一. 键盘驱动
1 .用户接口遵循 POSIX 标准,对设备驱动提供 open 、 read 、 ioctl 、 close 操作。主要实现 Linux 驱动中的 file_operations 结构中的打开、读、控制和关闭操作来完成。在 Linux 文件系统下创建对应的键盘字符设备即可对键盘进行操作。
2 .键盘中断,按照 Linux 的中断处理流程,首先注册中断处理程序,在中断处理程序中读出键的编码值,放入缓冲队列中。
3 .建立键的编码和键值的映射表,在读取键值时进行映射,而不在中断中进行映射,主要缩短中断的处理时间。
二 . 多中断源驱动
1 .驱动结构和键盘相似。
2 .中断处理上,主要设计中断处理函数。一般情况下,在中断处理程序中主要是对外设的数据进行读写,为了不丢失中断,则应尽可能的缩短中断处理程序的执行时间。设计思想如下:
A .设置一个读写队列,所有的应在中断处理程序中对外部的 IO 读写操作都放入此 队列中集中处理,当队列为空时则阻塞等待;
B .中断程序只执行下面几步:
1 .关当前中断;
2 .读中断状态寄存器;
3 .清中断状态寄存器;
4 .将中断状态寄存器的值放入读写缓冲队列;
5 .开中断;
6 .唤醒中断处理队列;
C .读写队列对状态寄存器进行解析,对外部设备进行读写;
在此处理过程中,假设 A,B,C,D,E 五个设备共享此中断,并且当前 A 发生中断并进入中断处理程序。第 1 步关中断,防止其他设备产生中断,打断了前中断处理;如果 B (或者其他设备)在第 2 步发生中断,此时虽然关中断不能响应,但是状态标志位被硬件设置,仍然可以捕捉到 B 设备的中断;如果 B 在第三步发生,此时有可能丢失中断(概率当然很小),可以通过 CPLD 中解决,即在读中断状态寄存器时硬件即将状态寄存器清 0 ,保证第 2 和 3 步为一个原子操作; 如果 B 在第 4 步发生,此时中断不能响应,但是由于状态标志位被硬件设置,在下次中断处理时仍然可以捕捉到该次中断的发生。
该方法将中断响应和中断中的数据处理分开,形成异步处理,极大的缩短了中断处理时间,保证中断能够及时响应不丢失。
3 .通用的统一读写格式。在用户对设备数据读写上,设置通用的统一读写格式。
三 . I2C驱动
1 .I2C的处理流程遵循Linux的I2C设备处理过程,包括I2C设备的探测、注册,I2C命令的响应处理;
2 .将I2C设备设计成一个字符设备,和键盘类似,提供POSIX的读写操作,读写的操作遵循 struct rw_req格式;
3 .在“中断”方式上,利用Linux的异步事件通知的特性,当数据准备好时向用户发一个 SIGIO信号;
四. 附加
1 .定时器,在驱动初始化的时候对定时器进行设置;
2 .整个物理地址到虚拟地址的映射由 Linux 完成( MMU );
3 .总的来说上面所有的驱动设计遵循几个原则:
a .及时响应中断,保证中断不丢失;
b .用户对设备控制时的通用性与灵活性;
c .完全遵循标准 C 语言编程接口;
|