新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Linux操作系统下的PCI驱动开发

Linux操作系统下的PCI驱动开发

作者:时间:2011-06-10来源:网络收藏

  32 设备的打开及操作

  通过上述步骤,系统内核就可以发现并打开设备了。设备打开模块中主要完成检查读写模式以及申请对设备的控制权等工作。同时可分配并填private_data数据结构、申请设备I/O资源的占用、申请中断、注册中断处理程序。

  是以操作文件的方式来操作设备的,也就是通过系统定义的file_operation结构体向文件系统注册一些操作设备的函数。其file_operation结构体的定义如下:

  当应用程序对设备文件进行诸如open、close、read、write等操作时,内核将通过file_operation结构访问程序提供的函数。

  简单的读写任务直接用read、write函数就可以完成,而复杂的控制则需要使用ioctl函数。ioctl函数是设备程序中对设备的I/O通道进行管理的函数,可以对设备的一些特性进行控制。因此,为实现对设备各种I/O资源的访问和实现不同的传输方式,通常都需要使用ioc-tl函数,程序的ioctl控制命令差不多完全是用一个switch语句来实现的,可实现初始化信息的初始化控制、读写配置空间、读写I/O端口地址空间、读写I/O内存空间、DMA传输等多种控制操作。

3.3 中断处理

  Linux将中断处理程序分解为顶半部和底半部两个半部。驱动程序在打开设备时,为系统安装了中断处理程序,当硬件设备触发中断时,中断处理程序首先调用顶半部程序以判断中断类型,对中断类型的判断可通过访问设备处理中断的寄存器来实现。当有中断信号来临时,驱动程序将中断处理任务排进任务队列中进行“登记”并清除中断标志,这样做的目的是占用较少的内核时间,然后再通过调度底半部来运行,这样,内核负责底半部的函数就会处理任务队列中的中断任务。可以说,底半部几乎做了中断处理程序所有的事情。

  驱动程序在设备驱动对象数据结构中为中断处理定义了一个任务队列Task_DpcForIsr,并将其rouTIne参数设置为负责底半部的函数,data参数设置为传递给底半部函数的参数,这样,当系统获得中断信号时,驱动程序就可将中断处理任务排进该任务队列中,以提供给底半部应用。

  34 释放设备模块及卸载

  释放设备模块主要负责释放对设备的控制权,同时释放所占用的内存和中断等。具体来说,首先是释放对设备的控制权。即对设备控制权的释放,这只需简单地将控制设备控制权的信号量释放即可。在Linux下可使用up,其调用形式是up(sem),它可递增信号量的值,并换醒所有正在等待信号量转为可用状态的进程。其次是释放由open分配的、保存在filp->private_data中的所有内容,将其值设为NULL。接着释放中断。最后释放PCI设备I/O资源的占用权。对PCI设备的I/O端口资源而言,实现I/O端口资源占有权的释放是通过release_region函数来完成的,而对于I/O内存资源,则需要使用iounmap函数同时释放其内存映射。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭