我在获取设备描述符和设置设备地址时都可以,在获取配置描述符的时候出错了,返回的中断号是0x17,有大神知道为什么吗,谢谢
我在连接另外一个打印机时没有出现这样的问题,难道是不同打印机获取描述符的方法不一样吗
原因可能是在接收配置描述符是超过了64字节,导致缓存区溢出,有大神知道这应该怎么处理吗
这是我的枚举过程,不知道为什么在获取配置描述符时返回的中断号就是0x17
status = ch376_GET_DESCR(1);
if(status == USB_INT_SUCCESS)
{
u3_printf("0000000000000000000000\r\n");
//return 1;
len = ch376_RD_USB_DATA0(buffer);
if ( len<18 || p_dev_descr->bDescriptorType!=1 )
{
return( 0 );
}
if ( p_dev_descr->bDeviceClass!=0 )
{
return( 0 );
}
}
ch376_SET_ADDRESS(3);
status = ch376_GET_DESCR(2);//此处的返回值是0x17
if(status == USB_INT_SUCCESS)
{
len = ch376_RD_USB_DATA0(buf);
if ( p_cfg_descr->itf_bInterfaceClass!=7 || p_cfg_descr->itf_bInterfaceSubClass!=1 ) return( 0 );
u3_printf("endp_bmAttributes_1 = %x\r\n",p_cfg_descr->endp_bmAttributes_1);
endp_in_addr = endp_out_addr = 0;
}
addr = p_cfg_descr->endp_bEndpointAddress_1;
u3_printf("addr22222 = %x\r\n",addr);
if(addr &0x80)
{
endp_in_addr = addr & 0x0f;
}
else
{
endp_out_addr = addr &0x0f;
endp_out_size = p_cfg_descr->endp_wMaxPacketSize_1;
}
if(p_cfg_descr->itf_bInterfaceProtocol <= 1) return 0;
if(endp_out_addr == 0) return 0;
u3_printf("p_cfg_descr->conf_bConfigurationValue = %x\r\n",p_cfg_descr->conf_bConfigurationValue);
ch376_SET_CONFIG(p_cfg_descr->conf_bConfigurationValue);
获取配置描述符,命令码 46H 02H。但是收到的描述符放在64字节缓冲区中,如果缓冲不够,此命令会报错,此时可以使用4EH ISSUE_TKN_X命令完成描述符获取。具体如何实现请参考例程贴5
你说的是这样吗?
ch376_SET_ADDRESS(3);
status = ch376_GET_DESCR(2);//我不知道这句用不用写了,我都试了,还是不行,返回值还是0x17
u3_printf("status_1 = %x\r\n",status);
status = ch376_ISSUE_TKN_X(0x80,0 << 4 | DEF_USB_PID_IN);//此时的返回值是0x22
u3_printf("status_2 = %x\r\n",status);
if(status == USB_INT_SUCCESS)
{
len = ch376_RD_USB_DATA0(buf);
if ( p_cfg_descr->itf_bInterfaceClass!=7 || p_cfg_descr->itf_bInterfaceSubClass!=1 ) return( 0 );
u3_printf("endp_bmAttributes_1 = %x\r\n",p_cfg_descr->endp_bmAttributes_1);
endp_in_addr = endp_out_addr = 0;
}
我用bushood看到的描述符没有大于64个字节,我数了才三十多个字节,这样也会在执行ch376_GET_DESCR(2);时 出现溢出吗
长度是否被bushound设置的单包最大长度限制了?
参考完成的控制传输,不是这样发的。控制传输分为三个传输阶段 SETUP_Transfer(dataBuf, &len)
jie你好,我根据您说的现在可以获得描述符了,枚举过程也结束了,但是在我向打印机发送数据时,中断返回0x20,这是为什么啊,是不是枚举之后还需要发送什么命令才能发送数据,
void ch376_send_data(int len,char *buf)
{
char l,stuse,out;
out = 0x00;
while(len)
{
l = len > endp_out_size ? endp_out_size : len;
u3_printf("l = %d\r\n",l);
ch376_WR_HOST_DATA(l,buf);
stuse = ch376_ISSUE_TKN_X(out,endp_out_addr << 4 | DEF_USB_PID_OUT);//返回0x20
u3_printf("stuse = %x\r\n",stuse);
if(stuse == USB_INT_SUCCESS)
{
u3_printf("send is success");
out = (~out & 0x40);
len -= l;
buf += l;
delay_us(10);
}
}
}
这是我的枚举过程,是还缺少什么命令没发吗?
#definep_dev_descr((PUSH_DEVI_DESCR)buffer)
#definep_cfg_descr((PUSB_CFG_DESCR_LONG)buf)
char buffer[64];
char buf[64];
unsigned short int i, len;
int status,addr;
out = 0x00;
status = ch376_GET_DESCR(1);
if(status == USB_INT_SUCCESS)
{
len = ch376_RD_USB_DATA0(buffer);
u3_printf("len = %x\r\n",len);
u3_printf("p_dev_descr->bDescriptorType = %x\r\n",p_dev_descr->bDescriptorType);
if ( len<18 || p_dev_descr->bDescriptorType!=1 )
{
u3_printf("error = 1\r\n");
return( 0 );
}
u3_printf("p_dev_descr->bDeviceClass = %x\r\n",p_dev_descr->bDeviceClass);
if ( p_dev_descr->bDeviceClass!=0 )
{
u3_printf("error = 2\r\n");
return( 0 );
}
max_package = buffer[7];
u3_printf("max_package = %x\r\n",max_package);
}
ch376_mode_reset();
ch376_SET_ADDRESS(5);
Req_buf[0]=0x80;Req_buf[1]=0x06;Req_buf[2]=0x00;Req_buf[3]=0x02;
Req_buf[4]=0x00;Req_buf[5]=0x00;Req_buf[6]=0x04;Req_buf[7]=0x00;
status = SETUP_Transfer(buf, &len);
if(status == USB_INT_SUCCESS)
{
Req_buf[6] = buffer[2];
Req_buf[7] = buffer[3];
status = SETUP_Transfer(buf, &len);
u3_printf("status = %x ",status);
}
if ( p_cfg_descr->itf_bInterfaceClass!=7 || p_cfg_descr->itf_bInterfaceSubClass!=1 ) return( 0 );
u3_printf("endp_bmAttributes_1 = %x\r\n",p_cfg_descr->endp_bmAttributes_1);
endp_in_addr = endp_out_addr = 0;
addr = p_cfg_descr->endp_bEndpointAddress_1;
if(addr &0x80)
{
u3_printf("addr_1 = %x\r\n",addr);
endp_in_addr = addr & 0x0f;
}
else
{
u3_printf("addr_2 = %x\r\n",addr);
endp_out_addr = addr &0x0f;
endp_out_size = p_cfg_descr->endp_wMaxPacketSize_1;
}
if(p_cfg_descr->itf_bNumEndpoints >= 2)
{
if(p_cfg_descr->endp_bDescriptorType_2 == 5)
{
addr = p_cfg_descr->endp_bEndpointAddress_2;
if(addr &0x80)
{
u3_printf("addr_3 = %x\r\n",addr);
endp_in_addr = addr & 0x0f;
}
else
{
u3_printf("addr_4 = %x\r\n",addr);
endp_out_addr = addr &0x0f;
endp_out_size = p_cfg_descr->endp_wMaxPacketSize_2;
}
}
}
if(p_cfg_descr->itf_bInterfaceProtocol <= 1) return 0;
if(endp_out_addr == 0) return 0;
ch376_SET_CONFIG(p_cfg_descr->conf_bConfigurationValue);
endp_out_addr的值?以及配置描述符?
endp_out_addr的值是8,我用bushood也是端口8是发送,
配置描述符是
仿照bus hound抓包数据发送。20错误表示设备响应超时,可能是传输的数据包不正确,设备没有响应。
我用bushood发送是可以的,能正常打印,就是用程序发就出现这种情况
而且用这种方法枚举打印只能枚举这个打印机,另外一个打印机枚举的数据不全,这是为什么呢