Linux是非常优秀的开源操作系统,有着十分广泛的应用。基于该操作系统设备驱动程序的需求越来越多。PCI作为一种广泛采用的总线标准,在嵌入式系统中正被大量使用,而Linux的内核也能很好地支持PCI设备。为此,本文介绍了Linux下无配置信息PCI设备驱动程序的设计开发方法。
1 PCI总线及无配置信息PCI设备
1.1 PCI总线
PCI是外围设备互连(Peripheral ComponentInterconnect)的简称,是一种通用的总线接口标准,原先是应用于计算机系统的。PCI提供了一组完整的总线接口规范,其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起。该规范同时详细定义了计算机系统中各个不同部件之间应该如何正确地进行交互。在一般的计算机系统中,总线子系统与存储子系统被PCI总线分开,CPU通过一块称为PCI桥的设备来完成同总线子系统的交互,图1所示是一个PCI子系统的体系结构。
尽管目前PCI设备大多采用32位数据总线,但PCI规范中已经给出了64位的扩展实现方案,从而使PCI总线能够更好地实现平台无关性。虽然PCI总线是由Intel公司提出的,但它不局限于Intel系列的处理器。当今流行的其它处理器系列如Alpha、PowerPC、APARC,以及多处理器结构的下一代处理器都可以使用PCI总线。具体而言,PCI总线包含的特点可简要描述为高性能、线性突发传输、极小的存取延误、采用总线主控和同步操作、独立于处理器、兼容性强、预留了发展空间、低成本、高效益、软件透明等等。
1.2 PCI设备的配置空间
标准的PCI设备上有三种地址空间:I/O空间、存储空间及配置空间。CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,主要用来实现PCI设备和Linux内核中设备驱动程序之间的通讯。而配置空间则装载着PCI设备的配置信息,主要由Linux内核中的PCI初始化代码使用。PCI设备的配置信息空间如图2所示。
标准PCI设备配置信息空间的大小为256个字节,其中低64个字节称为头标区,这部分区域的格式是固定的。内容包括PCI设备号、厂商识别号、命令寄存器、状态寄存器、基址寄存器等重要信息;其余的192个字节称为设备有关区,不同的设备可以对这部分寄存器进行不同的定义。
1.3 无配置信息的PCI设备
目前的嵌入式系统往往会要求CPU和专用数据运算器之间以很高的速率通信。由于现行的总线规范中,PCI的高性能是最为突出的,因此PCI总线的连接方式被大量采用。数据运算器往往是针对某一系统设计的,通常会采用FPGA设计。即在FPGA中添加进PCI的接口设计,也就是把FPGA设计成为一块PCI设备。但是由于嵌入式系统的局限性,在某些FPGA的PCI接口设计中不能划分配置信息空间(I/O空间和存储空间是设备与CPU信息交互的基础,是必须存在的),因此这个设计也就是一块无配置信息的PCI设备。
2 Linux设备驱动程序
Linux的设备驱动程序大致可以分为驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理几个部分。
2.1 设备的注册与注销
向系统增加一个驱动程序就要赋予它一个主设备号,这一赋值过程应该在驱动程序的初始化中完成,它通过调用函数register_chrdev()或reg-iste_blkdev ()向内核注册。接下来就是给程序一个设备驱动程序名,这个名字必须插入到/dev目录中,并与驱动程序的主设备号和次设备号相连。获得主设备号的方法是选择一个当前不用的设备号,或者在调用register_chrdev时让参数ma-jor为0,这样,其返回值便是设备的主设备号。另外,在关闭字符设备或块设备时,还需要通过unregisler_chrdev()或unregister_blkdev()从内核中注销设备,并释放主设备号。
2.2 设备的打开与释放
打开设备可由open()完成。在大部分驱动程序中,open主要用于检查设备相关错误(如设备尚未准备好等)、识别次设备号(如有必要更新当前read/write位置f_ops指针),以及分配和填写要放在file->private_data里的数据结构。
释放设备由release()完成,release的作用与open相反,主要是释放file->private_data中open分配的内存,并在最后一次关闭操作时关闭设备。
2.3 设备的读写操作
字符设备使用各自的read()和write ()来对设备进行数据读写。块设备则使用通用block_read()和block_write()来对设备进行数据读写。这两个通用函数可以向请求表中增加读写请求,这样,内核就可以优化请求顺序。由于是对内存缓冲区而不是对设备进行操作,因而能加快读写请求。如果内存缓冲区内没有要读入的数据或者需要将写请求写入设备,那么就需要真正地执行数据传输。
2.4 设备的控制操作和中断处理