1.设备驱动的作用
设备驱动最通俗的解释就是 驱使硬件行动。
充当硬件和软件之间的纽带,使得应用软件只需要调用系统软件的(API)就可以让硬件去完成工作。
如对串口定义SerialSend();SerialRecv();对Led 定义LightOn();LightOff();
对flash定义FlashWrite();FlashRead();
这样设备驱动才能良好的整合到操作系统的内核中。
2.无操作系统的设备驱动
对于功能单一、控制不复杂的系统并不需要多任务调度、文件系统、内存管理等复杂功能
用单任务架构完全可以很好的支持他们工作。
单任务典型框架如下
int main( int argc , char * argv[])
{
while(1)
{
if( serialInt == 1)
/*有串口中断*/
{
ProcessSerialInt();// 处理串口中断
serialInt = 0; // 中断标志变量清零
}
if ( keyInt == 1)
/* 有按键中断*/
{
ProcessKeyInt(); //按键中断处理
keyInt = 0 ; // 中断标志变量清零
}
status = ChckXX();
switch( status)
{
...
}
...
}
return 0 ;
}
系统不存在,设备驱动必须存在。
一般情况下对每一种设备驱动都定义一个软件模块包含.h和.c文件 .
3.有操作系统的设备驱动
首先,无操作系统时的设备驱动的硬件操作工作任然必训存在。
其次,将设备驱动融入内核。所以的设备驱动都必须面向操作系统的接口。
设备驱动就是连接硬件和内核的桥梁。
操作系统通过给设备驱动制造麻烦来到给上层应用提供方便。
4/设备分类
字符设备 指那些必训以串行顺序依次进行访问的设备,如触摸屏、鼠标。(不经过系统的快速缓冲)
块设备 可以任意顺序访问,以块为单位进行操作,如硬盘、软驱 (经过系统的快速缓冲)
网络设备 面向数据包的接收和发送而设计
编写linux设备驱动的技术基础
1、需懂得SRAM 、Flash、SDRAM、磁盘的读写方式,UART、I2C 、 USB等设备的接口,轮询、中断DMA的原理, PCI总线的工作方式以及cpu 的内存管理单元
2、C基础
3、linux内核基础(了解设备驱动与内核的接口,尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备
4. 有良好的多任务并发控制和同步控制基础,因为在驱动中会有使用大量的自旋锁、互斥、信号量等待队列等