中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
USB協(xié)議

USB協(xié)議  

2009-07-10 17:00:09|  分類: 通信協(xié)議 |字號 訂閱

一 枚舉過程:
◆ 用戶將一個USB設(shè)備插入USB端口,主機(jī)為端口供電,設(shè)備此時處于上電狀態(tài)。
◆主機(jī)檢測設(shè)備。
◆集線器使用中斷通道將事件報告給主機(jī)。
◆主機(jī)發(fā)送Get_Port_Status(讀端口狀態(tài))請求,以獲取更多的設(shè)備信息。
◆集線器檢測設(shè)備是低速運行還是高速運行,并將此信息送給主機(jī),這是對Get_Port_Status請求的響應(yīng)。
◆主機(jī)發(fā)送Set_Port_Feature(寫端口狀態(tài))請求給集線器,要求它復(fù)位端口。
◆集線器對設(shè)備復(fù)位。
◆主機(jī)使用Chirp K信號來了解全速設(shè)備是否支持高速運行。
◆主機(jī)發(fā)送另一個Get_Port_Status請求,確定設(shè)備是否已經(jīng)從復(fù)位狀態(tài)退出。
◆設(shè)備此時處于缺省狀態(tài),且已準(zhǔn)備好在零端點通過缺省通道響應(yīng)主機(jī)控制傳輸。缺省地址為00h,設(shè)備能從總線獲取高達(dá)100mA的電流。
◆主機(jī)發(fā)送Get_Deor(讀設(shè)備描述符)報文,以便確定最大數(shù)據(jù)包大小。設(shè)備描述符的八個字節(jié)是bMaxPacketSize。
◆通過發(fā)送Set_Address(寫地址)請求,主機(jī)分配地址,設(shè)備此時處于地址狀態(tài)。
◆主機(jī)發(fā)送Get_Deor報文,以獲取更多的設(shè)備信息。主機(jī)通過發(fā)送描述符響應(yīng)設(shè)備請求,隨后發(fā)送全部的次級描述符。
◆主機(jī)分配并加載設(shè)備驅(qū)動程序。
◆通過發(fā)送Set_Configuration(寫配置)請求,主機(jī)的設(shè)備驅(qū)動程序選擇一個有效配置,設(shè)備此時處于配置狀態(tài)。
◆主機(jī)為復(fù)合設(shè)備接口分配驅(qū)動程序。
◆如果集線器檢測到有過流現(xiàn)象,或者主機(jī)要求集線器關(guān)閉電源,則USB總線切斷設(shè)備供電電源。在這種情況下,設(shè)備與主機(jī)無法通信,但設(shè)備處于連接狀態(tài)。
◆如果在3毫秒內(nèi)設(shè)備在總線上未見任何動作,則它將進(jìn)入掛起狀態(tài),在掛起狀態(tài)設(shè)備消耗的總線電能最少。
還有一個差不多,如下:
1)集線器檢測新設(shè)備
主機(jī)集線器監(jiān)視著每個端口的信號電壓,當(dāng)有新設(shè)備接入時便可覺察。(集線器端口的兩根信號線的每一根都有15kΩ的下拉電阻,而每一個設(shè)備在D+都有一個1.5kΩ的上拉電阻。當(dāng)用USB線將PC和設(shè)備接通后,設(shè)備的上拉電阻使信號線的電位升高,因此被主機(jī)集線器檢測到。)
(2)主機(jī)知道了新設(shè)備連接后
每個集線器用中斷傳輸來報告在集線器上的事件。當(dāng)主機(jī)知道了這個事件,它給集線器發(fā)送一個Get_Status請求來了解更多的消息。返回的消息告訴主機(jī)一個設(shè)備是什么時候連接的。
(3)集線器重新設(shè)置這個新設(shè)備
當(dāng)主機(jī)知道有一個新的設(shè)備時,主機(jī)給集線器發(fā)送一個Set_Feature請求,請求集線器來重新設(shè)置端口。集線器使得設(shè)備的USB數(shù)據(jù)線處于重啟(RESET)狀態(tài)至少10ms。
(4)集線器在設(shè)備和主機(jī)之間建立一個信號通路
主機(jī)發(fā)送一個Get_Status請求來驗證設(shè)備是否激起重啟狀態(tài)。返回的數(shù)據(jù)有一位表示設(shè)備仍然處于重啟狀態(tài)。當(dāng)集線器釋放了重啟狀態(tài),設(shè)備就處于默認(rèn)狀態(tài)了,即設(shè)備已經(jīng)準(zhǔn)備好通過Endpoint 0 的默認(rèn)流程響應(yīng)控制傳輸。即設(shè)備現(xiàn)在使用默認(rèn)地址0x0與主機(jī)通信。
(5)集線器檢測設(shè)備速度
集線器通過測定那根信號線(D+或D-)在空閑時有更高的電壓來檢測設(shè)備是低速設(shè)備還是全速設(shè)備。(全速和高速設(shè)備D+有上拉電阻,低速設(shè)備D-有上拉電阻)。
以下,需要USB的firmware進(jìn)行干預(yù)
(6)獲取最大數(shù)據(jù)包長度
PC向address 0發(fā)送USB協(xié)議規(guī)定的Get_Device_Deor命令,以取得卻缺省控制管道所支持的最大數(shù)據(jù)包長度,并在有限的時間內(nèi)等待USB設(shè)備的響應(yīng),該長度包含在設(shè)備描述符的bMaxPacketSize0字段中,其地址偏移量為7,所以這時主機(jī)只需讀取該描述符的前8個字節(jié)。注意,主機(jī)一次只能列舉一個USB設(shè)備,所以同一時刻只能有一個USB設(shè)備使用缺省地址0。
以下操作雷同,不同操作系統(tǒng)設(shè)定時延是不一樣的,比如說win2k大概是幾毫秒,如果沒有反應(yīng)就再發(fā)送一次命令,重復(fù)三次。
(7)主機(jī)分配一個新的地址給設(shè)備
主機(jī)通過發(fā)送一個Set_Address請求來分配一個唯一的地址給設(shè)備。設(shè)備讀取這個請求,返回一個確認(rèn),并保存新的地址。從此開始所有通信都使用這個新地址。
(8)主機(jī)向新地址重新發(fā)送Get_Device_Deor命令,此次讀取其設(shè)備描述符的全部字段,以了解該設(shè)備的總體信息,如VID,PID。
(9)主機(jī)向設(shè)備循環(huán)發(fā)送Get_Device_Configuration命令,要求USB設(shè)備回答,以讀取全部配置信息。
(10)主機(jī)發(fā)送Get_Device_String命令,獲得字符集描述(unicode),比如產(chǎn)商、產(chǎn)品描述、型號等等。
(11)此時主機(jī)將會彈出窗口,展示發(fā)現(xiàn)新設(shè)備的信息,產(chǎn)商、產(chǎn)品描述、型號等。
(12)根據(jù)Device_Deor和Device_Configuration應(yīng)答,PC判斷是否能夠提供USB的Driver,一般win2k能提供幾大類的設(shè)備,如游戲操作桿、存儲、打印機(jī)、掃描儀等,操作就在后臺運行。但是Win98卻不可以,所以在此時將會彈出對話框,索要USB的Driver。
(13)加載了USB設(shè)備驅(qū)動以后,主機(jī)發(fā)送Set_Configuration(x)命令請求為該設(shè)備選擇一個合適的配置(x代表非0的配置值)。如果配置成功,USB設(shè)備進(jìn)入“配置”狀態(tài),并可以和客戶軟件進(jìn)行數(shù)據(jù)傳輸。
此時,常規(guī)的USB完成了其必須進(jìn)行的配置和連接工作。查看注冊表,能夠發(fā)現(xiàn)相應(yīng)的項目已經(jīng)添加完畢,至此設(shè)備應(yīng)當(dāng)可以開始使用。不過,USB協(xié)議還提供了一些用戶可選的協(xié)議,設(shè)備如果不應(yīng)答,也不會出錯,但是會影響到系統(tǒng)的功能。

 

    1.當(dāng)主機(jī)用輪詢的方式檢測到USB端口有新的設(shè)備插入時,主機(jī)就會給HUB發(fā)送總線復(fù)位命令,要求HUB進(jìn)行總線復(fù)位。
              設(shè)備連接到主機(jī)并初始化完成(Softconnect 位被設(shè)置為 1),主機(jī)檢測到D+與D-之間有電壓差,就認(rèn)為有新的設(shè)置接入。主機(jī)等待100ms后發(fā)出復(fù)位請求。設(shè)備接到復(fù)位請求后將產(chǎn)生一個外部中斷信號。

     2.主機(jī)使用默認(rèn)地址0,來讀取設(shè)備的描述符。
             發(fā)送 Get_descriptor標(biāo)準(zhǔn)請求。主機(jī)向D12發(fā)送一個八字節(jié)請求:80 06 00 01 00 00 40 00    D12接收到請求后產(chǎn)生一個中斷,我們可以通過讀中斷寄存器知道中斷源,并且可以加讀最后狀態(tài)寄存器來確定第一個接到的包是否為一個Setup包。當(dāng)控制器處理程序判斷出它是一個Get_descriptor請求是,把設(shè)備描述符的前16個字節(jié)發(fā)送到端點0緩沖區(qū)中。剩下的2個字節(jié)描述符第一次請求時不再發(fā)送。

     3.主機(jī)給設(shè)備分配一個地址
              當(dāng)主機(jī)收到正確的前16字節(jié)描述符后,會給設(shè)備分配一個地址,我的PC分配的地址為:0x03(這個要看你的機(jī)子當(dāng)時的USB接口設(shè)備數(shù)目而定) Set_Address 請求所發(fā)送的數(shù)據(jù)為:00 05 03 00 00 00 00 00 ,其中的03就表示主機(jī)為設(shè)備分配的地址為0x03,在以后的通信里設(shè)備就只對0x03地址作出應(yīng)答。當(dāng)D12產(chǎn)生一個接收中斷后,跟據(jù)所分配的地址設(shè)置D12的地址寄存器相應(yīng)位

    4.主機(jī)以地址0x03 ,重新請求設(shè)備描述符
        主機(jī)發(fā)送設(shè)備描述符標(biāo)準(zhǔn)請求Get_descriptor :80 06 00 01 00 00 12 00  此次將要求把18個字節(jié)全部發(fā)送完。所以主機(jī)要分兩次來讀取。第一次發(fā)送16個字節(jié),第三次發(fā)送兩個字節(jié),最后主機(jī)發(fā)送0表示發(fā)送完畢的應(yīng)答。

    5.主機(jī)發(fā)送Get_configuration請求
         由于事先沒有知道描述符的長度,所以先以0xff的長度進(jìn)行請求。其數(shù)據(jù)為:80 06 00 02 00 00 FF 00   我用的是周立功公司賣的D12開發(fā)板光盤資料中提供的驅(qū)動程序,發(fā)送的應(yīng)答是一個描述集合其結(jié)構(gòu)如下:
typedef struct USB_DESCRIPTOR {
    USB_CONFIGURATION_DESCRIPTOR ConfigDescr;        //配置描述符
    USB_INTERFACE_DESCRIPTOR InterfaceDescr;        //接口描述符
    USB_ENDPOINT_DESCRIPTOR EP1_TXDescr;            //端點1輸入描述符
    USB_ENDPOINT_DESCRIPTOR EP1_RXDescr;            //端點1輸出描述符
    USB_ENDPOINT_DESCRIPTOR EP2_TXDescr;            //端點2輸入描述符
    USB_ENDPOINT_DESCRIPTOR EP2_RXDescr;            //端點2輸出描述符
} USB_DESCRIPTOR, *PUSB_DESCRIPTOR;


     6.Set_Conficuration
           當(dāng)讀取完成描述符之后,需要對設(shè)備進(jìn)行配置,使得設(shè)備從地址狀態(tài)進(jìn)入配置狀態(tài)。這個在寫固件的時候可以提高運行效率。
     
     7.讀取配置狀態(tài)。 
 
     8.當(dāng)主機(jī)能正確地收到這些數(shù)據(jù)之后,就可以加載D12的驅(qū)動程序。這時就可能作應(yīng)用中的數(shù)據(jù)傳輸了。

         使用USB View 采集到的數(shù)據(jù):

Device Descriptor:
bcdUSB:             0x0100
bDeviceClass:         0xDC
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x10 (16)
idVendor:           0x0471
idProduct:          0x0666
bcdDevice:          0x0100
iManufacturer:        0x00
iProduct:             0x00
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x02
Open Pipes:              4

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:   Interrupt
wMaxPacketSize:     0x0010 (16)
bInterval:            0x0A

Endpoint Descriptor:
bEndpointAddress:     0x01
Transfer Type:   Interrupt
wMaxPacketSize:     0x0010 (16)
bInterval:            0x0A

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x0A

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x0A


       參考資料:《PDIUSBD12 USB固件編程和驅(qū)動開發(fā)》
                                           驅(qū)動開發(fā)網(wǎng)

 
USB 基本知識

 

USB的重要關(guān)鍵字:

1、端點:位于USB設(shè)備或主機(jī)上的一個數(shù)據(jù)緩沖區(qū),用來存放和發(fā)送USB的各種數(shù)據(jù),每一個端點都有惟一的確定地址,有不同的傳輸特性(如輸入端點、輸出端點、配置端點、批量傳輸端點)

2、幀:時間概念,在USB中,一幀就是1MS,它是一個獨立的單元,包含了一系列總線動作,USB將1幀分為好幾份,每一份中是一個USB的傳輸動作。

3、上行、下行:設(shè)備到主機(jī)為上行,主機(jī)到設(shè)備為下行

 

 

下面以一問一答的形式開始學(xué)習(xí)吧。

 

問題一:USB的傳輸線結(jié)構(gòu)是如何的呢?

答案一:一條USB的傳輸線分別由地線、電源線、D+、D-四條線構(gòu)成,D+和D-是差分輸入線,它使用的是3.3V的電壓(注意哦,與CMOS的5V電平不同),而電源線和地線可向設(shè)備提供5V電壓,最大電流為500MA(可以在編程中設(shè)置的,至于硬件的實現(xiàn)機(jī)制,就不要管它了)。

 

問題二:數(shù)據(jù)是如何在USB傳輸線里面?zhèn)魉偷?/p>

答案二:數(shù)據(jù)在USB線里傳送是由低位到高位發(fā)送的。

 

問題三:USB的編碼方案?

答案三:USB采用不歸零取反來傳輸數(shù)據(jù),當(dāng)傳輸線上的差分?jǐn)?shù)據(jù)輸入0時就取反,輸入1時就保持原值,為了確保信號發(fā)送的準(zhǔn)確性,當(dāng)在USB總線上發(fā)送一個包時,傳輸設(shè)備就要進(jìn)行位插入***作(即在數(shù)據(jù)流中每連續(xù)6個1后就插入一個0),從而強迫NRZI碼發(fā)生變化。這個了解就行了,這些是由專門硬件處理的。

 

問題四:USB的數(shù)據(jù)格式是怎么樣的呢?

答案四:和其他的一樣,USB數(shù)據(jù)是由二進(jìn)制數(shù)字串構(gòu)成的,首先數(shù)字串構(gòu)成域(有七種),域再構(gòu)成包,包再構(gòu)成事務(wù)(IN、OUT、SETUP),事務(wù)最后構(gòu)成傳輸(中斷傳輸、并行傳輸、批量傳輸和控制傳輸)。下面簡單介紹一下域、包、事務(wù)、傳輸,請注意他們之間的關(guān)系。

(一)域:是USB數(shù)據(jù)最小的單位,由若干位組成(至于是多少位由具體的域決定),域可分為七個類型:

1、同步域(SYNC),八位,值固定為0000 0001,用于本地時鐘與輸入同步

2、標(biāo)識域(PID),由四位標(biāo)識符+四位標(biāo)識符反碼構(gòu)成,表明包的類型和格式,這是一個很重要的部分,這里可以計算出,USB的標(biāo)識碼有16種,具體分類請看問題五。

3、地址域(ADDR):七位地址,代表了設(shè)備在主機(jī)上的地址,地址000 0000被命名為零地址,是任何一個設(shè)備第一次連接到主機(jī)時,在被主機(jī)配置、枚舉前的默認(rèn)地址,由此可以知道為什么一個USB主機(jī)只能接127個設(shè)備的原因。

4、端點域(ENDP),四位,由此可知一個USB設(shè)備有的端點數(shù)量最大為16個。

5、幀號域(FRAM),11位,每一個幀都有一個特定的幀號,幀號域最大容量0x800,對于同步傳輸有重要意義(同步傳輸為四種傳輸類型之一,請看下面)。

6、數(shù)據(jù)域(DATA):長度為0~1023字節(jié),在不同的傳輸類型中,數(shù)據(jù)域的長度各不相同,但必須為整數(shù)個字節(jié)的長度

7、校驗域(CRC):對令牌包和數(shù)據(jù)包(對于包的分類請看下面)中非PID域進(jìn)行校驗的一種方法,CRC校驗在通訊中應(yīng)用很泛,是一種很好的校驗方法,至于具體的校驗方法這里就不多說,請查閱相關(guān)資料,只須注意CRC碼的除法是模2運算,不同于10進(jìn)制中的除法。

 

(二)包:由域構(gòu)成的包有四種類型,分別是令牌包、數(shù)據(jù)包、握手包和特殊包,前面三種是重要的包,不同的包的域結(jié)構(gòu)不同,介紹如下

 

1、令牌包:可分為輸入包、輸出包、設(shè)置包和幀起始包(注意這里的輸入包是用于設(shè)置輸入命令的,輸出包是用來設(shè)置輸出命令的,而不是放據(jù)數(shù)的)

其中輸入包、輸出包和設(shè)置包的格式都是一樣的:

SYNC+PID+ADDR+ENDP+CRC5(五位的校驗碼)  

(上面的縮寫解釋請看上面域的介紹,PID碼的具體定義請看問題五)

幀起始包的格式:

SYNC+PID+11位FRAM+CRC5(五位的校驗碼)

 

2、數(shù)據(jù)包:分為DATA0包和DATA1包,當(dāng)USB發(fā)送數(shù)據(jù)的時候,當(dāng)一次發(fā)送的數(shù)據(jù)長度大于相應(yīng)端點的容量時,就需要把數(shù)據(jù)包分為好幾個包,分批發(fā)送,DATA0包和DATA1包交替發(fā)送,即如果第一個數(shù)據(jù)包是DATA0,那第二個數(shù)據(jù)包就是DATA1。但也有例外情況,在同步傳輸中(四類傳輸類型中之一),所有的數(shù)據(jù)包都是為DATA0,格式如下:

SYNC+PID+0~1023字節(jié)+CRC16

 

3、握手包:結(jié)構(gòu)最為簡單的包,格式如下

SYNC+PID

 

(注上面每種包都有不同類型的,USB1.1共定義了十種包,具體請見問題五)

 

(三)事務(wù):分別有IN事務(wù)、OUT事務(wù)和SETUP事務(wù)三大事務(wù),每一種事務(wù)都由令牌包、數(shù)據(jù)包、握手包三個階段構(gòu)成,這里用階段的意思是因為這些包的發(fā)送是有一定的時間先后順序的,事務(wù)的三個階段如下:

1、令牌包階段:啟動一個輸入、輸出或設(shè)置的事務(wù)

2、數(shù)據(jù)包階段:按輸入、輸出發(fā)送相應(yīng)的數(shù)據(jù)

3、握手包階段:返回數(shù)據(jù)接收情況,在同步傳輸?shù)腎N和OUT事務(wù)中沒有這個階段,這是比較特殊的。

事務(wù)的三種類型如下(以下按三個階段來說明一個事務(wù)):

1、 IN事務(wù):

令牌包階段——主機(jī)發(fā)送一個PID為IN的輸入包給設(shè)備,通知設(shè)備要往主機(jī)發(fā)送數(shù)據(jù);

數(shù)據(jù)包階段——設(shè)備根據(jù)情況會作出三種反應(yīng)(要注意:數(shù)據(jù)包階段也不總是傳送數(shù)據(jù)的,根據(jù)傳輸情況還會提前進(jìn)入握手包階段)

1) 設(shè)備端點正常,設(shè)備往入主機(jī)里面發(fā)出數(shù)據(jù)包(DATA0與DATA1交替);

2) 設(shè)備正在忙,無法往主機(jī)發(fā)出數(shù)據(jù)包就發(fā)送NAK無效包,IN事務(wù)提前結(jié)束,到了下一個IN事務(wù)才繼續(xù);

3) 相應(yīng)設(shè)備端點被禁止,發(fā)送錯誤包STALL包,事務(wù)也就提前結(jié)束了,總線進(jìn)入空閑狀態(tài)。

握手包階段——主機(jī)正確接收到數(shù)據(jù)之后就會向設(shè)備發(fā)送ACK包。

 

2、 OUT事務(wù):

令牌包階段——主機(jī)發(fā)送一個PID為OUT的輸出包給設(shè)備,通知設(shè)備要接收數(shù)據(jù);

數(shù)據(jù)包階段——比較簡單,就是主機(jī)會設(shè)備送數(shù)據(jù),DATA0與DATA1交替

握手包階段——設(shè)備根據(jù)情況會作出三種反應(yīng)

1)設(shè)備端點接收正確,設(shè)備往入主機(jī)返回ACK,通知主機(jī)可以發(fā)送新的數(shù)據(jù),如果數(shù)據(jù)包發(fā)生了CRC校驗錯誤,將不返回任何握手信息;

2) 設(shè)備正在忙,無法往主機(jī)發(fā)出數(shù)據(jù)包就發(fā)送NAK無效包,通知主機(jī)再次發(fā)送數(shù)據(jù);

3) 相應(yīng)設(shè)備端點被禁止,發(fā)送錯誤包STALL包,事務(wù)提前結(jié)束,總線直接進(jìn)入空閑狀態(tài)。

 

3、SETUT事務(wù):

令牌包階段——主機(jī)發(fā)送一個PID為SETUP的輸出包給設(shè)備,通知設(shè)備要接收數(shù)據(jù);

數(shù)據(jù)包階段——比較簡單,就是主機(jī)會設(shè)備送數(shù)據(jù),注意,這里只有一個固定為8個字節(jié)的DATA0包,這8個字節(jié)的內(nèi)容就是標(biāo)準(zhǔn)的USB設(shè)備請求命令(共有11條,具體請看問題七)

握手包階段——設(shè)備接收到主機(jī)的命令信息后,返回ACK,此后總線進(jìn)入空閑狀態(tài),并準(zhǔn)備下一個傳輸(在SETUP事務(wù)后通常是一個IN或OUT事務(wù)構(gòu)成的傳輸)

 

(四)傳輸:傳輸由OUT、IN、SETUP事務(wù)其中的事務(wù)構(gòu)成,傳輸有四種類型,中斷傳輸、批量傳輸、同步傳輸、控制傳輸,其中中斷傳輸和批量轉(zhuǎn)輸?shù)慕Y(jié)構(gòu)一樣,同步傳輸有最簡單的結(jié)構(gòu),而控制傳輸是最重要的也是最復(fù)雜的傳輸。

1、中斷傳輸:由OUT事務(wù)和IN事務(wù)構(gòu)成,用于鍵盤、鼠標(biāo)等HID設(shè)備的數(shù)據(jù)傳輸中

2、批量傳輸:由OUT事務(wù)和IN事務(wù)構(gòu)成,用于大容量數(shù)據(jù)傳輸,沒有固定的傳輸速率,也不占用帶寬,當(dāng)總線忙時,USB會優(yōu)先進(jìn)行其他類型的數(shù)據(jù)傳輸,而暫時停止批量轉(zhuǎn)輸。

3、同步傳輸:由OUT事務(wù)和IN事務(wù)構(gòu)成,有兩個特殊地方,第一,在同步傳輸?shù)腎N和OUT事務(wù)中是沒有返回包階段的;第二,在數(shù)據(jù)包階段所有的數(shù)據(jù)包都為DATA0

4、控制傳輸:最重要的也是最復(fù)雜的傳輸,控制傳輸由三個階段構(gòu)成(初始設(shè)置階段、可選數(shù)據(jù)階段、狀態(tài)信息步驟),每一個階段可以看成一個的傳輸,也就是說控制傳輸其實是由三個傳輸構(gòu)成的,用來于USB設(shè)備初次加接到主機(jī)之后,主機(jī)通過控制傳輸來交換信息,設(shè)備地址和讀取設(shè)備的描述符,使得主機(jī)識別設(shè)備,并安裝相應(yīng)的驅(qū)動程序,這是每一個USB開發(fā)者都要關(guān)心的問題。

1、初始設(shè)置步驟:就是一個由SET事務(wù)構(gòu)成的傳輸

2、可選數(shù)據(jù)步驟:就是一個由IN或OUT事務(wù)構(gòu)成的傳輸,這個步驟是可選的,要看初始設(shè)置步驟有沒有要求讀/寫數(shù)據(jù)(由SET事務(wù)的數(shù)據(jù)包階段發(fā)送的標(biāo)準(zhǔn)請求命令決定)

3、 狀態(tài)信息步驟:顧名思義,這個步驟就是要獲取狀態(tài)信息,由IN或OUT事務(wù)構(gòu)成構(gòu)成的傳輸,但是要注意這里的IN和OUT事務(wù)和之前的INT和OUT事務(wù)有兩點不同:

1) 傳輸方向相反,通常IN表示設(shè)備往主機(jī)送數(shù)據(jù),OUT表示主機(jī)往設(shè)備送數(shù)據(jù);在這里,IN表示主機(jī)往設(shè)備送數(shù)據(jù),而OUT表示設(shè)備往主機(jī)送數(shù)據(jù),這是為了和可選數(shù)據(jù)步驟相結(jié)合;

2) 在這個步驟里,數(shù)據(jù)包階段的數(shù)據(jù)包都是0長度的,即SYNC+PID+CRC16

除了以上兩點有區(qū)別外,其他的一樣,這里就不多說

 

(思考:這些傳輸模式在實際***作中應(yīng)如何通過什么方式去設(shè)置?)

 

問題五:標(biāo)識碼有哪些?

答案五:如同前面所說的標(biāo)識碼由四位數(shù)據(jù)組成,因此可以表示十六種標(biāo)識碼,在USB1.1規(guī)范里面,只用了十種標(biāo)識碼,USB2.0使用了十六種標(biāo)識碼,標(biāo)識碼的作用是用來說明包的屬性的,標(biāo)識碼是和包聯(lián)系在一起的,首先簡單介紹一下數(shù)據(jù)包的類型,數(shù)據(jù)包分為令牌包、數(shù)據(jù)、握手包和特殊包四種(具體分類請看問題七),標(biāo)識碼分別有以下十六種:

令牌包 :

0x01  輸出(OUT)啟動一個方向為主機(jī)到設(shè)備的傳輸,并包含了設(shè)備地址和標(biāo)號

0x09  輸入 (IN) 啟動一個方向為設(shè)備到主機(jī)的傳輸,并包含了設(shè)備地址和標(biāo)號

0x05  幀起始(SOF)表示一個幀的開始,并且包含了相應(yīng)的幀號

0x0d  設(shè)置(SETUP)啟動一個控制傳輸,用于主機(jī)對設(shè)備的初始化

數(shù)據(jù)包 :

0x03  偶數(shù)據(jù)包(DATA0),

0x0b  奇數(shù)據(jù)包(DATA1)

握手包:

0x02  確認(rèn)接收到無誤的數(shù)據(jù)包(ACK)

0x0a  無效,接收(發(fā)送)端正在忙而無法接收(發(fā)送)信息

0x0e  錯誤,端點被禁止或不支持控制管道請求

特殊包 0x0C  前導(dǎo),用于啟動下行端口的低速設(shè)備的數(shù)據(jù)傳輸

 

 

問題六:USB主機(jī)是如何識別USB設(shè)備的?

答案六:當(dāng)USB設(shè)備插上主機(jī)時,主機(jī)就通過一系列的動作來對設(shè)備進(jìn)行枚舉配置(配置是屬于枚舉的一個態(tài),態(tài)表示暫時的狀態(tài)),這這些態(tài)如下:

        1、接入態(tài)(Attached):設(shè)備接入主機(jī)后,主機(jī)通過檢測信號線上的電平變化來發(fā)現(xiàn)設(shè)備的接入;

        2、供電態(tài)(Powered):就是給設(shè)備供電,分為設(shè)備接入時的默認(rèn)供電值,配置階段后的供電值(按數(shù)據(jù)中要求的最大值,可通過編程設(shè)置)

        3、缺省態(tài)(Default):USB在被配置之前,通過缺省地址0與主機(jī)進(jìn)行通信;

        4、地址態(tài)(Address):經(jīng)過了配置,USB設(shè)備被復(fù)位后,就可以按主機(jī)分配給它的唯一地址來與主機(jī)通信,這種狀態(tài)就是地址態(tài);

        5、配置態(tài)(Configured):通過各種標(biāo)準(zhǔn)的USB請求命令來獲取設(shè)備的各種信息,并對設(shè)備的某此信息進(jìn)行改變或設(shè)置。

        6、掛起態(tài)(Suspended):總線供電設(shè)備在3ms內(nèi)沒有總線***作,即USB總線處于空閑狀態(tài)的話,該設(shè)備就要自動進(jìn)入掛起狀態(tài),在進(jìn)入掛起狀態(tài)后,總的電流功耗不超過280UA。

 

問題七:剛才在答案四提到的標(biāo)準(zhǔn)的USB設(shè)備請求命令究竟是什么?

答案七:標(biāo)準(zhǔn)的USB設(shè)備請求命令是用在控制傳輸中的“初始設(shè)置步驟”里的數(shù)據(jù)包階段(即DATA0,由八個字節(jié)構(gòu)成),請看回問答四的內(nèi)容。標(biāo)準(zhǔn)USB設(shè)備請求命令共有11個,大小都是8個字節(jié),具有相同的結(jié)構(gòu),由5個字段構(gòu)成(字段是標(biāo)準(zhǔn)請求命令的數(shù)據(jù)部分),結(jié)構(gòu)如下(括號中的數(shù)字表示字節(jié)數(shù),首字母bm,b,w分別表示位圖、字節(jié),雙字節(jié)):

bmRequestType(1)+bRequest(1)+wvalue(2)+wIndex(2)+wLength(2)

 

各字段的意義如下:

1、bmRequestType:D7D6D5D4D3D2D1D0

D7=0主機(jī)到設(shè)備

=1設(shè)備到主機(jī);

D6D5=00標(biāo)準(zhǔn)請求命令

     =01 類請求命令

     =10用戶定義的命令    

=11保留值

D4D3D2D1D0=00000 接收者為設(shè)備

            =00001 接收者為設(shè)備

            =00010 接收者為端點

            =00011 接收者為其他接收者

            =其他  其他值保留

2、bRequest:請求命令代碼,在標(biāo)準(zhǔn)的USB命令中,每一個命令都定義了編號,編號的值就為字段的值,編號與命令名稱如下(要注意這里的命令代碼要與其他字段結(jié)合使用,可以說命令代碼是標(biāo)準(zhǔn)請求命令代碼的核心,正是因為這些命令代碼而決定了11個USB標(biāo)準(zhǔn)請求命令):

0) 0  GET_STATUS:用來返回特定接收者的狀態(tài)

1) 1  CLEAR_FEATURE:用來清除或禁止接收者的某些特性

2) 3  SET_FEATURE:用來啟用或激活命令接收者的某些特性

3) 5  SET_ADDRESS:用來給設(shè)備分配地址

4) 6  GET_DEscriptOR:用于主機(jī)獲取設(shè)備的特定描述符

5) 7  SET_DEscriptOR:修改設(shè)備中有關(guān)的描述符,或者增加新的描述符

6) 8  GET_CONFIGURATION:用于主機(jī)獲取設(shè)備當(dāng)前設(shè)備的配置值(注同上面的不同) 

7) 9  SET_CONFIGURATION:用于主機(jī)指示設(shè)備采用的要求的配置

8) 10  GET_INTERFACE:用于獲取當(dāng)前某個接口描述符編號

9) 11  SET_INTERFACE:用于主機(jī)要求設(shè)備用某個描述符來描述接口

10) 12 SYNCH_FRAME:用于設(shè)備設(shè)置和報告一個端點的同步幀

以上的11個命令要說得明白真的有一匹布那么長,請各位去看書吧,這里就不多說了,控制傳輸是USB的重心,而這11個命令是控制傳輸?shù)闹匦模赃@11個命令是重中之重,這個搞明白了,USB就算是入門了。

 

問題八:在標(biāo)準(zhǔn)的USB請求命令中,經(jīng)常會看到Descriptor,這是什么來的呢?

回答八:Descriptor即描述符,是一個完整的數(shù)據(jù)結(jié)構(gòu),可以通過C語言等編程實現(xiàn),并存儲在USB設(shè)備中,用于描述一個USB設(shè)備的所有屬性,USB主機(jī)是通過一系列命令來要求設(shè)備發(fā)送這些信息的。它的作用就是通過如問答節(jié)中的命令***作來給主機(jī)傳遞信息,從而讓主機(jī)知道設(shè)備具有什么功能、屬于哪一類設(shè)備、要占用多少帶寬、使用哪類傳輸方式及數(shù)據(jù)量的大小,只有主機(jī)確定了這些信息之后,設(shè)備才能真正開始工作,所以描述符也是十分重要的部分,要好好掌握。標(biāo)準(zhǔn)的描述符有5種,USB為這些描述符定義了編號:

1——設(shè)備描述符

2——配置描述符

3——字符描述符

4——接口描述符

5——端點描述符

上面的描述符之間有一定的關(guān)系,一個設(shè)備只有一個設(shè)備描述符,而一個設(shè)備描述符可以包含多個配置描述符,而一個配置描述符可以包含多個接口描述符,一個接口使用了幾個端點,就有幾個端點描述符。這間描述符是用一定的字段構(gòu)成的,分別如下說明:

1、設(shè)備描述符

struct _DEVICE_DEscriptOR_STRUCT

{

 BYTE bLength;          //設(shè)備描述符的字節(jié)數(shù)大小,為0x12

 BYTE bDescriptorType;  //描述符類型編號,為0x01

 WORD bcdUSB;           //USB版本號

 BYTE bDeviceClass;  //USB分配的設(shè)備類代碼,0x01~0xfe為標(biāo)準(zhǔn)設(shè)備類,0xff為廠商自定義類型

                        //0x00不是在設(shè)備描述符中定義的,如HID

    BYTE bDeviceSubClass;   //usb分配的子類代碼,同上,值由USB規(guī)定和分配的

    BYTE bDeviceProtocl;    //USB分配的設(shè)備協(xié)議代碼,同上

    BYTE bMaxPacketSize0;   //端點0的最大包的大小

    WORD idVendor;          //廠商編號

    WORD idProduct;         //產(chǎn)品編號

    WORD bcdDevice;         //設(shè)備出廠編號

    BYTE iManufacturer;     //描述廠商字符串的索引

    BYTE iProduct;          //描述產(chǎn)品字符串的索引

    BYTE iSerialNumber;     //描述設(shè)備序列號字符串的索引

    BYTE bNumConfiguration; //可能的配置數(shù)量

   

}

 

 

2、配置描述符

struct _CONFIGURATION_DEscriptOR_STRUCT

{

 BYTE bLength;          //設(shè)備描述符的字節(jié)數(shù)大小,為0x12

 BYTE bDescriptorType;  //描述符類型編號,為0x01

 WORD wTotalLength;     //配置所返回的所有數(shù)量的大小

 BYTE bNumInterface;    //此配置所支持的接口數(shù)量

 BYTE bConfigurationVale;   //Set_Configuration命令需要的參數(shù)值

 BYTE iConfiguration;       //描述該配置的字符串的索引值

 BYTE bmAttribute;          //供電模式的選擇

 BYTE MaxPower;             //設(shè)備從總線提取的最大電流

}

 

3、字符描述符

struct _STRING_DEscriptOR_STRUCT

{

 BYTE bLength;          //設(shè)備描述符的字節(jié)數(shù)大小,為0x12

 BYTE bDescriptorType;  //描述符類型編號,為0x01

 BYTE SomeDescriptor[36];          //UNICODE編碼的字符串

}

 

4、接口描述符

struct _INTERFACE_DEscriptOR_STRUCT

{

 BYTE bLength;          //設(shè)備描述符的字節(jié)數(shù)大小,為0x12

 BYTE bDescriptorType;  //描述符類型編號,為0x01

 BYTE bInterfaceNunber; //接口的編號

 BYTE bAlternateSetting;//備用的接口描述符編號

 BYTE bNumEndpoints;    //該接口使用端點數(shù),不包括端點0

 BYTE bInterfaceClass;  //接口類型

 BYTE bInterfaceSubClass;//接口子類型

 BYTE bInterfaceProtocol;//接口所遵循的協(xié)議

 BYTE iInterface;        //描述該接口的字符串索引值

}

5、端點描述符

struct _ENDPOIN_DEscriptOR_STRUCT

{

 BYTE bLength;          //設(shè)備描述符的字節(jié)數(shù)大小,為0x12

 BYTE bDescriptorType;  //描述符類型編號,為0x01

 BYTE bEndpointAddress; //端點地址及輸入輸出屬性

 BYTE bmAttribute;      //端點的傳輸類型屬性

 WORD wMaxPacketSize;   //端點收、發(fā)的最大包的大小

 BYTE bInterval;        //主機(jī)查詢端點的時間間隔

}

 

 
USB枚舉實例轉(zhuǎn)載

對2440的USB HOST進(jìn)行初始化完畢(主要包括對符合OHCI規(guī)范的寄存器的初始化—總線復(fù)位、中斷使能、清除中斷標(biāo)志、電源管理、內(nèi)存指針寄存器的初始化,各種數(shù)據(jù)結(jié)構(gòu)的初始化等),等待USB設(shè)備的插入,當(dāng)2440檢測到有設(shè)備插入,就要對設(shè)備進(jìn)行枚舉了。那么為什么要對設(shè)備進(jìn)行枚舉呢?起始枚舉就相當(dāng)于主機(jī)和設(shè)備建立連接的過程(接頭),Host向Device詢問一些東西,Device將自身的設(shè)備類型,如何進(jìn)行通信報告給Host,這樣Host就知道怎么著對Device進(jìn)行操作了。

枚舉的過程實際上用到而且只用到了總線的“控制傳輸(Control Transfer)”的傳輸方式。這種傳輸方式通常用于配置/命令/狀態(tài)等情形,其中的設(shè)置操作setup和狀態(tài)操作status過程的數(shù)據(jù)包具有USB協(xié)議定義的數(shù)據(jù)結(jié)構(gòu),因此,控制傳輸只能通過消息管道進(jìn)行。

一個完整的控制傳輸包括三個過程:1.建立連接    2.數(shù)據(jù)過程(可選)         3.狀態(tài)過程

建立連接的過程都是有Host發(fā)起,它開始于一個Setup令牌包,后面緊跟一個DATA0包。如果是控制輸入傳輸,數(shù)據(jù)過程則為輸入數(shù)據(jù),若是控制輸出傳輸,則數(shù)據(jù)過程是輸出數(shù)據(jù)。

數(shù)據(jù)過程的可選型是指設(shè)置過程需要指定數(shù)據(jù)長度,如果指定為0,則沒有數(shù)據(jù)過程。狀態(tài)過程跟在數(shù)據(jù)過程之后,狀態(tài)過程恰好和數(shù)據(jù)過程的數(shù)據(jù)傳輸方向相反,因為此階段主要是用來確認(rèn)之前兩階段的所有數(shù)據(jù)都已經(jīng)正確傳輸了。

       好了,下面就結(jié)合我的這個實例來看看枚舉的詳細(xì)過程:

       1.控制2440向U盤發(fā)送第一個Setup包,內(nèi)容是80 06 00 01 00 00 08 00,其中最后的0008表示得到DEVICE_DCESCRIPTOR的前8個字節(jié),因為這個包的主要目的是要獲得USB Device中端點0的最大包的大?。ǖ?個字節(jié)),所以只需要8個字節(jié)就可以了。USB Device返回的設(shè)備標(biāo)識符為12 01 10 01 00 00 00 40,下面我們需要對0x40記錄下來,將其放到Endpoint Descriptor數(shù)據(jù)結(jié)構(gòu)的DWORD0的MPS(bit16~bit32)塊中去。

       2.接下來2440發(fā)送第二個Setup包,內(nèi)容是00 05 01 00 00 00 00 00這一個次的作用是為USB設(shè)備分配地址(相當(dāng)于SD卡中的RCA)。如果USB Device接收并接受了此地址設(shè)置包,會返回一個長度為0的數(shù)據(jù)包。Host接收到長度為0的狀態(tài)包之后就會返回一個ACK給Device,Device再接收到這個ACK之后,就可以啟用新地址了。這樣Device就得到了一個唯一的設(shè)備地址,作為主機(jī)通信的唯一表示。

3.發(fā)送第三個Setup包,內(nèi)容是80 06 00 02 00 00 09 00,這次是為了獲取配置描述符集合的大小,此位位于讀回數(shù)據(jù)的第三個字節(jié)。U盤返回的數(shù)據(jù)為09 02 20 00 01 01 00 80 32,即描述符集合總大小為0x20。

4.發(fā)送第四個Setup包,內(nèi)容是80 06 00 02 00 00 09 00,和上次不同的僅僅是,這次要讀回來的數(shù)據(jù)是整個配置描述符區(qū)域。U盤返回來的數(shù)據(jù)是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00。

這時候我們就可以知道該設(shè)備是什么類型的設(shè)備,支持什么樣的操作了。

上述這兩個過程也有的程序就是直接讀取0xff個字符大小,當(dāng)然同樣可以達(dá)到讀回設(shè)備描述符集合的目的。

至此,我們已經(jīng)得到了所需要的設(shè)備信息,之后就可以對設(shè)備進(jìn)行配置了。

5.向設(shè)備發(fā)送第五個Setup包,數(shù)據(jù)為00 09 01 00 00 00 00 00,USB Device返回一個長度為0的數(shù)據(jù)包,表明數(shù)據(jù)正確接收。

至此,USB的枚舉過程就完成了。

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
USB的八個問題和答案(適用初學(xué)者)--------轉(zhuǎn)帖??!謝謝原創(chuàng)者! 中國電子開發(fā)網(wǎng)(...
【轉(zhuǎn)】USB的枚舉過程 與 USB基礎(chǔ)知識
USB描述符
USB的描述符及各種描述符之間的依賴關(guān)系(轉(zhuǎn)載)
USB設(shè)備枚舉全紀(jì)錄
USB的“JoyStickMouse”工作過程詳細(xì)分析 (三)
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服