Linux USB驅動框架分析

2021-04-17 23:40:00 字數 4451 閱讀 7528

一 引言

隨著微電子技術的不斷創新和發展,嵌入計算系統(簡稱嵌入系統),作為計算機應用的乙個重領域,已深入到社會的方方面面,越來越為人們關注。我們為某煤礦企業開發的監控系統作為乙個智慧型分站,其系統就是採用嵌入式作業系統windows ce.net。

二 嵌入式作業系統

嵌入式系統是以應用為中心、以計算機技術為基礎、軟體硬體可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統。嵌入式系統是面向使用者、面向產品、面向應用的,它必須與具體應用相結合才會具有生命力、才更具有優勢[2]。嵌入式系統以其小型、專用、易攜帶、可靠性高的特點,已經在工業控制領域得到了廣泛的應用,如工業過程控制、遠端監控、智慧型儀器儀表、機械人控制器、數控系統等。此外,由於嵌入式系統本身所具備的網路和人機互動的能力,使得它有可能取代以往基於微控制器的控制方式。我們所設計的這種智慧型分站主要執行在高溫、高濕度震動較強的環境。普通pc體積大、工作溫度範圍較小、抗震性差,不能生產的特殊環境。微控制器體積小巧,是一種可編輯部件。但是由於目前晶元整合水平的限制,微控制器的功能十分單一,不能滿足複雜工業控制的要求。嵌入式系統具有實時性、低成本和小型化,克服了傳統的基於微控制器控制系統功能不足和基於pc的控制系統非實時性的缺點,因此選用嵌入式系統來實現監控監測的智慧型分站。

windows ce.net 是微軟推出的功能強大的嵌入式作業系統,該系統是一種緊湊、高效、可伸縮的32位的作業系統,主要面向各種嵌入式系統和產品。它所具有的多執行緒、多工、完全搶占式的特點是專為各種有很嚴格資源限制的硬體系統所設計的。

由於此煤礦系統需要長時間執行,而其內部的應用程式隨需求的不同以及環境的變化,需要定期更換,一般的大型系統要求更換應用程式時不能關掉系統,因此應用即插即用的usb裝置是必須的,開發usb驅動就在所難免。

以下就通過開發windows ce.net 的usb驅動程式,來介紹如何開發嵌入式作業系統中的usb驅動程式。

三 驅動程式開發

1 windows ce.net 的usb系統軟體結構

windows ce.net 的usb系統軟體分為兩層: usb client裝置驅動程式和底層的windows ce實現的函式層。usb裝置驅動程式主要負責利用系統提供的底層介面配置裝置,和裝置進行通訊。底層的函式體本身又由兩部分組成,通用序列匯流排驅動程式(usbd)模組和較低的主控制器驅動程式(hcd)模組。hcd負責最最底層的處理,usbd模組實現較高的usbd函式介面。

2 利用usbd介面函式實現驅動程式和外圍裝置的互動

usb裝置驅動主要利用usbd介面函式和他們的外圍裝置打交道。usb介面函式主要包括傳輸、管道、框架和配置函式,同時也包括執行其他功能的多工函式。

主要的傳輸函式有: abourttransfer、issuecontroltransfer、closetransfer、issueinterruptransfer、getisochresult、issueisochtransfer、transfercomplete、gettransferstatus、isissuebulktransfer、issuevendortransfer

取得設定裝置配置函式:clearfeature、setdescriptor、getdescriptor、setfeature、getinte***ce、syncframe、setinte***ce、getstatus

傳輸函式主要處理usb裝置資料傳送和接收,它是最重要的一類函式。所有的傳輸函式都有乙個對應可選的**函式。應當注意的是usbd模組呼叫**函式有可能會影響其他的usb操作,解決這一問題的主要方法就是設定一些狀態變數和標誌,通過上述方法的處理就可以採用多執行緒來處理所有滯後的處理過程。

上面列出了用到的主要函式,在程式設計過程中可能還會用到其他函式進行傳輸、設定等操作,採用何種函式以及具體函式的用法可通過幫助檔案獲得。

3 設定驅動程式要求的入口點

入口點的設定是為了實現usb驅動程式和usbd之間的互動,我們在動態連線庫中設定入口點。入口點主要有兩個作用:

(1) 使得usbd模組能與外部裝置互動;

(2) 使得驅動程式能建立和管理任何可能需要的註冊鍵。

usb裝置驅動程式要求的入口點的相關函式有:

(1)usbdeviecattach

當usb裝置連線到計算機上時,usbd模組就會呼叫此函式,這個函式主要用於初始化usb裝置,取得usb裝置資訊,配置usb裝置,並且申請必需的資源。

usbdeviceattach()函式的基本定義如下:

usbdeviceattach(

usb_handle hdevice, // usb裝置控制代碼

lpcusb_funcs lpusbfuncs, // usbdi的函式集合

lpcusb_inte***ce lpinte***ce, // 裝置介面描述資訊

lpcwstr szuniquedriverid, // 裝置id描述字串。

lpbool facceptcontrol, // 返回true,標識我們可以控制此裝置,反之表示不能控制

(2)usbinstalldriver

主要用於建立乙個驅動程式載入所需的登錄檔資訊,例如讀寫超時,裝置名稱等。一些基本定義如下:

const wchar gcszregisterclientdriverid= l"registerclientdriverid";

const wchar gcszregisterclientsettings= l"registerclientsettings";

const wchar gcszunregisterclientdriverid= l"unregisterclientdriverid";

const wchar gcszunregisterclientsettings= l"unregisterclientsettings";

const wchar gcszmousedriverid= l"generic_sample_mouse_driver";

(3)usbuninstalldriver

主要用於釋放驅動程式所占用的

資源,以及刪除usbinstalldriver函式

建立的登錄檔等。 一些**如下:

driversettings.dwdeviceclass= usb_no_info;

driversettings.dwdevicesubclass= usb_no_info;

driversettings.dwdeviceprotocol= usb_no_info;

driversettings.dwinte***ceclass= 0x03; // hid

driversettings.dwinte***cesubclass = 0x01; // boot device

driversettings.dwinte***ceprotocol = 0x02; // mouse

上述的三個函式介面是所有的usb驅動程式必須提供的,缺一不可。

4 設定驅動程式的註冊鍵

此外比較重要的是usb裝置驅動程式的登錄檔配置,一般的usb裝置驅動程式的登錄檔配置在hkey_local_machine/drivers/usb/loadclients下,每個驅動程式的子鍵都有group1_id/group2_id/group3_id/drivername格式,如果登錄檔資訊與usb裝置資訊符合,usbd就會載入此驅動程式。

主要的任務函式有:

registerclientdeviceid、

registerclientsettings、

registernotificationroutine、openclientregisterkey、

unregisternotificationroutine、registerclientdriverid

註冊鍵主要控制驅動程式的載入方式。usbd通過跟蹤註冊鍵來載入正確的驅動程式,這種依賴於裝置控制範圍的驅動程式載入方法,提供了靈活的結構,它使得在不同情形下載入相應驅動程式稱為可能。需要注意的是:usb裝置驅動程式不使用標準的登錄檔函式,而是使用registerclientdriverid()和registerclientsettings來註冊相應的裝置資訊。

另外的函式有usbuninstalldriver()函式,此函式主要用於刪除usbinstalldriver()時建立的登錄檔資訊,同樣的它使用自己的函式介面unregisterclientdriverid()和unregisterclientsettings()來做相應的處理。

最後乙個需要處理的是註冊監控通知函式usbdevicenotifications()。主要包含刪除相關的資源,中斷處理函式,資料接受緩衝區等的編寫。

5 usb驅動程式的載入

驅動程式編寫完以後,需要正確的安裝usb驅動裝置,這就要求正確的設定hkey_local_machine/drives/usb/loaclients下的子鍵,然後就可以正確的載入usb驅動程式了。

四 結束語

隨著嵌入式作業系統越來越被廣泛應用,在嵌入式系統中編寫驅動受到重視。usb裝置的控制、管理和資訊交換完全是由系統軟體按usb協議進行傳輸的,不占用主機的硬體資源(如i/o位址、記憶體、中斷、dma等),具有很高的傳輸可靠性和相容性。usb的這些特性使得它在嵌入式系統領域將會得到更廣泛的應用。

Linux USB驅動框架分析

初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我 說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老闆催貨。當然,還會順帶提一 下其他的...

Linux USB驅動框架分析(一)

linux usb驅動框架分析 一 初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我 說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老...

Linux USB驅動框架分析(一)

linux usb驅動框架分析 一 初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老闆...