Liunx驱动 = 驱动框架 + 硬件操作
===》Liunx驱动 = 驱动框架 + 单片机
对于驱动的的框架,大体有三种设计思想:1、面向对象;2、分层;3、分离,这三种设计思想大大为了加快开发速度,同时还可以兼容上层APP。
下面将详细阐述三种思想在驱动中的体现:
一、面向对象
面向对象的思想主要是通过结构体来体现,用一个结构体去抽象一个事件或一种物品
类似在Linux驱动编程篇(四)——LED驱动(二)LED驱动框架文中对于LED的结构体的构建,无论什么单板只要是LED都可以使用这个结构体来构建。
struct led_operations {
int (*init) (int which); /* 初始化LED, which-哪个LED */
int (*ctl) (int which, char status); /* 控制LED, which-哪个LED, status:1-亮,0-灭 */
};
二、分层
分层的思想主要是通过将一个整体划分为公共部分和私有部分进行分层。
类似在Linux驱动编程篇(四)——LED驱动(二)LED驱动框架文中对于LED驱动的框架设计,文中将LED驱动划分为两层,一层为公有层(进行注册驱动等操作),二层为私有层(具体单板硬件,实现具体寄存器操作)
代码就不贴了,具体见LED驱动框架文。
三、分离
分离与分层类似,分层是上下层之间的划分,而分离是通级之间的左右划分。
玩过单片机的小伙伴应该有体会,下面是一段单片机流水灯主程序:
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //LED0输出低
GPIO_SetBits(GPIOD,GPIO_Pin_2);//LED1输出高
delay_ms(300);
GPIO_SetBits(GPIOA,GPIO_Pin_8);//LED0输出高
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//LED1输出低
delay_ms(300);
}
}
其中GPIO_SetBits( GPIOx, GPIO_Pin)可以输入GPIO的组好和引脚号来进行设置,这样的一个函数可以完成这个个芯片上的所有GPIO输出高的操作。在驱动编写时也可以借鉴这种思想,对于具体的实现,下一篇文章会详细叙述。