基于WindowsCE的GPIO键盘驱动设计与实现_图文

基于WindowsCE的GPIO键盘驱动设计与实现_图文

2023年6月26日发(作者:)

第8卷 第6期 2008年3月167121819(24 科 学 技 术 与 工 程ScienceTechnologyandEngineering Vol.8 No.6 Mar.2008Ζ 2008 .基于WindowsCE的GPIO键盘驱动设计与实现赵振中 徐家恺(南京大学,南京210093)摘 要 介绍了基于WindowsCE的GPIO键盘驱动设计。详细分析了实现键盘驱动所需要的工作;并成功地完成了自定义功能的键盘驱动。关键词 WindowsCE  GPIO  键盘驱动中图法分类号 TP316.6;    文献标志码 A  WindowsCE是微软开发的一个开放的、可升级的32位嵌入式操作系统,以其良好的用户界面得到了广泛的应用。WindowsCE作为用户强交互的嵌入式系统,往往需要配备一个自定义功能的键盘。现以XscalePXA255为处理器,处理器的通用IO口作为键盘的输入口,设计了在WindowsCE操作系统下的键盘驱动程序,在应用程序中可以根据用户需求定制按键的具体功能满足系统的需要。动程序也只是以用户态的角色运行。可加载驱动程序通过文件操作API来从设备管理器和应用程序获得命令。外部设备较多采用流接口驱动。本机设备驱动和流驱动两者的差别在于它们向上提供的编程接口不同:流接口驱动提供一组通用的接口;而本地设备驱动则可以根据具体设备的需求提供相应的接口。1 WindowsCE驱动程序结构概述1.1 从加载以及接口方式区分WindowsCE驱动程序从加载以及接口方式来区分:可以分为本机设备驱动(Build2InDriver)、流驱动(LoadableDriver)。本机设备驱动即NativeDeviceDrivers。这些驱动程序在系统启动是,在GWES的进程空间内被加载。这些驱动对应的设备通常在系统启动时就被要求加载。平台大部分内建设备的驱动程序,如键盘、显示设备和触摸屏等是本地设备驱动。流驱动可以在系统启动时,或者和启动后的任何时候,由设备管理器动态加载。通常它们以DLL动态链接库的形式存在。系统加载它们后,这些驱2007年12月10日收到图1 独立驱动和层次型驱动在系统中的位置1.2 从驱动层次上区分WindowsCE驱动程序从驱动层次上区分:可以分为独立驱动和层次型驱动。如图1是这两种驱动在系统中的位置。独立驱动程序将驱动程序编写成同时包含MDD和PDD层的独立驱动。层次型驱动分为两层,较上层的ModelDeviceDriver(MDD)和比较下© 1994-2008 China Academic Journal Electronic Publishing House. All rights reserved. 6期赵振中,等:基于WindowsCE的GPIO键盘驱动设计与实现15 99层的PlatformDependentDriver(PDD)。MDD实现的是和平台无关的功能,它描述了一个通用的驱动程序框架。而PDD是和硬件以及平台相关的代码组成。MDD调用PDD中特定的接口来获取硬件相关的信息。当使用层次型驱动的时候,一般只需要基于相近的样例驱动程序,针对特定的硬件修改PDD程序,MDD建立的框架可继续使用。键盘驱动属于层次型驱动,因此主要编写PDD层程序。2 键盘驱动初始化WindowsCE里设备驱动程序本质上是一些动态连接库(DLL),它们向内核提供一些入口函数,这样设备管理器就可以通过这些函数与具体的硬件设备进行通信。键盘驱动的入口函数为DLLMain。DllMain是一个可选的DLL入口方式,在进程和线图2 键盘驱动电源管理软件流程上电时,进行虚存映射,将驱动所涉及到的GPIO单元的寄存器组和中断控制器的寄存器组映射到用户态的虚拟地址空间;设置对应GPIO的引脚方向寄存器GPDR为输入;置位GRER/GFER的对应位,检测按键下降沿跳变,同时置位跳变检测状态寄存器GEDR;置位中断控制器屏蔽寄存器ICMR的GPIO对应位IS[10],允许按键中断产生。断电时,程初始化或终止时候以及调用LoadLibrary或FreeLibrary之后被系统调用。WindowsCE加载设备驱动时,产生DLL_PROCESS_ATTACH理由调用DllMain,初始化设备,分配所需资源,并且开启ISR和IST;当卸载设备驱动时,产生DLL_PROCESS_DETACH理由调用DllMain,关闭设备并释放它占用的各种资源。键盘作为系统的输入设备,在系统正常运行后一直都在工作,它的DllMain函数只在驱动加载时以DLL_PROCESS_ATTACH理由调用。部分代码如下所示。DllMain(HANDLEhinstDll,DWORDdwReason,LPVOIDlpRe2served){   v_pkeysw=newKeySwitch;//新建一个键盘if(v_pkeysw->Initialize())//初始化键盘{v_pkeysw->IsrThreadStart();//键盘中断服务线程释放虚存空间。KeybdPdd_PowerHandler不仅供高层的KeybdDriverPowerHandler调用实现内核电源管理,而且还供键盘驱动DllMain调用进行驱动初始化,初始化后就开始建立ISR和IST。部分代码如下所示if(v_pICReg==NULL){v_pICReg=(volatileINTC_REGS3)MapRegisterMemory(0x400,(char)TEXT("KeybdPdd_PowerHandler:INTC_BASE_U_VIRTUAL"),(PVOID)INTC_BASE_U_VIRTUAL);//中断控制器的寄存器启动}}组物理地址到虚拟地址映射KeybdPdd_PowerHandler是键盘驱动PDD层的}PVOIDMapRegisterMemory(unsignedsize,char3str,PVOIDpVirtualAddress){{ptr=VirtualAlloc(0,size,MEM_RESERVE,PAGE_NOAC2CESS);//在虚拟地址中保存空间VirtualCopy((PVOID)ptr,(PVOID)pVirtualAddress,size,PAGE_READWRITE|PAGE_NOCACHE)//物理地址与虚拟地址相对应}v_pGPIOReg->GPDR_x&=GPIO4;//设置相关的GPIO的引电源管理函数,也是一个初始化键盘函数,它有1个BOOL型的入口参数bOff:bOff=1表断电,bOff=0表上电,见图2。© 1994-2008 China Academic Journal Electronic Publishing House. All rights reserved. 1600脚为输入科 学 技 术 与 工 程8卷② 注册中断,建立键盘事件与中断标识号的连接InterruptInitialize(SYSINTR_KEYBOARD,m_hevInterrupt,NULL,0);v_pICReg->icmr|=INTC_GPIO80_2;//使能GPIO中断3 键盘驱动中断服务例程中断服务是设备驱动的关键部分,WindowsCE的中断处理分为2个阶段,由2个不同的对象来实现:中断服务例程(ISR,InterruptServiceRoutine)和中断服务线程(IST,InterruptServiceThread)。ISR运行在内核模式,并且总是关中断的。为了提高实时性,减少中断关闭时间,ISR被要求短小精悍而效率很高,作用通常只是向内核返回中断标识号。IST工作在用户模式,它处理中断的事务性工作,它对时间的要求比ISR宽松得多。当内核接收ISR传给自己的中断标识号后就发出一个中断事件,激活一个正等待在该事件的事件队列上的IST,一段时间后,内核就会调度该线程工作。OAL层的ISR用于返回中断标识号,允许、禁③ 建立键盘IST线程Hthrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)KeySwitchIsrThread,this,0,NULL);4.2 键盘中断服务线程键盘中断发生后,OAL层的ISR将中断标识号SYSINTR_KEYBOARD传给内核,内核触发键盘中断事件,继而激活等待该事件的键盘IST。键盘中断服务线程是一个无线循环线程,它调用WaitForS2ingleObject函数等待键盘中断事件被内核触发,事件触发后则进入中断的事务性处理工作,读取GPIO引脚电平寄存器GPLR来判断具体是哪个按键被按下,然后调用keybd_event函数将按键对应的虚拟按键码发送给系统,产生键盘消息,处理完成后调用InterruptDone函数间接调用OEMInterruptDone重新止中断和中断结束处理。ISR开发工作包括:当入口中断标识号为SYSINTR_KEYBOARD时,则在OEMInterruptEnable函数中允许GPIO中断(置位ICMR的ICMR[IS[10]]位),函数由内核调用,建立ISR和驱动程序的IST之间的映射关系,当设备驱允许键盘中断,进入新的循环,等待下一次事件被触发。图3给出了它的软件流程。动程序调用InterruptInitialize内核函数后内核调用OEMInterruptEnable;OEMInterruptDisable函数禁止GPIO中断(清零ICMR[IS[10]])、OEMInterrupt2Done中断结束处理函数中再次允许GPIO中断;在OEMInterruptHandle中断核心处理函数中添加GPIO单元中断检测程序,若中断状态寄存器ICIP[IS[10]]位为1则禁止GPIO中断,并返回中断标识号SYSINTR_KEYBOARD。4 键盘驱动中断服务线程4.1 键盘中断服务线程启动过程DLLMain()调用v_pkeysw→IsrThreadStart()接图3 键盘IST软件流程着由该函数启动中断服务线程。该部分流程如下:① 建立键盘事件,获得事件句柄hKeybdEvnet=CreateEvent(NULL,FALSE,FALSE,NULL);(下转第1609页)© 1994-2008 China Academic Journal Electronic Publishing House. All rights reserved. 6期周彩霞,等:基于改进BP网络的人脸检测与定位16 09HumanFaceDetectionandLocationMethodBasedonImprovedBPNetworkZHOUCai2xia,YIJiang2yi(Electronics&InformationEngineeringDepartment,ChangshaAeronauticVocational&TechnicalCollege,Changsha410124,)[Abstract] AhumanfacedetectionandcativelearningrateisintroducedinordertoincreasethelearningspeedandensuretheweightsπrithmaccessionedmomentumisadoptedtominishtheweightsπltneuralnetworkistrainedbyuseofimageπgreyinformationandBPalgorithmaccessionedmomen2tum,thentheneuralnetworkwhichhasbeentrainedareusedtosearcherimentalresultsshowthismethodpossesseshigherrobustnessandex2pansionthantraditionalhumanfacedetectionandlocationmethod,andthespeedoflocationisveryquicklyandevolvementabilityisrathermarked.[Keywords] facedetectionandlocation  BPalgorithm  heuristicalgorithm(上接第1600页)册表信息,输入系统(GWES)在启动时从HKEY_LOCAL_装载键盘驱动。本文成功的实现了基部分代码如下所示ulGPLR0=(~v_pGPIOReg->GPLR_x&KEYSW_PINS_MASK);//读取GPIO按键的电平状态ulChangedBit=ulGPLR0&KEYSW_PINS_MASK;for(i=0;i

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687755315a39825.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信