WinCE驱动开发问题精华集锦-1

1、在应用程序中,如何向修改本机的ip 地址等网络参数,并使之立即生效?  
       网络设置保存在注册表中,位置[HKEY_LOCAL_MACHINE\Comm\网卡名称\Parms\TcpIp],例如常见的CS8900网卡设置:  
[HKEY_LOCAL_MACHINE\Comm\CS89001\Parms\TcpIp]  
   "EnableDHCP"=dword:0  
   "DefaultGateway"="192.168.0.1"  
   "DNS"="111.111.111.111"  
   "UseZeroBroadcast"=dword:0  
   "IpAddress"="192.168.0.2"  
   "Subnetmask"="255.255.255.0"  
     设置之后要生效有两种办法:一种热启动,调用KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL),热启动时间很短暂;另外一种调用DevieceIoControl API,传递IOCTL=IOCTL_NDIS_REBIND_ADAPTER。  
  
2、如何向控制面板中那样,修改系统声音的音量  
     调用API waveOutSetVolume(HWAVEOUT, dwVolume ),一般参数1为0。在[HKEY_CURRENT_USER\ControlPanel\Volume]下是系统声音的注册表设置。  
  
3、在应用程序中如何实现jpg、gif图片的显示  
有几种办法:  
1)、在MSDN中搜索标题为“Windows CE .NET Technical Frequently Asked Questions”的文档,其中有一个问题“How can I display JPEG, GIF, and other graphics files?”,下面就是答案。  
2)、如果安装了Windows CE 5.0,一个例子源码位于WINCE500\PUBLIC\GDIEX\SDK\SAMPLES\SIMPLE。  
3)、用IWebBrowser组件实现。  

4、 在应用程序中如何实现系统待机  
void GwesPowerOffSystem(void);  

5、   在WINCE中如何得到网卡MAC地址  
     事实证明,获得物理网卡的MAC地址并没有被统一成一个API或者IOCTL,如果网卡驱动程序没有提供接口的话只能直接访问寄存器获得。读者可以参考目录WINCE500\PUBLIC\COMMON\OAK\DRIVERS\NETCARD里的一些驱动源码。  
  
6、Windows XP Embedded 和Windows CE有何区别  
     简单地说Windows XP Embedded采用Windows XP内核,只能运行在x86处理器上,优点是能够运行PC上现有的应用软件,缺点是授权费太高,标价¥900元;Windows CE采用Windows CE内核,能够运行在多种处理器上,如x86、ARM、SHX、MIPS等,优点是授权费低,最低Core版标价¥30元。缺点是需要单独开发应用软件、定制内核,甚至开发BSP、Driver。  

7、 wince下只是把调制解调器的驱动挂接在了com1,如何将器驱动挂接在com2上?  
     1)、在HLM\drivers\buildin\com2\unimodem下复制和com1一样的数据
     2)、在HLM\ExtModems\HayesCompat下改写Port为COM2:,再改写FriendlyName为"Hayes Compatible 在 COM2:"。  
  
8、如何定制自己的外壳  
   1)、先开发一个外壳软件,假设名称为MyShell.exe  
   2)、删除注册表[HKEY_LOCAL_MACHINE\init]下如下一行:  
           "Launch50"="explorer.exe"  
     3)、在注册表[HKEY_LOCAL_MACHINE\init]下添加如下一行:  
           "Launch50"="MyShell.exe"  
     上述的“LaunchXX”中的XX为序列数,内核依据这个序列数按由小到大的顺序来分别执行所有子键列出的应用程序,具体数值应该为多少请参考帮助文档的说明。  
     如果原来的内核中添加了标准外壳(standard shell)组件,或者添加了其它组件而这些组件需要依赖标准外壳,那么在PB中是无法删除标准外壳组件的,解决办法一是保留explorer.exe在内核中,二是删除依赖标准外壳的组件。  

9、我原来的工程是x86版本的,编译选项只有x86,我如何能够编译ARM版本的  
两种办法:  
   1)、用EVC新建一个工程的时候,建议复选“CPUs”列表,这样发生了这种事情也能够轻易通过选择“WCE Configuration”工具栏中的CPU列表来编译不同CPU版本的软件  
     2)、如果打开工程后CPU列表中只有x86,而此时已经安装了ARM版本的SDK,那么单击EVC菜单“build”-“configurations”,然后单击“add”按钮来添加CPU。  

  
10、通常情况下WINCE采用串口1作为调试时输出信息用途,要正式出产品前如何去掉串口1的调试功能,正常情况下串口1只有在编译debug版本的内核时才在BootLoader中初始化串口1用于输出信息,而编译release版本会跳过此代码。而有些BSP设计成没有宏定义,也就是说无论什么版本都会在BootLoader中初始化串口1,这样造成WINCE启动后串口1无法被应用程序使用。对于这种情况只能在BootLoader源码中删除初始化代码,如OEMInitDebugSerial。  
  
11、基于wince的应用程序能建成console project么?  
       不能  

12、ARM系统外扩一片512K RAM,驱动程序经过映射可以使用这一段RAM。1、应用系统如何使用这一段RAM?要加一层驱动吗?2、如果要将这一段RAM当作RAM盘存储系统,该如何作呢?应该要加文件系统吧,如何加呢?
   解答这个问题前,先要说一下WINCE的地址映射机制。对于包含MMU(存储器管理单元)的处理器来说,如ARM和x86,WINCE要求OEM在定制内核的时候填写一个虚拟地址与物理地址映射关系的表,称为OEMAddressTable,在这个表中定义了所有物理设备的起始物理地址,对应的起始虚拟地址,地址空间大小,RAM就包括在其中(如果是x86平台还要求RAM起始虚拟地址从0x80000000开始)。如果有多片RAM,应该在 OEMAddressTable中将它们定义在一起,使之地址连续。对于非OEM的开发者来说,他们拿到的是定制好的内核,不能做任何修改,如果在产品中外扩一片RAM,只能通过API函数通知操作系统增加一条虚拟地址与物理地址映射关系表项。相关API函数有两个,分别是 CreateStaticMapping和VirtualCopy。它们的相同之处是都用于建立物理地址和虚拟地址的映射关系。它们的不同之处是 CreateStaticMapping映射的虚拟地址范围在0xC400 0000 到 0xE000 0000之间,这个范围只能由内核访问,一般用于ISR访问,因为ISR只能访问静态映射的虚拟地址空间,不能用VirtualCopy。 VirtualCopy通常和VirtualAlloc配合使用,映射的虚拟地址空间在0x8000 0000以下,一般用于驱动程序和应用程序访问。  
1)、应用程序要访问这片RAM,和驱动程序访问方法一样,调用VirtualAlloc和VirtualCopy。  
2)、可以做一个流驱动程序专门用于读写这片RAM,这样所有应用程序就可以通过调用流驱动接口函数来访问,非要加文件系统也是可行的,通过修改注册表就可以做到,但是麻烦一些。  

13、我怎么能在PB左边的定制平台加进我的驱动呢?  
两种办法:  
1)、在platform.bib或者project.bib的MODULES部分添加一条语句,例如:  
MyDriver.dll       C:\Driver\MyDriver.dll                     NK SH  
这样编译内核的时候就会把你的驱动DLL文件添加到内核中,如果有注册表需要设置,在platform.reg或者project.reg中添加注册表内容。  
2)、通过制作.cec文件来添加驱动,制作.cec文件的优点是只需制作一次,以后就可以通过将.cec文件导入到PB的Catalog中,象PB自带的feature一样通过菜单“Add to OS Design”添加到左边的内核工程中。  

14、 WINCE有没有相对路径概念?如果没有如何得到当前模块的路径?  
     1) 、WINCE没有相对路径概念,只有绝对路径,所以凡是涉及到路径均为绝对路径。  
     2)、调用API GetModuleFileName,传递一个模块的实例句柄就能够得到模块的绝对路径。  

15、   怎样让 POCKET WORD打开*.dat格式(里面都是数据)的文件?
     两种办法:  
     1)、调用API ShellExecuteEx,在结构体SHELLEXECUTEINFO中添加.dat文件的路径。  
     2)、调用API CreateProcess,在第二个参数中设置.dat文件的路径。  

16、 x86 Rom Boot Loader真的可以实现吗?它确实能代替BIOS启动计算机?  
   Rom Boot 被设计存放在Flash/EEPROM中,也就是原来BIOS的位置,这样当上电后CPU到固定地址执行代码,也就是执行了Rom Boot的代码,它对整个硬件系统进行初始化和检测,并且支持通过网卡从远程机器上下载nk.bin或者从本地IDE/ATA 硬盘的活动分区中寻找nk.bin文件加载。Rom Boot的优点就是引导并且加载速度快,而且它自身完成了所有的操作,这样就不用BIOS、MSDOS,更不用Loadcepc了。  
  
17、 对于x86 Rom Boot Loader,如何Build得到Romboot.rom?  
   1)、在PB中打开一个内核工程(x86的)
   2)、单击PB菜单“Build”-“Open Build Release Directory”
   30 、用cd命令进入 %_WINCEROOT%\Platform\Geode\Romboot 4、build  
  
18、如何设置、更改显示分辨率  
     能否设置、更改显示分辨率由显示驱动程序决定,而没有统一的标准。例如CEPC,在启动的时候可以通过设置loadcepc.exe的参数 /L来决定WINCE启动后的显示分辨率,这是由于显示驱动“VGA Linear Framebuffer”支持,而Geode可以通过在定制内核时修改注册表项来决定WINCE启动后的显示分辨率。  
  
19、 几个硬件使用同一个IRQ,那么发生中断的时候系统怎么判断到底是哪一个硬件发生的中断呢?ISR里面又应该怎么控制呢?  
     Windows CE支持多个设备中断共享一个IRQ,当一个共享IRQ发生时,CE内核的异常处理程序检测设备特定的寄存器,因为大多数设备都有一个单独的寄存器用于表示设备的活动状态,所以通过遍历共享这个IRQ的所有设备的寄存器就可以判断哪个设备发生中断。nk.exe加载一个giisr.dll,这个.dll是微软提供的,它其实是第一个可安装ISR。默认CE内核就是调用这个dll来检测寄存器状态的,当然OEM可以编写自己的.dll。  
     CE内部有一个ISR链,也就是可安装ISR。因为CE允许OEM添加自己的ISR处理程序,所以ISR被设计成一个链表。排在前面的ISR比后面的 ISR优先处理中断,如果当前ISR能够处理当前中断,那就返回中断ID由IST处理或者返回SYSINTR_NOP,如果当前ISR不能够处理当前中断,那就返回SYSINTR_CHAIN让下一个ISR处理。  
  
20、请问在wince中如何在内核中增加一个与\windows同级的目录?  
     在platform.dat或者project.dat中添加语句。例如要创建根目录下子目录Program Files,语句如下:  
     root:-Directory("Program Files")

你可能感兴趣的:(WinCE)