WinCE驱动开发问题精华集锦(二)

[复制链接]
4746|0
 楼主| tedyu 发表于 2009-3-27 12:43 | 显示全部楼层 |阅读模式
我怎么能在PB左边的定制平台加进我的驱动呢?&nbsp;<br />两种办法:&nbsp;<br />1、在platform.bib或者project.bib的MODULES部分添加一条语句,例如:&nbsp;<br />MyDriver.dll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C:DriverMyDriver.dll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NK&nbsp;SH&nbsp;<br />这样编译内核的时候就会把你的驱动DLL文件添加到内核中,如果有注册表需要设置,在platform.reg或者project.reg中添加注册表内容。&nbsp;<br />2、通过制作.cec文件来添加驱动,制作.cec文件的优点是只需制作一次,以后就可以通过将.cec文件导入到PB的Catalog中,象PB自带的feature一样通过菜单“Add&nbsp;to&nbsp;OS&nbsp;Design”添加到左边的内核工程中。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WINCE有没有相对路径概念?如果没有如何得到当前模块的路径?&nbsp;<br />1、WINCE没有相对路径概念,只有绝对路径,所以凡是涉及到路径均为绝对路径。&nbsp;<br />2、调用API&nbsp;GetModuleFileName,传递一个模块的实例句柄就能够得到模块的绝对路径。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;怎样让&nbsp;POCKET&nbsp;WORD打开*.dat格式(里面都是数据)的文件?&nbsp;&nbsp;&nbsp;<br />两种办法:&nbsp;<br />1、调用API&nbsp;ShellExecuteEx,在结构体SHELLEXECUTEINFO中添加.dat文件的路径。&nbsp;<br />2、调用API&nbsp;CreateProcess,在第二个参数中设置.dat文件的路径。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x86&nbsp;Rom&nbsp;Boot&nbsp;Loader真的可以实现吗?它确实能代替BIOS启动计算机?&nbsp;&nbsp;&nbsp;<br />Rom&nbsp;Boot&nbsp;被设计存放在Flash/EEPROM中,也就是原来BIOS的位置,这样当上电后CPU到固定地址执行代码,也就是执行了Rom&nbsp;Boot的代码,它对整个硬件系统进行初始化和检测,并且支持通过网卡从远程机器上下载nk.bin或者从本地IDE/ATA&nbsp;硬盘的活动分区中寻找nk.bin文件加载。&nbsp;Rom&nbsp;Boot的优点就是引导并且加载速度快,而且它自身完成了所有的操作,这样就不用BIOS、MSDOS,更不用Loadcepc了。&nbsp;<br /><br />对于x86&nbsp;Rom&nbsp;Boot&nbsp;Loader,如何Build得到Romboot.rom?&nbsp;<br />1、在PB中打开一个内核工程(x86的)&nbsp;2、单击PB菜单“Build”-“Open&nbsp;Build&nbsp;Release&nbsp;Directory”&nbsp;3、用cd命令进入&nbsp;%_WINCEROOT%PlatformGeodeRomboot&nbsp;4、build&nbsp;<br /><br />如何设置、更改显示分辨率&nbsp;<br />能否设置、更改显示分辨率由显示驱动程序决定,而没有统一的标准。例如CEPC,在启动的时候可以通过设置loadcepc.exe的参数&nbsp;/L来决定&nbsp;WINCE启动后的显示分辨率,这是由于显示驱动“VGA&nbsp;Linear&nbsp;Framebuffer”支持,而Geode可以通过在定制内核时修改注册表项来决定WINCE启动后的显示分辨率。&nbsp;<br /><br />几个硬件使用同一个IRQ,那么发生中断的时候系统怎么判断到底是哪一个硬件发生的中断呢?ISR里面又应该怎么控制呢?&nbsp;<br />Windows&nbsp;CE&nbsp;支持多个设备中断共享一个IRQ,当一个共享IRQ发生时,CE内核的异常处理程序检测设备特定的寄存器,因为大多数设备都有一个单独的寄存器用于表示设备的活动状态,所以通过遍历共享这个IRQ的所有设备的寄存器就可以判断哪个设备发生中断。nk.exe加载一个giisr.dll,这个.dll是微软提供的,它其实是第一个可安装ISR。默认CE内核就是调用这个dll来检测寄存器状态的,当然OEM可以编写自己的.dll。&nbsp;<br />CE内部有一个ISR链,也就是可安装ISR。因为CE允许OEM添加自己的ISR处理程序,所以ISR被设计成一个链表。排在前面的ISR比后面的ISR优先处理中断,如果当前ISR能够处理当前中断,那就返回中断ID由IST处理或者返回SYSINTR_NOP,如果当前ISR不能够处理当前中断,那就返回&nbsp;SYSINTR_CHAIN让下一个ISR处理。&nbsp;<br /><br />请问在wince中如何在内核中增加一个与windows同级的目录?&nbsp;<br />在platform.dat或者project.dat中添加语句。例如要创建根目录下子目录Program&nbsp;Files,语句如下:&nbsp;<br />root:-Directory(&quot;Program&nbsp;Files&quot;)&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />文件格式如下所示,我想把每行的4个值读到4个变量中,用EVC如何编程?&nbsp;<br />第一行:&nbsp;460.000,&nbsp;&nbsp;&nbsp;3384672.357342,&nbsp;&nbsp;&nbsp;521268.972763&nbsp;<br />第二行:&nbsp;475.117,&nbsp;&nbsp;&nbsp;3384663.772419,&nbsp;&nbsp;&nbsp;521281.415271&nbsp;<br />伪代码如下:&nbsp;<br />FILE&nbsp;&nbsp;&nbsp;*stream;&nbsp;<br />stream&nbsp;=&nbsp;_wfopen(L&quot;a.txt&quot;,&nbsp;L&quot;r+&quot;);&nbsp;<br />if(&nbsp;stream&nbsp;==&nbsp;NULL&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;<br />fseek(stream,&nbsp;0L,&nbsp;SEEK_SET&nbsp;);&nbsp;<br />while(&nbsp;!feof(&nbsp;stream&nbsp;)&nbsp;)&nbsp;<br />{&nbsp;<br />fwscanf(stream,&nbsp;L&quot;%s&quot;,&nbsp;WCHAR1);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwscanf(stream,&nbsp;L&quot;%f&quot;,&nbsp;float1);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwscanf(stream,&nbsp;L&quot;%f&quot;,&nbsp;float2);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwscanf(stream,&nbsp;L&quot;%f&quot;,&nbsp;float3);&nbsp;<br />}&nbsp;<br />fclose(&nbsp;stream&nbsp;);&nbsp;<br /><br />GWES组件的功能有哪些?&nbsp;<br />GWES不仅负责GDI、窗口、消息,还负责管理本机设备驱动程序,负责加载显示、键盘鼠标、触摸屏驱动程序,而且GWES本身包含电源、LED驱动程序。&nbsp;<br /><br />如何在PB中预先设定好存储内存和程序内存的大小,我想多划分一些空间给程序内存?&nbsp;&nbsp;&nbsp;<br />两种办法:&nbsp;<br />1、在定制内核时在config.bib文件中设置FSRAMPERCENT&nbsp;=&nbsp;number,具体number可参考标题为“FSRAMPERCENT&nbsp;”的帮助文档。这种办法是修改内核的设置,所有一直有效。&nbsp;<br />2、在应用程序中调用API&nbsp;SetSystemMemoryDivision,如果函数返回SYSMEM_CHANGED表示成功,如果返回SYSMEM_MUSTREBOOT表示需要热启动才能有效。这种办法需要每次启动后调用API才有效。&nbsp;<br /><br />如何取消鼠标光标?&nbsp;<br />通过取消SYS变量来实现此目的,在PB命令行下键入“set&nbsp;SYSGEN_CURSOR=”,然后回车确认。&nbsp;<br /><br />EVC下调用TextOut如何编译会出错?&nbsp;<br />类似这样的问题很多,这是因为EVC的帮助文档内容有错误。可能EVC的帮助文档内容是从桌面Windows帮助文档复制过来的,所以很多API函数还有例子代码都有错误,例如帮助文档中包含一个API函数的说明,但是实际编译的时候提示没有这个API,有的例子代码采用ANSI字符串,而WINCE的&nbsp;API都是宽字符版本,造成直接复制过来编译失败。&nbsp;<br />因为MFC&nbsp;for&nbsp;WINCE的CDC类中没有TextOut成员函数,所以编译会出错,可以用其它类成员函数ExtTextOut或者DrawText替换。&nbsp;<br /><br />我如何将我的dll软件让现有的ce系统认可?尽管我也知道应该使用signfile.exe程序进行签名,但是我并不知道那个ce系统认可的签名应该是啥&nbsp;<br />如果你说的WINCE系统内核已经加入了签名认证机制,那么没有私钥对你的DLL文件签名肯定是无法运行在此内核中的,一般签名密钥的密钥长度都是1024位,很难**。&nbsp;<br /><br />如果查看WINCE注册表中的内容?&nbsp;<br />两种办法:&nbsp;<br />1、建立同步后,用EVC自带的工具“Remote&nbsp;Registry&nbsp;Editor”打开查看。&nbsp;<br />2、从网上下载注册表查看工具,放到WINCE设备中。&nbsp;<br /><br />调用directshow出现链接错误,如何解决?&nbsp;&nbsp;&nbsp;<br />player.obj&nbsp;:&nbsp;error&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;_IID_IVideoWindow&nbsp;<br />player.obj&nbsp;:&nbsp;error&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;_IID_IMediaControl&nbsp;<br /><br />这是因为链接器没有找到合适的.lib文件。两种办法:&nbsp;<br />1、在EVC菜单Tools—options—directories&nbsp;里把library&nbsp;files的路径重新调整一下。如果你只安装了EVC自带的&nbsp;Standard&nbsp;SDK而没有其它SDK,可以指定WINCE目录中的.lib文件路径,例如D:WINCE500PUBLICDIRECTX&nbsp;OAKLIBX86RETAIL。注意CPU的类型。&nbsp;<br />2、安装SDK,前提是导出SDK的PB内核工程必须包括DirectShow或者其它组件。&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在PB的config.bib文件中,“IMGFLASH”表示什么意思呢?&nbsp;<br />表示能够刷NK到ROM中,具体请查看标题为“IMG&nbsp;Environment&nbsp;Variables”的帮助文档。&nbsp;<br /><br />x86平台如何映射各种地址空间?如何编写中断服务例程?&nbsp;<br />如果是x86平台,可以调用HalTranslateBusAddress转换物理总线地址到物理系统地址,调用&nbsp;HalTranslateSystemAddress转换物理系统地址到逻辑总线地址,也可以不调用这两个函数,因为x86平台除32位物理地址外还有&nbsp;16位的IO地址空间,对于16位的IO地址空间,可以直接调用WRITE_PORT_UCHAR或者READ_PORT_UCHAR等函数直接读写端口。对于32位物理地址可以调用VirtualAlloc和VirtualCopy来映射。这样做思路清晰,简单明了。&nbsp;<br />在x86平台要实现ISR,有如下几个步骤(以Geode&nbsp;BSP为例):&nbsp;<br />1、用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ。以“SYSINTR_”为前缀的常量由内核使用,用于唯一标识发生中断的硬件,又称为中断ID。在Nkintr.h文件中预定义了一些SYSINTR,OEM可以在Oalintr.h文件中自定义SYSINTR。&nbsp;<br />2、用HookInterrupt函数关联硬件中断号和ISR。这里提到的硬件中断号为物理中断号,IRQ为逻辑中断号。在InitPICs函数的最后调用了HookInterrupt函数,如下:&nbsp;<br />for&nbsp;(i&nbsp;=&nbsp;64;&nbsp;i&nbsp;&lt&nbsp;80;&nbsp;i++)&nbsp;<br />HookInterrupt(i,&nbsp;(void&nbsp;*)PeRPISR);&nbsp;&nbsp;&nbsp;///用ISR关联16个中断号&nbsp;&nbsp;&nbsp;<br />3、调用InterruptInitialize函数关联SYSINTR和IST创建的事件对象,也是IST等待的事件对象。详细内容请参考Geode&nbsp;BSP源码。&nbsp;<br />在x86&nbsp;平台要实现可安装ISR,先调用LoadIntChainHandler函数注册在注册表中指定的ISR&nbsp;DLL,然后填充GIISR_INFO结构体并调用KernelLibIoControl函数将此结构体传递给可安装ISR。详细内容请参考WINCE帮助文档或者我著的《Windows&nbsp;CE下驱动开发基础》。&nbsp;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部