嵌入式系統(tǒng)中USB主機(jī)控制器的設(shè)計(jì)
為了執(zhí)行控制轉(zhuǎn)移,可以使用框架函數(shù)send_request(),send_request()函數(shù)將分配一個(gè)傳遞給TD處理器的URB結(jié)構(gòu)。URB應(yīng)該包含有關(guān)設(shè)置狀態(tài)的信息,并且借助參數(shù)傳遞給send_request()。URB需要的信息包括:
* 請(qǐng)求類(lèi)型:表明USB請(qǐng)求類(lèi)型的字節(jié),該字節(jié)包含表示傳輸方向、傳輸類(lèi)型以及傳輸接受方的位。
* 請(qǐng)求:11種標(biāo)準(zhǔn)USB請(qǐng)求中的一種,這些請(qǐng)求包括:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Feature、Set_Interface、Synch_Frame。
* 值:特殊請(qǐng)求字段。
* 索引:特殊請(qǐng)求字段。
* 長(zhǎng)度:相關(guān)數(shù)據(jù)緩沖器的大小
載入用于URB的設(shè)置信息之后,便可將其它設(shè)備信息裝入U(xiǎn)RB,如地址、速度、終點(diǎn)數(shù)以及傳輸方向,還有表示傳輸類(lèi)型的字節(jié)和“回調(diào)”函數(shù)指示器。利用回調(diào)函數(shù)可以在框架內(nèi)進(jìn)行某些并行操作,也可在硬件處理USB操作的同時(shí)執(zhí)行其它任務(wù)。TD需要USB傳輸類(lèi)型信息,這樣框架就可以安排正確的傳輸類(lèi)型時(shí)序。此外,與批量或中斷傳輸相反,框架一次只允許進(jìn)行一個(gè)控制傳輸操作。
裝入所有URB信息之后,URB便被提交給TD處理器。TD處理器是框架的組成部分,它與硬件直接通信,處理有關(guān)傳輸?shù)牡图?jí)詳細(xì)資料。TD完成任務(wù)后,TD處理器將程序控制權(quán)由原始調(diào)用指定的“回調(diào)”函數(shù)轉(zhuǎn)給send_request()函數(shù)。
圖2顯示了調(diào)用帶回調(diào)函數(shù)的send_request()。這里我們使用控制傳輸以獲得某鍵盤(pán)的國(guó)家代碼,在get_country_code()函數(shù)中可看到send_request()的調(diào)用,注意send_request()調(diào)用中的最后一個(gè)參數(shù)是回調(diào)函數(shù)。在TD處理器確定硬件完成處理后執(zhí)行該函數(shù),此時(shí)回調(diào)函數(shù)將獲得返回的數(shù)據(jù)緩沖器,將其與HID描述器結(jié)構(gòu)相匹配,并存取與國(guó)家代碼對(duì)應(yīng)的字節(jié),然后URB被釋放。
EZ-Host框架值得注意的最后一個(gè)特點(diǎn)是設(shè)備驅(qū)動(dòng)程序的使用。在執(zhí)行過(guò)程中,設(shè)備驅(qū)動(dòng)程序?qū)?zhí)行三個(gè)功能,即停止、啟動(dòng)和運(yùn)行。啟動(dòng)某設(shè)備驅(qū)動(dòng)程序便是運(yùn)行它的run()函數(shù),該函數(shù)對(duì)某些數(shù)值進(jìn)行初始化,并分配一個(gè)用于數(shù)據(jù)傳輸?shù)闹貜?fù)出現(xiàn)的URB。對(duì)于鼠標(biāo)或鍵盤(pán),該URB將每隔10毫秒發(fā)生一次。數(shù)據(jù)傳輸完成后,TD處理器將控制轉(zhuǎn)交給interrupt_in_complete()函數(shù),通過(guò)檢查URB可得知數(shù)據(jù)是來(lái)自鍵盤(pán)還是來(lái)自鼠標(biāo),該回調(diào)函數(shù)負(fù)責(zé)將鍵盤(pán)或鼠標(biāo)數(shù)據(jù)發(fā)送至應(yīng)用層。
當(dāng)某驅(qū)動(dòng)程序停止時(shí),其重復(fù)出現(xiàn)的URB將從TD列表中除去并釋放出空間,然后傳送一個(gè)消息至應(yīng)用層,去掉相關(guān)設(shè)備。如果停止的驅(qū)動(dòng)程序相關(guān)設(shè)備是集線器,則與該集線器相連的所有設(shè)備也要去除,且驅(qū)動(dòng)程序同時(shí)停止。當(dāng)然,如果去除的設(shè)備中還有集線器,則與該集線器相連的設(shè)備將以同樣方式去除。
在驅(qū)動(dòng)程序運(yùn)行期間,系統(tǒng)可執(zhí)行各種任務(wù)。對(duì)于集線器設(shè)備驅(qū)動(dòng)程序,要檢查集線器的端口,以了解是否有設(shè)備插入和去除。這里鍵盤(pán)和鼠標(biāo)驅(qū)動(dòng)程序運(yùn)行函數(shù)不起任何作用。
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論