阅读:1543回复:2
USB开发中遇到的一些问题
问题1:
硬件环境为TI5402 DSP(16位)+PDIUSBD12。D12有两个端点,分别设定为中断传输和批传输。 驱动程序是用DRIVERWORKS自动生成的,添加了端点1端点2,属性指定与下面的描述符一致。 下面是我的所有描述符,其中双字节的数据由于处理器的原因拆成了两个独立的单字节数据。 code USB_DEVICE_DESCRIPTOR DeviceDescr = { sizeof(USB_DEVICE_DESCRIPTOR), // 描述表大小 (18 bytes) USB_DEVICE_DESCRIPTOR_TYPE, // 设备描述表类型01 //SWAP(0x0100), 0x0,0x01,// 兼容设备版本号(BCD码) USB_CLASS_CODE_TEST_CLASS_DEVICE,//设备类码0xdc 0, // 子类码 0,// 协议码 EP0_PACKET_SIZE,//端点0最大包大小16 //SWAP(0x0471), 0x71,0x04,//厂商ID //SWAP(0x0222), 0x22,0x02,// 产品ID //SWAP(0x0100), 0x0,0x01,// 设备发行号(BCD码) 0, //厂商信息字符串索引 0, // 产品信息字符串索引 0,// 设备序列号字符串索引(不支持设为0) 1 // 配置数 }; code USB_CONFIGURATION_DESCRIPTOR ConfigDescr = { sizeof(USB_CONFIGURATION_DESCRIPTOR),// 配置描述表长度46 USB_CONFIGURATION_DESCRIPTOR_TYPE,// 配置描述表类型02 //SWAP(CONFIG_DESCRIPTOR_LENGTH), // 配置描述表及附带表长度 CONFIG_DESCRIPTOR_LENGTH&0xFF,(CONFIG_DESCRIPTOR_LENGTH>>8)&0xFF, //42,0, 1,// 接口配置数 1,// 配置描述表标识 0,// 配置描述表字符串描述表索引 0xa0,// 配置属性,原来是0x60 0x64// 总线供电最大值(*2mA),原值为0x1 }; code USB_INTERFACE_DESCRIPTOR InterfaceDescr = { sizeof(USB_INTERFACE_DESCRIPTOR),// 接口描述表长度(9) USB_INTERFACE_DESCRIPTOR_TYPE,// 接口描述表类型04 0,// 接口数(0) 0,// 轮寻设置(0 号端点) NUM_ENDPOINTS,// 端点数 (4) //2, USB_CLASS_CODE_TEST_CLASS_DEVICE,// 接口类属0xdc USB_SUBCLASS_CODE_TEST_CLASS_D12,// 子类码0xa0 USB_PROTOCOL_CODE_TEST_CLASS_D12,// 协议码0xb0 0// 接口字符串描述表索引(不支持) }; code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = { sizeof(USB_ENDPOINT_DESCRIPTOR),// 端点描述表长度(7) USB_ENDPOINT_DESCRIPTOR_TYPE,// 端点描述表类型05 0x81,// IN 端点(1) USB_ENDPOINT_TYPE_INTERRUPT,// 传输模式3(0 控制、1 同步、2 批、3 中断传输) //SWAP(EP1_PACKET_SIZE), EP1_PACKET_SIZE&0xff,(EP1_PACKET_SIZE>>8)&0xff,// 最大包大小(16) //EP1_PACKET_SIZE, //0x10, 0x64// 轮寻时间, }; code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr = { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x1, USB_ENDPOINT_TYPE_INTERRUPT, //SWAP(EP1_PACKET_SIZE), EP1_PACKET_SIZE&0xff,(EP1_PACKET_SIZE>>8)&0xff, //0x10, //EP1_PACKET_SIZE, 0x64// }; code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr = { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x82, USB_ENDPOINT_TYPE_BULK, //SWAP(EP2_PACKET_SIZE), EP2_PACKET_SIZE&0xff,(EP2_PACKET_SIZE>>8)&0xff, //0x10, //EP2_PACKET_SIZE, 0x64// }; code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr = { sizeof(USB_ENDPOINT_DESCRIPTOR), USB_ENDPOINT_DESCRIPTOR_TYPE, 0x2, USB_ENDPOINT_TYPE_BULK, //SWAP(EP2_PACKET_SIZE), EP2_PACKET_SIZE&0xff,(EP2_PACKET_SIZE>>8)&0xff, //0x10, //EP2_PACKET_SIZE, 0x64 }; 我收到的主机的标准请求如下:(请求数据的后三个值是高低位颠倒的) 80 6 100 0 40 Suspend change! Request Type = Standard, Request = GET_DESCRIPTOR. Bus reset! Bus reset! 0 5 2 0 0 Request Type = Standard, Request = SET_ADDRESS. 80 6 100 0 12 Request Type = Standard, Request = GET_DESCRIPTOR. 80 6 200 0 9 Request Type = Standard, Request = GET_DESCRIPTOR. 80 6 200 0 ff Request Type = Standard, Request = GET_DESCRIPTOR. 80 6 100 0 12 Request Type = Standard, Request = GET_DESCRIPTOR. 80 6 200 0 400 Request Type = Standard, Request = GET_DESCRIPTOR. 0 9 1 0 0 Request Type = Standard, Request = SET_CONFIGURATION. configure device done Suspend change! (据别人的经验,好像不会有第6和7个请求,为何我的会出现这两个请求,是不是驱动程序发出的?) 问题1: 枚举的时候经常出现“超出了USB控制器带宽”的错误 但这种情况并不是每次都出现。 出现这种情况后,一般在“拔出或弹出硬件”工具中先停止设备。 然后再拔出USB设备,再重新连接一次,就不会有这个错了。 问题2: 当没有出现问题1提到的错误时,我用USBVIEW看到端点描述符中最大包大小一项全为0, 而其他项都与上面的设定相同。 我怀疑是USBVIEW的问题(USBVIEW.exe是通过DDK中的例程编译得到的),我的怀疑是否有根据呢? 问题3: 我的驱动程序实际上是按“10分钟生成USB驱动“那篇文章做的。 可是执行驱程测试程序test_XXX.exe r 5或test_XXX.exe w 5时都会蓝屏DUMP 而测试IOCONTROL函数,即test_XXX.exe i n时,则不会DUMP,但好像也不正确。 请问各位,执行OICONTROL函数时,设备固件程序应该有什么反应? 是不是会收到一个与标准请求类似的8字节的数据包。 驱程执行读写操作时固件又该如何反应?是不是进入主端点(端点2)的接收发送处理函数。 暂时先问这些,谢谢各位的解答。 致礼! |
|
最新喜欢:![]() |
沙发#
发布于:2003-09-14 21:54
哪位好心人帮忙看看吧
|
|
板凳#
发布于:2003-09-16 16:10
D12就没有学明白
|
|
|