1.概述
在信息和咨訊快速更新的今天,,掌上電腦以其方便和易攜帶性開始得到廣泛應(yīng)用,如在服務(wù)行業(yè)、導(dǎo)航系統(tǒng),、金融、證券,、保險(xiǎn)等領(lǐng)域,。在掌上電腦高端市場中,由微軟開發(fā)的嵌入式操作系統(tǒng)WinCE發(fā)展迅速,,占有較高的比例,。PocketPC2002采用定制化的WindowsCE3.0操作系統(tǒng),由Microsoft開發(fā)專用于個(gè)人數(shù)字手持設(shè)備,。
為方便擴(kuò)展,,基于PocketPC的掌上電腦向用戶提供了CF卡通用擴(kuò)展槽,利用該接口,,可設(shè)計(jì)不同的CF卡實(shí)現(xiàn)不同的應(yīng)用,,如CFMODEM卡、CF網(wǎng)卡,、CF數(shù)據(jù)采集接口卡等,。在CF卡的設(shè)計(jì)中,基于PocketPC的驅(qū)動(dòng)程序設(shè)計(jì)非常關(guān)鍵,,直接影響著CF卡的性能,。本文結(jié)合CF卡驅(qū)動(dòng)的設(shè)計(jì),介紹了PocketPC驅(qū)動(dòng)程序的設(shè)計(jì)方法,、CF卡設(shè)備的驅(qū)動(dòng)結(jié)構(gòu)和設(shè)計(jì)原理,,探討了CF卡的即插即用問題,,并且給出了一個(gè)CF卡PocketPC驅(qū)動(dòng)的設(shè)計(jì)及應(yīng)用程序和驅(qū)動(dòng)交互的實(shí)例。
2.基于PocketPC的CF卡驅(qū)動(dòng)設(shè)計(jì)
2.1.PocketPC驅(qū)動(dòng)簡介
WindowsCE3.0是微軟公司針對嵌入式系統(tǒng)開發(fā)的實(shí)時(shí)操作系統(tǒng),,具有可以獨(dú)立開發(fā)的內(nèi)核和設(shè)備驅(qū)動(dòng)程序模型,,PocketPC是針對掌上電腦的定制化的WindowsCE操作系統(tǒng),其驅(qū)動(dòng)模型與WindowsCE一致,。
PocketPC驅(qū)動(dòng)程序模型以靜態(tài)連接庫(.lib文件)或動(dòng)態(tài)連接庫(.dll文件)形式實(shí)現(xiàn),。支持四種驅(qū)動(dòng)程序類型:Nativedriver(本機(jī)驅(qū)動(dòng))、StreamInterfacedriver(流接口驅(qū)動(dòng)),、USBdriver和NDISdriver(網(wǎng)絡(luò)驅(qū)動(dòng)),。本機(jī)驅(qū)動(dòng)是指本地設(shè)備的驅(qū)動(dòng)程序。如點(diǎn)觸式面板,,顯示器,,鍵盤,發(fā)光二極管,,電池等的驅(qū)動(dòng),。USB和NDIS驅(qū)動(dòng)模型分別是針對USB設(shè)備和網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)實(shí)現(xiàn)。流接口驅(qū)動(dòng)程序是為連接基于WindowsCE的平臺(tái)的外圍設(shè)備而設(shè)計(jì)的,,包括串口,、PC卡,CF卡等[1],。
2.2.CF卡驅(qū)動(dòng)架構(gòu)和原理
設(shè)計(jì)CF卡驅(qū)動(dòng)程序的主要任務(wù)是實(shí)現(xiàn)PocketPC應(yīng)用程序?qū)F卡系統(tǒng)硬件的訪問,,實(shí)現(xiàn)CF卡設(shè)備的管理和即插即用。應(yīng)用程序?qū)F卡硬件的訪問需要考慮驅(qū)動(dòng)程序的體系結(jié)構(gòu),、應(yīng)用程序與驅(qū)動(dòng)程序的交互、驅(qū)動(dòng)層的中斷處理等問題,。CF卡即插即用問題涉及設(shè)備管理程序,、設(shè)備文件名等等。
2.2.1.流接口驅(qū)動(dòng)程序的系統(tǒng)結(jié)構(gòu)
PocketPC中CF卡驅(qū)動(dòng)程序的設(shè)計(jì)對應(yīng)模式是流接口驅(qū)動(dòng),。流接口驅(qū)動(dòng)程序是一個(gè)管理外圍設(shè)備的DLL,,它把設(shè)備表示為文件系統(tǒng)的一個(gè)特殊文件,主要任務(wù)是把外設(shè)的使用傳遞給應(yīng)用程序,。PocketPC的設(shè)備文件存在固定的路徑Windows下,,以一個(gè)特殊的命名慣例來區(qū)分設(shè)備文件和其他文件。
流接口驅(qū)動(dòng)程序接收設(shè)備管理器和應(yīng)用程序通過系統(tǒng)調(diào)用的命令,,并且封裝所有命令,,轉(zhuǎn)換成控制設(shè)備適當(dāng)?shù)膭?dòng)作信息。圖一表示CF卡的流接口驅(qū)動(dòng)程序和其他系統(tǒng)部件間的相互關(guān)系:
流接口驅(qū)動(dòng)程序通過內(nèi)部硬件訪問外圍設(shè)備,。對CF卡而言,,內(nèi)部設(shè)備是CF卡插槽,,由內(nèi)置CF卡插槽驅(qū)動(dòng)程序驅(qū)動(dòng),而CF卡插槽驅(qū)動(dòng)程序提供編寫CF卡流接口驅(qū)動(dòng)程序的插槽接口函數(shù),。即CF卡的設(shè)備驅(qū)動(dòng)程序使用CF卡服務(wù)庫(由CF卡插槽接口函數(shù)組成),,CF卡服務(wù)庫控制CF卡插槽硬件。
2.2.2.實(shí)現(xiàn)即插即用
在PocketPC中,,中斷,、I/O端口等系統(tǒng)資源被操作系統(tǒng)接管,并由其根據(jù)情況進(jìn)行智能的分配,,當(dāng)設(shè)備連接到掌上電腦時(shí),,操作系統(tǒng)能自動(dòng)識(shí)別并啟動(dòng)相應(yīng)的驅(qū)動(dòng),這就是即插即用,。為實(shí)現(xiàn)PocketPC的CF卡即插即用,,必須理解兩個(gè)概念:設(shè)備管理程序(DeviceManager,DM)和設(shè)備文件名,。
2.2.3.編寫CF卡接口驅(qū)動(dòng)程序DLL
設(shè)備管理程序?qū)儆谟脩魧映绦?,與內(nèi)核,注冊表和流接口驅(qū)動(dòng)程序DLL相互作用并實(shí)現(xiàn)特定功能(見圖一),,從而實(shí)現(xiàn)設(shè)備的即插即用,。
DM執(zhí)行下列任務(wù)[1]:
a.初始化驅(qū)動(dòng)程序的加載。
在系統(tǒng)啟動(dòng)或收到用戶在基于PocketPC平臺(tái)上增加外圍設(shè)備的信息時(shí),,開始加載相應(yīng)驅(qū)動(dòng),;
b.向內(nèi)核注冊設(shè)備文件名。
該文件名把應(yīng)用程序使用的流I/O函數(shù)映射到流接口驅(qū)動(dòng)程序的對應(yīng)函數(shù),;
c.啟動(dòng)相應(yīng)的驅(qū)動(dòng)程序
通過從外圍設(shè)備獲得即插即用標(biāo)識(shí)符或激活一個(gè)檢查模塊為外圍設(shè)備尋找合適的設(shè)備驅(qū)動(dòng)程序,;
d.自動(dòng)卸載設(shè)備驅(qū)動(dòng)程序
通過讀寫注冊表值加載和跟蹤驅(qū)動(dòng)程序,當(dāng)不再需要設(shè)備時(shí)卸載其驅(qū)動(dòng)程序,。
B)設(shè)備文件名
應(yīng)用程序通過文件系統(tǒng)里的特殊入口訪問外圍設(shè)備,。
PocketPC的文件系統(tǒng)可以識(shí)別特殊文件名并重定向文件IO操作到適當(dāng)?shù)牧鹘涌隍?qū)動(dòng)程序。
設(shè)備文件名前綴由三個(gè)大寫字母組成,,用來識(shí)別與特殊流接口驅(qū)動(dòng)程序相對應(yīng)的特殊設(shè)備文件名,。文件名前綴存儲(chǔ)在注冊表的相應(yīng)驅(qū)動(dòng)程序的鍵值中。在用戶生成流接口驅(qū)動(dòng)程序時(shí),,必須指定這三個(gè)前綴字母,。
C)即插即用
驅(qū)動(dòng)加載過程就是對中斷、I/O端口等系統(tǒng)資源進(jìn)行系統(tǒng)分配的過程,。此過程與DM和設(shè)備文件名緊密相關(guān),。
a.加載流接口驅(qū)動(dòng)
CF卡加載流接口驅(qū)動(dòng)有兩種方法:
第一種加載的類型是在DM自動(dòng)檢測到CF卡與PocketPC平臺(tái)的連接時(shí)進(jìn)行的。
第二種加載的形式是在DM不能自動(dòng)檢測到CF卡與平臺(tái)的連接時(shí),使用該CF的應(yīng)用程序必須列出該外圍設(shè)備的驅(qū)動(dòng)程序,,即主動(dòng)調(diào)用RegisterDevice()或者ActivateDevice()函數(shù)實(shí)現(xiàn)驅(qū)動(dòng)的加載,。
即插即用時(shí)驅(qū)動(dòng)的加載是采用第一種類型。實(shí)現(xiàn)CF卡即插即用,,首先下位機(jī)需要修改相應(yīng)的CIS(CardInformationStructure),,在驅(qū)動(dòng)中添加檢測模塊,并且在注冊表添加設(shè)備注冊信息,。
當(dāng)系統(tǒng)開啟或者CF卡插入槽后,,DM會(huì)調(diào)用在注冊表中設(shè)置的檢測模塊檢測插卡類型,如果符合,,則會(huì)加載相應(yīng)的驅(qū)動(dòng),。檢測模塊寫成DLL的形式,調(diào)用CF卡插槽接口函數(shù)檢測CIS中的數(shù)據(jù),,判斷是否對應(yīng)設(shè)備,。如果對應(yīng),則告訴DM需要加載注冊表中指定的相應(yīng)設(shè)備的驅(qū)動(dòng)程序,。
b.卸載流接口驅(qū)動(dòng)
流接口驅(qū)動(dòng)根據(jù)加載驅(qū)動(dòng)的方式用兩種方式分別卸載,。
對DM自動(dòng)加載的設(shè)備,當(dāng)檢測到CF卡從插槽拔出時(shí),,DM從HKEY_LOCAL_MACHINEDriverActive鍵中刪除相應(yīng)驅(qū)動(dòng)程序項(xiàng),,并調(diào)用DeregisterDevice函數(shù)從文件系統(tǒng)中刪除相應(yīng)外圍設(shè)備的文件名,同時(shí)通知FreeLibrary函數(shù)卸載DLL,。
對應(yīng)用程序主動(dòng)加載的驅(qū)動(dòng)設(shè)備,,應(yīng)用程序必須在DLL存在前通過調(diào)用函數(shù)DelregisterDevice來卸載DLL
2.2.3.編寫CF卡接口驅(qū)動(dòng)程序DLL
CF卡驅(qū)動(dòng)程序使用CF卡插槽接口函數(shù)實(shí)現(xiàn)驅(qū)動(dòng)。對每個(gè)驅(qū)動(dòng)程序而言,,其所要求的標(biāo)準(zhǔn)的入口點(diǎn)用來實(shí)現(xiàn)標(biāo)準(zhǔn)文件IO函數(shù)和電源管理函數(shù),,這些函數(shù)由WinCE操作系統(tǒng)的內(nèi)核使用。這些標(biāo)準(zhǔn)入口點(diǎn)為:XXX_Close,,XXX_Denit,,XXX_Init,XXX_IOControl,,XXX_Open,XXX_PowerDown,,XXX_PowerUp,,XXX_Read,XXX_Write等[3],。
生成一個(gè)DLL之前,,必須用設(shè)備文件名前綴替換入口點(diǎn)名字中的XXX,以對應(yīng)不同的設(shè)備驅(qū)動(dòng),。
3.CF卡驅(qū)動(dòng)程序設(shè)計(jì)實(shí)例
3.1.CF卡系統(tǒng)設(shè)計(jì)
要實(shí)現(xiàn)標(biāo)準(zhǔn)的CFCard,,硬件上關(guān)鍵在于接口的實(shí)現(xiàn),。我們應(yīng)用的是TexasInstrument公司的TL16PC564接口芯片來簡化設(shè)計(jì)并使其符合CF+標(biāo)準(zhǔn)。設(shè)計(jì)方案如圖二所示:
3.1.1.TL16PC564接口芯片介紹
TL16PC564接口芯片提供了在子系統(tǒng)串行數(shù)據(jù)和CF卡并行接口數(shù)據(jù)之間的串并轉(zhuǎn)換功能[2],。在下位機(jī)子系統(tǒng)中,,MCU負(fù)責(zé)處理由上位機(jī)和外部系統(tǒng)的數(shù)據(jù)流交互。此系統(tǒng)結(jié)構(gòu)可以制作各種功能的CFIO卡:如MODEM卡,,網(wǎng)卡等,。
TL16PC564的接口芯片功能模塊如圖三所示。
芯片中的CFCard的屬性空間由256字節(jié)的CIS和8字節(jié)的CCR(卡配置寄存器)組成,。該CIS和CCR利用主機(jī)CPU和子系統(tǒng)都可訪問的DPRAM實(shí)現(xiàn),。系統(tǒng)上電時(shí),由子系統(tǒng)負(fù)責(zé)完成對CIS的初始化,。
TL16PC564接口芯片的主要特性:
1)集成了符合CF+標(biāo)準(zhǔn)的TL16550的PCMCIA接口邏輯,,該邏輯提供了外設(shè)與CPU之間的數(shù)據(jù)串并轉(zhuǎn)換功能。
2)256字節(jié)的CIS和8字節(jié)的CCR由DPRAM代替EEPROM,使修改和更新CIS和CCR更加容易,。
3)提供了完全可編程的串行接口特性,。
4)可選的串行旁路模式可以使子系統(tǒng)能直接并行訪問接收和發(fā)送FIFO,使系統(tǒng)設(shè)計(jì)更加靈活,提高了子系統(tǒng)和主系統(tǒng)CPU間數(shù)據(jù)傳送吞吐率,。
3.1.2.TL16PC564接口芯片在多功能CF卡中的設(shè)計(jì)實(shí)現(xiàn)
對CF卡而言,,實(shí)現(xiàn)CF卡功能的軟件設(shè)計(jì)包括兩個(gè)方面,一方面是CFcard側(cè)MCU對CIS的初始化及數(shù)據(jù)采集和計(jì)算,,另一方面是主機(jī)側(cè)的驅(qū)動(dòng)程序,。在CFCard正常工作前,必須由卡上的MCU對設(shè)備進(jìn)行初始化,,即將CIS信息寫入屬性空間,,從而經(jīng)過主機(jī)識(shí)別,使主機(jī)明確CFCard的應(yīng)用類型,。
在實(shí)際設(shè)計(jì)中,,TL16PC564硬件設(shè)置為旁路模式,上下位機(jī)通過訪問FIFO,,實(shí)現(xiàn)數(shù)據(jù)的交互,。對上位系統(tǒng)驅(qū)動(dòng)而言,數(shù)據(jù)的發(fā)送等價(jià)于對TL16PC564的FIFO寫數(shù)據(jù),,當(dāng)數(shù)據(jù)的FIFO寫滿之后,,配合16650的控制邏輯,下位系統(tǒng)獲得數(shù)據(jù)到的消息,,從而將FIFO的數(shù)據(jù)讀出,,完成系統(tǒng)數(shù)據(jù)通訊下行的流程。上行流程與下行流程類似。由于TL16PC564硬件設(shè)置為旁路模式,,使下位機(jī)可以直接訪問FIFO,可以提高通訊速率,。我們在實(shí)現(xiàn)上下位機(jī)通訊過程中,定制了高效的通訊規(guī)則,,使上下位機(jī)數(shù)據(jù)交互速率最優(yōu)化,,經(jīng)過測試,系統(tǒng)通訊速度達(dá):56kbyte/s,。下位系統(tǒng)的MCU可以直接訪問FIFO,可以選擇不同的集成多功能的MCU或者添加外圍模塊,,實(shí)現(xiàn)多種通道的數(shù)據(jù)的采集和控制。系統(tǒng)設(shè)計(jì)時(shí),,可定制完善可靠的通訊規(guī)約,,實(shí)現(xiàn)系統(tǒng)對各種數(shù)據(jù)通道的控制和訪問,達(dá)到多功能卡設(shè)計(jì)的目的,。
3.2.CF卡驅(qū)動(dòng)程序的實(shí)現(xiàn)
實(shí)現(xiàn)PocketPC2002的CF卡驅(qū)動(dòng),,即采用EVC3.0+PocketPCSDK,在EVC里編譯代碼,,生成DLL,,然后導(dǎo)入到PocketPC的Windows目錄下,并添加注冊表信息,,實(shí)現(xiàn)即插即用,。以上是制作驅(qū)動(dòng)的完整流程[3]。
3.2.1.實(shí)現(xiàn)流接口驅(qū)動(dòng)的標(biāo)準(zhǔn)接口(設(shè)備文件名取CFC)
A)CFC_Init
DM調(diào)用RegisterDevice或ActivateDevice進(jìn)入此模塊,。通過XXX_Init()的返回值判斷CF卡初始化是否執(zhí)行成功,。此模塊完成以下功能:
a.初始化CF卡硬件。
b.分配資源,。
c.注冊回調(diào)函數(shù),,當(dāng)設(shè)備狀態(tài)變化,則操作系統(tǒng)調(diào)用此回調(diào)函數(shù)CardRegisterClient,。
d.分配IO資源,,調(diào)用CF卡插槽驅(qū)動(dòng)接口函數(shù)實(shí)現(xiàn)。
e.注冊中斷函數(shù),,調(diào)用CardRequestIRQ()函數(shù),。
f.配置CF卡寄存器。
B)CFC_Deinit
系統(tǒng)DM調(diào)用此模塊卸載CF卡,。需要做的工作是釋放申請的資源等,。
C)CFC_Open
應(yīng)用程序調(diào)用Createfile時(shí)進(jìn)入此模塊,主要是分配資源,,數(shù)據(jù)結(jié)構(gòu)的初始化。
D)CFC_Close
應(yīng)用程調(diào)用API接口CloseHandle(hFile)進(jìn)入此模塊,關(guān)閉CF卡的驅(qū)動(dòng),。
E)CFC_Read
應(yīng)用程調(diào)用API接口ReadFile進(jìn)入此模塊,,讀取CF卡數(shù)據(jù)。
F)CFC_Write
應(yīng)用程調(diào)用API接口WriteFile進(jìn)入此模塊,,向CF卡寫數(shù)據(jù),。
G)CFC_IOControl
應(yīng)用層調(diào)用DeviceIoControl()進(jìn)入此模塊。
3.2.2.驅(qū)動(dòng)中斷處理
PocketPC處理中斷的方法是在處理XXX_Init調(diào)用的過程中讓流接口驅(qū)動(dòng)程序生成一個(gè)新的線程,,這個(gè)線程叫做中斷服務(wù)線程(IST),。在中斷發(fā)生時(shí),OS就給IST發(fā)信號(hào),。CF卡驅(qū)動(dòng)程序的IST從CardRequestIRQ函數(shù)接受信號(hào),。因?yàn)閮?nèi)建CF卡插槽的驅(qū)動(dòng)程序得到由CF卡插槽生成的原始中斷,所以PC卡驅(qū)動(dòng)程序并不直接處理中斷,。在中斷發(fā)生時(shí),,進(jìn)入CardReguestIRQ指定的PC卡插槽驅(qū)動(dòng)程序調(diào)用的回調(diào)函數(shù)。
3.3.應(yīng)用程序與驅(qū)動(dòng)交互
PocketPC對設(shè)備的操作是采用文件操作實(shí)現(xiàn)的,。應(yīng)用層可以調(diào)用以下API接口函數(shù)對設(shè)備進(jìn)行操作:
Createfile():創(chuàng)建設(shè)備文件
ReadFile():讀取設(shè)備數(shù)據(jù)
WriteFile():放送數(shù)據(jù)至設(shè)備
DeviceIOControl():其他的相關(guān)操作
CloseHandle():關(guān)閉設(shè)備文件
應(yīng)用程序經(jīng)由CreateFile()打開和存取CF卡驅(qū)動(dòng)程序,,產(chǎn)生一個(gè)對CF卡驅(qū)動(dòng)程序中CFC_Open()的調(diào)用,驅(qū)動(dòng)程序返回一個(gè)句柄,,然后該句柄被常規(guī)的Win32文件功能所用,,如WriteFile()和ReadFile()。調(diào)用WriteFile()和ReadFile()分別對應(yīng)驅(qū)動(dòng)程序的CFC_Write(),,和CFC_Read()模塊,。最后,CloseHandle()調(diào)用驅(qū)動(dòng)程序的CFC_Close()模塊釋放內(nèi)部資源,。
3.4.驅(qū)動(dòng)程序的安裝
驅(qū)動(dòng)程序的安裝并不只是一個(gè)DLL,,包括需要用到的數(shù)據(jù)文件、配置文件,,和添加事先定義好的注冊表項(xiàng)[4],。以下是添加系統(tǒng)注冊表例子:
[HKEY_LOCAL_MACHINEDriversCFC]
"Dll"="CFCDriver.dll"
"Prefix"="CFC"
驅(qū)動(dòng)安裝過程是將驅(qū)動(dòng)程序“CFCDriver.dll”文件存到POCKETPC中windows目錄下,并且修改注冊表,,制作安裝包可以采樣SDK中自帶的工具實(shí)現(xiàn),。
3結(jié)束語
本文給出了基于PocketPC的CF卡驅(qū)動(dòng)程序的設(shè)計(jì)思路和程序架構(gòu),其中具體實(shí)現(xiàn)代碼限于篇幅,,不再文中贅述,。基于不同硬件設(shè)計(jì),,采樣相同的驅(qū)動(dòng)框架和設(shè)計(jì)方法,,可以制作不同的CFIO卡,,實(shí)現(xiàn)多種功能。