11.2.8 设备驱动程序框架

由于设备种类繁多,相应的设备驱动程序也非常之多。尽管设备驱动程序是内核的一部分,但设备驱动程序的开发往往由很多人来完成,如业余编程高手、设备厂商等。为了让设备驱动程序的开发建立在规范的基础上,就必须在驱动程序和内核之间有一个严格定义和管理的接口,例如SVR4提出了DDI/DDK规范,其含义就是设备与驱动程序接口/设备驱动程序与内核接口(Device-Driver InterfaceDriver-Kernel Interface)。通过这个规范,可以规范设备驱动程序与内核之间的接口。

Linux的设备驱动程序与外接的接口与DDI/DKI规范相似,可以分为三部分:

(1)   驱动程序与内核的接口,这是通过数据结构file_operations来完成的。

(2)   驱动程序与系统引导的接口,这部分利用驱动程序对设备进行初始化。

(3)   驱动程序与设备的接口,这部分描述了驱动程序如何与设备进行交互,这与具体设备密切相关。

 根据功能,驱动程序的代码可以分为如下几个部分:

 1)驱动程序的注册和注销

 2)设备的打开与释放

 3)设备的读和写操作

 4) 设备的控制操作

 5) 设备的中断和查询处理

前三点我们已经给予简单说明,后面我们还会结合具体程序给出进一步的说明。关于设备的控制操作可以通过驱动程序中的ioctl()来完成,例如,对光驱的控制可以使用cdrom_ ioctl()

与读写操作不同,ioctl()的用法与具体设备密切相关,例如,对于软驱的控制可以使用floppy_ioctl(),其调用形式为:

static int floppy_ioctl(struct inode *inode, struct file *filp,

                         unsigned int cmd, unsigned long param)

其中cmd的取值及含义与软驱有关,例如,FDEJECT表示弹出软盘。

除了ioctl(),设备驱动程序还可能有其他控制函数,如lseek()等。

对于不支持中断的设备,读写时需要轮流查询设备的状态,以便决定是否继续进行数据传输,例如,打印机驱动程序在缺省时轮流查询打印机的状态。

如果设备支持中断,则可按中断方式进行。