我在獲取設(shè)備描述符和設(shè)置設(shè)備地址時(shí)都可以,在獲取配置描述符的時(shí)候出錯(cuò)了,返回的中斷號(hào)是0x17,有大神知道為什么嗎,謝謝
我在連接另外一個(gè)打印機(jī)時(shí)沒有出現(xiàn)這樣的問題,難道是不同打印機(jī)獲取描述符的方法不一樣嗎
原因可能是在接收配置描述符是超過了64字節(jié),導(dǎo)致緩存區(qū)溢出,有大神知道這應(yīng)該怎么處理嗎
這是我的枚舉過程,不知道為什么在獲取配置描述符時(shí)返回的中斷號(hào)就是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字節(jié)緩沖區(qū)中,如果緩沖不夠,此命令會(huì)報(bào)錯(cuò),此時(shí)可以使用4EH ISSUE_TKN_X命令完成描述符獲取。具體如何實(shí)現(xiàn)請(qǐng)參考例程貼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);//此時(shí)的返回值是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個(gè)字節(jié),我數(shù)了才三十多個(gè)字節(jié),這樣也會(huì)在執(zhí)行ch376_GET_DESCR(2);時(shí) 出現(xiàn)溢出嗎
長度是否被bushound設(shè)置的單包最大長度限制了?
參考完成的控制傳輸,不是這樣發(fā)的??刂苽鬏敺譃槿齻€(gè)傳輸階段 SETUP_Transfer(dataBuf, &len)
jie你好,我根據(jù)您說的現(xiàn)在可以獲得描述符了,枚舉過程也結(jié)束了,但是在我向打印機(jī)發(fā)送數(shù)據(jù)時(shí),中斷返回0x20,這是為什么啊,是不是枚舉之后還需要發(fā)送什么命令才能發(fā)送數(shù)據(jù),
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);
}
}
}
這是我的枚舉過程,是還缺少什么命令沒發(fā)嗎?
#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是發(fā)送,
配置描述符是
仿照bus hound抓包數(shù)據(jù)發(fā)送。20錯(cuò)誤表示設(shè)備響應(yīng)超時(shí),可能是傳輸?shù)臄?shù)據(jù)包不正確,設(shè)備沒有響應(yīng)。
我用bushood發(fā)送是可以的,能正常打印,就是用程序發(fā)就出現(xiàn)這種情況
而且用這種方法枚舉打印只能枚舉這個(gè)打印機(jī),另外一個(gè)打印機(jī)枚舉的數(shù)據(jù)不全,這是為什么呢