智能无线抄表系统中CC1101的WinCE驱动开发
2WinCE下SPI驱动程序开发
Win CE下的SPI驱动属于流驱动。流驱动是能够导出流接口函数的驱动程序。在设计此类驱动时,把设备驱动程序当成一种特殊的文件,接口函数与一般的文件APl函数一样,比如CreatFile(),WriteFile(),ReadFile()和CloseHandle()等,因此在应用程序设计时可以通过使用文件系统API来调用驱动程序,以达到访问设备的目的。SPI驱动是一个动态链接库(DLL),可以被加载到内核空间,成为内核模式驱动。
SPI驱动程序是操作系统与硬件之间的接口,是对硬件设备的抽象。操作系统可以通过驱动程序来对设备进行操作和管理。当应用程序需要读取底层的物理器件输出时,就必须通过操作系统内核来加载特定的设备驱动程序,通过驱动程序来与底层的硬件进行通信,然后将读取信息传入应用程序中。当为WinCE5.0添加外围设备时,必须以流接口驱动方式提供给操作系统内核,再由操作系统对其进行加载,加载正确后,才可以在应用程序中通过标准的I/O函数调用底层的驱动。
WinCE5.0设备驱动程序开发中最重要的是设备相关寄存器的配置。寄存器的配置包括将寄存器地址映射到内核进程的虚拟地址,在串口操作的不同阶段配置好各种寄存器。这里,给出了在无线通信领域中,基于S3C2410和WinCE 5.0的具体应用方案,并在该应用测试方案上设计基于WinCE 5.0的设备接口驱动。现在开始建立WCE Dynamic-Link Library工程SPI_Driver,然后编写驱动程序接口函数。基于Win CE设备流驱动程序的开发,不管是什么设备,它们的实现框架都是相同的,只要把相关流接口实现即可。下面介绍几个常用的函数和测试操作。
2.1 DllEntry()函数
该函数是动态链接库的入口,每个动态链接库都需要输出这个函数,但它只在动态库被加载和卸载时才被调用,它是每个动态链接库最早被调用的函数,一般用它做一些全局变量的初始化。
2.2 SPI_Init()函数
该函数是驱动程序动态库被成功装载后第一个被调用的函数。它的调用时间仅次于DllEntry()函数,驱动程序应当在这个函数中初始化硬件,如果初始化成功,就分配一个自己的内存空间,将自己的状态保存起来,并且将该内存块的地址作为一个DWORD值返回给上层。设备管理器就会在调用SPI_Open()时将该句柄传回。如果初始化失败,则返回零以通知这个驱动程序没有加载成功,先前所分配的系统资源应该全部释放,此程序的生命即告终止。VirtualAlloc()和VirtualCopy()函数用来实现虚拟内存空间的分配,并且映射到硬件的物理地址,在Ini-tAddrlO()和InkAddrSPIreg()中被调用。初始化软件流程如图2所示。本文引用地址://m.amcfsurvey.com/article/162233.htm
2. 3 SPI_Open()函数和SPI_Close()函数
当用户程序调用CreateFile()打开这个设备时,设备管理器就会讽用此驱动程序的SPI_Open()函数。
当用户程序调用CloseHandle()关闭这个设备时,SPI_Close()函数就会被设备管理器调用。参数hOpenContext是SPI_Open()返回给上层的那个值。 SPI_Close()函数应该做与SPI_Open()相反的事情,具体包括释放SPI_Open()分配的内存,将驱动程序被打开的计数减少等。
评论