区块设备驱动器实例:IDE 设备驱动
与 EP9312 IDE 控制器接口的 IDE 设备被划分为 Linux 区块设备,其中包括硬盘驱动器和 CDROM 驱动器。这些设备上的数据可以随机读取是将其划分为区块设备的主要原因。
与简单的触摸屏接口执行相比,IDE 区块设备驱动器是相当复杂的。该设备驱动器被分成几部分,包括 IDE 区块设备内核接口、为 IDE 控制器设置的内部驱动器硬件接口(附加的独立 IDE 设备多达 4 个)、针对硬盘、软盘等 IDE 设备类型的模块,以及结构特别接口。通过允许硬件或结构特殊函数的调用,IDE 设备类型数据结构内的函数指针可以实现非标准结构的灵活性和可延展性。图3为IDE区块设备驱动程序结构示意图。下面从设备驱动程序初始化开始说明该驱动程序。
高级IDE驱动程序在Linux内核初始化或模块安装(如果驱动程序被设置为模块)时得到初始化。本文不详述高级IDE 驱动程序初始化或安装细节,而是着重讨论为初始化定制并与硬件接口的驱动程序各片断。在高级IDE驱动程序初始化过程中,以下函数被用于设置IDE控制器:
|
该函数在文件中被定义为:include/asm/mach/ide.h,为非标准IDE控制器配置硬件接口数据结构,注册高级IDE驱动程序EP9312 IDE接口,并为接口设置IRQ。
在结构特殊初始化代码内完成的IRQ设置仅仅在硬件接口数据结构内设置IDE接口所需的平台IRQ号码。调用request_irq() 由高级IDE驱动程序负责。
IDE硬件接口数据结构通过调用以下函数得到配置,并同时在include/asm/mach/ide.h内得到定义:
|
该函数通过设置硬件接口数据结构内的命令和控制注册地址配置了非标准EP9312 IDE 接口,并设置和实现EP9312上的接口。
在ide_init_default_hwifs(void) 函数设置IDE控制器并由高级IDE驱动程序注册硬件接口后,结构特殊接口通过以下函数调用得到进一步初始化:
|
该函数在文档驱动器/ide/ide-ep93xx.c 内被定义,并同时执行几个任务--把结构特殊函数映射到硬件接口数据结构内的函数指针函数,如果平台设有DMA则设置DMA接口。
IDE硬件接口数据结构的结构特殊函数指针如下所示:
|
ideproc 处理PIO模式转换,并被映射到结构特殊函数 ep93xx_ideproc()。rwproc 和dmaproc 都处理DMA模式转换。rwproc 向ep93xx_rwproc()映射,dmaproc向ep93xx_dmaproc()映射。高级IDE驱动程序检测这些指针是否无效。如果确为无效,则放弃结构特殊函数而采用默认函数。ideproc()和dmaproc()均系基于IOCTL的函数,可执行一系列高级IDE驱动程序定义的ioctls命令。rwproc()函数为特殊转换速度和方向设置IDE控制器。这些EP9312结构特殊函数都在文件驱动程序/ide/ide-ep93xx.c内得到定义。函数原型示意如下:
|
此外,一部分结构特殊执行命令也是几个IDE普通宏命令的再定义。它们是直接读写IDE设备的宏命令。文件 /include/asm/mach/ide.h 下的宏映射到EP9312 定义。
|