用BusHound 5.0分別抓手柄和鼠標(biāo)的數(shù)據(jù)包如下圖: 下面是手柄,可以看到HOST獲得HID報(bào)告描述符后,每隔15ms可以抓到一個(gè)數(shù)據(jù)包,數(shù)據(jù)或一致或不一致,與手柄的動(dòng)作有關(guān),可以解釋為HOST每隔15ms發(fā)送一個(gè)IN事務(wù)令牌包,手柄回傳8字節(jié)數(shù)據(jù)包,這個(gè)符合HID中斷傳輸。 但是上面的鼠標(biāo)表現(xiàn)出不一樣現(xiàn)象,HOST獲得HID報(bào)告描述符后,如果鼠標(biāo)不東,BusHound就抓不到任何包,而在按下鼠標(biāo)按鍵或移動(dòng)鼠標(biāo)后(鼠標(biāo)數(shù)據(jù)發(fā)生變化),才有數(shù)據(jù)包獲得,如果按下按鍵后,一直不釋放,又沒有數(shù)據(jù)了,直到釋放按鍵是才有一次傳輸,從后面的時(shí)間間隔可以看出傳輸不是等間隔的。似乎是鼠標(biāo)在主動(dòng)發(fā)送數(shù)據(jù)似的,這顯然不符合USB的傳輸協(xié)議。 不知道大家用BusHound抓鼠標(biāo)數(shù)據(jù)包是不是也這樣,能解釋一下嗎?
不是這樣解釋的.所有的USB傳輸都是由主機(jī)發(fā)起的,鼠標(biāo)不可能主動(dòng)傳數(shù)據(jù),而是主機(jī)主動(dòng)去取數(shù)據(jù)的.至于手柄為什么15MS取一次數(shù)據(jù),這可能是這類設(shè)備的協(xié)議規(guī)定的, 鼠標(biāo)鍵盤是按下鍵(或者移動(dòng))有鍵值,抬起按鍵一般都是發(fā)送全零的.對(duì)標(biāo)準(zhǔn)的鼠標(biāo)鍵盤來說主機(jī)(PC)每1MS會(huì)來發(fā)送一個(gè)IN令牌,有數(shù)據(jù)則返回ACK,無數(shù)據(jù)則返回NAK或者STALL. BUSHOUND抓取數(shù)據(jù)只能做為一個(gè)參考,不能做為標(biāo)準(zhǔn),只是在應(yīng)用層的,低層的好多數(shù)據(jù)傳輸是看不到的,比如一般來所設(shè)置地址這一過程是BUSHOUND抓不到的,因?yàn)檫@時(shí)候還為正常加載驅(qū)動(dòng),應(yīng)用層還不能正常工作.
是不是可以這樣理解:每次IN事務(wù),鼠標(biāo)并不一定要回傳數(shù)據(jù)包,如果鼠標(biāo)認(rèn)為數(shù)據(jù)和上次一樣,就可以響應(yīng)NAK來結(jié)束本次IN事務(wù),由于響應(yīng)NAK,所以BUSHOUND就沒有抓到數(shù)據(jù)包,表現(xiàn)出來就是鼠標(biāo)的數(shù)據(jù)傳輸是非等間隔的;而手柄是每次IN事務(wù)不管數(shù)據(jù)是否一致都返回?cái)?shù)據(jù)包,這樣就表現(xiàn)為等間隔傳輸了。 這樣還是解釋不了我的程序?yàn)槭裁碪SB狀態(tài)寄存器是0x90,如果鼠標(biāo)回傳NAK,應(yīng)該是0x9A才對(duì)。如果是端點(diǎn)被禁止,鼠標(biāo)應(yīng)該返回STALL,USB狀態(tài)寄存器應(yīng)該是0x9E,我目前除了有時(shí)能收到兩次數(shù)據(jù),其余USB狀態(tài)寄存器都是0x90或0x98。