Linux下PCI设备驱动程序开发

分享到:

        一、PCI总线系统体系结构

       PCI是外围设备互连(Peripheral Component Interconnect)的简称,作为一种通用的总线接口标准,它在目前的计算机系统中得到了非常广泛的应用。

       PCI提供了一组完整的总线接口规范,其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起,同时它还刻画了外围设备在连接时的电气特性和行为规约,并且详细定义了计算机系统中的各个不同部件之间应该如何正确地进行交互。

       无论是在基于Intel芯片的PC机中,或是在基于Alpha芯片的工作站上,PCI毫无疑问都是目前使用最广泛的一种总线接口标准。同旧式的ISA总线不同,PCI将计算机系统中的总线子系统与存储子系统完全地分开,CPU通过一块称为PCI桥(PCI-Bridge)的设备来完成同总线子系统的交互,如图1所示。

 图1 PCI子系统的体系结构
 

       由于使用了更高的时钟频率,因此PCI总线能够获得比ISA总线更好的整体性能。PCI总线的时钟频率一般在25MHz到33MHz范围内,有些甚至能够达到66MHz或者133MHz,而在64位系统中则最高能达到266MHz。尽管目前PCI设备大多采用32位数据总线,但PCI规范中已经给出了64位的扩展实现,从而使PCI总线能够更好地实现平台无关性,现在PCI总线已经能够用于IA-32、Alpha、PowerPC、SPARC64和IA-64等体系结构中。

       PCI总线具有三个非常显著的优点,使得它能够完成最终取代ISA总线这一历史使命:

       在计算机和外设间传输数据时具有更好的性能; 
       能够尽量独立于具体的平台; 
       可以很方便地实现即插即用。

       图2是一个典型的基于PCI总线的计算机系统逻辑示意图,系统的各个部分通过PCI总线和PCI-PCI桥连接在一起。从图中不难看出,CPU和RAM需要通过PCI桥连接到PCI总线0(即主PCI总线),而具有PCI接口的显卡则可以直接连接到主PCI总线上。PCI-PCI桥是一个特殊的PCI设备,它负责将PCI总线0和PCI总线1(即从PCI主线)连接在一起,通常PCI总线1称为PCI-PCI桥的下游(downstream),而PCI总线0则称为PCI-PCI桥的上游(upstream)。图中连接到从PCI总线上的是SCSI卡和以太网卡。为了兼容旧的ISA总线标准,PCI总线还可以通过PCI-ISA桥来连接ISA总线,从而能够支持以前的ISA设备。图中ISA总线上连接着一个多功能I/O控制器,用于控制键盘、鼠标和软驱。

 
图2 PCI系统示意图
 

       在此我只对PCI总线系统体系结构作了概括性介绍,如果读者想进一步了解,David A Rusling在The Linux Kernel中对Linux的PCI子系统有比较详细的介绍。

       二、Linux驱动程序框架

       Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。 

       1. 字符设备和块设备

       Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示,例如,系统中的第一个IDE硬盘使用/dev/hda表示。每个设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是次设备号,标识使用同一设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致,否则用户进程将无法访问到设备驱动程序。 

       在Linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来,PCI卡通常都属于字符设备。 

       所有已经注册(即已经加载了驱动程序)的硬件设备的主设备号可以从/proc/devices文件中得到。使用mknod命令可以创建指定类型的设备文件,同时为其分配相应的主设备号和次设备号。例如,下面的命令: 

       [root@gary root]# mknod  /dev/lp0  c  6  0 
 

       将建立一个主设备号为6,次设备号为0的字符设备文件/dev/lp0。当应用程序对某个设备文件进行系统调用时,Linux内核会根据该设备文件的设备类型和主设备号调用相应的驱动程序,并从用户态进入到核心态,再由驱动程序判断该设备的次设备号,最终完成对相应硬件的操作。 

       2. 设备驱动程序接口

继续阅读
基于ARM的无线视频传输系统的设计

设计一套低帧速无线视频传输系统,将个人计算机屏幕上的图像通过无线的方式传输到投影仪上。系统中视频发送端采用普通个人计算机,视频接收端是基于ARM11的嵌入式系统。所传输图像使用JPEG标准进行压缩,传

国内智能电视遭外商倒逼 自创系统迫在眉睫

如今的中国智能电视行业,就像一部活生生的战国古史。各种合纵连横的故事支撑着行业的继续前行。现在讨论对错尚早,媒体不妨只做个讲故事的人罢。商业化的战国多的是纷争,但还不至于乱局,因为每一个动作和态度都涉

汽车操作系统革命:封闭还是开源?

相信很多人买车的时候都纠结过一个问题:为什么自己花费数万元添置的娱乐导航系统在功能、数据更新和易用性上还不如一台数千元的智能手机或平板电脑?目前,移动应用已发展到上百万款,几乎每个月都能免费升级。而车

实时操作系统到Linux系统的应用移植

从一个操作系统到另一个操作系统应用程序的移植即使在最好的情况下也经常是一个艰巨的任务。把一个实时的嵌入式应用程序移植到一个新的操作系统上可以说是一项最困难的任务。

飞思卡尔 i.MX 6产品概述

本文从i.MX 市场和应用,i.MX应用处理器 核心价值,i.MX 6系列要点,i.MX 6Quad/6Dual 应用处理器,i.MX 6系列的GPU构架,i.MX 6系列的功耗,飞思卡尔 i.MX 6 系列开发系统,基于i.MX 6 的SABRE平台方框图,i.MX概述:支持工具,EcoMAPS: 基于ARM™内核的i.MX应用处理器,i.MX 6系列平台支持,飞思卡尔软件、支持和服务 详细介绍了飞思卡尔i.MX产品。

精彩活动