WINCE5.0 USB驱动如何确定设备扩展信息的长度
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驱动需要解析这个扩展信息时,如何确定扩展信息的长度?