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





