if(fd<0)
{
printf("Unabletoopentouchscreendevice%s!n",TS_DEV);
exit(1);
}
nbytes=read(pd_fd,data,sizeof(data));
close(fd);
if(nbytes!=sizeof(data))
return0;
return1;
}
区块设备驱动器实例:IDE设备驱动
与EP9312IDE控制器接口的IDE设备被划分为Linux区块设备,其中包括硬盘驱动器和CDROM驱动器。这些设备上的数据可以随机读取是将其划分为区块设备的主要原因。
与简单的触摸屏接口执行相比,IDE区块设备驱动器是相当复杂的。该设备驱动器被分成几部分,包括IDE区块设备内核接口、为IDE控制器设置的内部驱动器硬件接口(附加的独立IDE设备多达4个)、针对硬盘、软盘等IDE设备类型的模块,以及结构特别接口。通过允许硬件或结构特殊函数的调用,IDE设备类型数据结构内的函数指针可以实现非标准结构的灵活性和可延展性。图3为IDE区块设备驱动程序结构示意图。下面从设备驱动程序初始化开始说明该驱动程序。
高级IDE驱动程序在Linux内核初始化或模块安装(如果驱动程序被设置为模块)时得到初始化。本文不详述高级IDE驱动程序初始化或安装细节,而是着重讨论为初始化定制并与硬件接口的驱动程序各片断。在高级IDE驱动程序初始化过程中,以下函数被用于设置IDE控制器:
static__inline__voidide_init_default_hwifs(void)
该函数在文件中被定义为:include/asm/mach/ide.h,为非标准IDE控制器配置硬件接口数据结构,注册高级IDE驱动程序EP9312IDE接口,并为接口设置IRQ。
在结构特殊初始化代码内完成的IRQ设置仅仅在硬件接口数据结构内设置IDE接口所需的平台IRQ号码。调用request_irq()由高级IDE驱动程序负责。
IDE硬件接口数据结构通过调用以下函数得到配置,并同时在include/asm/mach/ide.h内得到定义:
static__inline__void
ide_init_hwif_ports(hw_regs_t*hw,
intdata_port,
iNTCtrl_port,
int*irq)
该函数通过设置硬件接口数据结构内的命令和控制注册地址配置了非标准EP9312IDE接口,并设置和实现EP9312上的接口。
在ide_init_default_hwifs(void)函数设置IDE控制器并由高级IDE驱动程序注册硬件接口后,结构特殊接口通过以下函数调用得到进一步初始化:
voidep93xx_ide_init(unsignedint*pointer)
该函数在文档驱动器/ide/ide-ep93xx.c内被定义,并同时执行几个任务--把结构特殊函数映射到硬件接口数据结构内的函数指针函数,如果平台设有DMA则设置DMA接口。
IDE硬件接口数据结构的结构特殊函数指针如下所示:
typedefstructhwif_s
{
…
ide_rw_proc_t*rwproc;
ide_ideproc_t*ideproc;
ide_dmaproc_t*dmaproc;…
}ide_hwif_t;
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内得到定义。函数原型示意如下:
staticvoidep93xx_ideproc(ide_ide_action_taction,ide_drive_t*drive,void*buffer,unsignedintcount)
staticvoidep93xx_dmaproc(ide_dma_action_taction,ide_drive_t*drive)
staticvoidep93xx_rwproc(ide_drive_t*drive,ide_dma_action_taction)
此外,一部分结构特殊执行命令也是几个IDE普通宏命令的再定义。它们是直接读写IDE设备的宏命令。文件/include/asm/mach/ide.h下的宏映射到EP9312定义。
#defineOUT_BYTE(b,p)ep93xx_ide_outb((b),(p))
#defineOUT_WORD(w,p)ep93xx_ide_outw((w),(p))
#defineIN_BYTE(p)ep93xx_ide_inb((p))
#defineIN_WORD(p)ep93xx_ide_inw((p))
硬件接口(EP9312IDE控制器接口)被初始化并与高级IDE驱动程序一起注册后,高级IDE驱动程序通过探测相连的IDE设备硬件接口继续初始化。如果设备被探测到,则与操作系统一起注册。设备与操作系统一起注册后,向能在设备上执行的操作表上映射。这样,操作系统也获得了设备的额外信息,并需要对设备进行资源管理。这些额外信息包括大小和分区数量等。以下是注册IDE硬盘的函数调用:
register_disk(structgendisk*gd,intdrive,
unsignedminors,
structblock_device_operations*ops,
longsize)
高级IDE驱动程序用探测设备时获得的的函数参数值调用这个函数。第一个参数是gd,它是描述盘片布局的数据结构。第二个参数--drive,是设备编号。对于EP9312而言,设备编号或为0,或为1,因为硬件只支持的两台设备。第三个参数--minors,是设备被探测时发现的盘片分区。第四个参数--block_device_operations,是函数指针列表,系IDE驱动程序硬盘执行所定义。被映射到该列表中的函数采用结构特殊函数执行不同任务。最后一个参数--size,是指设备的扇区数,它同样也是从设备中直接获得。
设备指针列表包括以下区块设备操作:
·open-设备和驱动程序实例初始化
·release-关闭设备或清除驱动程序实例
·ioctl-填补空白,是通过内核向设备驱动程序传递的一种信息的一种方式
·checkmediachange-处理支持可移动媒体的设备
·revalidate-处理支持可移动媒体的设备(通常为设备指定)
区块设备的设备操作列表不包括任何输入输出操作。对于区块设备而言,request方法用于处理设备输入输出,并与等待的输入输出操作队列相关,因此进一步与字符设备有所区分。Request方法和队列均由高级IDE设备驱动器定义,与操作系统一起注册并与设备主要编号相连。
除了将设备和操作系统一起注册,高级IDE设备驱动程序还通过数据结构在本地管理该设备,数据结构包括映射到IDE设备特别函数的函数指针。下面是映射到针对IDE硬盘函数的该数据结构的一部分:
staticide_driver_tidedisk_driver={
…
cleanup:idedisk_cleanup,
standby:do_idedisk_standby,
flushcache:do_idedisk_flushcache,
do_request:do_rw_disk,
end_request:NULL,
ioctl:NULL,
open:idedisk_open,
release:idedisk_release,
media_change:idedisk_media_change,
revalidate:idedisk_revalidate,
pre_reset:idedisk_pre_reset,
caPACity:idedisk_capacity,
special:idedisk_special,
proc:idedisk_proc,
reinit:idedisk_reinit,
…
};
值得注意的是,一些函数指针直接向与操作系统一起注册的文件操作列表函数指针映射,而此时IDE设备驱动器内部使用其他函数指针。例如,高级设备驱动程序内部使用函数指针do_request和end_request处理要求方法输入输出。
这就涵盖了IDE设备驱动器的结构特殊API。下一步是创建文档系统特殊文件,从而帮助用户级应用进入该设备。使用以下命令生成IDE硬盘驱动特殊文件:
mknod/dev/hda1b31
正如在触摸屏特殊文件创建中谈及,可在系统初始化阶段安排自动执行该步骤,或者用户可以在系统启动运行显示操作提示时手工操作该命令。
用户级应用较少直接调用区块设备。一般而言,区块设备直接通过内核级文档系统执行接入。用户级应用通常获取具有操作系统实用程序的区块设备,以执行文档系统创建、安装访问文档系统的设备等文档系统操作。命令行工具涵盖分割、格式化、安装和验证区块设备。例如,以下是用mnknod命令创建的设备的一个安装设备命令:
mount-text3-orw/dev/hda1/mnt/drive
-text3指出设备由一个Extended3文档系统配置;-orw则说明设备应该具备读写函数;/dev/hda1是被安装设备的文档系统特殊文件;/mnt/drive则是用户获取设备所存文档系统内容的安装位置。
添加Linux内核的新设备驱动程序支持