在之前的LED程序中,我们实现的是某个单板的LED驱动程序,那我们需要支持多个板子该如何写驱动呢?答案就是分层!
驱动程序要分为上下两层:leddrv.c和board_demo.c
1.与之前相同的是leddrv.c负责注册file.operations结构体,它的open/write成员会调用下层的board_demo.c
2.board_demo.c 中提供的是硬件led_opr中对应的函数(看第三点)。
3.board_demo.c中我们需要用到一个led_operation这个结构体。这是很关键的,我们需要以面向对象的思想,改进代码:
在led_opr.h中抽象出一个结构体:
#ifndef _LED_OPR_H
#define _LED_OPR_H
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_X.c实现自己的led_operations结构体,供上层的leddrv.c调用。
总的来说就是分为几个步骤:1. 在led_opr.h中定义一个结构体,把led *** 作抽象为这个结构体。2. 在单板入口函数中从下层驱动获取一个led_operations结构体,然后就可以在上层驱动中open R W去调用下层驱动中写入的不同硬件。3. 下层驱动要对结构体进行补充,类似file_operation。然后定义结构体里说明的函数,类似open read write。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)