USB列舉過程詳述

2021-06-21 04:51:38 字數 3287 閱讀 6367

本系統中所謂usb裝置與主機是通過檢測vcc上拉電阻的變化來確定是否有裝置連線的。在d12內部整合了1.5kω的上拉電阻,預設狀態下不與vcc相連,程式執行時可以向d12傳送連線命令使1.5kω電阻連線到vcc,這樣主機便檢測到有裝置連線。

它的列舉過程分析如下。

裝置連線到匯流排後,裝置從匯流排獲得5v電源,程式首先初始化,埠,然後向d12發出usb連線命令。主機檢測到裝置連線。主機向裝置發出第乙個信 號:匯流排復位。匯流排復位產生乙個中斷,並且d12器件在預設位址0處使能,以便在接下來的列舉過程中使用位址0傳輸命令和資料,同時中斷暫存器的匯流排復位 位被置為1。在程式中的表現是,d12向主迴圈請求中斷,進入中斷處理程式usb_int_handler(),讀取中斷暫存器,確定中斷的型別,進行相 應的處理。

主機使用預設位址0讀取裝置描述符。

具體過程是:主機向d12傳送第乙個setup包,每個setup包都是8個位元組,第乙個包get descriptor的內容為:80 06 00 01 00 00 40 00 ,資料為16進製表示。其中的40表示返回的資料最大長度為40h位元組。此setup包儲存在d12的端點0緩衝區中,並產生乙個外部中斷。(這時在 d12的中斷暫存器中儲存了中斷的型別:端點0的out中斷,即中斷暫存器位元組1的值應為0x01)進入中斷服務程式後,由於d12端點0的緩衝區只有 16個位元組,所以微控制器就先傳送16個位元組的裝置描述符。

當主機接收到這16個位元組的字元後,就認為真正有裝置連線了。

位址分配。

主機向d12傳送第二個setup包,這是乙個含有指定位址的資料報,其內容一般為:00 05 02 00 00 00 00 00 ,其中的02就表示主機為裝置分配的位址為0x02,在以後的通訊裡裝置就只對0x02位址的資訊作出應答。d12收到這個setup包後同樣產生乙個中 斷(端點0的out中斷),需要注意的是微控制器處理這個中斷時需要向主機返回乙個長度為0的空資料報。

主機從新的位址獲取裝置描述符。

主機收到裝置發來的空的應答資料報後,確認位址分配成功。然後主機向d12傳送第三個setup包,再次要求獲取裝置描述符。這個setup包的內 容一般是:80 06 00 01 00 00 12 00 。與上次不同的是,這次要求實際的描述符長度,其中的12(十六進製制數)表示要求得到全部18位元組的裝置描述符。因為每次只能傳送16位元組,因此程式中要 分兩次完成此要求。第一次16位元組,第二次2位元組。

主機讀取配置描述符。

成功得到18位元組的裝置描述符後,主機向d12傳送第四個setup包,要求得到裝置的配置描述符。這個setup包的資料為:80 06 00 02 00 00 09 00 。其中的09指定裝置返回9位元組資料,這正是配置描述符的長度。

讀取描述符集合。

成功得到9位元組的配置描述符後,主機向d12傳送第五個setup包,要求得到裝置的配置描述符、介面描述符、端點描述符的集合。這次setup包的內容是:80 06 00 02 00 00 ff 00 。由於不知道描述符集合的真實長度,因此它要求得到256位元組。

到這一步,主機現在應該已經發現新硬體並為新裝置安裝好驅動程式。對於以上過程,主機是在匯流排驅動層處理,下面的一步,也是典型列舉過程的最後一步,就需要裝置驅動程式來做了。

數值配置。主機得到各種描述符之後,認為裝置的資訊已經齊全,便對裝置進行配置,使裝置從位址狀態進入配置狀態。

主機向d12傳送第六個setup包,其資料為:00 09 01 00 00 00 00 00 。程式中需要呼叫set configuration()函式處理此事件,允許所有端點進入工作狀態。

至此,usb列舉過程結束,裝置可以正常使用了。在這個過程中d12指示燈根據通訊的狀況間歇閃爍。

usb  最主要的的是要理解 

usb主機傳送命令給裝置,裝置要對主機的命令進行響應, usb通訊的基本單位為 「包」 

理解好「包」這個概念是學習usb的關鍵所在。

包有如下分類:

分別是令牌包、資料報、握手包和特殊包(其實是由pid決定的)

令牌包:可分為輸入包、輸出包、設定包和幀起始包(注意這裡的輸入包是用於設定輸入命令的,輸出包是用來設定輸出命令的,而不是放據數的)其中輸入包、輸出包和設定包的格式都是一樣的: sync+pid+addr+endp+crc5(五位的校驗碼)

幀起始包: sync+pid+11位fram+crc5(五位的校驗碼)

數 據包:分為data0包和data1包,當usb傳送資料的時候,當一次傳送的資料長度大於相應端點的容量時,就需要把資料報分為好幾個包,分批發 送,data0包和data1包交替傳送,即如果第乙個資料報是data0,那第二個資料報就是data1。但也有例外情況,在同步傳輸中(四類傳輸型別 中之一),所有的資料報都是為data0,格式如下:

sync+pid+0~1023位元組+crc16

握手包:結構最為簡單的包,格式如下

sync+pid

下面舉幾個例子來說明usb的通訊過程:

1:主機想要向裝置傳送一串資料。 過程如下:

(1) 

主機向從機傳送 「令牌包」,令牌包的型別為輸出包,表示主機要向從機傳送資料了。

(2) 

主機向從機傳送完令牌以後,usb處理器件根據傳送的令牌,會將中斷狀態暫存器標誌置位,從機cpu通過查詢usb處理器件的中斷狀態暫存器,對主機的令牌包進行響應

(3) 

從機判別出中斷型別,於是,準備從主機接收資料。

(4) 

從機準備好了,於是主機開始傳送「資料報」 這時,usb處理器件會自動將從主傳送過來的資料放如它的內部緩衝區內,接收完這個資料報後,從機向主機傳送「應答包」 

這就是乙個完整的通訊過程。

由以上可以看出,usb若是想要傳送資料,那麼主機必須先發乙個 in 或out的令牌包,然後傳送data0,或data1資料報。

簡 單的用現實生活中的事件進行描述:  老闆想讓員工去做一件事情,老闆 先會發出命令,告訴要做什麼事情,員工準備好以後呢,老闆再把做這件事情的經費發放給員工,當員工把發放的經費清點以後,發現數目正確,他會給老闆乙個回 應資訊,告訴老闆,錢已經收到了,而且數目正確。

老闆想讓員工做的事:  對應usb通訊裡的令牌包。

老闆想要發放的經費:  對應usb通訊裡的資料報。

員工給老闆的回應: 

對應usb通訊裡的握手包。

這裡尤其需要注意乙個問題就是:

usb主機向裝置傳送令牌包的時候,接收令牌是有usb器件來完成的,而不是有從機cpu來完成的,如主機傳送乙個如下的令牌:

sync+pid+addr+endp+crc5

usb 器件回根據pid的型別來判斷是哪種型別的令牌 根據addr的值來判斷是否是和自己通訊,根據endp的值來判斷是和哪個端點進行通訊,根據校驗來判斷,資料傳送是否無誤。根據以上的令牌包信 息,usb器件會將其內部的中斷狀態暫存器相應的位置位,從機cpu可以查詢這個中斷狀態暫存器來進行相應的操作。

USB裝置列舉過程

當裝置連線到主機時,按照以下順序進行列舉 1.連線了裝置的hub 在host 查詢其狀態改變端點時返回對應的bitmap,告知host 某個port 狀態發生了改變。2.主機向hub 查詢該port 的狀態,得知有裝置連線,並知道了該裝置的基本特性。3.主機等待 至少100ms 裝置上電穩定,然後向...

USB列舉過程(1)

總的過程 host檢測到device,reset 獲取裝置描述符 host發獲取裝置描述符請求 setup data0 divice返回裝置描述符 in ack host說明已獲取裝置描述符 out data0空資料 lsb先發 對裝置reset,開始設定新位址 新位址 out data0 new ...

USB滑鼠列舉過程深入解析(下)

transfer5 transfer6 transfer7 是獲得字串描述符的傳輸過程。transfer5 是為了獲得0 號字串描述符,transfer6 是為了獲得2 號字串描述符,transfer7 是為了獲得1 號字串描述符。transfer5 現在來分析transfer5 的setup tr...