作者:dengxin123
转自:http://blog.youkuaiyun.com/dengxin123/article/details/3373765
WinCE下的驱动程序是一个DLL,需要自己写USBDeviceAttach等函数,用WinDriver生成的代码使用WinDriver提供的dll库,使用统一函数(对Win2k,xp,wince,linux等系统生成的代码外表看起来区别不大)包装了硬件接口函数,这样就屏蔽了底层,应用程序只需要对WinDriver提供的接口函数进行处理就可以了。驱动写好后,要通过Platform Builder烧入设备,设计修改注册表,还要用一个测试应用程序做测试。
1)用WinDriver(或DDK的USBVIEW)在pc上得到设备的vid/pid比如USB鼠标信息如下:
vendor id:04fc
Product id:0013
Manufacturer name:Sunplus Technology Co.,Ltd
记录id转化成十进制,即1276,0019
用WinDriver重新注册设备Generate inf选择自定义class后生成Embedded vc代码。
2)用Embedded VC将刚生成的项目文件打开,选择正确的BSP(如果菜单上没有自己的BSP,重装之)。然后可以修改程序(比如生成的项目是ibm_mouse,则测试程序主函数在ibm_mouse_diag.c,主要修改usb_diag_lib.c即可,再底层是windriver包装的型如WDU_XXXX函数)修改满足调试需要,等3,4做完才能编译。
3)将pb打开,生成一个新的platform,将WinDriver/redist/里面对应设备CPU的windrvr6.dll拷贝到pb的当前release目录里(build菜单里有release目录的快捷方式)。修改注册表project.reg
仿造WinDriver/samples/wince_install/PROJECT_WD.REG加入
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/WinDriver]
"Prefix"="WDR"
"Dll"="windrvr6.dll"
"Order"=dword:9
"Index"=dword:1
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/1276_0019/Default/Default/WDR] :
"Dll"="windrvr6.dll"
其中最后一个usb device name要和generate code时的名字保持一致,vid/uid为十进制
也可以再修改project.bib将windriver的库加入kernel,
可参考WinDriver/samples/wince_install/PROJECT_WD.bib,这里不改它
4)
编译pb的platform,编译的时候不要覆盖release目录,否则windrvr6.dll就没了。
编译成功后释放到release目录,再拷贝一份windrvr6.dll到release目录调试用。
然后生成run-time image之后add device烧到设备里。
5)如果上述步骤没有问题,下面就要烧入测试程序。将刚才改好的evc的程序编译连接pb,使用ActiveSync或者manual server,这里使用后者,事先将三个文件(网上搜一下)cemgrc.exe,cetlstub.dll,tcpipc.dll拷贝到设备闪存里,evc里设置用manual server连接设备,编译工程,会提示运行cemgrc的格式,设备里按照格式运行,若在pb中调试会让选择cemgrc在pc对应的路径,不要选它,cancel掉,在evc选ok,成功的花会把测试程序下载到设备根目录。
6)在设备里运行测试程序,如果未出现USB驱动初始化失败就成功了一半,监视pb中debug信息,将USB设备插入设备,正确情况设备将调用windrvr6.dll,这时候evc的程序就可以使用了,若evc的程序不对,应该是前面修改的问题,应该不是装驱动的问题。