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

转自:http://hgh123.blog.163.com/blog/static/5980422120086182936944/

 

在mediaplayer全屏播放的时候,我可以用键盘上的某一个键调节声音大小,现在我想在屏幕上显示调节的结果就跟我们看电视一样能出来一些标记。当声音变大在屏幕上就增多,当声音变小的时候就减少
得到播放窗口的DC,然后在上面显示一个不同颜色的矩形或者其它形状。

在ce自制平台中如何添加自己的驱动?cec文件和reg,bib文件有何区别?看混了,不知道如何才能让驱动注册到平台中。另外,reg和bib是我在编写驱动必须要自己写的么
CE 的驱动分为本机驱动和流驱动,本机驱动你可以修改源码(在%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS),然后 build驱动源码,之后用PB编译内核。流驱动是以DLL的形式被系统程序加载的。加载流驱动要在注册表中添加信息,这和cec文件没关。如果你想把此驱动DLL和注册信息作为一个整体给别人使用,那么就要做一个cec文件,PB能够读取cec文件内容并加载到内核工程中。cec文件相当于安装程序。

我安装的是evc4.0,我开发的系统要显示中文比如姓名什么的。在编辑的时候是中文显示,但是到了输出时,显示的都是乱码。不知道应该怎么去解决
EVC的模拟器不支持中文。所以显示出来的都是乱码。1、你可以只显示英文,调试结束后在改界面为中文。2、安装PB,PB的模拟器支持中文。  

CStatic及其控件的文字无法垂直居中显示,虽然在evc的资源编辑器中可设置,但是一旦运行,却无法垂直居中显示
这种情况正常,而且除此之外还不能右对齐。

获取设备ID的种类有哪些
除了手机模块外,还有CF卡有序列号、硬盘有ID号、网卡有MAC号等。这几种方法数获取手机模块ID最简单。

  
      在应用程序中,如何向修改本机的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。

如何向控制面板中那样,修改系统声音的音量
调用API waveOutSetVolume(HWAVEOUT, dwVolume ),一般参数1为0。在[HKEY_CURRENT_USER\ControlPanel\Volume]下是系统声音的注册表设置。

在应用程序中如何实现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组件实现。

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

  
      在WINCE下如何实现键盘钩子
我写了一个简单的例子,把其中主要部分截取出来放到了我的FTP里。用户名以及密码均为winceuser,地址是ftp://211.95.73.26/[email protected]/SourceCode/用钩子禁止系统键.rar。

  
      在WINCE中如何得到网卡MAC地址
事实证明,获得物理网卡的MAC地址并没有被统一成一个API或者IOCTL,如果网卡驱动程序没有提供接口的话只能直接访问寄存器获得。读者可以参考目录WINCE500\PUBLIC\COMMON\OAK\DRIVERS\NETCARD里的一些驱动源码。

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。

  
      wince下只是把调制解调器的驱动挂接在了com1,如何将器驱动挂接在com2上?
1、在HLM\drivers\buildin\com2\unimodem下复制和com1一样的数据 2、在HLM\ExtModems\ HayesCompat下改写Port为COM2:,再改写FriendlyName为"Hayes Compatible 在 COM2:"。

如何定制自己的外壳
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在内核中,二是删除依赖标准外壳的组件。

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

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

基于wince的应用程序能建成console project么?
不能

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,这样所有应用程序就可以通过调用流驱动接口函数来访问,非要加文件系统也是可行的,通过修改注册表就可以做到,但是麻烦一些。

 

 

你可能感兴趣的:(WinCE)