1 / 27

WINCE 驱动开发初探

WINCE 驱动开发初探. AEC 陈辉 2005.8.31. CONTENT. WINCE 驱动程序概述 WINCE 驱动开发流程及相关技术 i.mx21 开发板键盘驱动实例分析 ADC 系统串口键盘 / 鼠标驱动开发方案. WINCE 驱动程序概述. 所有的驱动都是动态链接库。 驱动实现过程中可调用所有标准的 API 函数。 CE 驱动程序模型。 可以分为本机驱动程序和流接口驱动程序 加载方式不同。本机驱动程序一旦系统启动就加载,而流接口驱动则是需要时加载。. WINCE 驱动程序概述.

saman
Download Presentation

WINCE 驱动开发初探

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. WINCE 驱动开发初探 AEC 陈辉 2005.8.31

  2. CONTENT • WINCE驱动程序概述 • WINCE驱动开发流程及相关技术 • i.mx21开发板键盘驱动实例分析 • ADC系统串口键盘/鼠标驱动开发方案

  3. WINCE驱动程序概述 • 所有的驱动都是动态链接库。 • 驱动实现过程中可调用所有标准的API函数。 • CE驱动程序模型。 • 可以分为本机驱动程序和流接口驱动程序 • 加载方式不同。本机驱动程序一旦系统启动就加载,而流接口驱动则是需要时加载。

  4. WINCE驱动程序概述 • GWES加载的有键盘/鼠标、触摸屏、显示器、电源、LED等 • DEVICE.EXE加载的驱动有本地驱动PCMCIA控制器、USB控制器、NDIS.DLL, 也有流接口驱动,如声音、串口、并口等 • 需要时才加载的如PC卡的USB设备的等

  5. WINCE驱动程序概述 • 中断处理分内核模式(ISR)的中断服务例程和用户模式的中断服务线程(ISP)。前者返回中断号给内核,后者接收中断后进行中断处理。 • 设备驱动加载后,产生中断IST,注册到中断处理器。 • 调用InterruptDisable来删除IST与逻辑中断的连接。

  6. WINCE驱动程序概述 • 中断处理过程如下 1.中断发生,内核跳至异常处理程序 2.异常处理程序使所有的中断无效,然后调用合适的中断服务例程准备物理中断。 3.经中断服务例程以中断标识符形式返回逻辑中断。 4.中断处理程序重新启动除当前中断以外的所有中断,并把信号传递给适当的中断服务线程。

  7. WINCE驱动程序概述 5.中断服务线程调用依赖平台的驱动程序来访问硬件和完成逻辑中断的处理。 6.中断服务程序调用InterruptDone函数. 7.中断处理程序重新启动当前中断,并在OAL中调用OEMInterruptDone函数。 中断有256个优先级,缺省CE驱动为97-152.

  8. WINCE驱动程序概述

  9. WINCE驱动程序概述 • 本机驱动程序按照设计的不同可以分为单片驱动程序和分层驱动程序。单片驱动是将硬件设备的功能直接传递给操作系统;分层则有模型设备驱动程序(MDD)和依赖平台的设备驱动程序(PDD)两类。

  10. WINCE驱动程序概述

  11. WINCE驱动开发流程及相关技术 • 1选择使用分层的还是单片的驱动结构。 • 2熟悉微软和第三方提供的驱动源代码、开发环境(PB)中操作、编译和调试的方法。 • 3.找一个相近的驱动,拷贝到自己的驱动目录下,然后进行配置文件的修改以及代码的修改与优化。 • 4.编译无错后加入到OS中。

  12. WINCE驱动开发流程及相关技术 • 5.在PB-IDE中编译run-time image来包含该驱动。 • 6.在PB中对驱动进行断点调试。在不同模块以及程序入口设置断点,都运行完毕并且中断服务程序功能正确,完成调试。 • 7.使能CETK到OS,然后进行CETK的测试。

  13. i.mx21开发板键盘驱动实例分析 • 键盘直接挂到i.mx21上 • 键区6乘6,矩阵扫描 • 关系紧密的三个文件,一个是keypad.h, 一个是keypad_map.h,和keypad.c,其中keypad_map.h提供了键区的索引与键的对应。 keypad.h定义了一些全局变量;主驱动程序在keypad.c

  14. ADC串口键盘/鼠标驱动开发方案 • 问题描述 • 串口接收到遥控器发送来的码字,每按一次发送两个字节的相同数据。目标是要能够使用串口捕获到中断,并且调用中断服务程序将接收到的数据进行键值转换,在应用软件层定义对应的键值,一旦满足这样的键值,则发生对应的动作,完成遥控特殊键盘/鼠标的功能。

  15. ADC串口键盘/鼠标驱动开发方案 • 常见驱动可以分为本地驱动和流驱动两种。存储卡,网络驱动等属于流驱动,需要时加载。键盘、显示器、鼠标等属于本地驱动,需要在系统加载时就被调用。 • 串口遥控键盘/鼠标驱动应该属于输入设备驱动,隶属键盘驱动大类。开发环境是PB,可以参考I.mx21的keypad和serial进行修改、编写,编译后进入和系统联系起来调式阶段,调试完成后,使用PB的BSP克隆并添加驱动的方法,将完成的驱动添加到OS中。

  16. ADC串口键盘/鼠标驱动开发方案 • 每个驱动一般用三个字母表示,我们可以使用RMC(Remote Controller)表示。每个驱动按照模块有以下几个部分: • (1)RMC_Init ------Load • (2)RMC_Deinit ------unload • (3)RMC_Open -------Createfile • (4)RMC_Close ------Closehandle • (5)RMC_Read -------readFile • (6)RMC_Write ------writeFile • (7)RMC_Seek ------SetFilePoint • (8)RMC_IOControl -----DeviceControl • (9)RMC_PowerDown ------before suspend • (10)RMC_PowerUp -----system resumes • 我们开发驱动也应该按照这种模块的划分方法,最好在比较接近的驱动的基础上,添加自己的代码完成特殊的功能。

  17. ADC串口键盘/鼠标驱动开发方案 • 键盘驱动的流程 • (1)初始化PFN_KEYBD_DRIVER_INITIALIZE和标准码转换PFN_KEYBD_DRVER_VKEY_TO_UNICODE • (2)中断服务IST • (3)中断响应,转换扫描到虚拟键值 • (4)使用回调函数传虚拟键值到PFN_KEYBD_DRIVER_INITIALIZE_EX或者keybd_even API 到系统输入 • (5)从队列中读出键值事件,转到(1)启动的标准码转换线程 • (6)驱动分析键盘事件,由虚拟的键值产生相应的字母,输入系统将虚拟码字和字母送到应用程式中。

  18. ADC串口键盘/鼠标驱动开发方案 • 解决方案 • 1.读i.mx21的serial.c串口驱动,找到接收到中断的部分。 • 2.对遥控键盘送到串口上的中断进行分析。 • 3.在中断服务例程里加入虚拟键值以及自定义键值的映射。 • 4.进行DEBUG。 • 5.加入到OS中进行CETK测试。

  19. ADC串口键盘/鼠标驱动开发方案 • 键盘的中断 • 每个中断请求对应一个中断服务。一个中断服务程序可以相应多个中断请求源。当中断有效并且产生一个中断,内核调用为该中断注册的ISR。一旦结束,ISR返回中断识别符。系统检查返回的中断识别符然后设置对应的事件。一旦事件设置完毕,中断服务线程开始运行。例外处理器是所有中断的基本处理器,中断产生后,微处理器在核中将控制权交给核中的例外处理器。然后意外控制器调用注册给当前中断的ISR。ISR将中断翻译成逻辑中断符,SYSINTR作为返回值送给核。核对应地设置了事件,导致排列了一个中断服务线程。该线程在设备管理器中运行。

  20. ADC串口键盘/鼠标驱动开发方案 • 如果内核的exception-trapping接受到一个硬件中断,内核会检测异常,内核处理中断,否则到下一步。 • 核中断支援控制器通知ISR停止所有的中断,直到控制完成。 • 例外控制器调用ISR决定如何处理该中断。(不同CPU不用的细节) • 核从ISR得到返回值,使核直到该如何去处理这个中断。 • 如果返回SYSINTR_NOP -------------Kernel does nothing • SYSINTR_RESCHED -------Kernel reschedules the IST • SYSINTR_XXX ----------Logical interrupt value for that specific interrupt source. The kernel triggers the interrupt source ISR so the IST wakes up and does its work. Then, the IST creates an event and waits on it. • 当IST苏醒,IST处理该中断。可能是对数据的搬迁或者特殊的解释。 • 需要的话,IST调用I/O程序来存取硬件操作。 • IST结束工作后,通知Kernel完成,使用InterrputDone。 • 核调用OAL的OEMInterruptDone来结束中断,再次中断使能。

  21. ADC串口键盘/鼠标驱动开发方案 • 在原来的基础上修改 • (1)将原来的驱动代码进行复制,并在WINCE根目录下的Platform下找到自己要用的OS,如果没有自己的OS,可以自己建立。 • (2)在其中的Driver里或者是公共的COMMON里的OAK下找到驱动的原始参考代码包。 • (3 )将包复制并且拷贝到你自己的OS下的Drivers里自己的驱动名称目录下,对SOURCE、DEF等文件进行修改并且修改源代码。 • (4)修改后进行编译;编译的方法可以在PB-IDE中,也可以在PB-〉build-〉open build release directory进入到DOS下,转到驱动的目录下面,输入sysgen命令;等待几分钟编译通过且没有错误的话,输入build –c命令。在IDE里编译的方法,

  22. ADC串口键盘/鼠标驱动开发方案 • 常用的一些函数 • BOOLKernelIoControl( DWORD dwIoControlCode,LPVOID lpInBuf,DWORD nInBufSize,LPVOID lpOutBuf,DWORD nOutBufSize,LPDWORD lpBytesReturned ); • dwIoControlCode • [in]I/O控制码,应该可以支持OAL I/O控制。 • lpInBuf • [out]输入buffer的指针 • nInBufSize • [in] lpInBuf的字节数 • lpOutBuf • [out]输出缓冲的指针 • nOutBufSize • [in] lpOutBuf的最大返回字节数 • lpBytesReturned • [in]接收返回数据的字节大小的一个双字型变量的地址 • 返回TRUE为成功,FALSE为失败。

  23. ADC串口键盘/鼠标驱动开发方案 • VOID keybd_event( • BYTEbVk, • BYTEbScan, • DWORDdwFlags, • DWORDdwExtraInfo • ) • 该函数可以模拟键盘输入。 • bVk • [in]定义了一个虚拟键码。该码必须在1-254之间。 • bScan • [in]定义了一个硬件扫描码,不常用。 • dwFlags • [in]操作标志 • dwExtraInfo • [in]对应键击定义32位附加值。 • 使用以上的函数就可以将扫描到的码值转换成虚拟按键时的值,这样就可以完成从键盘输入到系统的识别的过程。而且,其中有不少中断,这些中断的服务程序是整个键盘驱动的核心。

  24. ADC串口键盘/鼠标驱动开发方案 • BOOL InterruptInitialize( DWORD idInt, //和IST联合的中断检验器 HANDLE hEvent, //中断触发后发生的事件 LPVOID pvData, //传到OEMInterruptEnable的一个数据块的指针 DWORD cbData //上面数据块的大小); • 该函数初始化硬件中断,该初始化允许设备驱动注册一个事件并且使能中断。返回BOOL型TRUE或FALSE。

  25. ADC串口键盘/鼠标驱动开发方案 • HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes, //MUST NULLDWORDdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, //长指针指向要执行LPVOIDlpParameter, //长指针送一个32位参数到线程里DWORDdwCreationFlags, LPDWORDlpThreadId); • 该函数创建一个线程来执行访问的地址空间的程序。

  26. ADC串口键盘/鼠标驱动开发方案 • 驱动的调试信息 • (1)调试信息函数 • DEBUGMSG ( Condition, Printf_expr) • (2)condition可以设置全局变量 • #define KEY_DEBUG_MSG 0 • #define KEY_ERROR_MSG 0 • 这样就可以使用 • DEBUGMSG(KEY_DEBUG_MSG, (TEXT("Testing item count against maximum %u\r\n"), dwMaxNumberOfItems)); 进行调试了。同样地定义错误消息变量,也是为了调式的需要。设置为0时候,这些信息都不会显示。

  27. THANKS!!

More Related