主题 : 有谁做过WINCE下USB设备访问没? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 30597
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2010-10-19
最后登录: 2010-10-25
楼主  发表于: 2010-10-19 10:58

 有谁做过WINCE下USB设备访问没?

最近买了块MINI2440,照着用户手册,能顺利进行内核裁剪,轻松就能将wince5.00装起来,中间遇到一些小问题,但在手册上都找到了相关解决方法,整个上手时间在2天左右搞定了,对友善之臂的资料完整性赞一个!
我购买这块开发板主要是用来了解USB驱动的。我们有一款USB设备,想接入到开发板中,通过编写接口程序,应用程序能正常访问该USB设备。
我们的USB设备有两款,一款是HID类设备,一款是MASSSTORAGE类。
将HID类设备插入开发板,注册表中未能找到相关信息,是不是没有该驱动?看了一下自己所选的WINCE内核,HID只包含了鼠标键盘。
将MASSSTORAGE类设备(类似U盘)插入开发板,注册表中能找到DSK1,于是尝试用CREATFILE创建了设备句柄,当设备处于连接状态时,能返回句柄,当断开连接时,返回INVALID_HANDLE_VALUE,表明句柄创建没问题。然后我再尝试DeviceIoControl时,通过GetLastError返回50,得知请求不支持。参看LED等驱动,于是又通过RETAILMSG查看串口输出信息,修改了一通C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\USB\CLASS\STORAGE\DISK\SCSI2下的几个文件,但没发现哪个文件被调用。
在此向有经验的大大们请教一下,USB MASSSTORAGE类设备驱动程序如果要调试,我们应该跟踪哪个文件,HID类设备不是标准鼠标、键盘,是不是要另外写驱动?
级别: 新手上路
UID: 30597
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2010-10-19
最后登录: 2010-10-25
1楼  发表于: 2010-10-20 12:17
这里看来人气真不怎么样哈。
昨天摸索了一阵子,终于有些眉目了。
USB MASSSTORAGE应该跟踪的就是那个目录下的disk.c文件,只是我在SYSGEN时没有build,所以调试信息没输出,重新builde and sysgen 就能调试了。
另外HID类设备确实需要编写一个驱动程序。
接下来我会验证自己的思路。
周围没人搞WINCE,一个摸索真是孤独啊。
级别: 新手上路
UID: 30597
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2010-10-19
最后登录: 2010-10-25
2楼  发表于: 2010-10-22 10:58
针对MASSSTORAGE类设备我修改了DISK.C文件,通过RETAILMSG增加了一些调试信息,跟踪发现DISK.C里的DSK_IOControl控制类型关于SCSI只有IOCTL_SCSI_PASSTHROUGH,而我们在XP上位机通常用IOCTL_SCSI_PASS_THROUGH_DIRECT,而且上位机的IOCTL_SCSI_PASS_THROUGH与WINCE中IOCTL_SCSI_PASSTHROUGH值不相同,看来应该增加对应的控制类型分支,目前没什么思路,先放一放。
接下来又分析了一下HID类设备的USB访问。
在HID类设备中,同样通过RETAILMSG增加了一些调试信息,主要文件是C:\WINCE500\public\common\oak\drivers\usb\class\hid\下的文件,将每个函数都增加了串口输出调试信息。
当我在插入我们的HID设备时,尝试比较插入鼠标时的调试输出信息,发现Missing endpoint descriptors,没有相关端点描述符,回头分析我们的HID设备,原来,该设备通讯采用了默认端点0,所以不需要其他端点。但WINCE提示要端点,我就修改了HID设备的接口描述符,增加了一个端点描述符,再次插入设备了,程序运行正常。
这中间我将HID设备的HID描述符换成了
  0x05,0x01,0x09,0x00,0xa1,0x01,0x09,0x00,0xa1,0x00,0x05,0x01,0x09,0x00,
    0x15,0x80,0x25,0x7f,0x75,0x08,0x95,0x02,0x81,0x02,0x09,0x00,0x15,0x80,
    0x25,0x7f, 0x75,0x08,0x95,0x9a,0x91,0x02,0xc0,0xc0
并在WINCE注册表中根据HID描述符信息增加了对应的信息
;-------------------------------------USBKEY------
[HKEY_LOCAL_MACHINE\Drivers\HID\ClientDrivers\Usbkey]
"DLL"="ukeyWellcom.dll"
"Prefix"="UKY"
"IClass"="8746756c-b8b9-0579-f9bc-b86dea94591a"
"RemoteWakeup"=dword:1

[HKEY_LOCAL_MACHINE\Drivers\HID\LoadClients\Default\Default\1_0]
[HKEY_LOCAL_MACHINE\Drivers\HID\LoadClients\Default\Default\1_0\Usbkey]
"DLL"="ukeyWellcom.dll"
;-------------------------------------USBKEY END------

现在提示“Could not load client DLL ukeyWellcom.dll”
看来只有编写驱动就可以了,不着急,慢慢来
级别: 新手上路
UID: 30597
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
贡献值: 0 点
综合积分: 8 分
注册时间: 2010-10-19
最后登录: 2010-10-25
3楼  发表于: 2010-10-22 19:27
写HID驱动,大家都是参照键盘驱动来的,我也这么做了,但提示
“This collection does not have any understood usages and will be ignored”
为了解决这个问题,整个下午都在反复调整HID描述符,但没有结果,回头分析了一下,我这个设备本来就不是标准键盘鼠标等桌面设备,这个USAGE估计该不出,所以打算跳过这段代码,直接将EXIT注释了。如此一来,驱动程序就正常了。
目前WINCE上驱动程序和测试应用程序已经基本调通。这中间我又将HID使用页调整回原来的
0x06, 0xa0, 0xff,      //usage page (Vendor defined)
以保证设备在WINCE下跟在XP下相同。
接下来就是调试数据通讯了,应该问题不大了。
级别: 新手上路
UID: 33154
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2010-11-26
最后登录: 2010-12-22
4楼  发表于: 2010-12-10 12:46
楼主还在不在?我也做了一个HID设备的驱动,实现了XXX_Write和XXX_Read,XXX_Write中使用了
DWORD dwErr = pHidSap->pHidFuncs->lpSetReport(pHidSap->hDevice, HidP_Output,//HidP_Feature,
        (char*)pBuffer, BufferLength, dwTimeout);
这个貌似没什么问题,没有报错,发送字节也是成功的。
但是在XXX_Read中使用
DWORD dwErr = pHidSap->pHidFuncs->lpGetReport(pHidSap->hDevice, HidP_Input,
        (char*)pBuffer, BufferLength, &ReceivedLength, dwTimeout);
得到的数据不是我的设备应该返回的数据,而是之前lpSetReport的buffer的内容。
很困惑。不知道楼主能否赐教