如题 device 描述符超过64B,issue_token_x该怎样处理,得到全部描述符,谢谢!
你可以到这个里面去下载一个CH375B操作键盘鼠标的程序,里面有控制传输采用外置固件的程序: http://www.wch.cn/bbs/View.asp?S=101&I=19463
(1)您需要先了解一下描述符的结构 (2)描述符中有表示整个描述符总长度的数据,第一次先把总长度获取到,然后根据这个长度分多次获取,获取的流程参考楼上的例程
谢谢两位的回复,我研究了例子,感觉有个问题,我有些不大理解 unsigned char get_descr_ex() 函数里面 有个 p+=0x08; 这样我的描述符的结构里面 每次只有8字节存储?
目前我遇到的情况是 totallength = 0x95 读第一次是64B,读第二次时,就没反映了,中断不再发生。
Descr_Config.wTotalLength = 0x95; u08Length = 0x95;
UINT08 Get_Describle_Other(UINT08 u08Type, UINT08 u08Length) { UINT08 u08DesrLen; UINT08 revmode; UINT08 *p = descr_buf; p_Dev_Data[0] = 0x80; // requestrype// host to device p_Dev_Data[1] = USB_REQ_GET_DESCRIPTOR; // request get scriber p_Dev_Data[2] = 0x00; p_Dev_Data[3] = u08Type; // descr type, dev, config, string, interface, endpoint p_Dev_Data[4] = 0x00; // p_Dev_Data[5] = 0x00; p_Dev_Data[6] = u08Length; p_Dev_Data[7] = 0x00;
wr_usb_data(8, p_Dev_Data);
u08Statue = issue_token_X( ( 0 << 4 ) | DEF_USB_PID_SETUP, 0x80);
revmode = 0xc0; u08DesrLen = Descr_Config.wTotalLength;
if(u08Statue == USB_INT_SUCCESS) while(u08DesrLen) { // if(u08Statue == USB_INT_SUCCESS) { u08Statue = issue_token_X( ( 0 << 4 ) | DEF_USB_PID_IN, revmode); if(revmode == 0x80) revmode = 0xC0; else revmode = 0x80; }
if(u08Statue == USB_INT_SUCCESS) { u08Statue = rd_usb_data( p); u08DesrLen -= u08Statue; p += u08Statue; } u08Statue = 0x00;
} wr_usb_data( 0, p_Dev_Data); u08Statue = issue_token_X( ( 0 << 4 ) | DEF_USB_PID_OUT, 0x40);
if(u08Statue == USB_INT_SUCCESS) { return (p_Dev_Data[0]); }
return (0xFF); }
请大家指点一下,该怎样完成这个读取过程,谢谢!
(1) p+=0x08你可以将其修改为p+=Length;//length应该是每次获取的描述符的实际长度 (2)u08DesrLen = Descr_Config.wTotalLength;如果你是根据这个长度向设备索取描述符的话不是太妥当.如二楼所说,第一次获取描述符总长度(这个长度可能小于Descr_Config.wTotalLength).你应该根据这个总长度来向设备索取描述符.
现在已经可以读取完整的描述符了,现在有个新问题请教大虾
下面是读取完整描述符之后分析出来,
usb设备 有3个 interface, 第三个是hid interface, 只有一个endp 是 0x83。
我使用例程的get_report_descr_ex总是不成功
Request.Req.bmRequestType=0x81; Request.Req.bRequest=0x06; Request.Req.wValue=0x0022; Request.Req.wIndex=0x0000; Request.Req.wLength=0x0000|((unsigned int)(report_descr_len+0x40)<<8);
执行 issue_token 时, 出现错误, 返回代码 0x2E, 请各位大虾给出一些建议,谢谢!
get_report_descr_ex里的接口号没有设置好: Request.Req.wIndex=((unsigned int)InterfaceNum)<<8;//对应HID设备的接口号
谢谢各位帮忙,现在已经能顺利读取所有描述符了!
主要问题是 51编译器,avrgcc的编译 对于数据的大端小端处理不同, 使得发送数据的顺序不对,导致命令出错!