windows ce下驱动程序开发基础

windows ce下驱动程序开发基础

ID:9493607

大小:55.00 KB

页数:6页

时间:2018-05-01

windows ce下驱动程序开发基础_第1页
windows ce下驱动程序开发基础_第2页
windows ce下驱动程序开发基础_第3页
windows ce下驱动程序开发基础_第4页
windows ce下驱动程序开发基础_第5页
资源描述:

《windows ce下驱动程序开发基础》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、WindowsCE下驱动程序开发基础  研究的越多就越感觉自己懂的太少,其实在驱动开发方面我还是个菜鸟,我是想再次抛砖引玉,让做驱动有N年经验的人奉献一点出来,让大家减少一些研究驱动源码而又缺少中关联IRQ和SysIntr,当硬件设备发生中断时,ISR会禁止同级和低级中断,然后根据IRQ返回关联的SysIntr,内核根据ISR返回的SysIntr唤醒相应的IST(SysIntr与IST创建的Event关联),IST处理中断之后调用InterruptDone解除中断禁止。在OEMInit中关联的缺点是一旦编译了CE内核后就无法添加这种关联了,而一些硬件设备会随时插拔或者共享中断,

2、要关联这样的硬件设备解决方法就是可安装ISR,可安装ISR专用于处理指定的硬件设备发出的中断,所以如果硬件设备需要可安装ISR必须在注册表中添加IsrDll、IsrHandler。多数硬件设备采用CE默认的可安装ISRgiisr.dll,格式如下:以下是引用片段:  IsrDll=giisr.dll  IsrHandler=ISRHandler  如果一个硬件驱动程序需要可安装ISR而开发者又不想自己写一个,那么可以利用giisr.dll来实现。除了在注册表中添加如上所示外,还要在驱动程序中调用相关函数注册可安装ISR。伪代码如下:以下是引用片段:  g_IsrHandle=L

3、oadIntChainHandler(IsrDll,IsrHandler,(BYTE)Irq);  GIISR_INFOInfo;  PHYSICAL_ADDRESSPortAddress={PhysAddr,0};  TransBusAddrToStatic(BusType,dber,PortAddress,dp;dp;(PVOID)PhysAddr)  Info.SysIntr=dp;Info,sizeof(Info),NULL,0,NULL);  LoadIntChainHandler函数负责注册可安装ISR,参数1为DLL名称,参数2为ISR函数名称,参数3为IRQ。T

4、ransBusAddrToStatic函数在后面讲。如果要利用giisr.dll作为可安装ISR,必须先填充GIISR_INFO结构体,CheckPort=TRUE表示giisr要检测指定的寄存器来确定当前发出中断的是否是这个设备。PortIsIO表示寄存器地址属于哪个地址空间,FALSE表示是内定空间,TRUE表示IO空间。UseMaskReg=TRUE表示设备有一个掩码寄存器,专用于指定当前设备是否是中断源,也就是发出中断,而MaskAddr表示掩码寄存器的地址。如果对Info.Mask赋值,那么PortAddr表示一个特殊的寄存器地址,这个寄存器的值与Mask的值运算的结

5、果如果为真,则证明当前设备是中断源,否则返回SYSINTR_CHAIN(表示当前ISR没有处理中断,内核将调用ISR链中下一个ISR),如果UseMaskReg=TRUE,那么MaskReg寄存器的值与PortAddr指定的寄存器的值运算的结果如果为真,则证明当前设备是中断源。  函数SerInit接着调用函数Ser_InternalMapRegisterAddresses转换IO地址并且映射地址,Ser_InternalMapRegisterAddresses在内部调用系统提供的HalTranslateBusAddress(Isa,0,ioPhysicalBase,inIoS

6、pace,ioPhysicalBase)函数将与总线相关的地址转换为系统地址,参数1为总线类型,参数2为总线号,参数3为要转换的地址(PHYSICAL_ADDRESS类型,实际是LARGE_INTEGER型),参数4指定寄存器地址属于IO地址空间还是物理地址空间,参数5返回转换后的物理地址。观察HalTranslateBusAddress的源码得知如果是在x86平台,这个函数除了把参数3赋给了参数5其余什么都没有做,而非x86平台将inIoSpace的值置为0,表示一定是物理地址。在调用HalTranslateBusAddress前要确定从注册表中得到的寄存器地址到底是属于哪个

7、地址空间的,例如:以下是引用片段:  ULONGinIoSpace=1;///1表示是IO空间  PHYSICAL_ADDRESSioPhysicalBase={iobase,0};///相当于ioPhysicalBase.LoMapIoSpace(ioPhysicalBase,Size,FALSE);  TransBusAddrToStatic(Isa,0,ioPhysicalBase,Size,inIoSpace,ppStaticAddress);  MmMapIoSpace函数负责将物

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。