
固件流程
設置一旦完成,第一項任務便是檢查增加或移除的設備。從USB主端口開始,端口變更中斷可被用來察看在至USB主機的連接線路上是否發(fā)生了改變。如果有變化,則可對增加的設備進行計數(shù),或對移走的設備進行邏輯刪除。此后,如果仍有一部設備與USB主端口相連,則需進行檢查,以確定其是否為集線器。這可以通過檢查設備結構中的bClass字段來完成。如果該字段為一個“9”(用于HubClass),則檢查其端口的變更狀態(tài)。如果集線器報告一個狀態(tài)變化,則執(zhí)行下列操作。
確定端口變更是設備插入還是移除。如果是插入,則需對設備進行計數(shù)。如果端口變更是由設備移除所致,則需清除相關聯(lián)的設備結構。如果被移除的設備是集線器,則還需將其所有設備全部予以清除。
當發(fā)現(xiàn)一部新設備時,需對其進行計數(shù)。計數(shù)過程包括詢問設備的描述符并設定其邏輯地址。以下為對一部設備進行計數(shù)所需處置的一系列事項。
1.采用GetDecriptor命令來從邏輯地址“0”獲取設備描述符,一個未初始化設備將對地址“0”做出響應。
2.采用SetAddress命令來設定設備地址,利用GetNextAddr功能來獲取下一個可用地址。GetNextAddr將仔細查看一系列設備結構,并采用第一個具有一個地址“0”的設備結構。
3.采用GetDescriptor命令和邏輯地址來獲取設備描述符。
4.獲取配置描述符的8個字節(jié)。這里有一個長度字段,它將通告設備所具有的總描述符數(shù)據(jù)量。
5.再次獲取配置描述符,此次采用由第4步得到的新長度字段。利用這一組完整的描述符數(shù)據(jù),固件便能夠將信息確定為各種不同的描述符結構類型。這一過程可通過填充諸如端點的數(shù)量和類型等剩余設備信息的方法來完成。
6.如果類代碼表示的是一部HID設備,則調用GetHidDesc命令,以獲取一些HID專用描述符。此外,這里需要用于鍵盤的、有可能采用了特殊字符集的國家代碼。
7.如果類代碼表示的是一部集線器設備,則執(zhí)行以下操作。
a.采用GetHubDesc來獲取集線器專用描述符;
b.采用GetHubStat來獲取集線器的狀態(tài)信息;
c.采用PortFeature來清除所有集線器端口上的端口連接;
d.采用PortFeature來給所有的集線器端口加電;
e.采用PortStatus來獲取所有集線器端口的狀態(tài)信息;
f.給設備結構做標記,以表示該設備為集線器。
當一部設備被移除時,固件將執(zhí)行下列任務。
1.將該設備結構從設備陣列中清除,這樣該地址就可以被另一部設備重新使用。
2.如果被移除的設備是集線器,則需移除所有與其相連的設備。查看設備陣列,并清除每一部具有一個與集線器設備的邏輯地址相同的bParentAddr的設備。
用于對插入設備和移除設備進行計數(shù)的流程如圖2所示。
固件的數(shù)據(jù)收集部分比計數(shù)部分簡單得多。對于數(shù)據(jù)收集,察看設備結構陣列,并搜尋每一個具有非零邏輯地址字段的結構和一個與HID設備對應的類代碼“3”,調用InterruptXfer功能并將邏輯地址作為一個參數(shù)來傳送。如果該功能返回選中狀態(tài)(TRUE),則緩沖器中存在數(shù)據(jù)。對于鍵盤,將存在8字節(jié)數(shù)據(jù)(見上面的HID報表部分)。對于鼠標,數(shù)據(jù)字段的長度將為4字節(jié)。HID報表被顯示于HyperTerminal之上。其他實現(xiàn)方案可以將該數(shù)據(jù)傳送至一個應用程序,以便進行處理。
結論
與PC相比,為嵌入式系統(tǒng)添加USB功能需要相應的計算資源和USB主系統(tǒng)開發(fā)經(jīng)驗,但目前已有多款現(xiàn)成的USB主IC可被用來實現(xiàn)該功能,USB主堆棧和實時操作系統(tǒng)既可以采購,也可以自行開發(fā),開發(fā)人員能夠非常簡便地添加USB功能。
本文討論了僅通過采用一個附加IC(無需使用第三方軟件)來實現(xiàn)嵌入式USB主機的方法。賽普拉斯公司的嵌入式USB主機能夠在不增加編碼處理的情況下對HID設備和集線器提供支持。目前,該系統(tǒng)最多能夠支持8部設備和兩個集線器層,代碼長度約為10KB,所需做的全部工作就是增加用于一個完整系統(tǒng)的專用代碼。





