USB的HID通信協(xié)議.doc
《USB的HID通信協(xié)議.doc》由會員分享,可在線閱讀,更多相關(guān)《USB的HID通信協(xié)議.doc(9頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
USB事務(wù)處理是主機(jī)和設(shè)備之間數(shù)據(jù)傳輸?shù)幕締挝唬梢幌盗芯哂刑囟ǜ袷降男畔M成。因此,要了解完整的USB通信協(xié)議,必須從USB的信息傳輸單元包及其數(shù)據(jù)域談起。通過由下而上,從簡單至復(fù)雜的通信協(xié)議單位組成各種復(fù)雜的通信協(xié)議,進(jìn)而構(gòu)建出完整的通信協(xié)議。 16.4.1 包 包(Packet)是USB系統(tǒng)中信息傳輸?shù)幕締卧袛?shù)據(jù)都是經(jīng)過打包后在總線上傳輸?shù)?。首先了解一下包的組成。 USB包由五部分組成,即同步(SYNC)字段、包標(biāo)識符(PID)字段、數(shù)據(jù)字段、循環(huán)冗余校驗(yàn)(CRC)字段和包結(jié)尾(EOP)字段,包的基本格式如下: 同步字段(SYNC) PID字段 數(shù)據(jù)字段 CRC字段 包結(jié)尾字段(EOP) 在USB的數(shù)據(jù)傳輸中,所有的傳輸包都起始于SYNC,接著是PID,后面是包中所包含的數(shù)據(jù)信息,接下來是用來檢測包中數(shù)據(jù)錯(cuò)誤的循環(huán)冗余校驗(yàn)信息,最后以包結(jié)尾作為結(jié)束標(biāo)志。下面我們將一一介紹每個(gè)字段。 1.同步(SYNC)字段 SYNC字段由8位組成,作為每個(gè)數(shù)據(jù)信息包的前導(dǎo)。顧名思義,它是用來產(chǎn)生同步作用的,目的是使USB設(shè)備與總線的包傳輸率同步,它的數(shù)值固定為00000001。 2.包標(biāo)識符(PID)字段 PID字段是緊隨在SYNC字段后面,用來表示數(shù)據(jù)信息包的類型。在USB協(xié)議中,根據(jù)PID的不同,USB包有著不同的類型,分別表示具有特定的意義。如下所示: PID0 PID1 PID2 PID3 包標(biāo)識符長度為一個(gè)字節(jié)(8個(gè)數(shù)據(jù)位),由4個(gè)位的包類型字段和4個(gè)位的校驗(yàn)字段構(gòu)成。PID是USB包類型的唯一標(biāo)志,USB主機(jī)和USB設(shè)備在接收到包后,必須首先對包標(biāo)識符解碼得到包的類型,并判斷其意義從而做出下一個(gè)反應(yīng)。包標(biāo)識符中的校驗(yàn)字段是通過對類型字段的每個(gè)位求反碼產(chǎn)生的,它是用來對包類型字段進(jìn)行錯(cuò)誤檢測用的,旨在保證對包的標(biāo)識符譯碼的可靠性,如果4個(gè)檢驗(yàn)位不是它們各自的類型位的反碼,則說明標(biāo)識符中的信息有錯(cuò)誤。 表16-2中列出了信息包的類型,包括令牌、數(shù)據(jù)、握手或特殊四種信息包類型。為簡化對USB的認(rèn)識,有關(guān)高速傳輸?shù)牟糠譀]有在表中列出。 3.?dāng)?shù)據(jù)字段 在USB包中,數(shù)據(jù)字段是用來攜帶主機(jī)與設(shè)備之間要傳遞的信息,其內(nèi)容和長度根據(jù)包標(biāo)識符、傳輸類型的不同而各不相同。并非所有的USB包都必須有數(shù)據(jù)字段,例如握手包、專用包和SOF令牌包就沒有數(shù)據(jù)字段。在USB包中,數(shù)據(jù)字段可以包含設(shè)備地址、端點(diǎn)號、幀序列號以及數(shù)據(jù)等內(nèi)容。在總線傳輸中,總是首先傳輸字節(jié)的最低位,最后傳輸字節(jié)的最高位。 (1) 設(shè)備地址(ADDR)數(shù)據(jù)域 ADDR數(shù)據(jù)域由7位組成,可用來尋址多達(dá)127個(gè)外圍設(shè)備。 (2) 端點(diǎn)(ENDP)數(shù)據(jù)域 ENDP數(shù)據(jù)域由4位組成。通過這4個(gè)位最多可尋址出32個(gè)端點(diǎn)。這個(gè)ENDP數(shù)據(jù)域僅用在IN、OUT與SETUP令牌信息包中。對于慢速設(shè)備可支持端點(diǎn)0以及端點(diǎn)1作為中斷傳輸模式,而全速設(shè)備則可以擁有16個(gè)輸入端點(diǎn)(IN)與16個(gè)輸出端點(diǎn)(OUT)共32個(gè)端點(diǎn)。 (3) 幀序列號 當(dāng)USB令牌包的PID為SOF時(shí),其數(shù)據(jù)字段必須為11位的幀序列號。幀序列號由主機(jī)產(chǎn)生,且每個(gè)數(shù)據(jù)幀自動(dòng)加一,最大數(shù)值為0x7FF。當(dāng)幀序列號達(dá)到最大數(shù)時(shí)將自動(dòng)從0開始循環(huán)。 (4) 數(shù)據(jù) 它僅存于DATA信息包內(nèi),根據(jù)不同的傳輸類型,擁有不同的字節(jié)大小,從0到1023字節(jié)(實(shí)時(shí)傳輸)。 4.循環(huán)冗余校驗(yàn)(CRC)字段 根據(jù)不同的信息包類型,CRC數(shù)據(jù)域由不同數(shù)目的位所組成。其中重要的數(shù)據(jù)信息包采用CRC16的數(shù)據(jù)域(16個(gè)位),而其余的信息包類型則采用CRC5的數(shù)據(jù)域(5個(gè)位)。其中的循環(huán)冗余碼校驗(yàn)CRC,是一種錯(cuò)誤檢測技術(shù)。由于數(shù)據(jù)在傳輸時(shí),有時(shí)候會發(fā)生錯(cuò)誤,因此CRC可根據(jù)數(shù)據(jù)算出一個(gè)校驗(yàn)值,然后依此判斷數(shù)據(jù)的正確性。 5.包結(jié)尾(EOP)字段 包的發(fā)送方在包的結(jié)尾發(fā)出包結(jié)尾信號。它表現(xiàn)為差分線路的兩根數(shù)據(jù)線保持2比特低位時(shí)間和1比特空閑位時(shí)間。USB主機(jī)根據(jù)EOP判斷數(shù)據(jù)包的結(jié)束。 16.4.2 信息包格式 根據(jù)信息包所實(shí)現(xiàn)的功能,其可以分為3種類型:令牌包、數(shù)據(jù)包和握手包。其中,令牌包定義了數(shù)據(jù)傳輸?shù)念愋?,?shù)據(jù)包中含有需要傳輸?shù)臄?shù)據(jù),握手包指明了數(shù)據(jù)接收是否成功。 1.令牌(token)包 在USB系統(tǒng)中,只有主機(jī)才能發(fā)出令牌包。令牌包定義了數(shù)據(jù)傳輸?shù)念愋停鞘聞?wù)處理的第一階段。令牌包格式如下: 8位 8位 7位 4位 5位 SYNC PID ADDR ENDP CRC5 令牌包中較為重要的是SETUP、IN和OUT這三個(gè)令牌包。它們用來在根集線器和設(shè)備端點(diǎn)之間建立數(shù)據(jù)傳輸。一個(gè)IN包用來建立一個(gè)從設(shè)備到根集線器的數(shù)據(jù)傳送,一個(gè)OUT包用來建立從根集線器到設(shè)備的數(shù)據(jù)傳輸。IN包和OUT包可以對任何設(shè)備上的任何端點(diǎn)編址。一個(gè)SETUP包是一個(gè)OUT包的特殊情形,它是“高優(yōu)先級的”,也就是說設(shè)備必須接受它,即使設(shè)備正在進(jìn)行數(shù)據(jù)傳輸操作的過程中也要對其進(jìn)行響應(yīng)。SETUP包總是指向端點(diǎn)0的。 2.?dāng)?shù)據(jù)(data)包 一個(gè)數(shù)據(jù)信息包包含了4個(gè)數(shù)據(jù)域:SYNC、PID、DATA與CRC16。在這里要注意的是DATA數(shù)據(jù)域內(nèi)所放置的位值,需根據(jù)USB設(shè)備的傳輸速度(慢速、高速與全速)以及傳輸類型(中斷傳輸、批量傳輸、等時(shí)傳輸)而定,且須以8字節(jié)為基本單位。也就是,若傳輸?shù)臄?shù)據(jù)不足8字節(jié),或傳輸?shù)阶詈笏S嗟囊膊蛔?字節(jié),仍須傳輸8字節(jié)的數(shù)據(jù)域。格式如下: 8位 8位 0~1023字節(jié) 16位 SYNC PID DATA CRC16 3.握手(Handshake)包 握手信息包是最簡單的信息包類型。在這個(gè)握手信息包中僅包含一個(gè)PID數(shù)據(jù)域而已,它的格式如下所列: 8位 8位 SYNC PID 其中僅包含SYNC與PID兩個(gè)數(shù)據(jù)域。 16.4.3 事務(wù) 在USB上數(shù)據(jù)信息的一次接收或發(fā)送的處理過程稱為事務(wù)處理(Transaction)。事務(wù)處理的類型包括輸入(IN)事務(wù)處理、輸出(OUT)事務(wù)處理、設(shè)置(SETUP)事務(wù)處理和幀開始、幀結(jié)尾等類型。在輸出(OUT)事務(wù)處理和設(shè)置(SETUP)事務(wù)處理中,緊接著SETUP和OUT包后的是DATA包,DATA0和DATA1包是交替地發(fā)送的,在DATA包后面,設(shè)備將回應(yīng)一個(gè)握手信號,如果設(shè)備可以接收數(shù)據(jù),就回應(yīng)ACK包,如果設(shè)備忙,就回應(yīng)NAK包,如果設(shè)備出錯(cuò),則回應(yīng)STALL包;在IN事務(wù)中,IN包后面是設(shè)備發(fā)來的DATA包或NAK包或STALL包,若設(shè)備忙或出錯(cuò),就發(fā)NAK包或STALL包給主機(jī),若設(shè)備數(shù)據(jù)準(zhǔn)備好發(fā)送,則發(fā)DATA包,DATA0和DATA1包也是交替地發(fā)送的,緊接著DATA包后面是主機(jī)發(fā)給設(shè)備的握手包,ACK表示主機(jī)可以接收數(shù)據(jù),NAK包代表主機(jī)忙,STALL包代表主機(jī)出錯(cuò)。下面我們再分別介紹這些事務(wù)。 1.輸入(IN)事務(wù)處理 輸入事務(wù)處理表示USB主機(jī)從總線上的某個(gè)USB設(shè)備接收一個(gè)數(shù)據(jù)包的過程,接下來分析輸入事務(wù)處理的各種典型情況: (1) 正常的輸入事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC IN ADDR ENDP CRC5 2.設(shè)備->主機(jī)(數(shù)據(jù)信息包) SYNC DATA0 DATA CRC16 3.主機(jī)->設(shè)備(握手信息包) SYNC ACK (2) 設(shè)備忙時(shí)的輸入事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC IN ADDR ENDP CRC5 2.設(shè)備->主機(jī)(握手信息包) SYNC NAK (3) 設(shè)備出錯(cuò)時(shí)的輸入事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC IN ADDR ENDP CRC5 2.設(shè)備->主機(jī)(握手信息包) SYNC STALL 2.輸出(OUT)事務(wù)處理 (1) 正常的輸出事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC OUT ADDR ENDP CRC5 2.主機(jī)->設(shè)備(數(shù)據(jù)信息包) SYNC DATA0 DATA CRC16 3.設(shè)備->主機(jī)(握手信息包) SYNC ACK (2) 設(shè)備忙時(shí)的輸出事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC OUT ADDR ENDP CRC5 2.主機(jī)->設(shè)備(數(shù)據(jù)信息包) SYNC DATA0 DATA CRC16 3.設(shè)備->主機(jī)(握手信息包) SYNC NAK (3) 設(shè)備出錯(cuò)時(shí)的輸出事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC OUT ADDR ENDP CRC5 2.主機(jī)->設(shè)備(數(shù)據(jù)信息包) SYNC DATA0 DATA CRC16 3.設(shè)備->主機(jī)(握手信息包) SYNC STALL 3.設(shè)置(SETUP)事務(wù)處理 (1) 正常的設(shè)置事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC SETUP ADDR ENDP CRC5 2.主機(jī)->設(shè)備(數(shù)據(jù)信息包) SYNC DATA0 DATA CRC16 3.設(shè)備->主機(jī)(握手信息包) SYNC ACK (2) 設(shè)備忙時(shí)的設(shè)置事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC SETUP ADDR ENDP CRC5 2.主機(jī)->設(shè)備(數(shù)據(jù)信息包) SYNC DATA0 DATA CRC16 3.設(shè)備->主機(jī)(握手信息包) SYNC NAK (3) 設(shè)備出錯(cuò)時(shí)的設(shè)置事務(wù)處理 1.主機(jī)->設(shè)備(令牌信息包) SYNC SETUP ADDR ENDP CRC5 2.主機(jī)->設(shè)備(數(shù)據(jù)信息包) SYNC DATA0 DATA CRC16 3.設(shè)備->主機(jī)(握手信息包) SYNC STALL 16.4.4 USB傳輸類型 在USB的傳輸中,制定了4種傳輸類型:控制傳輸、中斷傳輸、批量傳輸以及實(shí)時(shí)傳輸。這里只詳細(xì)介紹控制傳輸,其他傳輸類型只作簡要說明。 1.控制傳輸 控制傳輸是USB傳輸中最重要的傳輸,唯有正確地執(zhí)行完控制傳輸,才能進(jìn)一步正確地執(zhí)行其他傳輸模式。 由于每個(gè)USB設(shè)備可能速度、傳輸?shù)陌拇笮〉刃畔⒂锌赡懿煌?,因此每個(gè)USB設(shè)備內(nèi)部都記錄著該設(shè)備的一些信息(也就是接下來將要介紹的設(shè)備描述符),當(dāng)在主機(jī)上檢測到USB設(shè)備時(shí),系統(tǒng)軟件必須讀取設(shè)備描述符,以確定該設(shè)備的類型和操作特性,以及對該設(shè)備進(jìn)行相應(yīng)的配置,這些工作都是通過控制傳輸來完成。每個(gè)USB設(shè)備都必須實(shí)現(xiàn)一個(gè)缺省的控制端點(diǎn),該端點(diǎn)總是0號端點(diǎn)。 控制傳輸類型分為2~3個(gè)階段:設(shè)置階段、數(shù)據(jù)階段(無數(shù)據(jù)控制沒有此階段)以及狀態(tài)階段。根據(jù)數(shù)據(jù)階段的數(shù)據(jù)傳輸?shù)姆较?,控制傳輸又可分?種類型:控制讀取(讀取USB描述符)、控制寫入(配置USB設(shè)備)以及無數(shù)據(jù)控制。以下介紹各階段的工作。 階段一:設(shè)置階段 USB設(shè)備在正常使用之前,必須先配置,本階段由主機(jī)將信息傳送給USB設(shè)備,定義對USB設(shè)備的請求信息(如:讀設(shè)備描述符)。主機(jī)一般會從USB設(shè)備獲取配置信息后再確定此設(shè)備有哪些功能。作為配置的一部分,主機(jī)會設(shè)置設(shè)備的配置值。我們統(tǒng)稱這一階段為設(shè)置階段。 設(shè)置階段由設(shè)置事務(wù)完成,也就是該階段包含了SETUP令牌信息包、緊隨其后的DATA0數(shù)據(jù)信息包(該信息包里的數(shù)據(jù)即為設(shè)備請求,本章將后續(xù)介紹)以及ACK握手信息包。它的作用是執(zhí)行一個(gè)設(shè)置的數(shù)據(jù)交換,并定義此控制傳輸?shù)膬?nèi)容。 階段二:數(shù)據(jù)傳輸階段 數(shù)據(jù)傳輸階段是用來傳輸主機(jī)與設(shè)備之間的數(shù)據(jù)。 控制讀取是將數(shù)據(jù)從設(shè)備讀到主機(jī)上,讀取的數(shù)據(jù)USB設(shè)備描述符。該過程如圖16-8所示。對每一個(gè)數(shù)據(jù)信息包而言,首先,主機(jī)會發(fā)送一個(gè)IN令牌信息包,表示要讀數(shù)據(jù)進(jìn)來。然后,設(shè)備將數(shù)據(jù)通過DATA1數(shù)據(jù)信息包回傳給主機(jī)。最后,主機(jī)將以下列的方式加以響應(yīng):當(dāng)數(shù)據(jù)已經(jīng)正確接收時(shí),主機(jī)送出ACK令牌信息包;當(dāng)主機(jī)正在忙碌時(shí),發(fā)出NAK握手信息包;當(dāng)發(fā)生了錯(cuò)誤時(shí),主機(jī)發(fā)出STALL握手信息包。 控制寫入則是將數(shù)據(jù)從主機(jī)傳到設(shè)備上,所傳的數(shù)據(jù)即為對USB設(shè)備的配置信息,該過程如圖16-9所示。對每一個(gè)數(shù)據(jù)信息包而言,主機(jī)將會送出一個(gè)OUT令牌信息包,表示數(shù)據(jù)要送出去。緊接著,主機(jī)將數(shù)據(jù)通過DATA0數(shù)據(jù)信息包傳遞至設(shè)備。最后,設(shè)備將以下列方式加以響應(yīng):當(dāng)數(shù)據(jù)已經(jīng)正確接收時(shí),設(shè)備送出ACK令牌信息包;當(dāng)設(shè)備正在忙碌時(shí),設(shè)備發(fā)出NAK握手信息包;當(dāng)發(fā)生了錯(cuò)誤時(shí),設(shè)備發(fā)出STALL握手信息包。 階段三:狀態(tài)階段 狀態(tài)階段用來表示整個(gè)傳輸?shù)倪^程已經(jīng)完全結(jié)束了。請注意,狀態(tài)階段傳輸?shù)姆较虮仨毰c數(shù)據(jù)階段的方向相反。即原來是IN令牌信息包,這個(gè)階段應(yīng)為OUT令牌信息包;反之,原來是OUT令牌信息包,這個(gè)階段應(yīng)為IN令牌信息包。對于控制讀取而言,主機(jī)會送出OUT令牌信息包,其后再跟著0長度的DATA1信息包。而此時(shí),設(shè)備也會做出相對應(yīng)的動(dòng)作,送ACK握手信息包、NAK握手信息包或STALL握手信息包。相對地對于控制寫入傳輸,主機(jī)會送出IN令牌信息包,然后設(shè)備送出表示完成狀態(tài)階段的0長度的DATA1信息包,主機(jī)再做出相對應(yīng)的動(dòng)作:送ACK握手信息包、NAK握手信息包或STALL握手信息包。 2.實(shí)時(shí)傳輸 實(shí)時(shí)傳輸適用于必須以固定速率抵達(dá)或在指定時(shí)刻抵達(dá),可以容忍偶爾錯(cuò)誤的數(shù)據(jù)上。實(shí)時(shí)傳輸一般用于麥克風(fēng)、喇叭等設(shè)備。 實(shí)時(shí)傳輸只需令牌與數(shù)據(jù)兩個(gè)信息包階段,沒有握手包,故數(shù)據(jù)傳錯(cuò)時(shí)不會重傳。 3.批量傳輸 用于傳輸大量數(shù)據(jù),要求傳輸不能出錯(cuò),但對時(shí)間沒有要求,適用于打印機(jī)、存儲設(shè)備等。 4.中斷傳輸 中斷傳輸方式總是用于對設(shè)備的查詢,以確定是否有數(shù)據(jù)需要傳輸。因此中斷傳輸?shù)姆较蚩偸菑腢SB設(shè)備到主機(jī)。 16.4.5設(shè)備列舉 1.描述符 USB描述符就好像是USB外圍設(shè)備的“身份證”一樣,詳細(xì)地記錄著外圍設(shè)備相關(guān)的一切信息。為了描述不同的數(shù)據(jù),就需以不同類型的USB描述符來加以描述,它共有以下幾種類型:設(shè)備描述符、配置描述符、接口描述符和端點(diǎn)描述符,這幾個(gè)描述符是必須具有的,下面將結(jié)合實(shí)例詳細(xì)介紹;其他的描述符,例如,字符串描述符、數(shù)種不同的群組描述符以及報(bào)告描述符則可以根據(jù)不同的設(shè)備進(jìn)行選擇。 (1) 設(shè)備描述符 設(shè)備描述符具有18字節(jié)的長度,并且是主機(jī)向設(shè)備請求的第一個(gè)描述符。以下列出設(shè)備描述符的范例、數(shù)值以及各個(gè)字段的意義: DeviceDesc: ;表示設(shè)備描述符 .byte $12 ; bLength域,表示該描述符的字節(jié)長度為18個(gè)字節(jié) .byte $01 ; bDescriptorType域描述符類型,1代表設(shè)備 .byte $10,$01 ; bcdUSB域表示符合USB 1.10規(guī)范,$210代表2.10規(guī)范 .byte $00 ; bDeviceClass域,群組碼,0表示每個(gè)接口都有自身的群信息, ;不同的接口操作相互獨(dú)立 .byte $00 ; bDeviceSubClass域,設(shè)備次群組(如果群組碼為0,設(shè)備次群組必須為0) .byte $00 ; bDeviceProtocol域,設(shè)備協(xié)議(0表示無群組特定協(xié)議) .byte $08 ; bMaxPacketSize0域,端點(diǎn)0的最大信息包大?。ㄖ荒転?、16、32或64) .byte $70,$0C ; idVendor域,制造商ID(2字節(jié)) .byte $00,$00 ; idProduct域,產(chǎn)品ID(2字節(jié)) .byte $00,$01 ; bcdDevice域,以BCD表示設(shè)備發(fā)行序號(2字節(jié)) .byte $01 ; iManufacturer域,制造商的字符串描述符索引(1字節(jié)),本實(shí)例中指 ; String1Desc處的字符串描述符 .byte $02 ; iProduct域,產(chǎn)品的字符串描述符索引(1字節(jié)),本實(shí)例中指 ; String2Desc處的字符串描述符 .byte $00 ; iSerialNumber域,設(shè)備序號的字符串描述符索引(1字節(jié)), ;本實(shí)例中指String0Desc處的字符串描述符 .byte $01 ; bNumConfigurations域,配置數(shù)目為1 (2) 配置描述符 配置描述符具有9字節(jié)的長度,針對設(shè)備給予配置的信息。以下列出配置描述符的范例、數(shù)值以及各個(gè)字段的意義: ConfigDesc: ;表示配置描述符 .byte $09 ; bLength域,表示該描述符的字節(jié)長度為9個(gè)字節(jié)(1字節(jié)) .byte $02 ; bDescriptorType域,描述符類型,2代表配置(1字節(jié)) .byte $20,$00 ; wTotalLength域,描述符的總長度為32個(gè)字節(jié),(包括配置描述符 ; 9字節(jié),接口描述符9字節(jié),兩個(gè)端點(diǎn)描述符各7字節(jié)) .byte $01 ; bNumInterfaces域,該配置支持的接口數(shù)目(1字節(jié)) .byte $01 ; bConfigurationValue域,配置值,作為Set Configuration請求的配置值 .byte $00 ; iConfiguration域,配置的字符串描述符的索引(1字節(jié)) .byte $C0 ; bmAttributes域,配置的屬性(自供電,不具有遠(yuǎn)程喚醒的特征) .byte $00 ; MaxPower域,表示當(dāng)USB設(shè)備操作時(shí),它從總線上 ;獲得的最大電源(以2mA為單位) (3) 接口描述符 接口描述符具有9字節(jié)的長度,用來描述每一個(gè)設(shè)備的接口特性。以下列出接口描述符的范例、數(shù)值以及各個(gè)字段的意義: InterfaceDesc: ;表示接口描述符 .byte $09 ; bLength域,表示該描述符的字節(jié)長度為9個(gè)字節(jié) .byte $04 ; bDescriptorType域,描述符類型,4代表接口 .byte $00 ; bInterfaceNumber域,接口數(shù)目以0為基值(表示一個(gè)接口) .byte $00 ; bAlternateSetting域,交互設(shè)置值為0(因?yàn)橹挥幸粋€(gè)接口) .byte $02 ; bNumEndpoints域,端點(diǎn)數(shù)目設(shè)置為2 .byte $FF ; bInterfaceClass域,接口群組,$FF表示是供應(yīng)商說明書 .byte $01 ; bInterfaceSubClass域,接口次群組 .byte $FF ; bInterfaceProtocol域,接口協(xié)議,$FF表示該接口使用的 ;是供應(yīng)商說明的協(xié)議 .byte $00 ; iInterface域,接口的字符串描述符的索引,本實(shí)例沒有 (4) 端點(diǎn)描述符 端點(diǎn)描述符具有7字節(jié)長度,用來描述端點(diǎn)的屬性以及各個(gè)端點(diǎn)的位置。該實(shí)例中有兩個(gè)端點(diǎn),我們首先介紹端點(diǎn)1描述符: Endpoint1Desc: ;表示端點(diǎn)1描述符 .byte $07 ; bLength域,表示該描述符的字節(jié)長度為7個(gè)字節(jié) .byte $05 ; bDescriptorType域,描述符類型,5代表端點(diǎn) .byte $81 ; bEndpointAddress域,端點(diǎn)地址([0x81=IN,0x02=OUT]), ;本實(shí)例端點(diǎn)編號為1且為IN端點(diǎn) .byte $03 ; bmAttributes域,傳輸類型的屬性設(shè)置為中斷傳輸 ;(0=控制,1=實(shí)時(shí),2=批量,3=中斷) .byte $08,$00 ; wMaxPacketSize域,最大信息包的大小設(shè)置為8個(gè)字節(jié) .byte $0A ; bInterval域,輪詢間隔,以ms為單位,在此設(shè)置為10ms 接下來介紹端點(diǎn)2描述符: Endpoint2Desc: ;表示端點(diǎn)2描述符 .byte $07 ; bLength域,表示該描述符的字節(jié)長度為7個(gè)字節(jié) .byte $05 ; bDescriptorType域,描述符類型,5代表端點(diǎn) .byte $02 ; bEndpointAddress域,端點(diǎn)地址([0x81=IN,0x02=OUT]), ;本實(shí)例端點(diǎn)編號為2且為OUT端點(diǎn) .byte $03 ; bmAttributes域,傳輸類型的屬性設(shè)置為中斷傳輸 ;(0=控制,1=實(shí)時(shí),2=批量,3=中斷) .byte $08,$00 ; wMaxPacketSize域,最大信息包的大小設(shè)置為8個(gè)字節(jié) .byte $0A ; bInterval域,輪詢間隔,以ms為單位,在此設(shè)置為10ms 2.USB設(shè)備請求 在USB接口的通信協(xié)議中,由于主機(jī)是取得絕對的主控權(quán),因此,主機(jī)與設(shè)備之間就必須遵循某種已溝通的特定命令格式,以達(dá)到通信的目的。而這個(gè)命令格式就是USB規(guī)范書中所制定的“設(shè)備請求”。這個(gè)設(shè)備請求的設(shè)置、清除與取得都須通過控制傳輸?shù)臄?shù)據(jù)交換來完成。表16-3中列出了標(biāo)準(zhǔn)設(shè)備請求的數(shù)據(jù)格式內(nèi)容。 表16-3各字段含義解釋如下。 bmRequestType域決定了特定請求的特征,該域的D7表示在控制傳輸?shù)臄?shù)據(jù)階段,數(shù)據(jù)傳輸?shù)姆较?。如果wLength的值為0,表示沒有數(shù)據(jù)階段,該位可以忽略;D[6:5]表示了該請求所屬的類型,USB標(biāo)準(zhǔn)中定義了所有的USB設(shè)備必須支持的一系列的標(biāo)準(zhǔn)請求,此外,群組和供應(yīng)商也可以定義一些其他的請求;D[4:0]表示接收端,請求可以針對設(shè)備、接口或設(shè)備的一個(gè)端點(diǎn),當(dāng)針對一個(gè)接口或端點(diǎn)時(shí),wIndex域決定了是哪個(gè)接口或端點(diǎn)。 bRequest域表示特定請求,如果bmRequestType域的類型字段為0,可以根據(jù)USB指定的一系列的標(biāo)準(zhǔn)請求,結(jié)合該域的值,知道這是什么請求。將在下面介紹這些請求。 wValue域的值根據(jù)請求的不同而不同,用來傳遞一個(gè)參數(shù)給設(shè)備。 wIndex域的值根據(jù)請求的不同而不同,用來指定一個(gè)接口或端點(diǎn)。 wLength域表示控制傳輸?shù)臄?shù)據(jù)階段中傳輸數(shù)據(jù)的字節(jié)大小,數(shù)據(jù)傳輸?shù)姆较蛴蒪mRequestType域中的D7位決定,如果該域的值為0,表示沒有數(shù)據(jù)階段。 下面結(jié)合實(shí)例分別介紹幾個(gè)主要的設(shè)備請求。 (1) 清除特性(Clear Feature) 該請求是用來取消一個(gè)特性,其格式如下: bmRequestType bRequest wValue wIndex wLength Data 00000000B(設(shè)備) 00000001B(接口) 00000010B(端點(diǎn)) CLEAR_FEATURE(01H) 特性選擇 0 接口 端點(diǎn) 0 無 該請求中的wValue表示特性選擇器,它對應(yīng)的值為:0=端點(diǎn),1=設(shè)備。當(dāng)某個(gè)特性不允許取消,或該特性根本不存在,或者是指向一個(gè)根本不存在的接口或端點(diǎn)時(shí),該請求將會導(dǎo)致設(shè)備請求失敗。如果端點(diǎn)被固件設(shè)為停止?fàn)顟B(tài),主機(jī)軟件(總線驅(qū)動(dòng)程序)也可以發(fā)送一個(gè)值為0的CLEAR_FEATURE命令清除該端點(diǎn)的停止?fàn)顟B(tài),本實(shí)例中就是這樣使用該請求的。 (2) 取得描述符(Get Descriptor) 該請求可以取得USB設(shè)備中存在的特定的描述符,其格式如下: bmRequestType bRequest wValue wIndex wLength Data 10000000B GET_DESCRIPTOR (06H) 描述符類型與描述符指針 0或語言ID 描述符的長度 各個(gè)描述符 該請求中的wValue的高字節(jié)表示要取得描述符類型,低字節(jié)表示描述符的索引值,描述的類型有:1表示設(shè)備描述符,2表示配置描述符,3表示字符串描述符,4表示接口描述符,5表示端點(diǎn)描述符。wIndex的值為0或語言ID;當(dāng)要取得描述符是字符串描述符時(shí),該域的值為語言ID;當(dāng)為其他的描述符時(shí),該域?yàn)?。wLength表示要返回的數(shù)據(jù)長度,如果SETUP階段的地址使用的是預(yù)設(shè)地址0(ENDP字段為0),這時(shí)的wLength值會大于實(shí)際的描述的值。這是為什么呢?原因是用戶以預(yù)設(shè)的地址0來取得設(shè)備描述符時(shí),不管設(shè)多少字節(jié),用戶最多只取其前8字節(jié),即在控制傳輸過程只有一次數(shù)據(jù)階段。但是,如果用戶以新的地址(ENDP字段不為0)來取得設(shè)備描述符時(shí),這時(shí)wLength的值就要注意了。 (3) 設(shè)置地址(Set Address) 該請求給USB設(shè)備設(shè)置地址,從而可以對該USB設(shè)備進(jìn)行進(jìn)一步的訪問。其格式如下: bmRequestType bRequest wValue wIndex wLength Data 00000000B SET_ADDRESS(05H) 設(shè)備地址 0 0 無 該請求與其他的請求有一個(gè)重要的不同點(diǎn),該請求下,USB設(shè)備一直不改變它的地址,直到該請求的狀態(tài)階段被成功地完成,而其他請求的操作都是在狀態(tài)階段之前完成,可以閱讀本實(shí)例加深對該點(diǎn)的理解。若特定的設(shè)備地址大于127,或者wIndex 或wLength為非0值,那么該請求不執(zhí)行。 (4) 設(shè)置配置(Set Configuration) 該請求對設(shè)備進(jìn)行設(shè)置。其格式如下: bmRequestType bRequest wValue wIndex wLength Data 00000000B SET_CONFIGURATION(09H) 設(shè)置值 0 0 無 該請求中的wValue域的低字節(jié)表示設(shè)置的值,該值必須為0或者與配置描述符中的配置值相匹配。如果設(shè)置值等于0,表示設(shè)備在地址狀態(tài)。如果wIndex 或 wLength為非0值,那么該請求不執(zhí)行。 另外還有其他的請求,這里不再詳細(xì)介紹,讀者可以參考相關(guān)的資料。 在學(xué)習(xí)了描述符和USB設(shè)備請求的基礎(chǔ)上,接下來就能進(jìn)行設(shè)備列舉了。 3.設(shè)備列舉 設(shè)備列舉可以簡單地概括為這樣的一個(gè)過程:主機(jī)通過USB設(shè)備請求來取得設(shè)備描述符并對該設(shè)備進(jìn)行配置。該過程可以簡化為如下5個(gè)步驟: 第一步,使用預(yù)設(shè)的地址0取得設(shè)備描述符。 第二步,設(shè)置設(shè)備的新地址。 第三步,使用新地址取得設(shè)備描述符。 第四步,取得配置描述符。 第五步,設(shè)置配置描述符。 設(shè)備列舉使用的是控制傳輸。上述的5個(gè)步驟必須符合控制傳輸?shù)幕炯軜?gòu),第一步、第三步和第四步使用的是控制讀取,第二步和第五步使用的是無數(shù)據(jù)控制。- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- USB HID 通信協(xié)議
鏈接地址:http://www.820124.com/p-9393189.html