不過還有一個(gè)問題,為什么設(shè)置Set_Report()鍵盤數(shù)字燈只是亮一下 就熄滅了 請(qǐng)問什么原因, buf[0]=LED_SCRL*4+LED_CAPS*2+LED_NUM; s=Set_Report(buf); //設(shè)置報(bào)表 if(s==USB_INT_SUCCESS) { printf("Set_Report success\n"); } else { printf("Set_Report Err=%02x\n",(unsigned short)s); //設(shè)置報(bào)告出錯(cuò) //if(s&0x0f==USB_INT_RET_STALL) goto next_operate2; //返回STALL可能本身不支持 }
Set_Report命令緊接著得發(fā)個(gè)OUT命令,此時(shí)OUT對(duì)應(yīng)的endp in addr=0,而不是endp in addr=1,點(diǎn)燈是對(duì)端點(diǎn)0操作的
怎么發(fā)送out命令,
HostCtrlTransfer374()這個(gè)函數(shù)仔細(xì)看
----------------------------------------------------------------------------------------------------- 我 按照你的代碼修改的,可是 NUMlock 燈 還是亮一下就熄滅了了 我新建立一個(gè)HostCtrlTransfer374 函數(shù) UINT8 HostCtrlTransfer374_1( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen ) // 如果需要接收和發(fā)送數(shù)據(jù),那么DatBuf需指向有效緩沖區(qū)用于存放后續(xù)數(shù)據(jù),實(shí)際成功收發(fā)的總長度保存在ReqLen指向的字節(jié)變量中 { UINT8 s, len, count, total; BOOL tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP階段,200mS超時(shí) if ( s == USB_INT_SUCCESS ) // SETUP成功 { tog = TRUE; // 默認(rèn)DATA1,默認(rèn)無數(shù)據(jù)故狀態(tài)階段為IN if((*(ReqBuf+3))==0x22) { total=*( ReqBuf + 6 )-0x40; } else total = *( ReqBuf + 6 ); if ( total && DatBuf ) // 需要收數(shù)據(jù) { len = total; if ( *ReqBuf & 0x80 ) // 收 { while ( len ) { mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // IN數(shù)據(jù) if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count & ( UsbDevEndpSize - 1 ) ) break; // 短包 tog = tog ? FALSE : TRUE; } tog = FALSE; // 狀態(tài)階段為OUT } else { // 發(fā) while ( len ) { mDelayuS( 100 ); count = len >= UsbDevEndpSize ? UsbDevEndpSize : len; Write374Block( RAM_HOST_TRAN, count, DatBuf ); Write374Byte( REG_USB_H_PID, count ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // OUT數(shù)據(jù) if ( s != USB_INT_SUCCESS ) break; DatBuf += count; len -= count; tog = tog ? FALSE : TRUE; } tog = TRUE; // 狀態(tài)階段為IN } total -= len; // 減去剩余長度得實(shí)際傳輸長度 } // if ( s == USB_INT_SUCCESS ) // 數(shù)據(jù)階段成功 // { // Write374Byte( REG_USB_LENGTH, 0 ); // mDelayuS( 100 ); // s = WaitHostTransact374( 0, ( tog ? DEF_USB_PID_IN : DEF_USB_PID_OUT ), TRUE, 200 ); // STATUS階段 // if ( tog && s == USB_INT_SUCCESS ) // 檢查IN狀態(tài)返回?cái)?shù)據(jù)長度 // { // if ( Read374Byte( REG_USB_LENGTH ) ) s = USB_INT_BUF_OVER; // 狀態(tài)階段錯(cuò)誤 // } // } }
我每條語句都仔細(xì)看了 看不出什么不對(duì)
這個(gè)是讓你看OUT在發(fā)set-report后怎么發(fā)OUT命令
我現(xiàn)在也遇到這樣的問題了,CH374枚舉USB鍵盤成功,但是獲取按鍵值失敗,鍵盤燈一直在閃。我接的是數(shù)字小鍵盤
這是串口接收到的數(shù)據(jù)
設(shè)備描述符:12 01 10 01 00 00 00 08 D5 05 89 06 03 01 00 01 00 01?
設(shè)置USB設(shè)備地址0X02成功
獲取配置描述符:
09 02 3B 00 02 01 00 A0 32 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 00 0A 09 04 01 00 01 03 00 00 00 09 21 10 01 00 01 22 32 00 07 05 82 03 05 00 0A?
hid_des_leng=41
endp_in_addr=01
endp_out_addr=00
HID_Desc: 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 95 08 75 01 81 02 95 08 75 01 81 01 05 08 19 01 29 03 95 03 75 01 91 02 95 01 75 05 91 01 05 07 19 00 2a ff 00 15 00 26 ff 00 95 06 75 08 81 00 c0?
Set_Report success
這種小鍵盤
現(xiàn)在不知道問題出在那了,麻煩大神指點(diǎn)一下了,謝謝
HID設(shè)備一般還要發(fā)set_idle命令。數(shù)據(jù)包翻轉(zhuǎn)是否出錯(cuò),有的鍵盤在獲取鍵值數(shù)據(jù)前會(huì)先發(fā)一個(gè)0包??梢杂肂USHOUND抓一下包看看電腦是怎么完成的,模仿這個(gè)過程。
set_idle有設(shè)置,你有BUS HOUND嗎?可以發(fā)一個(gè)給我嗎個(gè)人信息保護(hù),已隱藏,謝謝了