Windows CE下驅動開發基礎

來源:互聯網
上載者:User

這是我從1月6日開始主持天極網論壇嵌入式開發版以來第一次發表文章,加上以前瑣碎的文章共計30篇。研究的越多就越感覺自己懂的太少,其實在驅動開發方面我還是個菜鳥,我是想再次拋磚引玉,讓做驅動有N年經驗的人奉獻一點出來,讓大家減少一些研究驅動源碼而又缺少注釋所帶來的痛苦。

我想即使讀者看過微軟的關於驅動開發的培訓教材和CE協助文檔中的驅動部分,頭腦中仍然一片茫然。要想真正瞭解驅動程式必須結合一些驅動程式源碼,在此我以串口驅動程式(COM16550)中初始化過程為線索簡單講一講驅動開發的基礎知識。

Windows CE下的串口驅動程式能夠處理所有I/O行為類似串口的裝置,包括基於16450、16550 UART(通用非同步收發晶片)的裝置和一些採用DMA的裝置,常見的有9針串口、紅外I/O口、Modem等。在%_WINCEROOT%\Public\Common\OAK\Drivers\Serial目錄下,COM_MDD2子目錄包含新的串口驅動MDD層函數代碼。COM16550子目錄包含串口驅動PDD層代碼。SER16550子目錄包含的一系列函數專用於控制與16550相容的UART,這樣PDD層的主要工作就是調用SER16550中的函數。還有一個ISR16550子目錄包含的是串口驅動程式專用的可安裝ISR(插斷服務常式),而很多硬體裝置驅動程式採用CE預設的可安裝ISR giisr.dll。一般串口裝置相應的註冊表設定例子及意義如下:

意義
"SysIntr"=dword:13 串口1的中斷ID為十進位13
"IoBase"=dword:02F8 串口1的IO空間首地址為十六進位2F8
"IoLen"=dword:8 串口1的IO空間長度為8個位元組
"DeviceArrayIndex"=dword:0 串口1的索引,是1的由來
"Order"=dword:0 串口1驅動的載入順序
"DeviceType"=dword:0 串口1的裝置類型
"DevConfig"=hex: 10,00 .... 串口1在與Modem裝置通訊時的配置,如傳輸速率、奇偶校檢等
"FriendlyName"="COM1:" 串口1在撥號程式中顯示的名字
"Tsp"="Unimodem.dll" 串口1 被用於與Modem裝置通訊的時候要載入的TSP(TAPI Service provider)DLL
"Prefix"="COM" 串口1的流介面的首碼
"Dll"="com16550.Dll" 串口1的驅動程式DLL

SysIntr由CE在檔案Nkintr.h中預定義,用於唯一標識中斷裝置。OEM可以在檔案Oalintr.h中定義自己的SysIntr。常見的預定義SysIntr有SYSINTR_NOP(中斷只由ISR處理,IST不再處理),SYSINTR_RESCHED(重新調度線程),SYSINTR_DEVICES(由CE預定義的裝置中斷ID的基值),SYSINTR_PROFILE、SYSINTR_TIMING、SYSINTR_FIRMWARE等都是基於SYSINTR_DEVICES定義的。IoBase是串口1的IO地址空間的首地址,IoLen是IO空間的大小。IO地址空間只存在於x86平台,如果在其它平台硬體寄存器必須映射到物理地址空間,那子鍵的名稱為MemBase和MemLen。在x86平台更多硬體的寄存器由於IO空間的局限也映射到物理地址空間。DeviceArrayIndex是裝置的索引,用於區分同類型的裝置。Prefix是流驅動程式的首碼,當應用程式調用CreateFile函數傳遞COM1:參數時,檔案系統負責與串口驅動程式通訊,串口驅動程式是在CE啟動時由device.exe載入的。

下面從MDD層函數COM_Init開始探索串口驅動的初始化過程。COM_Init是在串口裝置被檢測後由裝置管理員device.exe調用的,主要的作用是初始化裝置,它的唯一參數Identifier是由device.exe傳遞的,其類型是一個字串指標,字串的內容是HLM\Drivers\Active\xx,xx是一個十進位數(device.exe會跟蹤系統中每個驅動程式,把載入的驅動程式記錄在Active鍵下)。COM_Init先分配一個HW_INDEP_INFO結構體,這個結構體是獨立於串口硬體的頭資訊(MDD、PDD、SER16550都包含自己獨特的結構體,具體的結構體定義請參見串口驅動源碼),分配之後再初始化結構體中每個成員,初始化結構體後調用 OpenDeviceKey((LPCTSTR)Identifier)開啟HLM\Drivers\Active\xx\Key包含的註冊表路徑,在這裡路徑一般為HLM\Drivers\BuiltIn\Serial,即串口的驅動程式資訊在註冊表中所處的位置。COM_Init接著在HLM\Drivers\BuiltIn\Serial下查詢DeviceArrayIndex、Priority256的值,Priority256指定了驅動程式的優先順序,如果沒有就用預設的優先順序。接下來調用GetSerialObject(DeviceArrayIndex),這個函數由PDD層定義,返回HWOBJ結構體,這個結構體主要包含PDD層和SER16550定義的函數的指標。也就是說MDD通過調用這個函數才能調用底層實現的函數。接下來的大多數工作都是調用底層函數實現初始化。第一個調用的底層函數SerInit主要設定由使用者佈建的硬體設定,例如線路控制、傳輸速率。它調用Ser_GetRegistryData函數得到儲存在註冊表中的硬體資訊,Ser_GetRegistryData在內部調用系統提供的DDKReg_GetIsrInfoDDK和DDKReg_GetWindowInfo函數得到在HLM\Drivers\BuiltIn\Serial下儲存的IRQ、SysIntr、IsrDll、IsrHandler、IoBase、IoLen。IRQ是邏輯中斷號,IsrDll表示當前驅動程式的可安裝ISR所在的DLL名稱,IsrHandler 表示可安裝ISR的函數名稱。在這裡順便提一下可安裝ISR,讀者在我以前發表的關於OAL的文章中可以瞭解到OEM在OEMInit函數中關聯IRQ和SysIntr,當硬體裝置發生中斷時,ISR會禁止同級和低級中斷,然後根據IRQ返回關聯的SysIntr,核心根據ISR返回的SysIntr喚醒相應的IST(SysIntr與IST建立的Event關聯),IST處理中斷之後調用InterruptDone解除中斷禁止。在OEMInit中關聯的缺點是一旦編譯了CE核心後就無法添加這種關聯了,而一些硬體裝置會隨時插拔或者共用中斷,要關聯這樣的硬體裝置解決方案就是可安裝ISR,可安裝ISR專用於處理指定的硬體裝置發出的中斷,所以如果硬體裝置需要可安裝ISR必須在註冊表中添加IsrDll、IsrHandler。多數硬體裝置採用CE預設的可安裝ISR giisr.dll,格式如下:

"IsrDll"="giisr.dll"
"IsrHandler"="ISRHandler"

如果一個硬體驅動程式需要可安裝ISR而開發人員又不想自己寫一個,那麼可以利用giisr.dll來實現。除了在註冊表中添加如上所示外,還要在驅動程式中調用相關函數註冊可安裝ISR。虛擬碼如下:

g_IsrHandle = LoadIntChainHandler(IsrDll, IsrHandler, (BYTE)Irq);
GIISR_INFO Info;
PHYSICAL_ADDRESS PortAddress = {PhysAddr, 0};
TransBusAddrToStatic(BusType, dwBusNumber, PortAddress, dwAddrLen, &dwIOSpace, &(PVOID)PhysAddr)
Info.SysIntr = dwSysIntr;
Info.CheckPort = TRUE;
Info.PortIsIO = (dwIOSpace) ? TRUE : FALSE;
Info.UseMaskReg = TRUE;
Info.PortAddr = PhysAddr + 0x0C;
Info.PortSize = sizeof(DWORD);
Info.MaskAddr = PhysAddr + 0x10;
KernelLibIoControl(g_IsrHandle, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.