本帖最后由 heianshaonian 于 2017-9-22 18:14 编辑
一点驱动函数的思路,参考linux驱动,
rt-thread驱动的一些想法,当然他们的驱动都采用init、write、read、ctrl的模式,和周立功的《面向AMetal框架与接口的编程(上)》,还参考了
cube的一个帖子,认为这样的便于扩展,同样的业务代码量增加不少,但感觉这样会有利于维护和可移植性。写这个希望获得一些建议和意见。
一、ledDev
led驱动。
1. 介绍
ledDev句柄
- typedef enum
- {
- LED0_OUT = 0,
- LED1_OUT,
- LED_MAX_OUT,
- }ledDev_id_t;
- typedef struct
- {
- ledDev_err_t (*led_set) (void *ledDev, uint8_t state);
- ledDev_err_t (*led_get) (void *ledDev, uint8_t *status);
- ledDev_err_t (*led_on) (void *ledDev);
- ledDev_err_t (*led_off) (void *ledDev);
- ledDev_err_t (*led_toggle) (void *ledDev);
- } ledDev_fun_t;
- typedef struct
- {
- ledDev_fun_t g_ledDev_fun;
- ledDev_id_t g_ledDev_id;
- }ledDev_t;
复制代码
定义了ledDev驱动的调用函数和id,led接口很多,使用这个识别,初始化需要给id赋值。为了方便排错,做id的时候最好从1开始(我这里还没做)。驱动函数中 *void ledDev 就是 ledDev_t 实例的一个指针,利用它函数获得它的ID号。
句柄注册
- ledDev_err_t ledDev_regist(ledDev_t *p_ledDev,ledDev_id_t g_ledDev_id)
- {
- p_ledDev->g_ledDev_id = g_ledDev_id;
- p_ledDev->g_ledDev_fun.led_set = bsp_led_set;
- p_ledDev->g_ledDev_fun.led_get = bsp_led_get;
- p_ledDev->g_ledDev_fun.led_on = bsp_led_on;
- p_ledDev->g_ledDev_fun.led_off = bsp_led_off;
- p_ledDev->g_ledDev_fun.led_toggle = bsp_led_toggle;
- if(EID_LED_NOERR != bsp_led_init(p_ledDev))
- {
- return EID_LED_PARAM;
- }
-
- bsp_led_off(p_ledDev);
- return ledDev_getRegState(p_ledDev);
- }
复制代码
句柄注册首先对句柄的参数和调用函数进行初始化,然后初始化硬件。 函数包括设置,获取,置位,复位,翻转,没有把初始化放进来。
2. 使用方法
定义句柄
- ledDev_t led0;
复制代码
注册句柄
- if(EID_LED_NOERR != ledDev_regist(&led0,LED0_OUT))
- {
- return false;
- }
复制代码
LED0_OUT是led驱动端口号
调用
- led0.g_ledDev_fun.led_on(&led0);
- delay_ms(1000);
- led0.g_ledDev_fun.led_off(&led0);
复制代码
demo:
dev/demo/app_led/user/main.c
3.下载
GitHub:
dev-master
本站:
dev-master.zip
(2.23 MB, 下载次数: 32)
2017-9-22 17:22 上传
点击文件名下载附件
readmePDF文件:
dev.pdf
(279.14 KB, 下载次数: 51)
2017-9-22 17:23 上传
点击文件名下载附件
led0.g_ledDev_fun.led_on(&led0);
led0 的实体都有了, 再传入是有点多余了,
方法肯定有的,你看linux和rt-thread的设备驱动,就知道了。
他们注册用一个名字,并将设备放入链表中,
然后
dev = find_dev(name)
write(dev,...);
read(dev,...);
一周热门 更多>