驱动程序设计.ppt
驱动程序设计驱动程序设计嵌入式操作系统嵌入式操作系统Windows CE课程安排课程安排提纲Windows CE 5.0驱动程序简介驱动程序简介流接口驱动程序分析流接口驱动程序分析动动手动动手简单的流接口驱动程序简单的流接口驱动程序LED点阵发光原理点阵发光原理设备的硬件接口电路分析设备的硬件接口电路分析Windows CE访问设备地址的实现访问设备地址的实现LED点阵驱动程序分析点阵驱动程序分析驱动程序简介驱动程序简介设备驱动程序是使操作系统和用户应用程序能够与外设硬件(与目标设备集成或连接的)交互的组件,例如 Peripheral Component Interconnect(外围组件互联,PCI)总线、键盘、鼠标、串口、显示、网络适配器和存储设备。操作系统(OS)载入相应设备驱动程序,然后使用这些驱动程序提供的函数和输入/输出(I/O)服务,在设备上执行操作,而非直接访问硬件。驱动程序的功能驱动程序的功能l l驱动程序将操驱动程序将操作系统和设备链作系统和设备链接起来,使得操接起来,使得操作系统能够识别作系统能够识别设备,并为应用设备,并为应用程序提供设备服程序提供设备服务。务。l l驱动程序的任驱动程序的任务,就是把操作务,就是把操作系统的驱动接口系统的驱动接口“映射映射”到具体到具体的功能实现中。的功能实现中。应用程序应用程序应用程序应用程序操作系统操作系统操作系统操作系统网卡驱动程序网卡驱动程序网卡驱动程序网卡驱动程序1 1网卡驱动程序网卡驱动程序网卡驱动程序网卡驱动程序2 2网卡网卡网卡网卡1 1网卡网卡网卡网卡1 1 Send()Send()SendPackageSendPackage()()MySendPackage1()MySendPackage1()MySendPackage2()MySendPackage2()驱动程序基本知识驱动程序基本知识 在 Windows CE 上,设备驱动程序是一个动态链接库(DLL),它提供底层硬件与操作系统及运行在目标设备上的应用程序之间的一个抽象层。驱动程序公开一套知名的函数并提供初始化硬件和与之通信的规则。软件开发人员可以在他们的应用程序中调用驱动程序的函数来与硬件交互。如果设备驱动程序遵循众所周知的应用程序编程接口(API),比如 Device Driver Interface(设备驱动程序接口)(DDI),您就可以把驱动程序作为操作系统的一部分而载入,比如显示驱动程序或用于存储设备的驱动程序。不用知道物理硬件的细节,应用程序就可以调用标准Windows API 函数,比如 ReadFile 或 WriteFile,来使用外设。驱动程序的宿主驱动程序的宿主l如果要运行如果要运行DLLDLL中的代码,那么必须先有一个中的代码,那么必须先有一个EXEEXE进程,把该进程,把该DLLDLL加载到自己的地址空间内,然后才可加载到自己的地址空间内,然后才可执行执行DLLDLL中的代码。中的代码。lWindowsCEWindowsCE的驱动程序也必须被的驱动程序也必须被其他其他EXEEXE宿主宿主加载加载Device.exeDevice.exe 又称做设备管理器,负责加载和管理又称做设备管理器,负责加载和管理又称做设备管理器,负责加载和管理又称做设备管理器,负责加载和管理Windows CEWindows CE下绝大多数的设备驱动程序。下绝大多数的设备驱动程序。下绝大多数的设备驱动程序。下绝大多数的设备驱动程序。GWES.exeGWES.exe负责加载一些与图形界面相关的负责加载一些与图形界面相关的负责加载一些与图形界面相关的负责加载一些与图形界面相关的I/OI/O设备驱动。设备驱动。设备驱动。设备驱动。FileSys.exeFileSys.exe在系统中负责管理在系统中负责管理在系统中负责管理在系统中负责管理Windows CEWindows CE中的对象存中的对象存中的对象存中的对象存储和文件系统,负责加载所有的文件系统驱动程序。储和文件系统,负责加载所有的文件系统驱动程序。储和文件系统,负责加载所有的文件系统驱动程序。储和文件系统,负责加载所有的文件系统驱动程序。驱动程序分类驱动程序分类WindowsCE驱动的分类,主要有以下:按驱动接口分,可分为本地驱动和流驱动;按驱动结构分,可分为单层驱动和分层驱动;按驱动加载的空间分,可分为内核态驱动和用户态驱动;按驱动加载的时间分,可分为启动时加载和需要时加载两种。本地本地 VS 流接口驱动流接口驱动 Windows CE下的驱动都可以归类到这两个里面,二者必居其一,是从驱动程序提供给操作系统的接口来区分的。本地驱动程序通常支持输入和输出外设,比如显示驱动程序、键盘驱动程序、和触摸屏驱动程序。图形、窗口、和事件子系统(GWES)直接加载和管理这些驱动程序。本地驱动程序根据它们的目的而实现特定的函数,由操作系统调用,应用程序不能访问。流驱动程序公开众所周知的一套函数,以启用 Device Manager(设备管理器)来加载和管理这些驱动程序。为了 Device Manager(设备管理器)能够与流驱动程序交互,驱动程序必须实现 Init、Deinit、Open、Close、Read、Write、Seek、和 IOControl 函数。流驱动可以动态管理,驱动调试助手就是用来帮助调试这一类驱动的。单层驱动单层驱动 VS 分层驱动分层驱动 MDD(Model Device Driver)和PDD(Platform Dependent Driver)的概念,这是从驱动代码实现的结构来区分的。Windows CE的驱动可以是单层的,也可以是PDD+MDD,没有硬性规定。一般来说,单层结构的驱动执行效率更高,而分层结构的驱动方便代码维护和移植。拿串口驱动来说,完全可以采用单层结构,而把它分为PDD和MDD,作为一般的开发者,只需实现PDD层就可以了,MDD层由微软实现。这样,驱动开发的工作量少很多,而代码的可靠性则有了更好的保证。至于采用哪一种结构的驱动,主要根据开发人员的需求。内核态驱动内核态驱动 VS 用户态驱动用户态驱动 Windows Embedded CE 6.0引入了内核态驱动和用户态驱动的概念。在Windows CE5.0及先前的版本中,驱动工作在用户态。从代码方面看,内核态驱动和用户态驱动没太大差别。内核态驱动被加载到内核空间,用户态驱动被加载到特定的用户进程空间中。从执行效率来看,内核态的驱动效率比用户态的驱动高。从稳定性方面考虑,用户态的驱动不会对系统产生致命影响,而内核态的驱动相对危险。至于采用哪一种结构的驱动,主要根据开发人员的需求。启动时加载驱动启动时加载驱动 VS 需要时加载驱动需要时加载驱动 从驱动加载的时间来看,可分为两种:系统启动时加载和需要时加载。一般来说本地驱动都是在启动时加载的,在这里主要针对是流驱动来说的。驱动在系统启动时加载,只需将它的注册表配置信息放到HKEY_LOCAL_MACHINEDriversBuiltIn下,如HKEY_LOCAL_MACHINEDriversBuiltInBattery,系统启动时,Device Manager会自动加载它。需要时加载,动态加载,很灵活。注意:USB设备的驱动加载,如USB摄像头驱动,它也属于需要时加载的驱动。从驱动的接口来看,它属于流驱动,但相对普通的流驱动,它增加了几个函数:USBDeviceAttach()、USBInstallDriver()、USBUnInstallDriver()等。USB摄像头驱动的加载在USBDeviceAttach()中完成。所以,它无须,也不能用驱动调试助手加载。需要时加载的驱动还有一个作用,在无法修改系统的情况下,应用程序中动态加载该驱动,以完成对硬件的操作。课程安排课程安排提纲Windows CE 5.0驱动程序简介驱动程序简介流接口驱动程序分析流接口驱动程序分析动动手动动手简单的流接口驱动程序简单的流接口驱动程序LED点阵发光原理点阵发光原理设备的硬件接口电路分析设备的硬件接口电路分析Windows CE访问设备地址的实现访问设备地址的实现LED点阵驱动程序分析点阵驱动程序分析流接口驱动程序流接口驱动程序 流接口驱动程序是实现流接口函数的设备驱动程序。不管硬件细节,所有Windows CE流驱动程序都公开流接口函数给操作系统,从而Windows CE的Device Manager(设备管理器)可以载入并管理这些驱动程序。在流式接口驱动程序中,驱动程序负责把外设抽象成一抽象成一个文件个文件,而应用程序则使用操作系统提供的文件API对外设进行访问。典型的流接口驱动程序有:文件系统驱动 串口驱动流接口驱动程序的体系结构流接口驱动程序的体系结构硬件硬件流接口驱动程序流接口驱动程序设备管理器设备管理器(device.exe)应用程序应用程序FileSys.exe流接口驱动程序的体系结构流接口驱动程序的体系结构其中电源管理的部分是可选的,在实际开发中接口名称中的其中电源管理的部分是可选的,在实际开发中接口名称中的XXX三个字母由设备驱动的设备文件名前缀代替。三个字母由设备驱动的设备文件名前缀代替。动动态态连连接接库库函函数数标准的流接口函数标准的流接口函数开发工具开发工具PlatformBuilderVisualStudio2005eMbeddedVisualC+(EVC)通用的流接口驱动通用的流接口驱动编写流接口驱动的步骤:选择定义一个设备文件名;实现所需流接口函数;创建驱动的模块定义文件(.def),导出必要的标准流接口函数;编辑必要的注册表键值,以加载流接口驱动。设备文件名设备文件名流接口驱动作为一个特殊的设备文件系统;两种不同的设备文件的命名方式:传统方法:前缀+索引+冒号例:“COM1:”,“LED1:”前缀三个大写字母存储在驱动程序对应注册表键的“Prefix”子键中索引区分同一个驱动程序管理的不同设备缺省:09,可通过“index”的值指明起始索引数适合大多数流式驱动,最大只能指定10个设备;设备文件名设备文件名Device:$device+前缀+索引例:“$deviceCOM1”命名方法与传统命名方法相似;支持多于10个流设备名;例:“$deviceCOM27”课程安排课程安排理论Windows CE 5.0驱动程序简介驱动程序简介流接口驱动程序分析流接口驱动程序分析动动手动动手简单的流接口驱动程序简单的流接口驱动程序LED点阵发光原理点阵发光原理设备的硬件接口电路分析设备的硬件接口电路分析Windows CE访问设备地址的实现访问设备地址的实现LED点阵驱动程序分析点阵驱动程序分析实验标准的流接口驱动程序开发与测试标准的流接口驱动程序开发与测试动动手动动手简单的流接口驱动程序借助WindowsCE5.0EmbeddedDevelopmentLabs.msi1.用用 Platform Builder 打开现有的打开现有的 MyPlatform 工作区。工作区。2.在在 File 菜单上,单击菜单上,单击 New Project or File。3.选择选择 WCE Dynamic-Link Library,给它一个合适的,给它一个合适的名称(例如,名称(例如,StreamDrv),然后单击),然后单击 OK,如图。,如图。添加一个作为设备驱动程序的项目4.在下图所显示的页面中填写一些您需要的信息,然后在下图所显示的页面中填写一些您需要的信息,然后单击单击 Next。5.选择选择A simple Windows CE DLL project,单击Finish完成此向导。6.为驱动程序选择一个唯一的三字母标识符。在为驱动程序选择一个唯一的三字母标识符。在 Location 框中输入之前创建的流驱动程序的完整路径,框中输入之前创建的流驱动程序的完整路径,或者使用或者使用“browse”按钮定位。按钮定位。7.在在 Driver Filename 框中输入驱动程序的名称。如图,框中输入驱动程序的名称。如图,使用与前面使用名称使用与前面使用名称(StreamDrv)相同的名称,以确相同的名称,以确保改写在保改写在 Platform Builder 中创建的原始文件。中创建的原始文件。8.按按 Go,将生成流驱动程序源代码。,将生成流驱动程序源代码。小结小结驱动程序只不过是一些驱动程序只不过是一些 DLLDLL。驱动程序被映射到驱动程序被映射到 Device.exeDevice.exe 进程地址空间中。进程地址空间中。驱动程序公开了一个众所周知的接口集。驱动程序公开了一个众所周知的接口集。将设备驱动程序添加到将设备驱动程序添加到 Windows CE Windows CE 操作系统映操作系统映像中相对容易的多。像中相对容易的多。课程安排课程安排提纲Windows CE 5.0驱动程序简介驱动程序简介流接口驱动程序分析流接口驱动程序分析动动手动动手简单的流接口驱动程序简单的流接口驱动程序LED点阵发光原理点阵发光原理设备的硬件接口电路分析设备的硬件接口电路分析Windows CE访问设备地址的实现访问设备地址的实现LED点阵驱动程序分析点阵驱动程序分析LED点阵原理点阵原理 从右图可以看出,从右图可以看出,8X88X8点阵共需要点阵共需要6464个个发光二极管组成,且发光二极管组成,且每个发光二极管是放每个发光二极管是放置在行线和列线的交置在行线和列线的交叉点上,当某一行置叉点上,当某一行置1 1电平,对应的某一电平,对应的某一列置列置0 0电平,则相应电平,则相应的二极管就亮。的二极管就亮。课程安排课程安排提纲Windows CE 5.0驱动程序简介驱动程序简介流接口驱动程序分析流接口驱动程序分析动动手动动手简单的流接口驱动程序简单的流接口驱动程序LED点阵发光原理点阵发光原理设备的硬件接口电路分析设备的硬件接口电路分析Windows CE访问设备地址的实现访问设备地址的实现LED点阵驱动程序分析点阵驱动程序分析硬件接口电路分析硬件接口电路分析PXA270RPPXA270RP目标板目标板LEDLED点阵接口电路如图所示:点阵接口电路如图所示:在实验系统上,整个在实验系统上,整个LEDLED显示模块是作为一个显示模块是作为一个I/OI/O进行进行控制的。控制的。LEDARYLEDARY的寄存器地址是的寄存器地址是0 x0C00 C0000 x0C00 C000,CPUCPU向该向该地址寄存器写一个地址寄存器写一个1616位的数据控制相应位的数据控制相应LEDARYLEDARY点的亮灭,点的亮灭,高八位和低八位分别控制高八位和低八位分别控制LEDARYLEDARY的行和列。的行和列。硬件接口电路分析硬件接口电路分析课程安排课程安排提纲Windows CE 5.0驱动程序简介驱动程序简介流接口驱动程序分析流接口驱动程序分析动动手动动手简单的流接口驱动程序简单的流接口驱动程序LED点阵发光原理点阵发光原理设备的硬件接口电路分析设备的硬件接口电路分析Windows CE访问设备地址的实现访问设备地址的实现LED点阵驱动程序分析点阵驱动程序分析Windows CE访问设备地址的实现访问设备地址的实现WindowsCE操作系统中,内存访问都是基于虚拟地址的,在驱动或者应用中不能直接访问设备的物理地址。因此,在访问设备地址时,需要将物理地址映射成为相应的虚拟地址。WindowsCE中常用的内存映射的APIVirtualAlloc()申请虚拟内存VirtualCopy()在物理内存和虚拟内存之间建立映射关系VirtualFree()释放虚拟内存MmMapIoSpace()CEDDK中提供的API,内部调用VirtualAlloc()和VirtualCopy()完成内存分配及映射MmUnMapIoSpace()取消内存映射Windows CE访问设备地址的代码示例访问设备地址的代码示例/定义一个指针变量volatileDWORD*g_pLedary=NULL;/设备的物理地址#defineLEDARY_PHYADDR0 x0800c000/初始化设备的默认值#defineLEDARY_INITVAL0 x000055aa/定义一个结构PHYSICAL_ADDRESSPA;PA.QuadPart=LEDARY_PHYADDR;/将物理地址映射成一个虚拟地址g_pLedary=(volatileDWORD*)MmMapIoSpace(PA,sizeof(DWORD),FALSE);/写设备*g_pLedary=LEDARY_INITVAL;/释放申请的系统资源MmUnmapIoSpace(PVOID)g_pLedary,sizeof(DWORD);课程安排课程安排提纲Windows CE 5.0驱动程序简介驱动程序简介流接口驱动程序分析流接口驱动程序分析动动手动动手简单的流接口驱动程序简单的流接口驱动程序LED点阵发光原理点阵发光原理设备的硬件接口电路分析设备的硬件接口电路分析Windows CE访问设备地址的实现访问设备地址的实现LED点阵驱动程序分析点阵驱动程序分析LED点阵驱动程序分析(点阵驱动程序分析(1/5)LEDLED点阵物理地址和初始值的定义:点阵物理地址和初始值的定义:#define LEDARY_PHYADDR0 x0C00C000#define CPLD1_MST_STATUS0 x08000018/0 x08000018#define LEDARY_INITVAL0 x00000000/0 x000055aaLED点阵驱动程序分析(点阵驱动程序分析(2/5)驱动程序的初始化函数驱动程序的初始化函数XXX_InitXXX_Init主要完成对设备的初始化。这个函数主要完成对设备的初始化。这个函数并不是由应用程序直接调用的,而是通过设备管理器提供的并不是由应用程序直接调用的,而是通过设备管理器提供的ActivateDeviceExActivateDeviceEx()函数来调用的。该初始化函数主要完成()函数来调用的。该初始化函数主要完成LEDLED点阵的物理地址到虚拟地点阵的物理地址到虚拟地址的转换。址的转换。DWORD LED_Init(DWORD dwContext)PHYSICAL_ADDRESS PA;RETAILMSG(1,(TEXT(*Ledary:LED_Initrn);PA.QuadPart=LEDARY_PHYADDR;g_pLedary=(volatile DWORD*)MmMapIoSpace(PA,sizeof(DWORD),FALSE);PA.QuadPart=CPLD1_MST_STATUS;g_pCPLD1=(volatile BYTE*)MmMapIoSpace(PA,sizeof(BYTE),FALSE);PA.QuadPart=BULVERDE_BASE_REG_PA_GPIO;g_pGPIORegs=(BULVERDE_GPIO_REG*)MmMapIoSpace(PA,0 x400,FALSE);if(g_pLedary&g_pCPLD1&g_pGPIORegs)g_pGPIORegs-GPDR2=g_pGPIORegs-GPDR2|(1GAFR2_L=g_pGPIORegs-GAFR2_L&(3GAFR2_L=g_pGPIORegs-GAFR2_L|(230);/Set GPIO79 as ncs3 *g_pCPLD1=*g_pCPLD1|(1=sizeof(DWORD)*g_pLedary=*(PDWORD)pBuffer);return sizeof(DWORD);return 0;XXX_WriteXXX_Write用于向设备进行写操作,该操作完成控制用于向设备进行写操作,该操作完成控制LEDLED点点阵的亮灭情况,应用程序使用阵的亮灭情况,应用程序使用WriteFileWriteFile函数来通知操作系函数来通知操作系统调用该函数。统调用该函数。LED点阵驱动程序分析(点阵驱动程序分析(5/5)其他流驱动接口函数:其他流驱动接口函数:DWORD LED_Read(DWORD hOpenContext,LPVOID pBuffer,DWORD Count)if(Count=sizeof(DWORD)return sizeof(DWORD);return 0;void LED_PowerUp(DWORD hDeviceContext)ledary.def文件文件ledary.defledary.def文件的内容:文件的内容:LIBRARY ledaryEXPORTS LED_InitLED_DeinitLED_OpenLED_CloseLED_ReadLED_WriteLED_SeekLED_PowerDownLED_PowerUpLED_IOControlledary.reg注册表注册表文件文件ledary.regledary.reg注册表注册表文件的内容:文件的内容:HKEY_LOCAL_MACHINEDriversBuiltInledaryIndex=dword:1Prefix=LEDDll=ledary.dllOrder=dword:0思考思考PXA270RPPXA270RP八段数码管八段数码管八段数码管原理八段数码管原理八段数码管由8个发光二极管组成,其7个长条形的发光管排列成“日”字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,能显示各种数字及部分英文字母。有两种不同的形式:共阳极和共阴极。共阴和共阳结构的八段数码管各笔划段名和安排位置是相同的。8个笔划段hgfedcba对应于一个字节(8位)的D7D6D5D4D3D2D1D0。想一想?想一想?对于共阴的八段数码管,当共阴极接地(为零电平),对于共阴的八段数码管,当共阴极接地(为零电平),显示器显示显示器显示“P P”字符时,那阳极字符时,那阳极hgfedcbahgfedcba各段为多少?各段为多少?即即“P P”字符的字形码是?字符的字形码是?如果是共阳的八段数码管,共阳极接高电平,那显示如果是共阳的八段数码管,共阳极接高电平,那显示“P P”字符的字形代码应为?字符的字形代码应为?1.阳极hgfedcba各段为01110011时,即对于共阴极的八段数码管,“P”字符的字形码是73H。2.对于共阳极的八段数码管,“P”字符的字形代码是10001100(8CH)。硬件接口电路分析硬件接口电路分析PXA270RPPXA270RP目标板八段数码管接口电路如图所示:目标板八段数码管接口电路如图所示:BSP添加驱动的步骤添加驱动的步骤用文档编写器编写驱动的源程序代码。在%_WinCEROOT%PlatformBspNameSrcDrivers下新建一个目录名(LED)。把编写驱动的源程序代码文件复制到“LED”目录下。在LED目录下建立好三个文件:MakefileSourcesLED.defMakefile文件文件WindowsCE的构建系统大量使用了Nmake工具和makfile,在大多数微软的软件和驱动开发包中都会包含Nmake工具。一般Windows下的许多集成开发环境(例如:VisualStudio和PlatformBuilder等)可以帮助开发人员完成makefile需要完成的功能。makefile负责帮助开发人员简化代码的编译、链接等构建工作。makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,像一个自动化脚本一样,其中也可以执行操作系统的命令。最大的好处是“自动化构建”。Makefile文件文件makefile本质上只是一个文本文件,本身并不能运行。在运行makefile的时候还是需要外部程序来对makefile进行解释执行,NMake.exe就是用来解析并执行makefile的工具。当用户输入nmake命令后,首先nmake会读取makefile,然后解析makefile,并根据makefile的规则来确定要编译哪些代码。然后nmake会调用编译器、链接器等一些开发工具,完成对代码的编译链接,最终会生成可执行文件。Sources文件文件Sources文件的结构:TARGETNAME=ledTARGETTYPE=DYNLINKRELEASETYPE=PLATFORMWINCEOEM=1DEFFILE=led.defINCLUDES=$(INCLUDES)TARGETLIBS=$(_COMMONSDKROOT)lib$(_CPUINDPATH)coredll.lib$(_COMMONOAKROOT)lib$(_CPUINDPATH)ceddk.lib$(_TARGETPLATROOT)lib$(_CPUINDPATH)pxa27x_xllp.libSOURCES=led.cLED.def文件文件LED.def文件的内容:文件的内容:LIBRARYledEXPORTSLED_InitLED_DeinitLED_OpenLED_CloseLED_ReadLED_WriteLED_SeekLED_PowerDownLED_PowerUpLED_IOControlBSP添加驱动的步骤添加驱动的步骤修改%_WinCEROOT%PlatformBspNameSrcDrivers目录下的DIRS文件:DIRS=extkeygpioledLedaryledEmotorDrvBSP添加驱动的步骤添加驱动的步骤修改%_WinCEROOT%PlatformBspNameFiles目录下的注册表文件:platform.regHKEY_LOCAL_MACHINEDriversBuiltInledIndex=dword:2Prefix=LEDDll=led.dllOrder=dword:0修改%_WinCEROOT%PlatformBspNameFiles目录下的配置文件:platform.bibled.dll$(_FLATRELEASEDIR)led.dllNKSHK课后作业课后作业1.简要说明编写流接口驱动的步骤。Thank you!