1 前言 Windows CE 是為各種嵌入式系統和產品設計的一種壓縮的、高效的、可升級的操作系統。多線性、多任務、全優先的操作系統環境是專門針對資源有限而設計的,它的模塊化設計使嵌入式系統開發者和應用者能夠將其應用于各種產品,例如家用電器、專門的工業控制和嵌入式通信設備等。Windows CE 支持各種硬件外圍設備及網絡系統,應用領域極為廣闊,是微軟專門為信息設備、移動通訊、電子產品、嵌入式應用等非 PC 領域而專門設計的一種戰略性操作系統產品。 2 Samsung ARM 系列S3C2410 處理器 S3C2410 是Samsung 公司推出的基于ARM920T 核的32 位RISC 微處理器芯片。S3C2410具有低功耗、低成本和高性能的特點,已成為PDA、智能手機、網絡計算機終端以及智能設備的終端產品等的熱門解決方案之一。 S3C2410 內部資源豐富、結構復雜、接口眾多,具有相互獨立的16kB 指令緩存和16kB數據緩存,帶有MMU 虛擬存儲單元和AMBA 總線接口。S3C2410 支持的內外圍設備包括外部存儲控制器、中斷控制器、LCD 控制器、8 通道10bit 精度的ADC 和觸摸屏控制器、SD/MMC 卡控制器、4 通道DMA、4 通道具有PW 入1 功能的定時器、具有日歷功能的實時時鐘、看門狗定時器、3 通道UART(包含IRDA 紅外線數據通訊口)、USB 主機/設備接口、I2C 總線接口、IIS 數字音頻總線接口、2 通道SPI 總線接口、通用I/O 端口以及具有鎖相環功能片上時鐘發生器等。同時,也可以根據需要進行功能擴展從而支持以太網接口、PCMCIA接口以及IDE 接口等。 3 Windows CE.net 下的驅動程序 目前基于 Windows CE.net 的兩種模型是本機設備驅動程序和流接口驅動程序。本機設備驅動程序用于低級、內置設備,提供一組定制的接口可通過移植、定制微軟提供的驅動樣例來實現。流接口驅動程序實現一組固定的流接口函數,所有的CE 設備皆可使用此模型實現。開發工具Platform. Builder 中包含的樣本設備驅動程序分為兩種:單片驅動程序和分層的驅動程序如圖1 所示。單片驅動程序基于單個碼片,該碼片直接把硬件設備的功能傳遞給操作系統。與彈片驅動程序相比,分層驅動程序由兩個設置好的層組成,上層是模型設備驅動程序(Model Device Driver,MDD),下層是依賴平臺的驅動程序(Platform. Dependent Driver,PDD)。大多數的樣本設備驅動程序都配置成分層的。 分層驅動程序要利用微軟提供的與應用程序通信的上層,這是一個與硬件平臺無關的上層,稱為模塊驅動程序層MDD(Model Device Driver),MDD 層通過設備驅動程序接口DDI(Device Driver Interface)與應用程序通信,開發驅動程序通常不修改MDD 層,主要關心與具體硬件相關的下層,依賴平臺的設備驅動程序層PDD(Platform. Dependent Driver),PDD層通過設備驅動服務接口DDSI(Device Driver Service Interface)直接管理硬件。單片驅動程序所驅動的設備通常與微軟提供的應用程序沒有直接的關系,如LCD 背光條開關的驅動。通常要求單片驅動程序提供一個特定DDI 接口如上層應用通信,通過編寫相應的動態鏈接庫DDL 實現這個功能。 4 基于 Windows CE 的流驅動程序的實現 4.1 選擇代表設備的文件名前綴 設備前綴名在系統中必須唯一,并且文件前綴名必須是 3 個字母,若有多個同類設備,則通過后綴1 個阿拉伯數字區分,例如COM1、LPT3 等等。文件前綴名將會在驅動的標準接口函數中體現,比如XXX_Init、XXX_Close 等,其中的“XXX”即是我們選擇的設備的文件名前綴。 4.2 實現驅動的各個標準接口函數 需要實現的函數在前文已經論述,現在只需按照其功能編寫具體的代碼。下面給出ADC_Init、ADC_Read、ADC_Write 部分程序代碼。 4.3 導出接口函數集 流驅動一般以 DLL 形式存在,與在windows 98/2000/XP 系統下用VC++開發DLL 工程一樣,如果我們愿意把DLL 中的某些函數暴露給應用程序或者操作系統調用,就需要將這些函數導出,否則外部程序將不能調用 DLL 中的函數。DEF 文件定義了DLL 需要導出的接口函數集,且名稱與設備驅動名稱相同[DEF 示例文件] LIBRARY ADC EXPORTS ADC_Open ADC_Close ADC_Init ADC_Deinit ADC_Read ADC_Write 本示例表明從 ADC.dll 中導出ADC_Init 等函數,其中 ADC 即為我們選擇的代表設備的文件名前綴,DLLEntry 是驅動程序的入口函數。 4.4 在注冊表中增加驅動項 注冊表是一個龐大的數據庫,它記錄了用戶安裝在機器上的軟件和每個程序的相互關聯信息;它包含了計算機的硬件配置,包括自動配置的即插即用的設備和已有的各種設備說明、狀態屬性以及各種狀態信息和數據。在 Windows 系統中,很多驅動都要通過設備管理器來查詢注冊表,再根據注冊表項來加載驅動程序,所以必須在注冊表中增加相應的驅動項。假定ADC.dll 為驅動程序,通常,注冊項位于注冊表的Root Key 下,一般為[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ADC]。其中 ADC 是為我們驅動程序而添加的。我們需要在 ADC下建立必要的子鍵和鍵值,“Prefix”和“DLL”是2 個重要而且必須的鍵,分別描述了設備前綴名和驅動程序的動態連接庫名。如果還有需要的話,可以建立驅動程序需要的其子他鍵。 [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ADC] "Index"=dword:1 "Prefix"="ADC" "DLL"="ADC.dll" "Order"=dword:0 "Irq"=dword:2 4.5 修改.BIB 文件 要想驅動的動態鏈接庫加入 Windows CE 系統中,還必須修改Windows CE 二進制映像生成的文件platform.bib。在platform.bib 文件中加入:ADC.dll $(_ FLATRELEASEDIR) \ ADC.dll NK SH 5 驅動編譯、加載和調用 增加兩個文件 makefile (定義了編譯規則)和sources(使用的頭文件,自定義函數庫,系統函數庫等),重新編譯Windows CE, ADC 驅動程序即可加載進操作系統。把編譯好的 WindowsCE 鏡像NK.bin 下載到博創嵌入式開發平臺(S3C2410 處理器),使用PB 的模塊查看器,可以看到驅動程序adc.dll 已經被成功加載, 如圖2 所示。 搭建一個簡單的電路,對S3C2410 處理器第六路ADC 輸入一個電壓信號,運行ADC_EXE。根據應用程序的運行結果,可以發現ADC.dll 被成功調用。以下是截取的是不同輸入電壓時的轉換結果,如圖3 所示。 6 結束語 通過本文介紹、分析Windows CE 下ADC 驅動程序的開發, 讀者可以對Windows CE 的驅動程序的結構、編寫以及實際應用能有一定的了解。本文作者創新點:在Windows CE.net系統下進行底層設備驅動開發,采用流接口的方式,實現了三星公司ARM9 內核的芯片S3C2410 ADC 驅動程序。 |