透徹理解USB總線應用之枚舉


Hello,大家好,今天我們來討論一下USB總線中的枚舉(Enumeration),首先簡單介紹一下USB系統的基本架構,它由USB主機USB設備與USB電纜(本文忽略它)組成,如下圖所示:

                     

 

     

最常見的主機就是電腦了,現在很多有USBOTG(On-The-Go)功能的手機也可以做主機,無需過多贅述。USB設備實在太多了,例如,手機、MP4、U盤、移動硬盤、打印機、掃描儀等等,當然,作為工程師的你還可能會購買其它一些使用USB接口的儀器,例如邏輯分析儀,示波器等等。無論USB設備的具體形式是怎么樣的,按照功能都可以分為兩大類,其中之一就是USB功能設備。剛剛提到的USB設備都屬於這類,它們都各自提供了一些特定的功能,例如,U盤就是存儲數據,示波器就是采集數據。

另外一類USB設備就是USB集線器(USB Hub),它的功能與網絡集線器相同,把一個USB接口擴展多個USB接口。例如,學校一個寢室有很多人,每個人都有一台電腦,但網線只有一根,怎么辦?用網絡集線器就可以解決這個問題,如下圖所示

 

  我們只需要特別留意:USB系統的數據或指令傳輸都是由主機啟動的,USB設備只是根據主機的要求進行被動響應。在任意時刻,USB系統僅允許存在一個USB主機。

------------------------------------------------------------------------------------------------------

好的,現在有一個問題得先弄明白:為什么在電腦同一個USB接口依次插入鼠標、鍵盤或其它USB設備,電腦都能夠正確地識別它的功能呢?這就是枚舉的功勞。為了形象地理解枚舉,我們來看一個面試對話場景:

------------------------------------------------------------------------------------------------

面試官:我看你的簡歷上說對三極管有比較深入的了解,那么請形象地講講三極管的放大原理。

:好的,你可以把三極管的三個區比作三個國家,然后…..

面試官:這個故事是你自己總結的嗎?

:不瞞你說,是通過微信公眾號《電子制作站》學來的。

面試官莞爾一笑:是嘛 ,難怪我怎么覺得這么熟悉,那另外一篇關於上下拉電阻的文章你看過沒有?

:必須的呀!

面試官:那你說說拉電流與灌電流的區別?

:拉與灌只是電流方向不同而已,具體到電路結構,就是…..

…..

面試官:好的,我覺得你的水平確實不錯,至少基礎非常扎實,不愧是關注《電子制作站》微信公眾號的老粉,值得信賴….

….

然后你就順利進入了該公司,拿到了一個代表你是公司員工的工牌….

----------------------------------------------------------------------------------------------------------

在以上面試過程中,面試官首先提出一個問題,根據面試者的反饋后再跳到另一個知識點,依此循環,繼而完成全面考察面試者業務水平的目的,最后才決定是否符合公司的錄用標准,這其實就是一個枚舉的過程。在面試的場景中,你就是USB設備,面試官就是USB主機,所以簡單的說,枚舉就是“識別”的同義詞

同樣的道理,當USB鼠標插入到電腦時,電腦也需要詢問關於它的一些信息,以確定它到底是個什么東東。電腦當然是不能說話的,它只是會發送一些命令,USB設備必須對這些命令進行響應,不然枚舉就會失敗(問你話咋一聲不吭呢?面試失敗!)。當然,USB設備必須進行正確響應,亂來也會導致枚舉失敗(回答問題怎么牛頭不對馬嘴呢?面試失敗!)。當然,即便枚舉成功了,也不一定代表USB設備能用,枚舉成功只是萬里長征的第一些。(你小子面試時能說會道,做起實事來卻完全不頂用,明天卷鋪蓋滾蛋吧,趕緊從我眼前消失!失敗中的失敗!!

概括來講,如果我們開發自己的USB設備,關鍵的兩個步驟是必須進行的。

 

其一:USB設備按照USB協議正確回應主機的命令,以成功完成枚舉

其二:在枚舉成功后,把數據按正確的格式進行傳輸

 

有些人想:蝦米?還要響應命令吶,粗看了一下,貌似很復雜,玩不了,回家洗洗睡了!哈哈,必須得打擊你一下,USB底層的實現確實有點復雜,但幸運的是,通常廠商都會把底層核心的東西做好了打包成庫,我們只要修改一些應用方面的數據即可。也就是說,如果你只是使用USB總線傳輸數據,底層的東西你沒機會(也不需要)去修改

 

那到底需要修改什么才能成功完成枚舉呢?其實道理跟我們工程師做項目一樣!例如使用單片機控制新的器件時,第一步需要做的就是了解新器件的基本原理,包括通訊時序、寄存器的定義、硬件電路的連接要求等等。器件廠家為了方便用戶使用,通常都會准備好相應的數據手冊(datasheet),它包含了用戶應用該器件的所有信息。

同樣的道理,如果把你當成一台電腦,當USB鼠標插入USB接口時,你又是怎么知道它是鼠標,而不是鍵盤或其它設備呢?很明顯,你(電腦)也需要數據手冊之類能夠描述插入設備所有信息的媒介,對不對?USB協議中定義的描述符(descriptor)就是這個目的。

描述符在C語言實現層面通常就是結構體(Structure),應用上就是多個有一定關聯的信息的集合體。例如,我要定義一個員工的描述符,它應該包含姓名、性別、年齡、工號等等信息,如下所示:

也就是說,USB描述符就是用來描述相應的USB設備具體是什么,有什么特點,能做什么(是不是真的能做就不知道了),所以在源代碼編程自定義USB設備時,我們最先開始的工作就是:找到廠商提供的固件(firmware)或示例程序中描述符對應的位置,再根據USB協議的規定進行合適的修改。如果修改正常,廠商提供的固件會自動根據主機發送的命令提交你修改描述符信息,這樣主機才能正確識別(會提示你插入了新設備,可以正常使用了),至於它具體能不能起到什么功能,就是枚舉成功之后再去討論的事了,先通過面試這一關才能發揮咱們的才干吶!

USB協議定義了很多描述符,結構也遠比前面的員工信息要復雜的多,我們將在下一篇文章中繼續討論,么么噠~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM