USB入門總結(jié)——枚舉過程
把最近的學習usb的筆記結(jié)合一些資料來總結(jié)一下,本文僅代表個人觀點,盡可能保證內(nèi)容準確性。
1. 不但固件程序需要編寫;
2. PC端的驅(qū)動也要編寫;
3. 而且驅(qū)動寫好了還要寫個上機位才能看出效果;
這樣調(diào)試起來十分困難,建議從USB的鍵盤,鼠標開始做,了解清楚了,再做自己的協(xié)議就比較簡單了。

(一)設(shè)備插入
主機會輪回查詢各個USB端口,主機檢測到D+與D-之間有電壓差,就認為有新的設(shè)置接入。主機等待100ms后發(fā)出復位請求。設(shè)備接到復位請求后將產(chǎn)生一個外部中斷信號。
(二)枚舉過程(檢測到設(shè)備插入以后)
主機這時候只是知道有新的設(shè)備插入了,但是不知道插進來個什么東西,所以就開始詢問它是什么設(shè)備,怎么用,負荷能力怎么樣。這個時候就進入了枚舉過程。
步驟1:(設(shè)備描述符)
地址:因為剛剛插入的設(shè)備沒有分配地址,就用默認地址0;
主機:首先發(fā)送一個Get_deor(獲取設(shè)備描述符)指令包;
設(shè)備:設(shè)備接到包后就開始解析包(其實就是你在固件程序里判斷處理),然后按固定格式返回自己設(shè)備的設(shè)備描述符
目的:這一步主要是讓主機知道你的USB設(shè)備的基礎(chǔ)屬性,比如支持的傳輸數(shù)據(jù)長度,電流負荷多少,支持那個USB版本,以后方便電腦找驅(qū)動的PID,VID。
步驟2:(配置描述符)
分配地址:主機知道設(shè)備的數(shù)據(jù)長度和電流大小后,然后就是給設(shè)備分配一個屬于它的地址;
主機:給設(shè)備一個地址后,就開始詢問設(shè)備的具體配置(配置描述符)。首先發(fā)送一個試探性的設(shè)備配置請求Get_configuration(要求固定返回9個設(shè)備配置字)指令包;
設(shè)備:接到指令包后就開始發(fā)送9字節(jié)的設(shè)備配置字,其中包括設(shè)備的配置字的總長度;
主機:這樣主機就知道設(shè)備的配置到底有多長,然后再發(fā)一次設(shè)備配置請求指令包;
設(shè)備:這時設(shè)備就開始上傳所有的配置字;
主機:這個時候主機就已經(jīng)很明白你的工作方式和各種特性,然后就可以正常工作了;
目的:配置(后面詳細說明)要求說明自己的名字什么的,這里還要上傳字符串描述符;如果是鼠標或者鍵盤還要上傳報告描述符。
(三)正常數(shù)據(jù)階段
這個時候你已經(jīng)被主機正式接受并且注冊了,你可以通過自己寫測試驅(qū)動或通用驅(qū)動與電腦進行通訊了。
對于USB的工作我這里做個比方:
主機好比一個公司,你就是USB設(shè)備,要進入公司首先要面試(枚舉),你到了面試現(xiàn)場(第一次插入設(shè)備),面試官首先了解到你的外表,性別已經(jīng)你要應(yīng)聘的崗位(設(shè)備描述符),然后給你一個號,以后就開始按號叫人,當你被叫到就開始問你的專業(yè)知識,性格等(配置描述符),如果你比較合適(通過了枚舉)你就會錄取了,并且注冊一個你的信息到公司(驅(qū)動安裝,并且寫入注冊表)。等你下次來公司,只要把工號(PID,VID)報上,就知道是你來了。

小浩筆記

