| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | 
您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> Windows CE >> 文章正文 用户登录 新用户注册
[组图]Win2k驱动程序设计之硬件            【字体:
Win2k驱动程序设计之硬件
作者:杨沙洲 p…    文章来源:21control    点击数:    更新时间:2005-12-12
驱动程序必须和硬件相结合是无可争辩的事实,传统的,硬件设计者编写的测试代码是第一代的驱动程序,这些早期的驱动程序然后传递给硬件机制的软件工程师去开发全功能的驱动程序。 

  迟早,驱动程序开发工程师必须理解硬件和足够的术语,这一章概述一下大多数系统的硬件基础。 

  硬件基础 

  无论开发怎样的驱动程序,都必须清楚以下几点: 

  1. 怎样使用驱动程序的状态和控制寄存器? 

  2. 怎样使驱动程序产生一个中断? 

  3. 驱动程序怎样传输数据? 

  4. 是否驱动程序使用专用的存储器? 

  5. 怎样驱动程序宣布它的存在? 

  6. 驱动程序怎样通过软件进行配置? 

  下面将依次介绍。 

  设备寄存器 

  驱动程序通过读写和外设相关联的寄存器来和外设通讯。一般的,每个设备寄存器执行一个如下功能: 

  1. 命令: 仅占了几位去控制设备,如: 开始和结束一个数据的转换或者配置设备和简单的写。 

  2. 状态: 驱动程序去读这些寄存器来得到当前设备的状态。 

  3. 数据: 3. 数据: 这些寄存器被用来转换驱动程序与设备之间的数据。驱动程序写输出数据寄存器,读输入数据寄存器。 

  简单的设备仅有很少的相关联的寄存器,复杂的设备(如: 显示适配器)就会有很多的寄存器。寄存器的数量和用途最终被硬件设计者定义,生成硬件设计说明书。一般的,经验告诉我们那些保留的位不是不必关心的位,当读的时候要掩盖它们,写的时候要强制为零。 

  访问设备寄存器 

  在知道了硬件函数之后,还必须知道如下信息: 

  1. 设备的第一个寄存器地址。 

  2. 寄存器的相对地址。 

  通常情况下设备寄存器占用连续的地址空间。因此,访问其它的寄存器的时候必须知道第一个寄存器地址。不幸的,在不同的平台上,一个虚拟地址空间有不同的意义,因此,详细的讨论放到了第八章。一般的,CPU访问设备寄存器使用以下方法(如图2.1)的其中之一: 

  1. 使用CPU的特殊I/O指令。 

  2. 使用标准的存储器指令。 [ 相关贴图 ]


图2.1 CPU访问I/O与存储器 

  地址空间编址方式 

  I/O地址空间与存储器空间的地址空间进行统一编址,这样读写指令相同,减少了指令数目,也就减少了CPU指令的长度,缺点是占用了存储器空间。 

  I/O地址空间与存储器空间的地址空间进行分开编址,读写指令采用特殊指令,如IN,OUT,虽然增加了CPU指令的长度,但是I/O地址空间是与存储器空间分离,不会占用存储器空间。 

  I/O空间寄存器 

  一些CPU的结构(尤其是80X86,采用分开编址模式)访问设备寄存器使用I/O机器指令,这些特殊的指令引起CPU针脚的特殊脉冲波形,因此I/O设备需要一个特殊的总线和地址空间,这些总线上的地址叫做端口,它是完全和内存空间分离的。在80X86结构中,I/O地址空间占16Bits,可寻址空间为64KB,汇编语言定义了读指令为IN,写指令为OUT。 

  当然,如第一章所述,驱动程序代码应具有设备无关性,因此IN与OUT指令应避免使用。代替的是使用一些HAL的宏,如表2.1所示。 

[ 相关贴图 ]


表2.1 访问I/O端口的HAL宏 

  存储器映像寄存器 

  不是所有的CPU的结构使用分开的I/O地址空间(统一编址)。同样的,可以设计硬件设备寄存器地址接口在存储器空间,甚至CPU支持分开的I/O地址空间。在一些情况下,设备(例如: 显示适配器)会接触这两种地址空间。 

  设备通常在存储器空间中暴露出大量的数据缓冲区,这样可以使用高级语言(例如: C)快速和方便的访问它们,HAL提供了一些宏去访问存储器映像的设备寄存器,罗列在表2.2中,因为这些宏与I/O地址空间宏是不同的,所以一个设备必须支持两种不同的平台。 
[ 相关贴图 ]


表2.2 访问存储器映像的设备寄存器的HAL宏 

  设备中断 

  因为设备执行硬件操作与CPU操作是异步的,所以设备发出一个中断信号给CPU是必须的。不同的CPU的中断机制是不同的,但是,当设备需要请求中断服务的时候,总是设备发送信号给CPU的一个或者几个针脚,在跳到执行设备驱动程序的中断服务程序之前,CPU存储现在的CPU状态和上下文。 

  设备在以下情况下产生中断: 

  1. 完成了一个操作,准备好另外一个操作的时候。 

  2. 当设备的缓冲区或者先进先出将要空(输出时)或者将要满(输入时)时。这些中断让驱动程序去重新填充设备的缓冲区,或者清空设备的缓冲区去保证设备操作不会暂停。 

  3. 设备执行操作时遭遇到一个错误的时候。 

  不产生中断的设备将严重的降低系统的执行性能,因为在WIN2000中,CPU分配时间给系统中正在运行线程,不允许设备占用宝贵的消息循环去等待一个设备完成操作。以后的章节会介绍一些用于没有中断的设备的技术。 

  中断优先权 

  可能好几个设备在同一时刻申请中断,这时就需要一个机制去决定那一个设备首先接受服务。应该给最重要的设备或者必须分配最小的等待时间的设备分配最大的优先权,如果一个设备可以等待,就分配一个第一点的优先权,一个配置选项分配优先权给设备。这个优先权可以在设备初始化时由软件设定。 

  当一个低优先权的设备中断时,高优先权的设备还可以中断,在这种情况下,CPU有两个中断,且第二个中断的优先权高于第一个。相反的,高优先权的中断正在接受中断服务时,这时请求的低优先权中断被拖延,直到高优先权的中断服务完成和销毁。 

  中断向量 

  一些设备或者CPU结构允许中断自动的调用软件定义的函数作为中断的服务。必须提供一个公用的中断服务给所有的中断,这个公用的中断服务程序根据中断设备从一个中断设备表中选择一个真正的中断服务程序,因为系统每秒产生上百个中断,所以这种中断向量非常有效率. 

  中断信号发送机制 

  当设备产生中断时有两个基本的策略,它们是下降边沿触发和锁闭中断。产生下降边沿触发中断的设备通过在硬件线路上产生1到0的跳变来发出它们需要服务的信号,一旦跳变发出,设备可能释放这条硬件线路,恢复逻辑1状态。换句话说,设备产生一个脉冲,CPU的责任是感知这个脉冲。 

  锁闭中断屏蔽掉虚假的中断,因为中断线路的噪声有时像一个中断脉冲,更糟的是,两个设备尝试同时共享一条中断线路,这时CPU认为只有一个设备产生了中断,这样这两个设备需要的服务将永远丢失。 

  丢失中断的典型的例子是老式的串行口,传统的,COM1与COM3共享一个X86中断,IR04。结果,两个端口不能同时用作中断驱动的程序。如果尝试在COM1使用鼠标,在COM3口使用MODEM,会常常导致鼠标或者MODEM无反应,它们时常等待中断产生。 

  在电压触发的信号机制中不会产生这种情况,设备将保持中断线路一定的电压水平直到它的服务开始,CPU可以在任何时候侦测中断信号,因此,两个或者更多的设备可以共享一个中断,当多个中断同时产生,较高的中断优先权的设备得到服务,其它的设备继续保持电压水平直到得到服务。 
处理机的亲合力 

  如果系统有多与一个处理机,设备的中断线路连接其中一个CPU还是所有的? 通常是一块特殊的新芯片去配置和分配中断信号。如果一个CPU可以服务一个设备的中断,我们认为这个中断与那个CPU具有亲合力。强迫一个CPU去执行一个中断,这样去尝试在多个设备和CPU间平衡负载。 

  数据传输机制 

  当移动数据从或者到CPU或者存储器,使用以下三种机制: 

  1. 过程控制I/O 。 

  2. 直接存储器访问(DMA) 。 

  3. 共享缓冲区 。 

  数据传输机制的选择是由设备的速度,平均数据量的大小等决定,当然,一个设备可以选择多于一个的数据传输机制。以下的部分详细描述这三种数据传输机制。 

  过程控制I/O 

  过程控制I/O(PIO)直接通过设备的数据寄存器传输输据。驱动程序必须发出一个I/O指令去读或者写数据寄存器。如果传输大量的数据,软件缓冲区的地址和数据计数器必须作为驱动的状态被保存。 

  因为实际设备的数据传输率是远低于CPU读或者写一个数据寄存器,一个过程控制I/O的设备可能每传输一个数据都要中断(指的是CPU的等待,不是产生一个中断服务)一次。串行口是一个过程控制I/O的例子。好一点的设备包括先入先出的设备,它们每4或者16个字节中断一次,这样的设备的中断率依然很高,而且这样的技术只能适合低速的设备。 

  更好的软件设计方法可以使过程控制I/O设备的冲突减到最小,它们将在第八章讨论。 

  直接存储器访问 

  直接存储器访问利用了一个DMA控制器(DMAC),DMAC是一个辅助处理器,它被用来在指定的设备和存储器间传输一系列数据。DMAC的操作仅对整个系统有少许的影响。 

  为了开始一个I/O操作,驱动程序必须设置DMAC开始的缓冲区地址,DMAC开始在设备与系统RAM间移动数据,这时没有更多的软件干涉,当DMAC完成所有的传输,就会产生一个中断,这样,驱动程序只有在开始传输和传输结束的时候工作,解放出来的CPU可以去完成其它的工作。 

  高速的设备利用DMA传输大量的数据,比过程控制I/O大量减少了数据传输的中断。磁盘,多媒体设备,网络卡都是利用DMA数据传输的。 

  必须指出,DMA传输和系统的其它操作不同,DMAC和CPU竟争存储器的带宽。如果CPU频繁地访问主存储器,那幺CPU或者DMAC必须等待直到之前的存储器循环结束。当然,现在的CPU拥有较大的CACHE,所以很少对存储器带宽有太大的请求。一个有很多DMA设备的系统,在同时传输时会互相竟争存储器的带宽。 

  设备专用存储器 

  第三个传输数据的方法是使用一个共享的缓冲区。为什幺设备希望借用或者拥有系统地址空间,有两个如下原因: 

  1. RAM或者ROM可能是设备使用的资源,为使驱动程序可以高速访问,通常映像设备寄存器到CPU的存储空间。例如: 一个设备可能有一个内有激活代码和数据的ROM,为了让CPU执行这些代码,它必须被映像到CPU可用到的地址空间。 

  设备可能有一个使用系统内存为缓冲区的高速的专用处理器。例如: 视频捕获卡可能使用内存来存储流入设备的视频流。 

  2. DMA操作需要设备使用系统地址空间。在这种情况下,DMAC的操作比单一的使用DMAC更有效。 

  一些设备通常使用一段指定的存储器地址空间。例如: 一个VGA视频适配卡使用从0xA0000开始的128KB的主存储器作为视频缓冲区。 

  其它的设备允许它的初始化例程指定专用的存储器地址空间。后者的做法是比较灵活的。 

  自动识别和自动配置 

  每个设备都占用系统资源,系统资源包括I/O地址空间,中断请求,DMAC,存储器地址等。因为不同的设备被不同的时间,不同的制造商制造出来,资源的冲突当然是不可避免的。 

  第一个个人计算器需要它的主人通过设定条线,或者开关去分配独一无二的资源给每一个设备。添加一个新的设备需要了解什幺资源已经被现有的设备占用,这些手动的配置时常导致一些错误,使系统不能激活,或者设备不能使用。  

  处理自动识别与自动配置的新的总线构架已经被提出,自动识别需要这些新添加的设备向系统汇报它的存在,这可能发生在系统重启或者当设备被插入的时候。总线和设备必须支持热拔插和允许软件在不用重启的情况下增加或者移除设备。 

  自动配置允许软件分配可利用的资源给支持软件配置的设备。这个属性可以让一般用户安装新的硬件而不需要先设置跳线。 

  设备资源列表 

  一个设备必须标识它自己和提供一个它所占用的资源列表,资源列表的内容包括: 

  1. 制造厂商的ID号码 

  2. 设备类型ID号 

  3. 需要的I/O空间 

  4. 中断请求 
 
  5. DMA控制请求 

  6. 设备存储器请求 

  没有跳线和开关 

  为了支持自动配置,设备必须允许指定的软件动态的设定和改变端口,中断,DMAC分配。这些允许WIN2000在竟争的设备中去解决冲突。 

  改变通知消息 

  一个和它关联的总线的设备,在插入和移除时,必须发送一个通知消息。如果没有这个性质,设备就不可能支持热拔插和自动配置。 

  WIN2000与总线 

  总线是一个让设备间通讯和收集数据,地址,控制信号的线路。一些总线很宽,允许同时传输多位的数据或者控制信号,一些只不过是一条单一的导线,允许连续的传输数据或者控制信号,一些总线允许任何设备和其它设备通讯,一些必须由主控制器(如CPU或I/O控制器)的控制才能接收或者发送数据。 

  随着时间的流逝,总线得到和最后失去普及,用户在速度,价值,可扩展性,容易使用等方面进行取舍,设备需要新的技术使用到PC世界。例如: 用在家用计算器的数字视频适配器需要一个简单,高速的总线。 

  WIN2000的驱动程序构架容易和有效地支持新技术的总线,剩下的本章将概括的介绍WIN2000支持的总线,详细的信息请参考相关资料。 
ISA: 工业标准总线 

  这是一个早在1980年,IBM为AT构架的主板设计的总线,它支持8Bits和16Bits的设备。因为ISA总线出现在20年前,所以它即不快速,使用也不简单。它的时钟频率是8.33 MHz。因为16Bits的传输至少使用两个时钟循环,所以最大数据传输速度只是8MByte/S。因为现在的CPU速度快了两倍,所以ISA不再是一个和CPU速度相适应的总线。WIN2000和本书包含了它仅仅是为了向后兼容。 

  寄存器访问 

  ISA总线是一个支持自动识别和自动配置的总线,ISA提供的定义是混乱的,不标准的寄存器用法,因此设备可能竟争任何I/O地址,通常,主板上的设备使用0x0000到0x00FF之间的地址,个种插卡的设备占用0x0100到 0x03FF之间的地址。每一个设备分配一个连续的32Byte的寄存器地址空间。 

  令人悲痛的是,许多遗留下来的ISA接口卡不能译码所有的16B的地址线,它们仅仅译码前10B。这样的接口卡反映出很多地址,一个地址在0x300的设备同样反映了地址0x700。如果在系统中使用这样的设备,将使64K的I/O地址快速减小。 

  中断机制 

  ISA总线的中断使用两片传统的可编程中断控制器芯片(PIC)Intel 8259A,每个PIC提供八个中断优先集的中断输入引脚,一个中断输出引脚,另一个PIC(主)的一个中断输入脚连接前一个PIC(副)中断输出脚,这样将15个中断汇成一条输出线,如表2.3所示。 

  Intel 8259A可编程控制它是下跳沿触发中断或者电平触发中断,这个控制对整个芯片起作用,而不是其中一个中断引脚。传统的BIOS初始化这两个芯片为下跳沿触发中断,因此,典型的ISA接口卡不能共享中断线。一些主板可以对Intel 8259A选择下跳沿触发中断或者电平触发中断。 

  DMA能力 

  标准的执行DMA使用一对Intel 8237 DMAC,每个Intel 8237 DMAC提供四个独立的DMAC,像PIC一样,将两个芯片串联,剩下七个给DMA驱动设备,如表2.4所示。 

  当多于一个的DMA信道同时使用,DMAC利用软件选则的优先权顺序执行,通常优先权高的使用信道0,低的使用信道7。只有副DMAC可以传输16Bits,所以它的数据传输速率是主DMAC的两倍。 

  ISA总线只有24条寻址线(这里表示ISA总线的寻址范围,前面的地址线指插ISA卡寄存器的地址),这样ISA总线只能传递第一个16Mbyte的系统存储器。 

  自动识别和自动配置 

  ISA接口总线不宣布它自己,不提供一个资源请求列表,也不需要软件配置,它使用手动跳线和柭动开关的方法。 

  新的ISA接口总线尝试通过扩展ISA接口去改正这些问题,这些新的ISA接口总线在WIN95时期得到大量的普及,但WIN2000以前NT版本不支持即插即用,所以很少出现这些版本的安装程序,WIN2000却很好的支持这些新的ISA接口总线。 

[ 相关贴图 ]

EISA: 扩展的ISA接口总线构架 

  EISA接口总线是对原始的ISA总线的扩展,EISA接口的去除了ISA的局限性,同时保持兼容遗留下来的ISA卡。当然这种兼容在几个方面受到限制。例如: 因为数据宽度加宽到32Bits,时钟速率保持8MHz,最大数据传输率为32Nbyte/S。再如: EISA插槽也接受ISA卡,所以不可能改善由于ISA卡布线而产生的噪声问题。 
  
  寄存器访问 

  EISA接口总线可以扩展到15个插槽,每一个插槽分配固定的4KB的I/O地址,这样使低端地址产生冲突,如表2.5,只有256个地址保证唯一。 


表2.5 使用EISA接口总线的地址空间 

  中断机制 

  EISA的中断是ISA接口的超集,虽然EISA同样提供像ISA一样的15个不同优先级别的中断,但是中断请求线可以单独的设定为下降沿触发中断或者电平触发中断,这样允许EISA卡和ISA卡共存在同一总线上。 

  DMA能力 

  像ISA接口一样,使用两个DMAC产生从0到7的7个系统DMA信道(信道4不可用)。 

  EISA使用好几个方法扩展ISA接口: 

  1. 任何一个信道都可以传输8Bits,16Bits,32Bits的数据,所以任何设备可以使用任何信道。 

  EISA的DMA信道的总线循环格式可以单独的设定,这个特性可以使新设备更快的运行,而且兼容遗留下来的ISA卡,如表2.6所示。 


表2.6 EISA的DMA总线循环 

  2. 增加了24Bits的DMAC的计数寄存器,使一个传输操作就传送16Mbytes的数据,为了兼容性DMAC可以使用16Bits的计数寄存器。 

  3. 因为EISA DMAC产生32Bits地址,它可以访问整个系统4GByte的物理地址空间,所以不必像ISA那样必须放在第一个16MByte空间。 

  设备寄存器 

  EISA接口总线有32Bits的地址空间,设备专用的寄存器可以占用系统4GB空间的任何地方,也可以使用卡上自带的ROM地址。 

  自动识别和自动配置 

  几个部分组成了EISA的配置过程: 

  1. 每个EISA接口卡必须在0xnC80(n是EISA插槽代号从1到0xA)地址处设置一个4-byte的ID寄存器,这个ID标识了EISA接口设备卡的制造商,设备类型,版本号等。 

  2. 设计者可以使用剩下的124Butes(从0xn C84 到 0xn CFF)作为配置EISA接口卡的寄存器,可能有一个保存DMA信道号码的寄存器,另一个保存中断请求号码的寄存器,存储数值在这些存储器和设置跳线与开关的效果是等价的。 

  3. 使用一个存储包含EISA接口卡的资源列表,使用的配置寄存器的地址的脚本文件。这个文件是用标准的EISA脚本语言写成的,它的文件名是根据EISA接口卡ID号码设定的,这个文件通常来自EISA接口卡的制造商提供的软盘。 

  4. EISA接口卡的配置程序是在系统激活时运行,这点使人迷惑不解。程序扫描以前清空的EISA接口卡的插槽,如果发现了一个,它使用插槽的ID寄存器,构造一个空的EISA接口卡的脚本文件,然后请求制造商提供的软盘,一旦软盘插入,配置程序开始分配资源给EISA接口卡。它也复制这些分配给与这个插槽相关联的主板上的非易失性的CMOS存储器,这样在以后的系统激活时就不需要这张软盘了。 

  WIN2000自动侦测多种EISA接口卡,可以使用HAL提供的HalGetBusData和HalSetBusData来直接访问EISA接口卡的插槽。 
PCI: 外设互联接口 

  高速的网络,快速移动的视频图像,24Bits像素的显示器,这些都需要高的数据传输速度,PCI总线尝试去满足人们这种对硬件有苛刻要求的需要。虽然它的原始设计来自Intel,它已经被分别被植入到DEC的Alpha 和Motorola的PowerPC系统中,如图2.2所示。 

  利用快速的总线时钟(33MHz)和一些技术,使PCI构架可以传输32Bits的数据速度达到132Mbyte/S,传输64Bits的数据速度可以再提高一倍。产生这个快速的数据传输的原因如下: 

  1. PCI协议假定每一个数据的传输都是一个爆发操作,结果,高速的设备将使用巨大的吞吐量去传输大量的数据。 

  2. PCI支持加倍总线管理,允许直接的设备到设备数据传输(在存储器中无中间停顿)。这样使I/O和CPU操作重迭。 

  3. 一个中央总线仲裁器通过对数据传输进行重迭的仲裁减少了反应时间。它允许当这个佣有者释放总线的时候,下一个佣有者马上开始操作。 

  4. 一个智能桥放置在主CPU和PCI总线之间,作为数据的缓冲区和读前面的功能,它减少了花费的等待数据的时间。 

  PCI接口卡允许32个同时插在同一条总线上,每一个接口卡由8个独立的功能部分组成,在分离出一个功能去发送消息,一个总线上可以同时有255个可设定地址的功能,而且,如图2.2所示,一个系统可扩展到256个PCI总线。 


图2.2 典型的PCI总线系统 

  访问寄存器 

虽然使用32Bits的地址,但是,I/O寄存器的寻址空间在80X86平台上仍然是64Kbyte,所以PCI的I/O寄存器和其它东西必须压缩到这64Kbyte中。而且,在有EISA或者ISA总线的系统上,设计者仍然需要避免遗留的EISA或者ISA设备使用这64Kbyte的空间。 

  除了I/O寄存器空间和存储器空间外,PCI还定义了一个配置空间,配置空间将和自动配置一起讨论。 

  中断机制 

  PCI总线共有四个优先权相同的中断线(INTA-INTD),这些中断线可以设定为低有效,电平触发和可共享状态。一个单功能的设备必须使用INTA,多功能的设备可以使用从INTA开始的任意中断线。唯一的限制是一个功能只能连接一个中断线。 

  对于中断的优先权PCI总线的规范是没有设定的,但是它通过一个外部的控制器改变中断请求线给正确的系统中断线。例如: 计算器上的转向控制器为了完成将PCI的功能请求INTA-INTD转换到系统的中断请求IRQ0-IRQ15的其中之一,任何产生中断的功能必须填写以下两个寄存器: 

  1. 中断引脚寄存器: 这个只读寄存器存储PCI中断线的标识。 

  2. 中断线寄存器: 这个可读可写的寄存器存储中断的优先权和中断的向量,在个人计算器中0x00- 0x0F与IRQ0 - IRQ15相对应。 

  这是一个非常灵活的方案,因为它不强加给系统设计者任何特殊的策略,这也使它很容易地支持其它处理器环境。 

  DMA构架 

  PCI规范中没有定义副DMA的使用,PCI只使用主DMA或者过程控制I/O,使用副DMA的只是EISA桥。 

  在固有的DMA操作中,参与者被称为代理者,在任何的传输中,仅涉及两个代理者: 

  1. 发起者: 这是一个总线的管理者,它有权使用总线,将要建立一个数据传输操作。 

  2. 目标: 者是PCI总线当前被发起者寻址的功能,它有数据传输的地址。 

  因为所有的总线管理者都可以是发起者,所以可以在两个PCI之间直接传输数据而不经过主存储器。这个强大的数据传输能力使它可以应用在高速的设备如网卡和视频适配卡。 

  PCI规范中也没有定义仲裁PCI总线是否有权使用的策略,它只是定义了PCI总线仲裁信号的时序。而是由系统定义了确定下一个有权使用PCI总线的方法。 

  设备缓冲区 

  PCI总线使用的设备缓冲区可以使用32Bits寻址空间的任何地方,但必须在主CPU可以访问设备缓冲区之前激活某些PCI的功能。 

  PCI总线的一个有趣的特性是一个单一的功能可以在ROM中有多个映像,每一个对应不同的CPU平台。这个特性给制造商为不同的平台设计产品。PCI规范为ROM块定义了一个标准的头格式,这样,初始化程序可以加载ROM中适当的部分到主存储器中执行。 

  自动配置 

  PCI规范中定义了PCI接口的每一个功能必须有自己的256个用来配置PCI接口的存储地址。 

  第一个64Bits是头,它有一个固定的结构,剩下的192Bits留给PCI接口卡的设计者。系统可以使用头去唯一标识一个PCI接口的功能和给它分配资源。头的内容包括: 

  1. 制造厂商,设备类型,版本号码等信息。 

  2. 一对标准的命令和状态寄存器,纪录启用各种功能和提供错误信息。 

  3. 一个功能使用的缓冲区和I/O寄存器空间请求的资源列表, 

  4. 一个中断引脚和一个中断线寄存器。 
 
  5. 一个指向PCI设备的ROM的指针。 

  在每个功能有256Bits的情况下,PCI系统的配置空间可以很容易变得很大,可能会超过64Kbyte(80X86),虽然可以选择是否映 射它们到主存储器,但是它们会占用大量的空间。为了解决这个问题,PCI的功能访问配置数据使用了两个寄存器: 

  1. 配置地址寄存器: 它标识了总线号码,设备,功能,配置空间的地址。 

  2. 配置数据寄存器: 它作为CPU和配置空间的数据缓冲区。在设置了配置地址寄存器之后,通过读写配置数据寄存器来读写配置空间。 

  幸运的是,WIN2000提供了HAL函数去简单的访问配置数据,HalGetBusData,HalSetBusData, 和HalAssignSlotResources分别去得到,设置配置和给PCI设备分配资源USB: 通用串行总线 

  各大公司联合发行了通用串行总线协议,使用它来为数字图像,计算器通话,多媒体游戏等这些设备提供一个低价,中等速度的总线。现在的USB接口的版本号码是1.1,支持这个协议的公司数量持续的增加。一个更高速度的USB接口版本2已经提出。 

  USB接口的最高速度是12MBit/S,低速USB接口的数据传输速度是1.5MBit/S。USB版本2允许数据传输速率是480Mbit/S。数据串行的通过两条数据线,另外两条是提供给USB设备的电源线。 

  USB接口的速度是ISA接口的1/5,但是没有必须主板插槽的限制,设备可以连接到远于5M的距离。可以使用USB集线器在一条USB总线上扩展多个USB设备,当然,这时联机的距离可以再增加,将一条USB总线扩展5个USB集线器,联机的距离可以达到30M,典型的联机如图2.3所示。 


图2.3 USB接口拓扑实例 

  寄存器的访问 

  设备寄存器需要使用特殊的USB命令来访问,这些命令是一些从8-bit到64-bit的数据流,用来配置,电源控制和接收少量的设备数据。一个计算器上最多可以扩展127个USB设备,添加设备的时候,系统动态分配给它一个与总线相关联的地址。命令数据的数量和意义由USB设备指定。数据块的传输是利用同步的机制,一贞扩展到1023Bytes数据,每一贞占用固定的1mS的时间间隔。 

  中断机制 

  USB没有真正的中断,主机的USB接口给设备注册一个固定时间间隔,它指的是传输多长时间中断一次,通常是16到32mS。注册码的长度可以达到64Bytes。 

  从设备的角度去看,USB的中断和DMA能力是被有USB接口的主机定义着的,相当大的成就被放到主机USB接口的协议上: 开放的主机控制接口(OpenHCI)和通用的主机控制接口(UHCI)。主控制器提供一个传统的中断和DMA传输结构。 

  DMA能力 

  USB设备不能直接访问系统存储器,它们被主机的USB接口隔离。USB不支持DMA,然而,主机的USB接口为每一个USB设备提供一个虚拟的DMA。当主机的USB接口从USB设备接收到数据的时候,它使用DMA将数据收到的数据传送到系统内存,这样主机的USB接口就提供了DMA的能力。 

  自动侦测与自动配置 

  USB接口直接支持即插即用。每个USB设备被赋上USB接口或者USB集线器信号,插入的时候报告制造商ID和设备描述符,WIN2000侦测它们的存在,位置,然后安装一个合适的驱动程序。 
IEEE 1394:火线总线 

  被苹果计算器公司首先提出和应用,后来,电气和电子工程师协会(IEEE)定义了一个高速的对等的串行接口来提供给较低速度的USB传输的程序,但是它最后被证明是不适当的。IEEE1394接口(IEEE1394a)支持三种速度的数据传输,100,200,和400 Mbites/sec,IEEE1394b支持更高的速度,甚至在最低的速度(10 MBytes/sec)下,它的速度还是比原始的ISA要快。 

  1394火线的标签上仍然有一个苹果公司的商标。1394这个术语被用来描述计算器硬件的总线,Sony和其它公司使用 "i.LinkTM" 来描述1394的软件。 

  每一个1394设备可以使用长达4.5米的4芯或者6芯的电缆连接到主机,使用菊花链的方式可以连接63个1394设备,最长达到72米。1394桥接器可以连接62个附加设备,这样1024个1394总线可以连接到一起,可以连接到一起的1394设备的理论的数量是64K。当一个设备连接上的时候,主机将分配给它一个16Bits的ID号码。 

  6芯的电缆里有两对螺旋形的独立的数据传输线,另外一对是电源线。整个电缆是被套上外壳保护起来,两头各连接一个任天堂的连接器。 

  1394接口典型的使用是在数字照相机,它需要巨大的代宽来传输大量的数据到主机去完成编辑工作。有这样的数据传输速度的设备都有这样的接口。 

  访问寄存器 

  IEEE1394接口标准与IEEE1212接口标准有一样的控制,状态寄存器(CSR),CSR标准定义了一个固定的64Bits的空间,其中有10Bits的总线号码,6Bits的节点ID,剩下左侧的48Bits给设备使用。虽然这是给IEEE1212接口定义的规格,但是256 TBytes的地址范围足够满足任何场合的需要。 

  中断机制 

  像USB接口一样,IEEE1394模仿设备中断,设备必须发送一个数据报去宣布它的状态,或者主机请求设备状态的情况下。1394的设备驱动程序必须对这些数据做出反应,将它们放置到系统存储器空间。 

  1394家族有一个开放的主机控制器接口(OHCI),OHCI规范对于驱动程驱设计者是一个重要的标准。它为1394接口提供一个传统的中断和DMA构架,1394同业工会提供一个方便的联结到OHCI规格和其它的相关信息: http://www.1394.ta.org。 

  DMA构架 

  主机接口适配器使用DMA来传输数据和命令到或者从系统存储器。1394设备不能直接的访问系统存储器,OHCI提供一个地址范围,这个地址范围里的数据被主机的软件或者DMAC直接发送到系统内存,这样来实现虚拟的DMA功能。 

  自动侦测与自动配置 

  1394接口直接支持即插即用,每个被插到插槽的设备,被附上总线信号,在1394总线复位的时候,主机发现它然后罗举设备ROM。 

  计算器卡总线 

  大概十年前,好几个公司联合为可移动设备开发了一个标准总线构架,起初,它的目的是存储卡。后来,这个团队成为了个人计算器存储卡国际协会(PCMCIA)。今天,300多家公司都是PCMCIA的会员。 

  原始的PC卡标准定义了有68个脚的接口,定义的速度与ISA接口相当,可移动设备的尺寸和电力资源是缺乏的,所以,它的设计强调的是尺寸和功率,而不是速度。 

  术语PCMCIA卡可交替的和PC卡使用,这是术语学制造的混乱,PCMCIA是一个组织,而PC卡是一种接口。今天PCMCIA至少定义了三种接口: PC Card,DMA,和CardBus。 

  原始的PC卡的时钟于ISA卡相同,是8MHz,允许8Bits或者16Bits的设备,因而,16Bits卡的最大数据传输速度是16 MBytes/sec,CardBus允许32Bits的设备,它的时钟于PCI卡相同,是33MHz,所以它的最大数据传输速度是128MBytes/sec。 

  访问寄存器 

  PC卡标准为它的I/O访问定义了26Bits的地址范围(64Mbyte),其寻址与ISA接口相似。CardBus定义了32Bits的地址范围,和PCI卡一样。 

  DMA构架 

  PC卡标准不允许DMA访问,1995年发布了一个新的标准扩展了DMA功能。像ISA卡,DMA标准允许传输8Bits或者16Bits的数据,假定设备在副DMAC。在主DMAC的设备的执行方式式不同的。 

  CardBus卡标准允许DMA的方式像PCI卡,传输16Bits或者32Bits的数据在33MHz的时钟频率下。 

  自动侦测与自动配置 

  PC卡完全支持即插即用,支持热拔插和自动配置。PC卡和CardBus卡的标准的软件分为两层: 插槽服务程序和卡服务程序。插槽服务程序是基本输入输出水平的软件,它在系统中管理一个或者多个插槽,它负责侦测和报告设备是否插入或者移除。卡服务程序管理卡的硬件资源。 

  准备设计驱动程序 

  为新的硬件设计一个驱动程序可能是一个挑战,驱动程序工程师遵循一个与普通软件工程师不同的设计方法论。以下的提示对设计一个驱动程序是有帮助的。 
学习硬件 

  在开始一个新的驱动程序之前,学习尽可能多的这个硬件设备的知识,大部分需要的信息都在硬件提供的文件中。至少要确定以下信息: 

  1. 总线的结构。 

  2. 控制寄存器。 
 
  3. 错误和状态汇报。 

  4. 中断行为。 

  5. 数据传输机制。 

  6. 设备存储器。 

  总线结构 

  总线的结构对设计驱动程序有巨大的影响,自动识别和自动配置的信息必须清楚。WIN2000希望新的设备分享即插即用机制。 

  控制寄存器 

  必须知道设备寄存器的尺寸和地址规划,每个控制,状态,数据寄存器的目的,内容必须被完整的描写。特殊的行为也必须描述出来,如: 

  1. 一些寄存器可能只读或者只写。 

  2. 一个单一的寄存器在读的时候和写的时候执行的功能不同。 

  3. 在发出一个命令,再间隔一定时间之后,这个数据或者状态寄存器的数据才有效。 

  4. 寄存器的访问需要特殊的顺序。 

  错误和状态汇报 

确定设备使用的汇报硬件错误和设备状态的任何协议。 

  中断行为 

  正确的找出硬件在什幺情况下产生中断,以及是否设备使用多于一个的中断向量。如果它是一个多设备的控制器,中断可能来自控制器它自己,这时必须有一个机制标识出那个真正产生中断的设备。 

  数据传输机制 

  过程控制I/O与DMA的设备是完全不同的。一些设备可以执行这两种I/O,在设计使用DMA传输数据的设备时,确定DMA机制是使用DMAC主还是副,是否有缓冲区地址范围的限制。 

  设备存储器 

  如果设备使用专用的存储器,确定怎样去访问它。它可能被映 射到固定的主存储器地址,或者它是一个必须被初始化的寄存器,请纪录下来它的映 射地址。 

  使用硬件智能 

  一些外设包含有自己处理器,它们执行诊断和控制的功能。这些处理器可能在设备固件(ROM)的程序下运行,或者在初始化的时候下载的过程控制之下。 

  我们可以充分利用设备的智能,利用硬件的功能可以提高驱动程序的执行和诊断能力。 

  测试硬件 
  
  硬件应该在早期进形测试,除了有机会发现硬件错误之外,也提供一个发现设备动作的过程。 

  1. 基本测试: 确定所有的联机都已经正确连接后打开开关,装入执行程序,确定所有的资源不冲突。 

  2. 分别测试: 如果可能的话,为所有的硬件和固件编写单独的测试程序,这些常常是一些没有在操作系统帮助下运行的程序。幸运的话,硬件设备的制造商会提供一些测试程序。 

  最后,记得去测试设备的侦测和汇报错误的能力。 

  小结 

  本章粗略的介绍了硬件的问题,一个驱动程序需要发现它控制的设备,确定需要请求的资源。后来的章节将介绍WIN2000的使这些变的容易的服务。 
文章录入:flyongrass    责任编辑:flyongrass 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 基于WindowsCE的GPS数据导航…

  • Windows CE.net的智能移动信…

  • Windows CE.net的智能移动信…

  • 基于Windows CE的COM应用开发

  • WinCE操作系统的基本体系结构

  • Microsoft Windows CE 编程的…

  • WinCE开发常识

  • 开发windows ce 程序一定要掌…

  • Windows CE在嵌入式工业控制…

  • 如何安装Windows CE ?

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)