由于设备种类繁多,相应的设备驱动程序也非常之多。尽管设备驱动程序是内核的一部分,但设备驱动程序的开发往往由很多人来完成,如业余编程高手、设备厂商等。为了让设备驱动程序的开发建立在规范的基础上,就必须在驱动程序和内核之间有一个严格定义和管理的接口,例如SVR4提出了DDI/DDK规范,其含义就是设备与驱动程序接口/设备驱动程序与内核接口(Device-Driver Interface/Driver-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()等。
对于不支持中断的设备,读写时需要轮流查询设备的状态,以便决定是否继续进行数据传输,例如,打印机驱动程序在缺省时轮流查询打印机的状态。
如果设备支持中断,则可按中断方式进行。