hcn: 請問,在USB接口鍵盤例程中的這么幾個函數(shù)是否是必須的? set_report(); set_idle(); get_descriptor_x(); 至少我看不出它們有什么用。
這是根據(jù)計算機(jī)操作鍵盤的步驟來的,如果不這樣操作的話,那么鍵盤的枚舉就有可能不成功
hcn: 這幾個函數(shù)我先屏蔽掉試試,不行的話再添上。 我通過相關(guān)軟件抓取的配置描述符(USB鍵盤)有這樣兩種: 09 02 3b 00 02 01 00 a0 18 09 02 22 00 01 01 00 a0 18 都是9個字節(jié),wTotalLength一個是59(0x3b),一個是34(0x22),但我不知道應(yīng)該是哪一種;
我用 request.r.bmRequestType=0x80; request.r.bRequest=0x06; request.r.wValue=0x0002; request.r.wIndx=0x0000; request.r.wLength=0x0900; get_device_derc();//配置描述符 得到的配置描述符為 09 02 3b 00 02 01 00 a0 18 而用 request.r.bmRequestType=0x80; request.r.bRequest=0x06; request.r.wValue=0x0002; request.r.wIndx=0x0000; request.r.wLength=0x0000|((unsigned int)buffer[2]<<8); get_device_derc();//配置描述符 得到的為59個字節(jié)的描述符: 09 02 3b 00 02 01 00 a0 18 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 ...
請問這是對的嗎?
你用BUS HOUND軟件抓下你的低速設(shè)備的描述符,接著在用你的程序來讀取你的設(shè)備的描述符,比較下就可以了
hcn:
unsigned char status; void intt0() { unsigned char len_temp,i; unsigned char *BUF=buffer_r; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ status=CH375_RD_DAT_PORT();//printf("%02x ",(unsigned int)status);printf("\n"); if(status!=USB_INT_SUCCESS)//&&((status&0xf0)==0x20)) {CH375_WR_CMD_PORT( CMD_CLR_STALL );//printf("13\n"); CH375_WR_DAT_PORT(1); /* 如果設(shè)備端不是CH37X芯片,那么需要修改端點(diǎn)號 */ toggle_recv(1); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//發(fā)送從中斷端點(diǎn)讀數(shù)據(jù)的令牌 } else { len_temp=rd_usb_data(buffer_r); //鍵盤中斷端點(diǎn)數(shù)據(jù)長度一般為8字節(jié),鼠標(biāo)為4字節(jié) //for(i=0;i!=8;i++)printf("%02x ",(unsigned int)buffer_r[i]); // printf("\n"); // flag_output=0; tank=((~tank)&0x01); toggle_recv(tank); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//發(fā)送從中斷端點(diǎn)讀數(shù)據(jù)的令牌 } }
這段接收數(shù)據(jù)子函數(shù)好象有點(diǎn)問題,不對鍵盤做任何操作,都可以執(zhí)行到else后面的大括號里頭。不知道為什么?
hcn: 我在檢驗(yàn)USB鍵盤那段例程,前面的步驟都沒什么問題,就是最后用intt0();子函數(shù)接收不到數(shù)據(jù)。
hcn: 不管按什么鍵,我現(xiàn)在從鍵盤端接收的8個字節(jié)全是0,不知為什么?
unsigned char status; void intt0() { unsigned char len_temp,i; unsigned char *BUF=buffer; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ status=CH375_RD_DAT_PORT(); if(status!=USB_INT_SUCCESS) {CH375_WR_CMD_PORT( CMD_CLR_STALL ); CH375_WR_DAT_PORT(1); /* 如果設(shè)備端不是CH37X芯片,那么需要修改端點(diǎn)號 */ toggle_recv(1); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//發(fā)送從中斷端點(diǎn)讀數(shù)據(jù)的令牌 } else { len_temp=rd_usb_data(buffer); //鍵盤中斷端點(diǎn)數(shù)據(jù)長度一般為8字節(jié),鼠標(biāo)為4字節(jié) tank=((~tank)&0x01); toggle_recv(tank); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//發(fā)送從中斷端點(diǎn)讀數(shù)據(jù)的令牌 } }
你用這個程序試下看可以不可以UploadImages/hcn00120067211677.rar
hcn: 不知收到郵件了沒有?盼回復(fù)。謝!