本文**http://developer.51cto.com/art/200907/136858.htm
引言
windows ce.net 是乙個32位、多工、多執行緒的完全搶占式的實時作業系統。它提供了眾多強大工具適應於快速構建新一代記憶體少、體積小的智慧型裝置,如工業控制器、手持式裝置等。該系統的特點是專為各種具有嚴格資源限制的硬體系統所設計的。為了將作業系統和硬體裝置連線起來,連線硬體和應用軟體的驅動就非常重要。該**主要針對samsung公司以arm9為核心的s3c2410進行分析,介紹在windows ce.net 系統下進行底層裝置流介面驅動的原理和開發方法並提供ad驅動程式的例項。
s3c2410晶元片上ad介紹
s3c2410 是一款基於arm920t的16/32位risc微處理器,擁有高價效比,低功耗等特點,也是目前市面上出現較多的嵌入式開發板的處理器之一,具有8路10位的a/d轉換,s3c2410上的a/d轉換器在2.5mhz的時鐘下,最大轉化速率可達500ksps,a/d轉換器支援片上取樣和保持功能。s3c2410微處理對ad轉換進行的操作,主要是對下面的兩個暫存器進行讀/寫:adc 控制暫存器,adccon ;adc 資料寄器,adcdat0。
流介面驅動
流介面驅動體系結構
流驅動將裝置抽象為檔案進行操作,它體系結構如圖1所示。應用程式使用檔案api對裝置進行訪問,檔案api被作業系統**到filesys.exe程序中;然後filesys.exe發現是對裝置進行操作,就會把執行交給裝置管理器;接著裝置管理器根據具體的請求,呼叫不同的流介面驅動程式中暴露的介面;最終驅動程式負責與硬體互動。
流介面函式
流介面驅動程式是動態連線庫,由裝置管理程式的特殊程式載入、管理和解除安裝,與具有單獨目的介面的內部驅動程式相比,流介面驅動程式使用同乙個介面並呼叫同乙個函式集-流介面函式[4]。windows ce.net 系統規定流介面的入口點如表1,對應著直接或者間接呼叫流介面函式的系統元件或檔案api函式。生成乙個dll後,就用裝置檔名字首替換入口點名字中的***。
流介面驅動工作原理
在流驅動工作原理中需要包括幾個重要的工作實體:硬體、流介面驅動驅動程式、系統登錄檔、裝置管理器、應用程式。整個驅動程式工作原理。
流驅動的工作順序如下:1)載入驅動。在當系統啟動時,裝置管理器搜尋登錄檔的hkey_local_machine/driver/builtin鍵下面的子鍵,並逐一載入子鍵下的每個驅動,此過程叫busenum。2)裝置管理器從登錄檔的dll鍵值中獲取驅動程式所在的dll檔名。3)裝置管理器呼叫loaddriver()函式把dll載入到自己的虛擬位址空間內。4)裝置管理器在登錄檔的hkey_local_machine/driver/active下面,記錄所有已經載入的驅動程式[2]。5)裝置管理器呼叫驅動中的***_init()函式。6)在***_init()中,通常對硬體進行一些基本的初始化操作。通過以上6步,流介面驅動被成功載入。7)應用程式使用該裝置。首先它呼叫createfile()開啟裝置。createfile()是在filesys.exe中實現的。但是filesys.exe只作簡單判斷,如果發現開啟的裝置驅動程式而不是乙個檔案,那麼就重新把主動權交還給裝置管理器。8)裝置管理器呼叫驅動程式中的***_open()函式開啟裝置。在***_open()中,驅動程式可能會對硬體進行一些額外的初始化工作,使硬體進入工作狀態。9)***_open()函式把開啟裝置的結果返回給裝置管理器。10)裝置管理器把***_open()返回的結果,再返回給應用程式的createfile()函式呼叫。通過7-10步,裝置已被成功開啟,至此就可以對裝置進行讀寫和控制操作。11)應用程式使用第7步createfile()函式返回的控制代碼作為 readfile() / writefile()的第乙個引數,向裝置傳送讀請求。同樣readfile() / writefile()要經過filesys.exe**給裝置管理器。12)裝置管理器呼叫驅動程式中的***_read() / ***_write() 函式,讀取裝置的資料資訊或向裝置寫資訊。13)在流驅動程式中,***_read() / ***_write() 函式可與硬體互動,從硬體中讀取必要的資訊或向硬體寫必要的資訊。然後返回給裝置管理器,再返回給應用程式。
當應用程式不再使用該裝置時,它可呼叫closehandle()將裝置關閉。當系統不再使用裝置時,應用程式可呼叫deactivatedevice()函式把該驅動程式解除安裝。
ad驅動的實現
ad驅動程式以動態鏈結庫方式編寫,採用流介面驅動的標準形式。在adc_ init函式中,主要進行初始化。函式adc_open 只需要返回乙個不為0的值來判斷開啟裝置成功。在函式 adc_write 中通過寫入要選擇的通道號和預分頻值,它控制通道的動作。函式 adc_read 中的**最為關鍵,它完成讀取模擬量向數字量的轉換結果,其部分主要**如下:
padcioreg->radccon = (1<<14)|(adcprs<<6)|(ch<<3); //建立通道號
padcioreg->radccon |= 0x1; // 開始轉換
while(padcioreg->radccon & 0x1); //檢測開始位是否為低電平
while(!(padcioreg->radccon & 0x8000)); //檢測轉換是否完畢標誌位
return ( (double)(padcioreg->radcdat0 & 0x3ff) ); //返回轉換完的數值
其中 ch 表示取樣通道號, adcprs為預分頻值。其它函式均為空。
adc驅動封裝及其在windows ce.net中的新增
通過以上的工作,編譯出乙個 dll 函式,接著建立乙個自己的 def 檔案,匯出所需要的流介面函式。新建乙個記事本檔案,命名為 adcdriver.def :
library adcdriver
exports
adc_init
adc_open
adc_readwww.51kaifa.com
adc_write
adc_close
adc_deinit
然後編寫乙個登錄檔檔案, 命名為adcdriver.reg :
[hkey_local_machine/ drivers/ builtin/ adc]
"index" = dword :1
"prefix" = "adc"
"dll" = "adcdriver.dll"
"order" = dword :0
最後在 platform builder中新建乙個 cec 檔案,首先新增乙個buildmethod ,它的任務是複製登錄檔到 windows ce.net 的系統目錄下面。然後再新增乙個 bib file,其主要任務是把編譯的 adcdriver.dll 檔案新增到 windows ce.net 核心中去。儲存寫好的cec檔案。在platform builder 中 , 開啟「file」選單,新增已經編寫好的 cec 特徵到系統選項中去。生成系統的時候, 新增 cec 特性,這樣驅動就加入到作業系統裡了。
總結
文中作者分析了 windows ce.net 的流介面驅動的工作原理順序,設計實現了windows ce.net下的ad驅動,並通過platform builder將其編譯到作業系統。而本系統再配上 evc 開發的圖形介面軟體,可以開發出各種使用的裝置,如移動資料採集器等,在現代化檢測領域有很強的實用性。本文作者創新點:分析了windows ce.net下流驅動的執行順序以及上層檔案api如何呼叫流驅動,並給出將編寫的驅動加入到作業系統的詳細步驟,該驅動設計簡單,應用程式可以靈活呼叫。
windows CE驅動開發學習筆記
首先是wince驅動的分類問題。按照書上講的說ce下驅動分成單體驅動和分層驅動,而看到另一種說法是本機驅動和流式驅動。經過microsun大哥的指點,把這兩種分類法分開了。在這裡引用一下 單體與分層只是從 的形式上做的分類.分層驅動 上分為pdd與mdd,一般的微軟已經實現了mdd,可能也實現了pd...
windowsCE驅動程式問題集錦
如何讓系統載入自己寫的驅動程式?兩種辦法 1 在 hkey local machine drivers builtin 下新增註冊鍵。2 在應用程式中呼叫activatedeviceex。在一些檔案中用分號來表示注釋,例如下面的內容 在 cesysgen.前加了 有沒有什麼特別的含義?在wince的...
Windows CE驅動開發常用巨集定義
巨集的確是個好 在ce驅動開發過程中,正確,準確的使用恰當的巨集,能使得 非常精煉,書之精彩,閱之愉悅.對於開發中經常用到的一些巨集,我在這裡做了一些總結.暫存器操作 8bit defineinreg8 x read register uchar uchar x define outreg8 x,y...