从8/16位到32位微机接口技术变化与对策(上)华中科技大学计算机学院武汉豪申光电新技术有限公司2006.7演讲人:李畅内容提要1.实验环境介绍2.基本IO接口实验3.PCI接口实验4.实验内容安排①在Windows下运行DOS程序②在纯DOS模式下运行基本实验内容③用VC++编写程序驱动硬件实验环境介绍1.实验系统的组成结构2.实验操作说明实验系统组成框图MFID实验系统软件环境硬件环境驱动程序PCI驱动卡集成软件开发环境实验平台板面包板实验区PCI驱动卡PCIBus32bit,33MHzPCI9052/9054SerialEEPROMCPLDISABus8bit,upto40MHzSRAMCSconfig,JumpersSRAMPCI驱动卡1.功能:①连接PC机和平台板桥梁②实现用户资源到系统的双向映射③真正的32位实验设备2.设计思想:①采用PLX9054芯片支持主控DMA②采用32K×32b位存储器作为32位存储器的实验对象③在板CPLD硬件设计更加灵活④E2PROM提供方便的硬件配置功能实验平台布局图实验平台板1.功能:①提供基本接口芯片②提供典型的IO被控对象及控制开关③提供仿ISA总线④提供扩展的接口信号线2.设计思想:①要具有灵活的接线方式②要具有典型而非重复的被控对象③要具有安全稳定的电源模块④各模块能够任意组合⑤满足不同层次的学生进行实验和课程/毕业设计软件环境软件环境1.功能:①提供统一的C/C++、汇编、Win32汇编语言的编辑、编译、调试环境②提供教师备课功能③提供联机的实验说明④具有方便的硬件检测程序2.设计思想:①要集多种功能于一体②要具有方便的调试编程工具③具有方便的硬件管理及维护功能④实验内容及说明能够灵活配置⑤要具有方便实验同步说明驱动程序介绍驱动程序是连接上层应用软件与底层硬件的桥梁;我们知道,随着操作系统的发展,其稳定性越来越高,究其原因,就是其保护机制在起作用。特别是windows2K及XP,完全限制了应用层程序对底层硬件的直接访问,因此,我们在2K或XP下对硬件的操作必须要由驱动程序来完成。“驱动程序提供的接口”我们将会在后面详细说明实验说明1.实验步骤:打开MFIDE软件环境,从左边的目录树中,选择相应的实验项目将其展开选择相应的实验说明,阅读实验说明书,查看实验原理图并正行正确连线点击相应目录树中的实验源程序或直接打开源程序或自己创建新程序进行编译-连接-运行,查看实验现象2.(初次实验,最好先阅读实验注意事项)本实验板的资源1.本平台系统提供的I/O地址范围是300H~30FH,目前已使用的I/O地址有:2.8255A:300H~303H3.8253A:304H~307H4.8251A:308H~30BH5.ADC0809:30CH、30EH6.DAC0832:30FH7.8237A:主片0~0FH;从片0C0H~0DEH8.8259A:主片20H,21H;从片0A0H,0A1HDOS模式下的端口操作C语言形式:(DOS.H头文件中声明)输出:outportb()输入:Inportb()汇编语言形式:输出:MOVDX,303HMOVAL,81HOUTDX,AL输入:MOVDX,300HINAL,DX基本IO实验(虚拟DOS程序)1.展示步进电机的演示程序2.展示步进电机的DOS程序3.实验安排:(操作时间)①熟悉软件环境②阅读实验源程序,体会程序设计思想③了解平台板上的一些基本模块及功能4.问题:为什么DOS程序可以在Windows下实现IO操作?软件编程模型对于不同的操作系统,其编程模型也不相同。1.对于Windows2K/XP分为两种情况,一种是虚拟DOS另一种是Windows下的WIN32程序。由于Windows对硬件操作的保护,我们不能直接对硬件控制,因此要用到以下的编程模型2.对于DOS操作系统,对硬件的操作没有任何限制,因此,我们可以直接对PCI卡进行操作。虚拟DOS程序1.虚拟DOS程序(运行于Ring3层)在Windows2000的DOS虚拟机(DOSVM)下运行,每一个Dos程序对应一个DOS虚拟机。2.DOSVM中的程序通过VDD(VirtualDeviceDriver)和WDM通信访问硬件端口。Windows程序1.Windows应用层程序(运行于Ring3层)在Windows2000的系统虚拟机(SystemVM)下运行,通过调用WDM设备驱动程序(运行于Ring0层)访问硬件端口。Window2k/XP编程模型MS-DOSApplicationNTVDMInteceptVDDWin32APIFunctionIOManagerKernel_modedevicedriverHard_waredeviceWin32ApplicationUserModeinRing3KernelModeinRing0应用层对于16位DOS程序,当发生IO操作时,VDD会截获其操作,并通过调用底层的WDM驱动程序来完成IO操作并返回结果对于32位应用程序,用户在应用程序中,通过WindowsAPI函数来调用驱动程序驱动设备按照指定的方式工作见示例VDD驱动层此层主要提供16位DOS应用程序在Windows2K/XP下访问硬件的功能,它属于一个中间层,向上为DOS程序提供接口,向下,调用Kernel_ModeDriver实现硬件操作功能。它主要截获inportb(),outportb()及硬件中断方面的操作并实现它WDM驱动层驱动层完成的任务主要是实现PCI资源的映射以及向上层应用程序提供操作硬件的接口,并且实现PCI的PnP、DMA及电源管理等功能驱动程序提供给上层应用层的接口及实现方法将在驱动程序设计中介绍PCI接口实验(Win32程序)在进行PCI接口实验前,有必要先了解一下PCI9054卡的一些硬件结构及相关的一些概念。通过以下内容体会基于PCI总线的接口技术与以前的接口技术有何区别。在最后将以以下两个程序为例,介绍PCI设备的编程思想①PCI配置空间实验②高级步进电机实验PCI硬件基础CPUs处理器总线NorthBridgePCI总线SouthBridge(驱动板)LocalBusMFID平台板IoBase=0xC400IoOffset=0x1FIntNumber=21IoBase=0x300IoOffset=0x1F物理的中断信号线WDM(Ring0)IoBase=0xC400IoOffset=0x1FIntNumber=21Windows2000WinApp(Ring3)(WinSystemVM)DOSApp(DOSVM)IoBase=0x300IoOffset=0x1FIntNumber=10MFVDDMFID软、硬件进行的I/O变换和中断路由从图中可以看出整个实验平台在系统中的层次。接口目标设备通过PCI9054驱动卡连入到系统。在此卡中,起主要作用的是PLX9054芯片,它实现了PCI总线到应用面比较广泛的LOCAL总线之间的桥接功能。而接口平台板则是挂接在LOCAL总线之上。因此,在当前的硬件环境要设计接口卡,涉及到两方面内容一个是我们常规的接口设备的设计另一个是PCI总线到LOCAL总线的接口设计。常规接口设计就是实验平台板上所涉及的内容,总线接口设计就是我们下面所要讨论的问题。为突出问题的重点,我们来看看基于PCI总线的扩展卡设计有哪些特点及会出现什么问题:1.扩展设备设计与系统分离:设计扩展设备时是面向LOCAL总线而不是系统本身。而LOCAL总线又是可以自由配置的,因此设计灵活性较大2.资源的自动分配:所有资源的分配都是系统根据当前资源使用情况来配置,不需要用户分配。系统比用户更了解当前资源的使用情况,因此不会出现冲突现像,而且非常方便。3.LOCAL地址空间的重映射:LOCAL侧的地址可以重映射到系统空间中,实现地址的重定位。上面三点是PCI设计带来的好处,为了实现这些功能,采用下面了一些技术:1.PCI配置空间2.LOCAL配置空间3.基地址映射4.配置机构PCI配置空间定义一个PCI总线配置空间的目的在于提供一套适当的配置措施,使之实现完全的设备再定位而无需用户干预安装、配置和引导,并由与设备无关的软件进行系统地址映射PCI配置空间是PCI协议的内容,每个PCI功能都必须实现该配置空间。PCI配置空间实质上是一组相邻的寄存器PCI配置空间头区域的格式每个PCI功能都有64个双字配置空间,PCI协议定义了这个配置空间的开头16个双字的格式和用途,称为设备的配置空间头区域,剩下的48个双字的用途由PCI设备来定义。目前PCI协议(2.2版本)定义了3种类型的头区域格式,0类用于定义标准PCI设备,1类配置头区域用于定义PCI-PCI桥,2类配置头区域用于PCI-CardBus桥。0类配置空间头区域结构布局图PCI配置空间的功能①设备识别功能②设备控制功能③设备地址的映射功能(重点)④提供设备状态⑤头区域中其他寄存器的功能LOCAL配置空间PCI协议中只定义了PCI配置空间的格式,为了实现PCI总线到LOCAL总线的桥接,PLX9054中也实现了LOCAL配置空间,该配置空间的主要作用是实现LOCAL总线的配置。如LOCAL侧的IO基地址/存储器基地址和LOCAL侧需要的资源大小等LOCAL配置空间的格式PCI配置空间与LOCAL配置空间PCI配置空间与LOCAL配置空间既相互联系,又相对独立。联系体现在两配置空间中的寄存器之间有一定的对应关系独立体现在两配置空间的基地址不同,而且分别控制不同的总线工作方式。下面重点看看两者间的联系,这是编写控制程序的关键。PCI与LOCAL配置空间的联系主要是基地址寄存器的对应关系。下面先来看看相关的概念PCI基地址寄存器PCI配置空间中有六个基地址寄存器用来存放映射基地址。在PCI协议中每个基地址寄存器既可作为存储器的基地址映射也可作为IO基地址的映射,具体是哪种映射可由该寄存器格式来判断。另外,对于不同厂商的PCI芯片,其基地址的映射关系可能不同。下面可以看到在PLX9054中每个基地址寄存器的作用。PCI基地址寄存器的格式基址寄存器为32位,所有的基址寄存器,位0均为只读位,并且用来决定是将设备映射到存储空间还是I/O空间。该位若为0,则表示映射到存储器空间;若为1,则表示映射到I/O地址空间。映射到IO空间的基地址格式将设备映射到I/O地址空间的基址寄存器支持映射到32位地址空间。其中,位0恒为1,位1为保留位,并且保留位的读出值必须为0。其余各位用来把设备映射到I/O地址空间31201基地址保留I/O空间标志10映射到存储空间的基地址寄存器格式存储器空间的基址寄存器映射的地址空间可以是32位或64位,但在具体实现过程中,除了低4位应符合上述要求外,其高位部分的实际使用位数要根据映射多大的地址空间范围来决定,32位或64位的限制只是一个上限。例如,一个设备希望1MB的地址空间(用32位基址寄存器)时,应使用寄存器的高20位。LOCAL基地址寄存器组1.Space0①Space0RangeRegister②Space0RemapRegister③Space0DescriptorsRegister2.Space1①Space1RangeRegister②Space1RemapRegister③Space1DescriptorsRegisterLOCAL地址寄存器格式LOCAL基地址寄存器格式如下图所示最低位表示映射的使能位为0表示不允许映射为1表示允许映射。当该寄存器为IO地址时其各位的作用如图1,若该寄存器为存储器地址时,其各位的作用如图2。地址空间的映射1.PCI设备可以在地址空间中浮动是PCI总线中最重要的功能之一,它能够简化设备的配置过程。在系统上电时,与设备无关的系统软件必须确定有哪些设备存在,同时,建立一个统一的地址映射关系,并确定一个设备是否有扩展ROM。2.系统初始化软件在引导操作系统之前,必须要建立起一个统一的地址映射关系。也就是说,必须确定在系统中有多少存储器和I/