阅读:1594回复:1
RNDIS Composite Device "Cannot Start error code 10"现在开发一个USB 复合设备,包括4个子设备 Modem,USBNET,一个自定义的CDC设备以及RNDIS 。 1) 之前测试过前三个子设备作为复合设备工作OK,现在新加入了一个RNDIS设备,Windows(Win7 32bit) 可以枚举出4个设备,且根据修改好的inf文件可以匹配上RNDIS驱动,但是其他三个设备工作正常,唯独RNDIS设备cannot start。 利用USB 分析仪抓包可以发现 对于 RNDIS 设备,Set Configuration 之后就没有操作了,按理说此后Windows应该发起以RNDIS initialize messages为首的一系列握手过程。 2) 如果把其他三个设备从描述符里面去掉,只保留RNDIS ,则一切工作正常。 请问大虾们是否遇到过类似问题,有什么思路? 设备描述符如下: devDesc[0] = 0x12; // bLength - Descriptor length devDesc[1] = 0x01; // bDescriptorType - Descriptor Type devDesc[2] = bcdUSB_LSB; // bcdUSB (LSB) - Device Compliant to USB specification .. devDesc[3] = bcdUSB_MSB; // bcdUSB (MSB) devDesc[4] = 0x00; // bDeviceClass - class of the device devDesc[5] = 0x00; // bDeviceSubClass - subclass of the device devDesc[6] = 0x00; // bDeviceProtocol - protocol of the device devDesc[7] = bEp0MaxPacketSize; // bMaxPacketSize0 - Max Packet Size for EP zero devDesc[8] = 0x86; // idVendor (LSB) - Vendor ID devDesc[9] = 0x12; // idVendor (MSB) devDesc[10] = 0x0E; // idProduct (LSB) - Product ID devDesc[11] = 0x81; // idProduct (MSB) devDesc[12] = 0x02; // bcdDevice (LSB) - The device release number devDesc[13] = 0x00; // bcdDevice (MSB) devDesc[14] = 0x01; // iManufacturer - Index of string descriptor describing Manufacturer devDesc[15] = 0x03; // iProduct - Index of string descriptor describing Product devDesc[16] = 0x04; // iSerialNumber - Index of string descriptor describing Serial number devDesc[17] = 0x01; // bNumConfigurations - Number of configurations //Configuration Descriptor configDesc[0] = 0x09; // bLength - Descriptor length configDesc[1] = 0x02; // bDescriptorType - Descriptor Type configDesc[2] = 177; // wTotalLength (LSB) - Total Data length for the configuration, configDesc[3] = 0x00; // wTotalLength (MSB) - includes all descriptors for this configuration configDesc[4] = 0x05; // bNumInterfaces - Number of interfaces this configuration supports configDesc[5] = 0x01; // bConfigurationValue - The Value that should be used to select this configuration configDesc[6] = 0x00; // iConfiguration - Index of string descriptor describing this configuration configDesc[7] = 0xC0; // bmAttributes - bit6: Self-Powered, bit5: RemoteWakeup configDesc[8] = 0xfa; // MaxPower - Maximum power consumption for this configuration (mA) //Interface Descriptor 0 usbnet configDesc[9] = 0x09; // bLength - Descriptor length configDesc[10] = 0x04; // bDescriptorType - Descriptor Type configDesc[11] = 0x00; // bInterfaceNumber - Index (Number) of this interfaces configDesc[12] = 0x00; // bAlternateSetting - The value to select alternate setting of this interface configDesc[13] = 0x03; // bNumEndpoints - Number endpoints used by this interface configDesc[14] = 0xff; // bInterfaceClass - Class of this Interface configDesc[15] = 0xff; // bInterfaceSubClass - Sub class of this Interface configDesc[16] = 0x00; // bInterfaceProtocol - Protocol of this Interface configDesc[17] = 0x05; // iInterface - Index of string descriptor describing this Interface // usbnet Endpoint Descriptor configDesc[18] = 0x07; // bLength - Descriptor length configDesc[19] = 0x05; // bDescriptorType - Descriptor Type configDesc[20] = 0x85; // bEndpointAddress - Endpoint Address & Direction configDesc[21] = 0x03; // bmAttributes - BULK,ISO,Interrupt configDesc[22] = 0x0F; // wMaxPacketSize (LSB) - Max packet size configDesc[23] = 0x00; // wMaxPacketSize (MSB) configDesc[24] = bInterval; // bInterval - Polling Interval (ms) configDesc[25] = 0x07; // bLength - Descriptor length configDesc[26] = 0x05; // bDescriptorType - Descriptor Type configDesc[27] = 0x81; // bEndpointAddress - Endpoint Address & Direction configDesc[28] = 0x02; // bmAttributes - BULK,ISO,Interrupt configDesc[29] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Max packet size configDesc[30] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (MSB) configDesc[31] = 0x00; // bInterval - Polling Interval (ms) configDesc[32] = 0x07; // bLength - Descriptor length configDesc[33] = 0x05; // bDescriptorType - Descriptor Type configDesc[34] = 0x02; // bEndpointAddress - Endpoint Address & Direction configDesc[35] = 0x02; // bmAttributes - BULK,ISO,Interrupt configDesc[36] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Max packet size configDesc[37] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (MSB) configDesc[38] = 0x00; // bInterval - Polling Interval (ms) //Interface descriptor 1 ICAT configDesc[39] = 0x09; // bLength - Descriptor length configDesc[40] = 0x04; // bDescriptorType - Descriptor Type configDesc[41] = 0x01; // bInterfaceNumber - Index (Number) of this interfaces configDesc[42] = 0x00; // bAlternateSetting - The value to select alternate setting of this interface configDesc[43] = 0x02; // bNumEndpoints - Number endpoints used by this interface configDesc[44] = 0xFF; // bInterfaceClass - Class of this Interface configDesc[45] = 0x00; // bInterfaceSubClass - Sub class of this Interface configDesc[46] = 0x00; // bInterfaceProtocol - Protocol of this Interface configDesc[47] = 0x00; // iInterface - Index of string descriptor describing this Interface //ICAT endpoints configDesc[48] = 0x07; // bLength - Descriptor length configDesc[49] = 0x05; // bDescriptorType - Descriptor Type configDesc[50] = 0x87; // bEndpointAddress - Endpoint Address & Direction configDesc[51] = 0x02; // bmAttributes - BULK,ISO,Interrupt configDesc[52] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Max packet size configDesc[53] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (MSB) configDesc[54] = 0x00; // bInterval - Polling Interval (ms) configDesc[55] = 0x07; // bLength - Descriptor length configDesc[56] = 0x05; // bDescriptorType - Descriptor Type configDesc[57] = 0x08; // bEndpointAddress - Endpoint Address & Direction configDesc[58] = 0x02; // bmAttributes - BULK,ISO,Interrupt configDesc[59] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Max packet size configDesc[60] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (MSB) configDesc[61] = 0x00; // bInterval - Polling Interval (ms) //Modem class specific descriptors configDesc[62] = 0x09; // bLength - Descriptor length configDesc[63] = 0x04; // bDescriptorType - Descriptor Type configDesc[64] = 0x02; // bInterfaceNumber - Index (Number) of this interfaces configDesc[65] = 0x00; // bAlternateSetting - The value to select alternate setting of this interface configDesc[66] = 0x03; // bNumEndpoints - Number endpoints used by this interface configDesc[67] = 0x02; // bInterfaceClass - Class of this Interface configDesc[68] = 0x02; // bInterfaceSubClass - Sub class of this Interface configDesc[69] = 0x01; // bInterfaceProtocol - Protocol of this Interface configDesc[70] = 0x00; // iInterface - Index of string descriptor describing this Interface configDesc[71] = 0x05; // descriptor length Comms Class CS_INTERFACE 'Functional Descriptors' Triplet configDesc[72] = 0x24; // descriptor type configDesc[73] = 0x00; // subtype = header configDesc[74] = 0x10; // BCD configDesc[75] = 0x01; // configDesc[76] = 0x05; // 2. descriptor length - Call Manangement Func Desc configDesc[77] = 0x24; // descriptor type configDesc[78] = 0x01; // subtype = Call management configDesc[79] = 0x00; //bmcapabilities; MS driver usbser.sys seems to ignore this bit and sends AT over the data,interface anyway configDesc[80] = 0x01; // Interface number of data class interface configDesc[81] = 0x04; // 3.descriptor length Abstract Control Func Desc configDesc[82] = 0x24; // descriptor type configDesc[83] = 0x02; // subtype = Abstract CM configDesc[84] = 0x00; // bmcapabilities configDesc[85] = 0x05; // Size of descriptor. Number of interfaces plus 3 bytes of header configDesc[86] = 0x24; // 0x24 - CS_INTERFACE configDesc[87] = 0x06; // 0x06 - See table 25 of document "USB Class definitions for Comms Devices" configDesc[88] = 0x00; configDesc[89] = 0x01; //Endpoint Descriptors MODEM configDesc[90] = 0x07; // bLength - Descriptor length configDesc[91] = 0x05; // bDescriptorType - Descriptor Type configDesc[92] = 0x86; // bEndpointAddress - Endpoint Address & Direction configDesc[93] = 0x03; // bmAttributes - BULK,ISO,Interrupt configDesc[94] = 0x0F; // wMaxPacketSize (LSB) - Max packet size configDesc[95] = 0x00; // wMaxPacketSize (MSB) configDesc[96] = bInterval; // bInterval - Polling Interval (ms) configDesc[97] = 0x07; // bLength - Descriptor length configDesc[98] = 0x05; // bDescriptorType - Descriptor Type configDesc[99] = 0x83; // bEndpointAddress - Endpoint Address & Direction configDesc[100] = 0x02; // bmAttributes - BULK,ISO,Interrupt configDesc[101] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Max packet size configDesc[102] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (MSB) configDesc[103] = 0x00; // bInterval - Polling Interval (ms) configDesc[104] = 0x07; // bLength - Descriptor length configDesc[105] = 0x05; // bDescriptorType - Descriptor Type configDesc[106] = 0x04; // bEndpointAddress - Endpoint Address & Direction configDesc[107] = 0x02; // bmAttributes - BULK,ISO,Interrupt configDesc[108] = bBulkMaxPacketSize_LSB; // wMaxPacketSize (LSB) - Max packet size configDesc[109] = bBulkMaxPacketSize_MSB; // wMaxPacketSize (MSB) configDesc[110] = 0x00; // bInterval - Polling Interval (ms) //rndis IAD configDesc[111] = 0x08; // bLength configDesc[112] = 0x0b; // INTERFACE ASSOCIATION DESCRIPTOR bDescriptorType configDesc[113] = 0x03; // bFirstInterface configDesc[114] = 0x02; // bInterfaceCount configDesc[115] = 0x02; // bFunctionClass configDesc[116] = 0x02; // bFunctionSubClass configDesc[117] = 0xFF; // bFunctionProtocol configDesc[118] = 0x03; // Index of string descriptor describing this function //rndis comm interface configDesc[119] = 0x09; // bLength - Descriptor length configDesc[120] = 0x04; // bDescriptorType - Descriptor Type configDesc[121] = 0x03; //bInterfaceNumber - for RNDIS configDesc[122] = 0x00; // bAlt configDesc[123] = 0x01; // bNumEnd configDesc[124] = 0x02; //bInterfaceClass configDesc[125] = 0x02; // bInterfaceSubclass configDesc[126] = 0xFF; // bInterfaceprotocol configDesc[127] = 0x00; // iInterface +++++++++++++++++++++++++++++++++++++need modified // Class specified descriptor configDesc[128] = 0x05; // configDesc[129] = 0x24; // bDescriptorType configDesc[130] = 0x00; //bDescriptorSubtype configDesc[131] = 0x10; // BCD configDesc[132] = 0x01; // configDesc[133] = 0x05; // configDesc[134] = 0x24; // bDescriptorType configDesc[135] = 0x01; // bDescriptorSubtype configDesc[136] = 0x00; // bmCapabilities configDesc[137] = 0x04; //bDataInterface configDesc[138] = 0x04; // configDesc[139] = 0x24; // bDescriptorType configDesc[140] = 0x02; // bDescriptorSubtype configDesc[141] = 0x00; // bmCapabilities configDesc[142] = 0x05; // configDesc[143] = 0x24; // bDescriptorType configDesc[144] = 0x06; // bDescriptorSubtype configDesc[145] = 0x03; // bControlInterface configDesc[146] = 0x04; // bsubordinateInterface //Interrupt In endpoint configDesc[147] = 0x07; // configDesc[148] = 0x05; // configDesc[149] = 0x8C; //bendpointAddress configDesc[150] = 0x03; //bmAttributes configDesc[151] = 0x08; // wMaxPacketSize configDesc[152] = 0x00; // configDesc[153] = 0x01; // bInterval //rndis data interface configDesc[154] = 0x09; // bLength - Descriptor length configDesc[155] = 0x04; // bDescriptorType - Descriptor Type configDesc[156] = 0x04; //bInterfaceNumber --- for RNDIS configDesc[157] = 0x00; // bAlt configDesc[158] = 0x02; // NumEndpoints configDesc[159] = 0x0a; //bInterfaceClass configDesc[160] = 0x00; // bInterfaceSubclass configDesc[161] = 0x00; // bInterfaceprotocol configDesc[162] = 0x00; // iInterface +++++++++++++++++++++++++++++++++++++need modified //Bulk In endpoint configDesc[163] = 0x07; // configDesc[164] = 0x05; // configDesc[165] = 0x8E; //bendpointAddress configDesc[166] = 0x02; //bmAttributes configDesc[167] = 0x00; // wMaxPacketSize configDesc[168] = 0x02; // configDesc[169] = 0x00; // bInterval //Bulk Out endpoint configDesc[170] = 0x07; // configDesc[171] = 0x05; // configDesc[172] = 0x0D; //bendpointAddress configDesc[173] = 0x02; //bmAttributes configDesc[174] = 0x00; // wMaxPacketSize configDesc[175] = 0x02; // configDesc[176] = 0x00; // bInterva |
|
沙发#
发布于:2012-08-30 17:07
自己回答吧,必须把RNDIS的IAD 调整描述符的到最前面,作为第一个和第二个interface。
问题解决,虽然不知道为什么,权且记下吧,希望后来人能发现深层次的原因。 |
|