引言 在航空航天和工業控制等一些嵌入式應用領域,要求控制系統具有嚴格的實時性,能夠為任務提供一個可預見的響應時間。一些實時操作系統的引入可以有效地滿足任務的實時性要求,如RTEMS和VxWorks。在這樣的系統中,如果系統通信模塊的通信速度不高,或者通信質量不可靠,就會影響整個系統的實時性能。通用串行總線(USB)由于其高帶寬、高可靠性的特點,必將越來越多地應用到這類系統中。然而由于多數實時操作系統目前并未提供USB主機和設備的驅動,而且USB協議相對于其他串行通信協議(RS232、SPI等)復雜度較高,使得USB驅動程序的開發難度較大。 1 RTEMS及其設備管理機制 1.1 RTEMS簡介 RTEMS(Real—Time Executive for MultiprocessorSystem)是一個為嵌入式應用系統提供高性能支持環境的實時操作系統內核,早期用于美國軍方的導彈系統。RTEMS的實時性能高于RTLinux,與VxWorks相比也毫不遜色。 RTEMS具有如下特點:支持多任務;支持同構或異構多處理器系統;支持事件驅動、基于優先級、占先的調度算法,具有單調速率調度算法;支持任務間的通信和同步;支持優先級繼承算法,快速響應的中斷管理;支持動態存儲器分配,具有用戶配置的能力。 RTEMS是微內核搶占式的實時操作系統,具有實時性能好、運行速度快和可靠性高等優點,在通信、航空航天、工業控制等領域有著非常廣泛的應用。 1.2 設備管理機制 操作系統的一個重要功能就是為應用程序提供一個統一的I/O設備的虛擬接口,使用戶程序能夠按照相同的模式對設備進行操作,無需關心每個設備的具體特性。 RTEMS系統提出了一種設備抽象模型,使用這種模型,應用程序通過相同的I/O系統調用塒沒備進行操作,而不必關心實現細節。RTEMS的I/O 管理器提供的系統調用包括: ◆rIems_io_initialize,初始化一個設備驅動程序; ◆rtems_io_register_name,注冊一個設備名; ◆rIems_io_lookup_name,根據設備名查找主/副設備號; ◆rterns_io_open,打開一個設備; ◆rteros_io_close,關閉一個設備; ◆rtems_io_read,從一個設備中執行讀操作; ◆rtems_io_write,向一個設備中執行寫操作; ◆rteros_io_control,特殊的設備服務。 RTEMS系統使用設備驅動程序地址表來提供這種抽象,在這個表中提供了每個標準I/O請求處理函數的入口地址。RTEMS使用設備的主設備號和副設備號來定位它的驅動程序。主設備號是設備驅動程序地址表中相應設備表項的索引,用于選擇某個設備驅動程序;副設備號的用途則依賴于具體的設備驅動程序,通常用于在相同設備驅動程序所控制的若干設備中指定特定的設備。在RTEMS系統中,每個特定的設備都有與之相關聯的設備名稱。RTEMS系統內核中包含了一個“設備驅動程序文件名表”。這個表將設備文件名與設備的主、副設備號聯系起來,應用程序可以使用注冊設備名查找與一個設備相關聯的主設備號/副設備號,進而通過標準I/0系統調用和主設備號/副設備號在設備驅動程序地址表中找到該設備的驅動程序的入口函數地址,對設備進行操作。 RTEMS系統在初始化時,會調用各個設備驅動程序的初始化函數,初始化所有的設備驅動程序。當應用程序需要對設備進行操作時,會執行有關設備管理的I/O系統調用,RTEMS會根據該系統調用判斷應該選擇的設備驅動程序的入口函數。由應用程序傳遞給RTEMS的信息,將被傳遞給適當的設備驅動程序入口函數。 2 USB通信協議簡介 USB(Universal Serial Bus,通用串行總線)是一種在主機和設備之間進行串行數據傳輸的通信協議。USB接口由于速度快、可靠性高、功耗低等優點,已成為當前微機的必備接口,同時也被廣泛應用于嵌入式系統設計中心。USB的物理拓撲為分層的星型結構,由3部分組成——USB主機、USB集線器和USB設備,如圖1所示。 ![]() USB主機是USB系統的主控組件,控制總線上所有USB設備和USB集線器的數據通信過程,所有的數據傳輸都是由USB主機端發起的。 USB主機控制器的復雜度要遠遠高于USB設備,典型的USB主機控制器大約需要10 000個門電路,而設備端的USB接口大約需要1 500個門電路。正是由于這種設計復雜度的不平等,使得USB設備得以在短時間內得到廣泛應用。 3 RTEMS下USB設備驅動程序的設計 3.1 概 述 嵌入式系統的硬件環境千差萬別,各類USB設備的類規范也各不相同。為了確保程序的可移植性和可擴展性,將程序設計為二層結構:硬件抽象層和USB 設備類驅動層,如圖2所示。 ![]() 硬件抽象層封裝對底層USB設備控制器的操作和對中斷的處理,通過一些標準方法,為上層提供一個底層的硬件抽象,便于移植。USB設備類驅動層包含對標準命令和對特定設備類命令的處理。 3.2 硬件抽象層 硬件抽象層對USB設備控制器進行操作,實現以下功能:設備狀態管理、端點狀態管理和中斷管理。 3.2.1 設備狀態管理 每一個USB設備在正常工作前必須完成主機對它的配置過程,即總線枚舉。USB設備在總線上共有6種狀態:接入態、加電態、默認態、地址態、配置態和掛起態。 硬件抽象層提供USB_Init、USB_Attach、USB_Disat—tach、USB_Connect、USB_Disconnect、 USB_SetAddress、USB_ResetAddress、USB_SetConfiguration和 USB_ResetConfiguration九個函數對設備的狀態進行管理。一般來說,設備在總線上的狀態變化都會由中斷通知設備,中斷服務程序根據中斷類型和當前狀態通過提供的功能接口對沒備進行相應的操作,確保設備能夠完成枚舉過程÷順利進入配置態。設備在硬件抽象層函數控制下的在總線上的狀態機如圖3所示。由于掛起與恢復無需軟件干預,因此沒有在狀態機中描述這一狀態。 ![]() 3.2.2 端點狀態管理 USB設備與主機的通信可以通過對USB端點狀態的控制來完成。USB設備端點可以定義3個不同狀態:空閑(Idle)狀態、停止(Halt)狀態和讀/寫(W/R)狀態。USB硬件抽象層提供USB_ConfigureEndpoint、USB_Write、USB_Read、 USB_EndOfTransfer、USB_Stall、USB_HaIt和USB_ClearHalt七個功能函數對設備的狀態進行管理,端點的狀態轉換過程如圖4所示。 ![]() USB_ConfiguIreEndpoint負責配置端點的最大包長度和傳輸方向,并將端點狀態設置為空閑狀態。端點進入空閑狀態,如果上層調用 USB_Write進行數據發送,將發送緩沖區指向要發送的數據,設置端點狀態為寫狀態,等待USB主機接收數據(真正的數據傳輸在中斷服務程序中進行)。寫完成后,端點回到空閑狀態。數據接收與發送類似。如果設備出現某種錯誤,主機會向設備發送Set_Feature命令,設備接收到 Set_Feature命令,執行USB_Halt進入停止狀態。端點處于停止狀態時,如果接收到Clear_Feature,則執行USB— ClearHalt清除Halt標志,進入Idle狀態;如果USB設備由于某種原因無法對當前命令進行處理(如不能識別命令,或者沒有準備好進行數據傳輸),則執行USB_Stall通知主機發生錯誤,但端點的狀態不變。 3.2.3 中斷管理 在USB設備端,存在以下幾類中斷:幀起始中斷、設備恢復中斷、設備掛起中斷和端點中斷。硬件抽象層的中斷服務例程對各類中斷進行響應,判斷中斷類型。如果是與設備狀態相關的中斷,則需要調整設備到相應的狀態,同時調用上層提供的相應回調函數;如果是端點中斷,則按照圖5的流程處理。 ![]() 3.3 USB設備類驅動 USB設備類驅動包含兩個功能:對標準命令的處理和對基于設備類的命令的處理。USB類驅動根據硬件抽象層提供的接口,與中斷服務程序協同管理 USB設備和端點的狀態。通過為硬件抽象層的中斷服務程序提供相應的回調函數,完成特定設備類要求的操作;同時根據RTEMS系統的設備管理機制,為應用程序提供設備驅動的入口點。 3.3.1 標準命令處理 為了更好地協調USB主機與設備之間的數據通信,USB規范定義了一套命令,用于完成主機對總線上的USB設備的控制。USB設備必須對來自于主機的控制命令做出響應。一般來說,命令都是通過設備的默認管道傳遞到設備的。USB協議定義了11個標準命令,用于配置設備、獲得設備的信息等操作。USB設備必須支持這些標準命令。 3.3.2 基于設備類的命令處理 除了標準命令以外,USB每種設備類的協議又定義了自己的類命令。設備廠商為了使設備實現某種特殊的功能,還可以定義廠商專有的命令。 所有的命令雖然有不同的內容和使用目的,但也有一些共同的特點:所有命令的結構是一樣的;USB命令是在控制傳輸的設置階段從USB主機發往設備的;如果除命令本身外,主機還打算向設備發送與命令相關的信息,那么這些信息將由緊跟在設置階段的數據階段發出;如果命令要求設備返回信息,這些信息會在控制傳輸的數據階段從設備端發出;當命令完成時,設備會在握手階段返回ACK;設備可以返回Stall,表明不支持當前命令或無法完成命令要求的操作。 3.3.3 命令的處理流程 當設備接收到新的命令時,硬件抽象層的中斷處理函數會調用USB設備類驅動層提供的回調函數;在回調函數中,判斷命令的類型,如果是標準命令,則交給標準命令處理函數處理;否則,交給基于設備類的命令處理函數處理。因此,要實現對某種標準USB設備類型或非標準USB設備類型的命令的支持,只需要在 USB設備類驅動層添加對該標準設備類型命令或者自定義命令的處理函數,這樣使得程序易于擴展。 3.3.4 USB設備驅動程序入口函數 RTEMS系統的設備驅動程序應該包含下列入口函數:設備初始化例程、設備打開例程、設備關閉例程、從設備中讀出數據的例程、向設備中寫人數據的例程和特定于具體設備的設備操作例程。如果一個設備驅動程序不支持某個特定的入口函數,在設備驅動程序地址表中這個入口函數的地址值應該設置為空。以下6個函數是驅動程序為標準I/O請求提供的入口函數。 ①初始化:rtems_device_driver usb_initialize(rtems_device_major_number maior,rtems_device_minor_numberminor,vold*arg)。在RTEMS系統中注冊USB設備的設備名,調用 USB_Init實現設備的功能和狀態初始化,注冊中斷。 ②打開:rtems_device_driver usb_open(rtems_device_major_number major,rtems_device_minor_number mi—nor,void*arg)。如果設備已經被成功枚舉(處于配置態)并且未被其他任務打開,則標記設備已被打開標志,成功返回;否則,打開失敗。 ③關閉:rtems_device_driver usb_close(rtems_device_major_number major,rtems_device_minor_number mi—nor,void*arg)。清除設備打開標志。 ④讀操作:rtems_device_driver usb_read(rtems_de—vice_major_number major,rtems_device_minor_numberminor,void*arg)。調用USB_Read(),設置端點為讀狀態,等待主機端發來的數據,數據到達后,中斷服務程序會把端點設置為空閑狀態,函數將數據返回給應用程序。 ⑤寫操作:rtems_device_driver usb_write(rtems_de—vice_major_number major,rtems_device_minor_numberminor,void*arg)。調用USB_Write(),設置端點為寫狀態,并等待主機接收數據,數據發送完成后,中斷服務程序會將端點設置為空閑狀態,函數返回。 ⑥控制操作:rtems_device_driver usb_control(rtems_device_major_number major,rtems_device_minor_num—ber minor,void*arg)。具體操作根據需要定義。將設備驅動程序的入口函數地址添加到設備驅動程序地址表后,就可以通過RTEMS提供的I/0系統調用對設備進行操作。 結語 在RTEMS系統的移植和應用開發過程中,設備驅動程序的編寫是十分重要的一環。USB由于其協議的復雜性,成為驅動開發中的難點之一。本文對 RTEMS系統下USB設備驅動程序的設計與實現進行了詳細論述,相應程序在AT91RM9200開發板上得以實現和驗證。本設計著眼于程序的可移植性和可擴展性,采用層次結構,實現了硬件平臺與USB具體設備類驅動的分離,使其能夠方便地移植到其他硬件平臺上并實現對特定USB設備類型的支持。同時,由于與操作系統的耦合度較小,驅動程序還可以方便地移植到其他的操作系統上。 參考文獻 1. 查看詳情 2. 肖踞雄.翁鐵成 USB 技術及應用設計 2003 3. 蔣文杰.陳文智 基于 RTEMS操作系統的設備驅動開發 [期刊論文] -工業控制計算機2006(6) 作者:北京航空航天大學 王品 尚利宏 來源:單片機與嵌入式系統應用 2009 (1) |