WINCE5.0 USB驱动如何确定设备扩展信息的长度

foochow 2009-02-23 01:52:16
LINUX下的usb core驱动定义的数据结构中都有一个字端来保存扩展信息的长度,例如:

/* host-side wrapper for one interface setting's parsed descriptors */
struct usb_host_interface {
struct usb_interface_descriptor desc;

/* array of desc.bNumEndpoint endpoints associated with this
* interface setting. these will be in no particular order.
*/
struct usb_host_endpoint *endpoint;

char *string; /* iInterface string, if present */
unsigned char *extra; /* Extra descriptors */
int extralen;
};

结构的最后两个字段用来保存接口扩展信息的地址和长度。

但是wince5.0 的USB CORE驱动定义的数据结构并没有长度字段:
typedef struct _USB_INTERFACE {
const DWORD dwCount;

const USB_INTERFACE_DESCRIPTOR Descriptor;
const LPCVOID lpvExtended;
const LPCUSB_ENDPOINT lpEndpoints;
} USB_INTERFACE, * PUSB_INTERFACE, * LPUSB_INTERFACE;
typedef USB_INTERFACE const * PCUSB_INTERFACE;

这个定义中只包含了扩展信息的地址(lpvExtended).

查看了相关usb core的源码,发现在USB设备枚举时驱动并没有保存扩展信息长度,usb core的实现在目录WINCE500\PUBLIC\COMMON\OAK\DRIVERS\USB\HCD\COMMON下,设备相关信息的解析在
cdevice.cpp文件中实现,也就是CDevice::CreateUsbConfigurationStructure方法(394行)。

// 2) copy any extended info, if it exists
{
UINT interfaceDescExtendedBytes = 0;
while ( offset + interfaceDescExtendedBytes < dataBufferLen ) {
pusbCommon = (PUSB_COMMON_DESCRIPTOR)(pDataBuffer + offset + interfaceDescExtendedBytes);
if ( pusbCommon->bDescriptorType != USB_INTERFACE_DESCRIPTOR_TYPE &&
pusbCommon->bDescriptorType != USB_ENDPOINT_DESCRIPTOR_TYPE &&
offset + interfaceDescExtendedBytes + pusbCommon->bLength <= dataBufferLen ) {

interfaceDescExtendedBytes += pusbCommon->bLength;
} else {
break;
}
}
DEBUGCHK( rInterface.lpbExtended == NULL );
if ( interfaceDescExtendedBytes > 0 ) {
rInterface.lpbExtended = new BYTE[ interfaceDescExtendedBytes ];
if ( rInterface.lpbExtended == NULL ) {
goto configDescMemoryError;
}
memcpy( rInterface.lpbExtended, pDataBuffer + offset, interfaceDescExtendedBytes );
offset += interfaceDescExtendedBytes;
#ifdef DEBUG
DumpExtendedBytes( rInterface.lpbExtended, interfaceDescExtendedBytes );
#endif // DEBUG
}
}


代码段开头定义的interfaceDescExtendedBytes 变量就是扩展信息的长度,usb core代码并没有保存这个长度,传递给USB设备驱动。那么如果USB驱动需要解析这个扩展信息时,如何确定扩展信息的长度?

...全文
82 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
beyondma 2009-03-01
  • 打赏
  • 举报
回复
很久不做驱动了,解析的时候需要长度吗?

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧