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