LED驱动程序框架

您所在的位置:网站首页 苹果屏幕分成上下两层 LED驱动程序框架

LED驱动程序框架

2024-07-13 15:18| 来源: 网络整理| 查看: 265

1. 字符设备驱动程序框架

在这里插入图片描述

2. 基于分层思想的LED驱动 2.1 把驱动拆分为通用的框架和具体的硬件操作

把驱动拆分为通用的框架(leddrv.c)、具体的硬件操作(board_X.c): 如图: 在这里插入图片描述

以面向对象的思想,改进代码

抽象出一个结构体: 在这里插入图片描述 每个单板相关的board_X.c实现自己的led_operations结构体,供上层的leddrv.c调用 在这里插入图片描述

2.2 驱动框架程序

驱动程序分为上下两层:leddrv.c、board_demo.c。 leddrv.c负责注册file_operations结构体,它的open/write成员会调用board_demo.c中提供的硬件led_opr中的对应函数。 led_opr.h:

#ifndef _LED_OPR_H #define _LED_OPR_H //把LED的操作抽象为这个结构体 struct led_operations { int (*init) (int which); /* 初始化LED, which-哪个LED */ int (*ctl) (int which, char status); /* 控制LED, which-哪个LED, status:1-亮,0-灭 */ }; struct led_operations *get_board_led_opr(void); #endif

board_demo.c:头文件led_opr.h的实现

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "led_opr.h" /* 初始化LED, which-哪个LED */ static int board_demo_led_init (int which) { printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which); return 0; } /* 控制LED, which-哪个LED, status:1-亮,0-灭 */ static int board_demo_led_ctl (int which, char status) { printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off"); return 0; } //含有led相关操作函数的结构体 static struct led_operations board_demo_led_opr = { .init = board_demo_led_init, .ctl = board_demo_led_ctl, }; struct led_operations *get_board_led_opr(void){ return &board_demo_led_opr; }

leddrv.c:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "led_opr.h" #define LED_NUM 2 /* 1. 确定主设备号 */ static int major = 0; static struct class *led_class; struct led_operations *p_led_opr; #define MIN(a, b) (a ctl(minor, status); return 1; } static int led_drv_open (struct inode *node, struct file *file){ int minor = iminor(node); printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__); /* 根据次设备号初始化LED */ p_led_opr->init(minor); return 0; } static int led_drv_close (struct inode *node, struct file *file){ printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__); return 0; } /* 2. 定义自己的file_operations结构体 */ static struct file_operations led_drv = { .owner = THIS_MODULE, .open = led_drv_open, .read = led_drv_read, .write = led_drv_write, .release = led_drv_close, }; /* 4. 把file_operations结构体告诉内核:注册驱动程序 */ /* 5. 谁来注册驱动程序啊?得有一个入口函数:安装驱动程序时,就会去调用这个入口函数 */ static int __init led_init(void){ int err; int i; printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__); major = register_chrdev(0, "100ask_led", &led_drv); /* /dev/led */ led_class = class_create(THIS_MODULE, "100ask_led_class"); err = PTR_ERR(led_class); if (IS_ERR(led_class)) { printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__); unregister_chrdev(major, "100ask_led"); return -1; } for (i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3