久久久国产精品视频_999成人精品视频线3_成人羞羞网站_欧美日韩亚洲在线

0
首頁 精品范文 驅動程序設計

驅動程序設計

時間:2022-11-02 01:26:43

開篇:寫作不僅是一種記錄,更是一種創造,它讓我們能夠捕捉那些稍縱即逝的靈感,將它們永久地定格在紙上。下面是小編精心整理的12篇驅動程序設計,希望這些內容能成為您創作過程中的良師益友,陪伴您不斷探索和進步。

第1篇

關鍵詞:wince 驅動程序;開發;設計

1 引言

WINCE和Windows 98或Windows 2000不同,它可以工作在12種不同的處理器體系結構、180余種CPU上;同時,WINCE是一個實時操作系統(實時系統的意義就是輸入的指令不必進入隊列就可以馬上處理,過去我們使用的DDS就是實時系統),可以滿足應用程序所需要的實時性要求。

Windows CE的模塊化設計使得它能夠在大量的平臺上定制使用,從客戶電子設備到專用的工業控制器。由于它是模塊化的,因而我們可以使用滿足平臺系統需求的最小軟件模塊和組件集合來設計嵌入式系統平臺,從而使內存用量最小,但最大可能地提高操作系統的性能。因此外圍擴展設備就必須要有硬件驅動才能正常工作。

和其它的操作系統一樣,Windows CE也提供設備驅動軟件,這些軟件的目的是驅動內部和外圍的硬件設備,或為它們提供接口。設備驅動程序將操作系統和設備鏈接起來,使得操作系統能夠識別設備或者為應用程序提供設備服務。

Windows CE支持廣泛的基于各種CE平臺的設備驅動程序。也提供一些用于驅動程序開發的模型(model) ,其中包括來自其它操作系統的驅動程序模型(model),因為這些豐富多變的驅動程序模型, Windows CE適應大部分的內部和外圍設備口Microsoft Windows CE設備驅動程序工具包配備了文檔資料,這些文檔資料使得你能夠為Windows CE創建設備驅動程序。目前,Windows CE提供了四種設備模型,其中兩種是專用于Windows CE的模型,另外兩種外部模型來自其它操作系統。

2 驅動程序開發簡介

2.1 開發工具

Windows CE驅動可以使用Platform Builder或者Visual Studio開發,但是開發人員一般都使用Platform Builder開發設備驅動程序,對于部分驅動也會使用Visual Studio開發,應用程序開發人員更多的使用Visual Studio開發驅驅動程序。作為BSP(Board Support Package)的一部分進行整體編譯開發。

2.2 驅動分類

2.2.1 按加載方式和接口類型分類

1) 本機驅動程序(Built-In Drivers)

通常由GWES加載,驅動接口一般都是定制的(Custom Purpose)。

2) 流驅動程序(Stream Drivers)

通常由Device Manager加載,驅動接口是標準的流式接口。

3) 混和型驅動程序

同時有定制式和流驅動兩套驅動接口,但是和系統交互只使用流式驅動接口,比如PC卡槽驅動。

2.2.2 按驅動層次分類

1) 層次型驅動程序(Layered Driver)

> MDD(Model Device Driver),與硬件無關,面向上層應用程序,一般由微軟建立統一框架;

> PDD(Platform Dependent Driver),針對具體硬件平臺的操作代碼,一般由驅動開發商實現MDD和PDD之間通過標準的設備驅動服務供應商接口DDSI連接。

2) 獨立型驅動程序(Monolithic Driver)

> 獨立驅動程序包含了MDD面向上層應用和PDD面向硬件平臺兩方面的代碼;

> 適用于操作不復雜的驅動;

> 減少了MDD和PDD傳遞之間傳遞信息的開銷,實時性更強;

3 流驅動程序的實現

    流驅動程序必須實現一套標準接口,流驅動程序適用于IO操作,這也是嵌入式系統中最常見的設備驅動,操作接口和文件系統操作相似,通過CreateFile,ReadFile,WriteFile,IOControl函數等來操作應用程序和流驅動交互,可以把設備當作文件操作。

3.1 文件前綴名確定

    根據文件前綴名在系統中必須唯一這一特點,在定義文件前綴名必須是三個字母,若有多個同類設備,由后綴一個阿拉伯數字區分,例如COM1,LPT3等等。文件前綴名將會在驅動的標準接口函數中體現,比如XXX_Init,XXX_Close等。

3.2 通用函數

    根據設備的不同,所需函數不同,通用函數如下所示:

1) XXX_Init:通知設備管理器為設備初始化分配資源;

2) XXX_Deinit:通知設備管理器回收設備初始化時分配的資源;

3) XXX_Open:打開設備。應用程序調用CreateFile時,通過文件系統映射為XXX_Open;

4) XXX_Close:關閉設備。應用程序調用CloseFile時,通過文件系統映射為XXX_Close;

5) XXX_PowerUp:設備上電時,操作系統調用該函數完成必要的上電操作;

6) XXX_PowerDown:設備掉電時,操作系統調用該函數完成必要的關機操作

7) XXX_Read:從打開的設備文件中讀取數據,可以通過ReadFile映射;

8) XXX_Write:向打開的設備文件寫數據,可以通過WriteFile映射;

9) XXX_Seek:文件定位,根據設備情況決定是否支持;

10) XXX_IOControl:IO操作擴展,可以根據設備情況來決定支持何種特殊的操作模式。

3.3 DEF文件建立

    流驅動一般以DLL形式存在,DEF文件定義了DLL需要導出的接口集,因此DEF文件的名稱與設備驅動名稱相同。

3.4 寫注冊表

    在wince中任何設備的識別都是通過注冊表來實現的,因此必須在注冊表中添加具體的設備驅動項,以便系統識別。具體方法如下:

在注冊表中增加驅動程序入口點,找到注冊表項,注冊項位于注冊表的Root Key下,一般為[HKEY_LOCAL_MACHINEDriversBuiltInSampleDrv],建立必要的子鍵和鍵值,“Prefix”和“DLL”是兩個重要,而且是必須的鍵,分別描述了設備前綴名和驅動程序的動態連接庫名,然后根據具體設備的需要建立驅動程序需要的其子他鍵。

4 調試驅動程序

驅動程序編寫完畢后,就應該進行硬件的調試。具體方法如下:

4.1 調試區信息(Debug Zone)

調試區一般和WinCE的控制臺調試工具Cesh.exe配合調試,在不打斷OS運行情況下,進行驅動的實時調試,利用宏開關,可以選擇需要輸出的調試區信息,可以得到進程,線程和調試狀態信息。并且可以利用IDE環境,動態選擇開關調試區信息,但是打印驅動程序輸出調試信。必須借助于至少一種外設顯示調試信息,比如串口或者網卡或者其他通過調用RETAILMSG或者DEBUGMSG完成,不影響OS的運行,保證驅動程序運行的真實性,動態輸出設備的狀態信息,調試相對簡單,也是最廣泛使用的一種調試方法。

4.2 核心調試工具(Kernel Debugger)

核心調試工具將會禁止所有硬件中斷,掛起操作系統,因此可以單步調試OS或者核心代碼,可以訪問堆棧信息,但是必須在Platform的環境下,利用至少一種外設進行通信。

4.3 硬件輔助調試方法

利用硬件調試工具可以觀察物理設備的真實狀態,一般常用的方法可以利用JTAG工具實時查看CPU內部寄存器,利用邏輯分析儀或者示波器實時查看物理外設的輸入輸出狀態。利用指示LED來顯示驅動程序實時狀態信息。

4.4 Visual Studio調試

可以利用VS內置的調試工具進行單步跟蹤,狀態調試等。

5 測試驅動程序

驅動程序經過調試以后就需要對驅動的功能進行測試。其常用的方法如下:

1) 寫一個應用程序來測試驅動程序的正確性

2) 模擬各種可能發生的硬件輸入狀態來測試驅動程序的正確性

3) 利用Windows CE自帶的測試工具CETK來測試驅動程序的性能和完備性

6 驅動程序的集合和

6.1 驅動程序集成

驅動程序經過調試和測試確定其正確性后,就可以對驅動程序進行集成了。具體過程如下:

1) 在BSP的Driver目錄下建立新的驅動文件夾MyDrv

2) 實現MyDrv驅動以及相關的DEF文件

3) 如果需要用到硬件中斷資源,修改原BSP中的相關中斷處理函數OEMInterruptEnable,OEMInterruptDisable,OEMInterruptDone,OEMInterruptHandler

4) 在Platform.reg中,增加驅動程序相關項

5) 在Platform.bib中,增加驅動程序的相關注冊表項MyDrv.Dll$(_FLATRELEASEDIR)MyDrv.dll NK SH

6.2 驅動程序

驅動程序進過集成以后就可以使用了,具體的過程如下所示:

1) 利用CAB Wizard生成.cab驅動包

2) 直接提供驅動程序文件夾以及相關注冊表項和修改說明

7 總結

本為詳細的介紹了,wince下驅動開發的流程,介紹了驅動程序開發到的詳細過程,并詳細說明了各個部分的實現和操作方法,使是初學者對wince下驅動程序的開發流程和一般的開發工具有了初步的了解。

第2篇

關鍵字 Windows系統 驅動程序 通知應用程序 設計 方法

中圖分類號: TP316 文獻標識碼:A

1 前言

操作系統的穩定性及可移植性是務必要優先確保的,為此Windows操作系統不支持應用程序直接訪問系統的硬件資源,而是必須借助于相應的設備驅動程序。設備驅動程序可以直接操作硬件,假如應用程序和設備驅動程序之間實現了雙向通信,也就達到了應用程序控制底層硬件設備的目的。

2 通知應用程序設計四種方法

鑒于設備驅動程序通知應用程序的重要性,本人結合一些經驗,對它進行了總結,歸納出5種方法摘要:異步過程調用(APC)、事件方式(VxD)、消息方式、異步I/O方式和事件方式(WDM)。下面分別說明這幾種方式的原理。

2.1 異步過程調用(APC)

Win32應用程序使用CreateFile()函數動態加載設備驅動程序,然后定義一個回調函數backFunc(),并且將回調函數的地址%26amp;backFunc()作為參數,通過DeviceIoControl()傳送給設備驅動程序。回調函數的輸入參數是由設備驅動程序填入的,回調函數在這里主要是對消息進行處理。

2.2 事件方式(VxD)

首先,Win32應用程序創建一個事件的句柄,稱其為Ring3句柄。由于虛擬設備驅動程序使用事件的Ring0句柄,因此,需要創建Ring0句柄。用LoadLibrary()函數加載未公開的動態鏈接庫Kernel32.dll,獲得動態鏈接庫的句柄。然后,調用GetProcAddress(), 找到函數OpenVxDHandle()在動態鏈接庫中的位置。接著,用OpenVxDHandle()函數將Ring3事件句柄轉化為Ring0事件句柄。Win32應用程序用CreateFile()函數加載設備驅動程序。

2.3 消息方式

Win32應用程序調用CreateFile()函數動態加載虛擬設備驅動程序。加載成功后,通過調用DeviceIoControl()函數將窗體句柄傳送給VxD,VxD利用這個句柄向窗體發消息。當條件滿足時,VxD調用SHELL_PostMessage()函數向Win32應用程序發送消息。SHELL_PostMessage()函數的第一個參數為Win32窗體句柄,第二個參數為消息ID號,第三、四個參數為發送給消息處理函數的參數,第五、六個參數為回調函數和傳給它的參數。Win32應用程序收到消息后,對消息進行處理。

2.4 事件方式(WDM)

Win32應用程序首先創建一個事件,然后將該事件句柄傳給設備驅動程序,接著創建一個輔助線程,等待事件的有信號狀態,自己則接著干其他事情。設備驅動程序獲得該事件的句柄后,將它轉換成能夠使用的事件指針,并且把它寄存起來,以便后面使用。

3 結語

在目前流行的Windows操作系統中,設備驅動程序是操縱硬件的最底層軟件接口。它向上提供和硬件無關的用戶接口,向下直接進行I/O、硬件中斷、DMA和內存訪問等操作。它將應用程序和硬件細節屏蔽開來,使軟件不依靠于硬件并且可在多個不同的平臺之間移植。這4種方法都經過實際測試。測試結果表明,它們都能夠達到設備驅動程序通知應用程序的目的。

參考文獻

[1] 李和平. 基于DSP的ICT圖像重建系統探究. 北京摘要: 北京航空航天大學機械工程及自動化學院, 2002

第3篇

【關鍵詞】USB 設備驅動 Linux

1 USB總線原理

USB 協議是1994年底由康柏、IBM、英特爾等幾家公司聯合提出來的外部總線接口協議。USB就是英文中Universal Serial Bus(通用串行總線)的縮寫。USB總線具有其他總線所不具備的如:熱插拔、數據傳輸可靠、擴展方便、成本低等一系列特點,因此在嵌入式系統中被廣泛使用。

一個USB系統一般是由一個USB主機控制器、一個或多個USB集線器和一個或多個USB設備節點組成。USB系統的物理連接具有層次性。USB總線連接USB設備和USB主機,是一種星型拓撲結構。USB的拓撲結構如圖1所示。

在一個USB系統傳輸數據的過程中有兩個非常重要的概念,就是USB傳輸模式和USB描述符。USB傳輸模式是指USB設備傳輸數據的形式。USB設備支持四種傳輸模式:控制傳輸模式、同步傳輸模式、中斷傳輸模式和批量傳輸模式??刂苽鬏斈J绞怯脕硖幚鞺SB主端口到USB從端口的數據傳輸,主要是設備控制指令、設備查詢狀態指令和確認指令。同步傳輸模式是指傳輸和時間關系密切的信息所使用的一種傳輸方式,是一種周期的、連續的單向傳輸方式。中斷傳輸模式這類傳輸模式主要用于傳輸非周期性的、自然發生的、數據量很小的信息,這類數據傳輸的方向是從設備到主機,適用于鍵盤、鼠標、操縱桿等設備上。最后一種是批量傳輸模式,該模式適用于大量的、對時間沒有要求的數據傳輸,如U盤或者移動硬盤等設備。

USB設備在邏輯上分為幾個層次,分別是設備層(Device)、配置層(Config)、接口層(Interface)、端點層(Endpoint)。各個層次都有與之相對的描述符,分別是設備描述符、配置描述符、接口描述符和端點描述符。

2 Linux下的USB驅動框架

USB設備的設備描述符在Linux系統中用usb_device_descriptor結構體表示,它描述了USB設備的一般信息。配置描述符用usb_config_descriptor結構體表示,它給出了USB設備的配置信息。接口驅動程序是在一個配置內給出一個接口信息,它在Linux中由usb_interface_descriptor結構體表示。端口描述符被主機用來決定每個端口的帶寬需求,它在Linux系統中由usb_endpoint_descriptor結構體表示。

編寫一個USB驅動程序,是從usb_driver結構體開始的。Linux中模塊加載函數調用usb_register()和usb_unregister()從而對usb_driver結構體進行加載與卸載。如果某個設備信息與該驅動中usb_device_id usb_mouse_id_table 結構體的信息相一致,則會調用usb_driver中探測成員函數probe(),將初始化USB斷點信息,并對設備做一些初始化工作,分配urb結構體,準備數據傳輸。其urb處理大致框架結構如圖2所示。

當鼠標設備在用戶空間打開時,將提交 probe 函數構建的 urb 請求塊,urb 將開始為傳送數據而忙碌了。urb 請求塊就像一個裝東西的“袋子”,USB 驅動程序把“空袋子”提交給 USB core,然后再交給主控制器,主控制器把數據放入這個“袋子”后再將裝滿數據的“袋子”通過 USB core 交還給 USB 驅動程序,這樣一次數據傳輸就完成了。

3 結束語

由于USB簡單方便快捷等優點,許多外接設備會越來越青睞USB接口,這是一種發展的趨勢。Linux系統具有開源、安全等特性,用戶也在急劇增加。屆時,會有越來越多的USB驅動加入Linux內核之中。

參考文獻

[1]Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman等.LINUX設備驅動程序[M].北京:中國電力出版社,2006.

[2]Universal Serial Bus Specification Compaq,Intel,Mi―crosoft,NEC Revision 1.1.September 23,1998.

[3]溫卡特斯瓦蘭.精通Linux驅動程序開發[M].北京:人民郵電出版,2009.

[4]胡曉軍,張愛成.USB接口卡發技術[M].西安:西安電子科技大學出社,2005:15-17.

作者簡介

徐海林(1989-),男,江蘇省南通市人?,F為安徽理工大學計算機科學與工程學院學生。

第4篇

關鍵詞Windows CE;YAFFS;NAND;驅動開發

中圖分類號 TP311.1文獻標識碼A文章編號 1674-6708(2009)05-0054-02

0 引言

Windows CE是微軟公司設計的嵌入式操作系統,具有系統體積小、界面友好、可擴展、應用程序開發上手快等特點,目前,在手持式測量設備領域的應用越來越多。手持式振動信號測量儀是一種電池供電、便于現場或野外攜帶和使用的測量設備,主要功能是對振動信號進行實時連續的采集、顯示、分析、處理和存儲。

1 YAFFS文件系統簡介

YAFFS是一種類似于JFFS/JFFS2的專為NAND Flash設計的嵌入式文件系統,適用于大容量的存儲設備。和JFFS相比,YAFFS減少了一些功能,但是速度更快、占用的內存更少、NAND Flash的使用壽命也更長。YAFFS文件系統采用層次結構設計,可分為三層:文件系統管理接口層、YAFFS內部實現層和NAND Flash接口層。

2 YAFFS NAND Flash接口層

YAFFS NAND Flash接口層的主要功能就是為文件系統管理接口層、YAFFS內部實現層提供一個與具體NAND Flash硬件無關的訪問服務,提高了代碼的可移植性和通用性。在對NAND Flash接口層相關代碼進行深入的分析后,我們發現為了使YAFFS能夠對NAND Flash進行訪問,必須為NAND Flash提供一個塊設備驅動程序。與NAND Flash物理訪問相關的代碼全部由其實現,而YAFFS則是通過給該設備驅動程序發送IOControl請求來實現對NAND Flash的讀、寫、擦除等具體操作,具體來說,主要有以下幾個操作請求:

1)IOCTL_DISK_NAND_INIT 功能是命令NAND Flash驅動程序對Flash芯片進行初始化。

2) IOCTL_DISK_NAND_GETSIZE 功能是獲取NAND Flash的存儲容量(磁盤空間)。

3) IOCTL_DISK_NAND_GETNAME 功能是獲取設備在Windows CE中顯示的文件夾名稱。

4) IOCTL_DISK_NAND_GETPARTITIONS 功能是獲取NAND Flash中的分區表。

5) IOCTL_DISK_NAND_WRITE 功能是將緩沖區中的數據寫到NAND Flash中的指定頁中。

6) IOCTL_DISK_NAND_READ 功能是讀取指定的頁的數據。

7) IOCTL_DISK_NAND_ERASE 功能是從NAND Flash中的指定塊擦除。

3 Samsung K9K8G08U0A Flash

目前,在嵌入式系統領域廣泛使用的Flash主要有兩種:一種是采用NOR技術的NOR Flash,另一種是采用NAND技術的NAND Flash。這里重點介紹一下NAND Flash,首先,從內部存儲器的組織形式上看,NAND Flash的內部可分為若干個塊,塊又分為頁,頁而由數據存儲區和備用區兩部分組成;其次,NAND Flash不能按照字節進行訪問,而是以頁為單位進行讀、寫,以塊為單位進行擦除;第三,NAND Flash的地址、數據、命令端口復用,讀、寫、擦除等操作都是相應的命令來完成的。

SAMSUNG的K9K8G08U0A NAND Flash內部共有8192個塊,每個塊有64個頁,每頁包含2048字節的存儲空間和64字節的備用空間,總容量為1G字節。K9K8G08U0A的以頁為單位進行讀和寫,以塊為單位擦除,其典型的隨機頁讀時間為25us、順序頁讀時間為25ns、頁寫時間為200us、塊擦除時間為1.5ms。

4 K9K8G08U0A塊設備驅動程序的實現

Windows 環境下的塊設備驅動程序一般都實現為流接口驅動的形式,即流接口驅動需要的XXX_Close、XXX_Deinit、XXX_Init、XXX_IOControl、XXX_Open、XXX_PowerDown、XXX_PowerUp、XXX_Read、XXX_Seek 、XXX_Write都要實現,XXX表示設備名前綴,這里可以是“DSK”。由于YAFFS的NAND Flash接口主要是通過IOControl的形式實現的,所以,相應的與K9K8G08U0A讀、寫、擦除等操作相關代碼也都在DSK_IOControl函數內實現。下面給出DSK_IOControl的部分程序代碼:

DSK_IOControl的部分程序代碼如下:

BOOL DSK_IOControl(……)

{

switch (dwIoControlCode)

{

case IOCTL_DISK_NAND_WRITE:

NandRePage(pDisk,pBufData,pBufSpare,ifData->chunk);break;

case IOCTL_DISK_NAND_READ:

NandReadPage(pDisk,pBufData,pBufSpare,ifData->chunk);break;

case IOCTL_DISK_NAND_ERASE:

NandEraseBlock(pDisk,*BlockNumber);break;

}

}

具體的讀、寫、擦除等操作分別由NandReadPage、NandWritePage、NandEraseBlock三個函數按照Samsung公司K9K8G08U0A的時序規范來實現。

5 結論

第5篇

關鍵詞:光纜檢測;USB;接口;CY7C68013

引言

隨著人們對通信的要求越來越高,光通信以其獨特的優勢而越來越普及,與此同時光纜檢測也變得非常重要,為適應對預設光纜線路的可用狀態實時監測和管理需求,要求光纜線路監測系統能夠對預設通信光纜進行拓撲管理、告警管理、統計分析管理、安全管理、資源管理和系統自維護。

光纜檢測系統和計算機之間的接口設計是該系統的一個重要組成部分。RS-232接口曾經取得過巨大成功,但是隨著計算機與設備的發展,RS-232串行端口逐漸成為通信的瓶頸。而USB則突破原有接口的限制,不僅具備較高的通信速率,而且其彈性化設計可以取代各種設備所使用的接口,在計算機接口中也占據著越來越明顯的優勢。

Cypress公司的CY7C68013芯片內部是增強型51單片機,控制簡單,并實現了標準的USB1.1和USB2.0協議,而且成本較低,用于光纜檢測系統是一個很好的選擇,然而,其實現架構較為復雜。本文重點分析和討論了其固件程序、驅動程序等開發過程,實踐表明,本文的方法達到了預期設計目的,效果較好。

光纜檢測系統

圖1是光纜線路檢測硬件模塊框圖,由DTE接口單元、主控處理單元和PSTN接口單元組成。

DTE接口單元:提供了RS-232接口,USB接口。USB符合1.1和2.0協議。

主控處理單元:是系統的核心模塊。主要功能為:從DTE接口單元接收命令,并通過調制解調后發送到遠端監測站;從PSTN接口接收遠端監測站的信號,解調后發送到DTE。

PSTN接口單元:提供了分別用于輪詢和中斷兩路PSTN標準接口。

本文采用從底層到上層的結構來敘述如何使USB設備完成光纜檢測系統和計算機之間數據傳輸的基本功能。

USB設備接口設計

USB設備接口設計主要包含兩方面的內容:USB芯片和光纜檢測系統之間的接口;USB芯片和計算機之間的接口設計。其中USB芯片和光纜檢測系統之間的接口可分為固件配置程序設計和接口時序設計;USB芯片和計算機之間的接口可分為驅動程序設計以及驅動程序和應用程序之間的通信。

固件配置程序

USB傳輸類型包括中斷傳輸(interrupt)、批量傳輸(bulk)、等時傳輸(iso)、控制傳輸(control)四種類型,四種類型的相關特性:數據最大長度、數據周期性、發生錯誤是否重傳、可得到的最大帶寬等都存在較大區別。根據光纜檢測系統和計算機之間數據交互的特點,CY7C68013被配置為slave、異步、bulk模式。圖2是固件程序的框架結構,只完成數據讀寫的功能,不對數據進行任何處理。

要實現最基本的數據讀寫功能只需要在TD_Init函數中進行配置,由于篇幅原因這里僅列舉比較重要的一些寄存器的配置情況(表1)。

這里僅僅配置了端點2和端點6,端點2配置為寫設備地址,端點6配置為讀設備地址,兩個端點都設置為4個緩沖區,緩沖區大小設置為512bytes,兩個端口都設置為自動方式,這樣設置可以使得讀寫數據非常方便,大大減少開發時間和復雜性。

接口時序設計

異步slavefifo寫時序設計

外部主控器進程如下:

IDLE:當寫事件發生時,轉到狀態1。

狀態1:指向IN FIFO,激活FIFOADR[1:O],轉向狀態2。

狀態2:如果FIFO滿標志為1(1:FIFO不滿;0:FIFO滿),則轉向狀態3,否則停留在狀態2。

狀態3:傳送總線驅動數據。傳送一個數據,激活SLWR,轉向狀態4。

狀態4:如果有更多的數據要寫,則轉向狀態2,否則轉向IDLE。

實現異步從屬FIFO讀和實現異步從屬FIFO寫大同小異,這里不再贅述。

驅動程序設計

驅動程序設計主要包括驅動程序設計、用來安裝驅動程序的inf文件設計。Cypress公司為了使用戶使用簡單,已經完成了大部分工作,用戶只需要對其驅動程序和inf文件作一些必要的修改就可以實現需要的功能。用戶可以去掉Cypress公司提供的部分不需要的功能,同時需要對USB設備描述符、配置描述符、接口描述符、端點描述符和串描述符進行修改。

固件驅動程序的功能是使計算機認識自己的USB設備,因此需要對設備進行固件程序配置,固件配置程序可以在Cypress公司提供的框架下進行修改,主要是對端點和選擇模式相關的寄存器進行配置,然后通過提供的hex2c將生成的十六進制文件轉換為一個數組,并將該數組替換驅動程序中的firmware[],用DDK進行編譯產生固件驅動程序。計算機通過搜索注冊表中的設備VID和PID來識別USB,如果存在EEPROM或者是FLASH,則這個VID和PID可以開發人員自己定制。如果沒有EEPROM則VID必須為04b4,PID必須為8613,否則設備將無法被識別。

下載固件驅動程序后,需要下載通用驅動程序,通用驅動程序可以完成需要設備完成的一系列功能。通用驅動程序可以直接使用Cypress公司提供的通用驅動程序。配置的時候VID和PID必須和inf文件中通用驅動程序的VID和PID一致。

lnf文件的編寫

所有的USB設備都至少具有一個VID和PID,VID和PID通過設備描述符表提交給Windows系統,同時,Windows系統使用INF文件將某一個VID和PID綁定到某一設備驅動程序。這樣,Windows系統在知道了設備的VID和PID后,就通過存儲在INF文件中的信息查找該設備的驅動程序。第一次安裝后,VID和PID信息就保存在注冊表中,以后當該設備重新插上時,系統就會在注冊表中很快的查找該設備的驅動程序信息。

固件驅動程序的VID和PID必須為04b4和8613(如果有EEPROM則可以定制),固件驅動程序主要是用來自動加載固件配置;通用驅動程序的VID和PID必須和固件程序中配置的一致;

讀寫測試的C語言程序

操作設備之前需要安裝驅動程序,此時需要把sys文件和inf文件分別拷貝到系統文件夾system32\drivers和inf下,然后依次選擇驅動程序目錄文件進行安裝即可,驅動程序安裝成功后就可以對設備進行訪問。訪問過程通常分為三個階段:打開設備、操作設備、關閉設備。

打開設備可以通過符號鏈接名方式,用CreateFile函數可以以同步方式打開設備,獲取設備句柄。操作設備通過DeviceIoControl函數可以完成,由于接口時鐘不同,所以要用異步方式對設備進行讀寫,否則設備讀寫將會出現錯誤;讀取設備時采用直接程序控制方式,即CPU不斷查詢設備的FULL狀態位,當有數據到達時該位變為低電平,CPU就開始讀取數據。設備操作完成后通過CloseHandle函數關閉設備句柄。

第6篇

    通用串行總線(Universal Serial Bus,即USB)以其方便的即插即用和熱插拔特性,以及較高的傳輸速率,成為PC領域廣為應用的外設連接規范。目前,國內外普遍采用的是USB1.1規范,它支持兩種傳輸速率:1.5Mbps和12Mbps,主要應用在低速傳輸要求的場合。2000年的USB2.0規范提供了480Mbs的傳輸速率,以滿足更快的數據傳輸要求。

    為了使MPEG視頻卡快速地向PC機傳送大量的數據,我們在設計MPEG視頻卡與PC機的接口時采用USB2.0技術。對USB的設計與開發,我們是基于CYPRESS公司的EZ-USB FX2系列的CY7C68013芯片及其FX2開發包。

    1、 硬件設計

    傳統的采用PCI接口的MPEG視頻卡, 不但占用了有限的PCI插槽,安裝不方便,而且不支持熱插拔和即插即用。所以,在本設計中,我們選用USB2.0接口芯片對傳統的MPEG視頻卡進行了改進。

    改進后的USB2.0接口的方案如圖1所示。

   

    該USB2.0接口的MPEG視頻卡的工作原理為:音視頻信號經AK4550音頻處理芯片及AA7113視頻處理芯片進行A/D轉換,將模擬信號轉換成8bit的PCM格式的數字信號,傳入SZ1510音視頻壓縮采集芯片進行處理,將編碼調制PCM格式的數據轉化為符合格式MPEG-1的混合影視文件,最后MPEG-1數據經USB接口芯片送給PC機作進一步的處理,如存儲、顯示等。

    設計中,我們選用的USB接口芯片是EZ-USB FX2 系列的CY7C68013芯片。該芯片是針對USB2.0的,而且和USB1.1兼容,它支持兩種傳輸速率:全速(Full_speed)12Mbps和高速(High_speed)480Mbps,它不支持低速(Low_speed)1.5Mbps。該芯片的內部結構如圖2所示。

    CY7C68013-128AC內部集成了一個增強的8051內核,它既與標準的8051兼容,又有諸多的改進:最高工作頻率48MHZ,一個指令周期只需4個時鐘周期,比標準的8051平均提高了2.5倍;2個UARTS端口;3個定時/記數器;擴展的中斷系統及其更多I/O口等。CY7C68013內部集成的USB2.0的SIE能完成大部分USB2.0協議的處理工作,減少了用戶對繁雜的USB協議的處理。另外,用戶在開發時,可以利用GPIF和FIFO方式實現與高速外圍設備之間的邏輯連接,并進行高速數據的傳輸。在該改進方案中,我們選用的是GPIF方式,實現和Z1510之間的通信。

    2、 軟件設計

    USB 軟件設計包括三方面的工作:固件(Fireware)設計,驅動程序設計和主機端應用程序的設計。

    (1) 固件設計

    設計中,我們考慮到MPEG視頻卡要求快速地持續地傳送大量數據,并對數據的完整性要求不太高,我們采用ISO傳輸方式。另外,我們讓CY7C68013工作在GPIF模式下的FIFO Read方式,最多可以傳輸4G byte(WORDWIDE=0)或word(WORDWIDE=1)。外設的數據由于不需8051的處理,我們采用自動打包的方式(AUTOIN=1),直接從FIFO到SIE,這樣有利于提高傳輸速率。其主要實現代碼如下:

void  TD_Init( )

{

CPUCS = 0X01;   

file://CLKSPD[1:0]=10; for 48MHz operation.

GpifInit( );

   ……

SYNCDELAY;

EP6CFG = 0XDA; 

file://端點配置: 同步IN方式、緩沖大小1024字節

SYNCDELAY;

FIFORESET = 0X80; 

// activate NAK_ALL to avoid race conditions

SYNCDELAY;

FIFORESET = 0X06;    file://reset, FIFO 6

SYNCDELAY;

FIFORESET = 0X00;    file://deactivate NAK_ALL

SYNCDELAY;

EP6FIFOCFG = 0X0D;   file://wordwide=1

SYNCDELAY;

……

}

    (2) 驅動程序設計

    在WINDOWS平臺下,USB 驅動程序由三部分組成:USB設備驅動程序,USB總線驅動程序和USB主控制器驅動程序,它們必須遵循WIN32驅動程序模型(WDM)。其中,WINDOWS操作系統已經提供了處于驅動程序棧底的USB總線驅動程序和USB主控制器驅動程序。而USB設備驅動程序由設備開發者編寫,它通過向USB總線驅動程序發送包含URB(USB  Request Block)的IRP(I/O Request Packet),來實現USB外設之間的信息交換。當主機應用程序要對USB設備進行I/O操作時,它調用Windows API函數對Win32子系統進行Win32調用,由I/O管理器將此請求構造成一個合適的IRP,并把它傳遞給USB設備驅動程序。USB設備驅動程序接受到這個IRP后,根據IRP中包含的具體操作代碼,構造響應的URB并把它放到一個新IRP中,然后把此IRP傳遞到USB總線驅動程序,USB總線驅動程序根據IRP中所包含的URB執行響應的操作,并把操作結果通過IRP返還給USB設備驅動程序。USB設備驅動程序接受到此IRP后,將操作結果通過IRP返還I/O管理器。最后,I/O管理器將此IRP中操作結果返還給應用程序,至此應用程序對USB設備的一次I/O操作完成。

    開發USB設備驅動程序,可采用Numega公司的開發包Driver Works和 Microsoft公司的2000DDK,并以VC++6.0作為輔助開發環境。Driver Works提供的驅動向導,,可根據用戶的需要,自動生成代碼框架。減少了開發的難度,縮短了開發的周期。

    在CYPRESS公司的EZ-USB FX2開發包中,有一個通用的驅動程序,該程序可不加修改經DDK編譯后直接使用。在本設計中,由于時間關系,我們采用的就是這個通用驅動程序(GPD)。

    (3) 應用程序設計

    USB主機應用程序是計算機中完成特定功能的程序,其關鍵是實現從USB 外設讀取或發送特定數量的數據,USB標準設備請求和特定的命令等。另外,可以對數據做進一步的處理,如:存儲、顯示、快速傅立葉變換等。在WINDOWS 2000下,我們所使用的應用程序開發工具是VC++6.0。

第7篇

關鍵字:JDBC;數據庫;MySql

Java數據庫連接(JDBC)由一組用 Java 編程語言編寫的類和接口組成。JDBC 為工具/數據庫開發人員提供了一個標準的 API,使他們能夠用純Java API 來編寫數據庫應用程序。然而各個開發商的接口并不完全相同,所以開發環境的變化會帶來一定的配置變化。

一、連接各種數據庫方式速查表

下面羅列了各種數據庫使用JDBC連接的方式,可以作為一個手冊使用。

1. Oracle8/8i/9i數據庫(thin模式)

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為數據庫的SID

String user="test"; String password="test";

Connection conn= DriverManager.getConnection(url,user,password);

2. DB2數據庫

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();

String url="jdbc:db2://localhost:5000/sample"; //sample為你的數據庫名

String user="admin"; String password="";

Connection conn= DriverManager.getConnection(url,user,password);

3. Sql Server7.0/2000數據庫

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";String user="sa"; String password="";

Connection conn= DriverManager.getConnection(url,user,password);

4. Sybase數據庫

Class.forName("com.sybase.jdbc.SybDriver").newInstance();

String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB為你的數據庫名

Properties sysProps = System.getProperties();

SysProps.put("user","userid");

SysProps.put("password","user_password");

Connection conn= DriverManager.getConnection(url, SysProps);

5. MySQL數據庫

Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB 為數據庫名

Connection conn= DriverManager.getConnection(url);

6. access數據庫直連用ODBC的

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;

String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");

Connection conn = DriverManager.getConnection(url,"","");

Statement stmtNew=conn.createStatement() ;

二、JDBC連接MySql方式

下面是使用JDBC連接MySql的一個小的教程

1. 查找驅動程序

MySQL目前提供的java驅動程序為Connection/J,可以從MySQL官方網站下載,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驅動程序為純java驅動程序,不需做其他配置。

2. 動態指定classpath

如果需要執行時動態指定classpath,就在執行時采用-cp方式。否則將上面的.jar文件加入到classpath環境變量中。

3. 加載驅動程序

trClass.forName(com.mysql.jdbc.Driver);

System.out.println(Success loading Mysql Driver!);

}catch(Exception e){System.out.println(Error loading Mysql Driver!);e.printStackTrace();}

4. 設置連接的url

jdbc:mysql://localhost/databasename[?pa=va][&pa=va]

三、以下列出了在使用JDBC來連接Oracle數據庫時可以使用的一些技巧

1. 在客戶端軟件開發中使用Thin驅動程序

在開發Java軟件方面,Oracle的數據庫提供了四種類型的驅動程序,二種用于應用軟件、applets、servlets等客戶端軟件,另外二種用于數據庫中的Java存儲過程等服務器端軟件。在客戶機端軟件的開發中,我們可以選擇OCI驅動程序或Thin驅動程序。OCI驅動程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數據庫進行通訊。Thin驅動程序是純Java驅動程序,它直接與數據庫進行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發中使用OCI驅動程序,這似乎是正確的。但我建議使用Thin驅動程序,因為通過多次測試發現,在通常情況下,Thin驅動程序的性能都超過了OCI驅動程序。

2. 關閉自動提交功能,提高系統性能

在第一次建立與數據庫的連接時,在缺省情況下,連接是在自動提交模式下的。為了獲得更好的性能,可以通過調用帶布爾值false參數的Connection類的setAutoCommit()方法關閉自動提交功能。

3. 在動態SQL或有時間限制的命令中使用Statement對象

在執行SQL命令時,我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個SQL命令,PreparedStatement都只對它解析和編譯一次。當使用Statement對象時,每次執行一個SQL命令時,都會對它進行解析和編譯。這可能會使你認為,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進行的測試表明,在客戶端軟件中,情況并非如此。因此,在有時間限制的SQL操作中,除非成批地處理SQL命令,我們應當考慮使用Statement對象。

第8篇

【摘要】 我們從軟件技術的角度,論述了在Windows XP環境下基于PCI總線數據采集卡實現實時測控所需要的關鍵技術、軟件體系結構和開發方法。遵循本文所討論的技術路線,開發了DFQ系列多方位牽引床的測控軟件,提高了被控系統的控制精度和可靠性,增強了系統的可用性。

【關鍵詞】 PCI總線;WDM設備驅動程序;軟件體系結構;計算機測量與控制

Abstract:The key techniques, software architecture and development method used to implement real-time measurement and control based on PCI bus data acquisition card in Windows XP environment are discussed from the viewpoint of software technology. The measurement and control software for DFQ multidimensional traction bed are developed according to the techniques provided in this paper,the precision, high reliability and better usability of the object system are improved.

Key words:PCI Bus;WDM device driver;Software architecture;Computer measurement and control

1 引 言

計算機測控技術在生產實踐中有著廣泛的應用?;谟嬎銠C技術的測控系統主要分為兩種類型。一類是以各種單片機、可編程邏輯芯片為核心組成的測控系統,這類測控系統一般適用于功能要求相對簡單的被控對象,可獨立構成測控系統,或以PC機作為上位機構成兩級級聯的測控系統,此時PC機一般負責界面處理。一類是以PC機為核心構成的測控系統,PC機通過數據采集卡及接口電路連接到被控對象。由于PC機具有高性能、易用性、可擴展性和豐富的軟件資源等,此類系統可適用于功能要求較為復雜的被控對象。

Windows XP是一個多任務的并能夠滿足實時要求的操作系統,是目前PC機普遍采用的操作系統之一。PCI總線是高性能的局部總線,支持高速數據傳輸,是PC機上流行的總線接口標準。我們從軟件技術的角度,討論了在Windows XP操作系統下,基于PCI總線數據采集卡,在工業現場實現實時數據測控的關鍵技術,包括實時I/O端口讀寫和定時數據采集的實現方法。本研究的技術已成功應用于DFQ多方位牽引床的軟件研發,取得了良好的效果。由于是在Windows XP操作系統下采用實時測控技術,最終設計完成的牽引床系統功能豐富,控制精確,可靠性高,具有良好的用戶界面。

2 系統的關鍵點和技術難點

Windows XP是一個多用戶、多任務的操作系統。由于允許多個任務并發執行以及允許多個用戶同時登錄操作系統,安全性和穩定性是Windows XP操作系統設計的主要目標之一。在Windows XP操作系統下,計算機的運行狀態被強制為用戶態和核心態兩種狀態。對于一個程序,在一個確定的時刻,要么在用戶態執行,要么在核心態執行。在用戶態運行的程序處于系統最低的中斷請求級(interrupt request level,IRQL)上,隨時可以被具有更高中斷請求級的中斷請求所打斷[1]。因此,為了能夠在給定的時間約束內發出控制信號和采集數據,滿足系統的實時性要求,提高系統可靠性,必須使得測控程序能夠在核心態執行。

其次,為了滿足自身的穩定性,Windows XP將對硬件的訪問封裝在了系統底層。用戶態的應用程序不能直接訪問硬件資源,包括讀寫I/O端口和內存,響應中斷,執行DMA操作等。在Windows XP下,程序只有轉入核心態,并通過系統調用才能直接訪問硬件資源。顯然,若能夠獲得直接訪問硬件的能力,則可明顯提高測控程序的實時性和效率。

綜上所述,在Windows XP操作系統下,測控軟件要獲得本質上的實時性和高可靠性,必須具有在操作系統核心態運行的能力。設備驅動程序是Windows XP留給用戶的允許用戶獲得核心態運行能力的唯一開發接口[1]。WDM(windows driver model)驅動程序模型是Windows XP下的設備驅動程序的模型之一,測控軟件可借助WDM驅動程序實現所要求的實時性和高可靠性。

3 系統組成和開發環境

如圖1所示,牽引床控制系統由PC機、PCI總線數據采集卡、外圍接口電路和牽引床四部分組成[2]。PCI總線數據采集卡是通用的標準模塊,可供選擇的產品很多,本系統使用凌華公司的PCI 9111數據采集卡[3]。接口電路完成模擬信號和數字信號的調理和傳輸。

系統測控程序由上層主程序和下層設備驅動程序兩部分組成。主程序完成系統的總體邏輯功能和界面交互,運行于操作系統的用戶態。設備驅動程序采集數據,完成牽引床的各種基本控制動作,運行于操作系統的核心態。主程序和驅動程序之間通過事件通知的機制完成通信聯絡,驅動程序向下調用操作系統的系統服務完成基本控制動作。

軟件開發環境由Windows XP DDK(Driver Develo

pment Kit)、DriverStudio 3.1和Visual C 6.0組成。Visual C 6.0是系統主程序和驅動程序的集成開發調試環境,DriverStudio 3.1和Windows XP DDK用于編譯生成驅動程序。

4 測控程序設計

我們本節論述測控程序設計的幾個關鍵問題,包括訪問PCI 9111數據采集卡,讀寫I/O端口,定時中斷的實現方法和主程序與驅動程序的通信共四部分。

4.1 訪問PCI 9111數據采集卡

PCI 9111是一塊集成的多功能數據采集卡,具有數字量輸入輸出、模擬量輸入輸出、定時計數的基本功能,支持軟件查詢方式、中斷方式、DMA方式多種數據傳輸方式,AD采樣頻率最高支持100 KHz。PCI 9111板卡上使用PCI 9052[4]作為PCI總線接口芯片,支持PnP即插即用功能,用戶無需手工設置板卡使用的硬件資源(如IO基地址、中斷請求號等),這些硬件資源由計算機的PnP子系統自動分配。用戶通過基地址BASE加偏移量的IO端口讀寫方式,訪問PCI 9111的各寄存器,實現對PCI 9111的控制命令寫入和數據輸入輸出。因此,要訪問PCI 9111,必須首先要獲得PnP子系統分配給PCI 9111的基地址。

根據PCI總線規范,PnP子系統分配給PCI設備的基地址,存儲在PCI接口芯片的BAR0~BAR5共六個PCI配置寄存器(PCI configuration registers,PCRs)中。對于PCI 9111板卡而言,BAR1中存儲的是PCI 9052芯片局部配置寄存器(local configuration registers,LCRs)的起始地址,BAR2中存儲的是局部地址空間0的基地址,即PCI 9111板卡寄存器的基地址BASE。

PnP子系統為PCI設備分配的硬件資源,由操作系統的PnP管理程序通知給PCI設備的設備驅動程序。在DriverStudio的WDM設備驅動程序框架下,該信息以IO請求包(Irp)的形式傳遞給驅動程序設備類(是KPnpDevice的子類)的OnStartDevice()成員函數。在OnStartDevice()函數中,通過如圖2中的代碼,可獲得BAR1寄存器和BAR2寄存器的值。

NTSTATUS DfqDevice::OnStartDevice(KIrp I)

{

……

PCMRESOURCELIST pResListRaw=I.AllocatedResources();

PCMRESOURCELIST pResListTranslated=I.TranslatedResources();

KPciConfiguration PciConfig(mLower.TopOfStack());

//BAR1

mIoLCR.Initialize(pResListTranslated, pResListRaw,

PciConfig.BaseAddressIndexToOrdinal(1));

//BAR2

mIoPortRange.Initialize(pResListTranslated, pResListRaw,

PciConfig.BaseAddressIndexToOrdinal(2));

……

}

圖2 初始化mIoLCR和mIoPortRange

Fig 2 Initialization of mIoLCR and mIoPortRange

在圖2所示的代碼中,mIoLCR和mIoPortRange都是DfqDevice類的KIoRange類型的成員變量。圖2所示代碼實際上是使用BAR1和BAR2寄存器的值分別對mIoLCR和mIoPortRange進行了初始化。mLower是DfqDevice類的KPnpLowerDevice類型的成員變量,該成員變量指向代表PCI設備的底層物理設備對象。

4.2 讀寫IO端口

一旦初始化mIoPortRange和mIoLCR,進行IO端口讀寫就非常容易。使用KIoRange類的成員函數inx()/outx(),可完成對指定端口的讀寫,其中x可為b、w、d,分別表示8位數據、16位數據和32位數據。于是,調用m_IoPortRange對象的IO讀寫成員函數,可訪問PCI 9111板卡的各寄存器;調用mIoLCR對象的IO讀寫成員函數,可訪問PCI 9052芯片的各局部配置寄存器。參照PCI 9111的用戶手冊[3],就可以方便地完成PCI 9111數據采集卡的數字量輸入、數字量輸出、軟件查詢式AD轉換和模擬量輸出功能。

4.3 定時中斷

對于實時過程監控,最為關鍵的是能夠定時檢測被控對象的狀態,一旦達到預定義的條件,則發出相應的控制命令。這就需要設備驅動程序能夠提供精確的定時中斷。

PCI 9111板卡上提供了8254定時/計數器,可用于實現定時中斷。通過編程設置PCI 9111,可令8254定時/計數器的輸出作為中斷源發起定時中斷請求。在中斷服務程序內,可以完成AD數據采集(從而實現定時中斷式AD轉換)、數字量數據輸入輸出等各種定時執行的任務。對于中斷式AD轉換,也可以編程設置PCI 9111,令8254定時/計數器的輸出作為AD轉換觸發信號,而AD轉換器的AD轉換結束信號作為中斷源發起中斷請求。由于AD轉換器是定時觸發,此時亦可實現定時中斷式AD轉換。

要使得驅動程序能夠響應來自PCI 9111的硬件中斷,首先需要編寫在設備類里的中斷服務程序鏈接到PnP子系統,分配給PCI 9111的中斷請求號(IRQ)上。代碼見圖3。

NTSTATUS DfqDevice::OnStartDevice(KIrp I)

{

……

mInterrupt.InitializeAndConnect(pResListTranslated, LinkTo(ISR), this);

……

}

圖3 鏈接中斷服務程序到系統分配的中斷請求號

Fig 3 Link interrupt service routine to interrupt request number of

system distribution

圖3的代碼中,mInterrupt是定義在DfqDevice類中的KInterrupt類型的中斷對象。ISR是DfqDevice類的成員函數,即實際的中斷服務程序。

由于Windows XP是一個多任務的操作系統,在編寫中斷服務程序時,要考慮留給其他程序執行的機會,因此,在中斷服務程序中,通常完成當前最為緊迫的任務。由于多個物理設備可能共享同一個中斷請求號,因此在中斷服務程序中,首先判斷所響應的中斷請求是否來自PCI 9111。若不是,則立即返回,以節省時間。然后清除硬件中斷,以便下一次中斷請求能夠正常產生(而不被阻塞)。然后針對具體被控對象的定時執行的任務。

在DFQ牽引床控制軟件中,編程使PCI 9111板卡的8254定時技術芯片每160 μs產生一次中斷。在每次中斷中完成AD數據采集和數字量輸入,檢測當前動作的執行情況。當AD采樣值達到主程序設定要求時,即牽引床動作到位,中斷服務程序及時發出動作結束信號。牽引床的每個動作的執行都在頻率為6 KHz的AD采樣監視之下完成。首先,由于AD采樣頻率高,牽引床動作(如距離、角度等)的執行非常精確。牽引床動作的實際誤差基本不受測控軟件的影響,而主要取決于牽引床本身的機械結構所帶來的誤差。其次,由于牽引床的動作控制信號是在設備驅動程序中發出的,而設備驅動程序具有比任何Windows線程更高的中斷請求級(IRQL),牽引床工作的可靠性明顯提高。在連續長時間的測試以及大量用戶的反饋中,牽引床系統幾乎沒有出現錯誤動作。

值得提出的是,由于PCI 9111的AD轉換頻率最高可達100 KHz,因此在實際使用中,8254的定時常數可以設置得比160 μs更低,如十微秒級,這樣可以完成對于更加快速控制過程的實時監控。另外,在許多系統中,人們也使用Windows提供的軟件定時器或編寫已有驅動程序的回調函數實現過程監控,但這并不能從根本上滿足實時要求。其原因為:(1)軟件定時器工作在用戶態,不具有嚴格的實時性。(2)由于受Windows操作系統線程調度模型的制約,軟件定時器和回調函數只能實現毫秒級或十毫秒級的定時,不能滿足高速的實時測控要求。因此,設備驅動程序設計的方法保證了數據采集和過程監控的實時性、高精度和可靠性。

4.4 主程序和設備驅動程序的通信

主程序和設備驅動程序是功能相對獨立的兩個程序,它們之間通過通信聯絡完成控制命令和數據的傳輸。主程序和設備驅動程序之間通信的典型方法有異步IO、事件通知等[3,5]。DFQ牽引床系統采用事件通知的方法完成主程序和設備驅動程序之間的通信。

在此,以牽引床的一個基本動作的執行過程為例,說明主程序和設備驅動程序之間的通信。首先,主程序調用SDK函數 CreateEvent(NULL, FALSE, FALSE, NULL)創建事件句柄hEvent,其中第二個參數FALSE表示所創建的事件為自動重置事件,第三個參數FALSE表示事件的初始狀態為無信號狀態。然后主程序調用SDK函數DeviceIoControl()向設備驅動程序發出控制命令,命令參數中含有事件句柄hEvent。最后,主程序調用SDK函數WaitForSingleObject()等待事件hEvent變為有信號狀態,從而主程序線程進入阻塞狀態。設備驅動程序在控制命令處理函數中通過new(NonPagedPool) KEvent(hEvent, OBJECTTYPEALLACCESS)創建KEvent類對象pEvent,然后啟動動作執行,并中斷對動作進行定時監控。當檢測到動作執行到位(或遇到異常情況中止)后,設備驅動程序調用pEvent->Set()將事件對象hEvent設置為有信號狀態。此時主程序線程作系統喚醒,繼續向下執行。主程序可進一步訪問設備驅動程序獲得動作的執行情況以做出相應的處理。

事件通知的方法,在保證牽引床動作執行的實時性、可靠性和精確性的同時,還符合多任務系統的設計原則,主程序和設備驅動程序并不會持續長時間獨占CPU而影響計算機整體性能。這是因為:(1)在牽引床動作執行期間,主程序因調用WaitForSingleObject()而一直處于阻塞狀態,并沒有獲得執行。(2)在牽引床動作執行期間,設備驅動程序通過定時中斷的方法,只是每隔設定的一段時間(在牽引床系統中設置為160 μs),檢測一次動作的執行情況,設備驅動程序也沒有在動作執行期間獨占CPU。這樣,CPU就會有充足的時間執行其他的程序。于是,可在主程序中進一步使用多線程技術,實現更為復雜的邏輯控制功能。如牽引床的快速牽引、復合牽引等各種治療功能就是使用多線程技術實現的。

5 結束語

本研究從操作系統底層的角度,對Windows XP操作系統的實時測控技術進行了研究和探討。通過WDM設備驅動程序設計的方法,使程序獲得在系統核心態執行的能力,從而實現實時過程監控。以DFQ牽引床系統為例,剖析了在Windows XP操作系統下,基于PCI總線數據采集卡進行實時過程監控的關鍵技術。遵循本文的技術路線,我們設計了DFQ牽引床系統的測控軟件,產品質量檢測和實際應用均表明,DFQ牽引床工作可靠性高,動作完成精確到位,測控軟件具有良好的易用性。本研究所論述的實時測控技術可適用于一般的控制系統。

參考文獻

[1]尤晉元,史美林.Windows操作系統原理[M]. 北京:機械工業出版社,2001.

[2]劉傳永,張明,王艷萍,等.雙中心重合式脊柱治療機的研制[J].生物醫學工程研究,2006,25(1):55-57

[3]ADLINK Technology.PCI-9111 DG/HR multi-functions data acquisition card User's guide[EB/OL].adlinktech.com/PD/Download/adlinktechnology-index.php.2008-01-10.

[4]武安河,邰銘,于洪濤.Windows 2000/XP WDM設備驅動程序開發[M]. 北京:電子工業出版社,2003.

第9篇

由于工作關系,我經常涉及PC機與設備接口的工作,從PC機這方面要做的工作看來,主要是通過接口處理設備的中斷,通過I/O端口或內存地址與外設互相傳遞數據。從計算機原理的角度看,所要達到的目的很簡單,那么如何編寫程序完成上述功能呢?

目前國內流行的PC操作系統有三種:DOS,Win95/98系列,WindowsNT。DOS是單用戶、單任務操作系統,由于PC機硬件處理速度不斷提高,基于單用戶、單任務的操作系統越來越不能充分發揮硬件的功能,現在只應用于一些老式PC及其它個別場合,有逐漸被淘汰的趨勢;Win95/98系列和WindowsNT屬于多任務操作系統,不論從其原理還是界面上看,這兩種操作系統都比DOS有著無可比擬的優越性,這兩種操作系統雖然在界面和操作上及其相似,但其內部實現的諸多方面有許多區別,有些區別是本質上的。Win95/98設計目標是針對一般家庭用戶,安全性及可靠性存在許多薄弱環節,就可靠性而言,Win95/98系列不能很好的防止多任務環境中某個進程的非法操作導致系統中其它程序甚至整個系統的崩潰,而WindowsNT在這方面及其它諸多方面設計的相當嚴謹。這兩種操作系統是Microsoft公司同一時期的產品,但針對不同的使用群,所以在一些重要場合及生產實踐中應該選擇WindowsNT作為計算機的操作系統,此外,從發展趨勢來看,WindowsNT已經成為定型產品,具有相對穩定性。

在不同操作系統下編寫驅動程序是有很大區別的,在DOS平臺上,應用程序和設備驅動程序之間沒有標準的接口,它們在外部表現為一個擴展名為EXE的文件,驅動程序的作用被柔和在應用程序中,這樣,應用程序為了使用不同廠商的同一類設備,必須了解這些設備在接口上具體的硬件實現,同時,對于一個特定型號的硬件產品,所有支持它的應用軟件中對于控制整個設備動作的這部分代碼,可能被多次重寫。這種情況不適應硬件及應用軟件的飛速發展。Windows系統在這方面,進行了根本性改進,把控制設備動作的這部分代碼獨立出來,提出了設備驅動程序的概念,驅動程序是應用程序和硬件設備之間的一個橋梁,應用程序與驅動程序之間有明確的接口,應用程序通過與驅動程序交換信息,達到控制外設的目的。接口定義的操作是面向設備的,這就是說,在應用程序的設計中,并不用關心對外設操作的具體硬件實現,只是對驅動程序發出一系列指令既可;驅動程序接受來自上層應用程序的指示,具體操縱實際硬件,完成用戶功能。具體實現上,Win95/98系列與WindowsNT又有所區別,WindowsNT是嚴格按照上述思路設計的;而Win95/98系列不那么嚴格,其支持上述思路,但同時應用程序也可以繞過驅動程序直接訪問實際物理I/O,這樣做,增加程序設計的靈活性,但同時,對系統可靠性造成一定隱患。這也正是Win95/98系列可靠性低于WinNT的原因之一。

WindowsNT設備驅動程序的組成原理

WindowsNT操作系統結構分為用戶模式和內核模式,用戶模式下的編程為應用程序的設計,而開發設備驅動程序,則屬于內核模式下的編程,內核模式組件包括NTExecutive(ExXxx),內核(KeXxx),硬件抽象層(HalXxx)。其層次如圖2-1所示,其中NTExecutive包括幾個獨立的軟件組件,它們是系統服務接口(ZwXxx),對象管理器(ObXxx),配置管理器,進程管理器(PsXxx),安全監視器(SeXxx),虛擬空間管理器(MemXxx),本地進程調用,I/O管理器(IoXxx)。內核模式的系統服務并不是全部公開的,而是提供了一系列開發設備驅動程序需要的函數(上文括號內為函數形式,函數手冊參見[2]Kernel-ModeDrivers-Reference章節),換言之,這些函數功能是所有內核模式的系統服務功能的子集。

驅動程序由一系列相對獨立的函數組成,由I/O管理器根據需要調用這些函數,對于一個需要處理中斷的最簡單的驅動程序也需要由以下幾個函數構成:

1.DriverEntry()運行于PASSIVE_LEVEL

驅動程序入口點,當驅動程序被手動或自動裝入系統后,驅動程序從這點開始執行,主要用于定位硬件資源,建立指向其它驅動程序函數的指針等其它初始化工作。

2.XxUnload()運行于PASSIVE_LEVEL

用于驅動程序從系統卸出之前,釋放由驅動程序占用的所有系統資源。

3.XxIsr()運行于DIRQL

中斷服務程序。

4.XxDpcForIsr()運行于DISPATCH_LEVEL

中斷服務程序后處理程序,以排隊方執行不太關鍵代碼的執行,由于排隊機制及優先級,不會造成代碼擁塞從而提高中斷服務程序的響應并且提高系統總體I/O吞吐率。

5.XxOpen()運行于PASSIVE_LEVEL

處理應用程序Win32函數CreateFile()請求。

6.XxClose()運行于PASSIVE_LEVEL

處理應用程序Win32函數CloseHandle()請求。

7.XxDispatch()運行于PASSIVE_LEVEL

處理應用程序Win32函數DeviceIoControl()請求,通過一系列自定義命令,驅動程序與應用程序交換特定的信息。

WindowsNT使用一個抽象化的CPU優先級方案,IRQL代表中斷請求級,任一時刻CPU總處在某一級上,這個數越大,表示當前的任務重要性越大,如表2-1所示,從上至下IRQL越來越小。所有上述驅動程序的函數及內核模式函數都必須運行于各自的IRQL級上,如果違反這一調用規定,會造成系統崩潰。例如,中斷服務程序(XxIsr)運行于DIRQL及上,那幺在編寫中斷服務程序時,只能調用允許在這一級運行的內核模式函數(并不是所有內核模式函數都能運行于DIRQL級)。至于每個內核模式函數運行級別的說明,詳見[2]Kernel-ModeDrivers-Reference章節。

WindowsNT是一多任務系統,許多設備的驅動程序同時存在系統中,這樣各個設備所占用的資源(中斷,I/O及RAM地址空間)很有可能沖突,如果設備驅動程序在運行之前不進行‘探測’而使用自己硬件設備的資源,有可能和系統內其它設備占用的資源沖突,后果不堪設想。WindowsNT通過注冊表管理硬件資源的占用信息,作為內核模式信任的組件,驅動程序使用硬件資源之前必須遵循‘查詢-申請-使用-釋放’的原則

WindowsNT設備驅動程序的編寫步驟與實例

現以一實際例子簡要說明設備驅動程序的開發步驟,本例以CINRAD天氣雷達測試卡實際應用為原型,加以簡化、抽象。

第一步,了解被控設備的接口情況。

本例為一ISA卡,占用PC機9號中斷,I/O地址360H及RAM地址D0228H分別一個字空間。

第二步,確定驅動程序的功能。

驅動程序每當9號中斷達到時,檢查運行標志變量RunFlag(為一BOOL變量),如果等于TRUE,中斷累積計數器counter(為一unsignedshort變量)增一,把這個值寫入RAM地址D0228H,再從這個地址讀出,如果讀出值等于寫入值,把這個值寫入I/O地址360H,這個地址的內容會驅動板卡上的LED顯示,把寫入值顯示出來;如果讀出值不等于寫入值,設置運行標志變量FALSE。如果運行標志變量等于FALSE,什幺也不做,返回。

第三步,定義驅動程序與應用程序的軟件接口。

本例定義兩個接口命令:

IOCTL_IOCardA_START:應用程序設置驅動程序內部的運行標志變量等于TRUE。

IOCTL_IOCardA_READ:應用程序查詢驅動程序內部的中斷累積計數器的值。

第四步,畫流程圖。這里列舉本例實現的幾個主要流程圖,(圖略)。

系統傳給驅動程序入口函數系統定義的‘設備驅動對象’DrObj,通過初始化這個對象的一些成員變量,把驅動程序其它函數與這個對象聯系起來。

ISA卡為非即插即用設備,事先把資源占用信息手工添加注冊表如下:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IOCardA\parameters]

"IRQ"=dword:00000009

"IOSPAN"=dword:00000004

"IOAdd"=dword:00000360

"RAMAdd"=dword:000d0228

"RAMSPAN"=dword:00000002

其中IOCardA以下各子鍵及其值為自定義,設備驅動程序利用相應函數檢索出這些值。

(3)每個設備驅動程序可以創建若干系統定義的‘設備對象’,本例根據需要只創建了一個‘設備對象’Dev?!O備對象’其中一個成員變量為指向一非分頁的物理內存塊DeviceExtension,這塊內存大小及內容為用戶自定義,由于Dev或DeviceExtension對象會被系統傳給驅動程序的其它函數,這樣驅動程序各函數通過訪問這塊內存區,實際上達到互相傳遞信息的功能。本例在這里存儲設備硬件資源信息及RunFlag和中斷計數器counter,這些數值在DriverEntry()初始化后,供驅動程序的其它函數使用。

圖3-2為中斷服務程序IOCardAIsr()流程圖。操作系統接受中斷,連同DeviceExtension等參數傳給中斷服務程序,中斷服務程序利用這些參數,實現要求功能。

圖3-3為IOCardADispatch()流程圖,這個函數用于處理來自上層應用程序的命令。上層應用程序通過以下程序段設置驅動程序中RunFlag值為TRUE,從而啟動中斷服務程序開始計數。

BOOLcmd=TRUE;

hTest=CreateFile(...);//打開設備

DeviceIoControl(hTest,//設備句柄

IOCTL_IOCardA_START,//命令

&cmd,sizeof(BOOL),//輸入緩沖區地址及大小

NULL,0,&c,NULL);

CloseHandle(hTest);//關閉設備

上層應用程序通過以下程序段查詢當前的中斷計數器的值并存于變量w中。

unsignedshortw;

hTest=CreateFile(...);

DeviceIoControl(hTest,

IOCTL_IOCardA_READ,//命令

NULL,0,

&w,sizeof(unsignedshort),//輸出緩沖區地址及大小

&c,NULL);

CloseHandle(hTest);

其中DeviceIoControl()執行后,操作系統調用IOCardADispatch()函數,如流程圖所示,這個函數內部通過一個開關語句,根據命令執行相應的分支。驅動程序與應用程序通過此函數接換數據時,操作系統提供4種可選數據緩沖方式,本例由于數據I/O量比較小,故選用‘緩沖I/O’(METHOD_BUFFERED)。過程是,I/O管理器首先分配一個非分頁池,它的大小為調用者輸入緩沖區和輸出緩沖區的較大者,第一段程序為sizeof(BOOL),第二段程序為sizeof(unsignedshort),它的地址存到IRP(I/O請求包)的AssociatedIrp.SystemBuffer域中,然后把輸入數據拷貝到這個池中,在第一段程序中cmd的值TRUE被拷貝到池中,這樣驅動程序通過RtlCopyBytes()函數再把池中的值拷貝到驅動程序的RunFlag中。IOCardADispatch()函數執行完,I/O管理器把池中的內容拷貝到調用者的輸出緩沖區,在第二段程序中,驅動程序通過RtlCopyBytes()函數把counter的值拷貝到池中,從而最終傳遞到應用程序變量w中。

第五步,編程。在編寫設備驅動程序的同時,要編寫一個簡單的應用程序用于測試設備驅動程序的一些功能。

第六步,驅動程序的載入。

驅動程序C語言源程序經過編譯、連接生成擴展名為SYS的文件,本例為IOCardA.sys,把這個文件拷貝到\WINNT\system32\drivers\系統目錄下,同時手工添加如下信息到注冊表:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IOCardA]

"ErrorControl"=dword:00000001

"Start"=dword:00000003

"Type"=dword:00000001

要保證IOCardA子鍵名與驅動程序文件名一致,其中Type=1表示此驅動程序為內核模式驅動程序,Start=3表示此驅動程序手動載入,ErrorControl=1表示當驅動程序發生錯誤時,日志記錄錯誤并顯示一個消息框。這樣當Windows重新啟動后,通過使用控制面板中的Device小應用程序,從列表中找到IOCardA設備名,按Start按鈕,于是,設備驅動程序就駐留內存并在底層開始工作了。

第七,調試。設備驅動程序沒有界面,完全在系統底層運行,為了觀察驅動程序的運行狀態,WindowsNTDDK提供windbj.exe程序用于設備驅動程序的調試,調試設備驅動程序需要兩臺CPU體系結構完全相同的計算機,一臺為‘宿主機’,運行windbj.exe程序,另一臺為‘目標機’,運行設備驅動程序,兩臺計算機用串口線連好,進行一系列軟件設置(參見[1]第17章),就可以開始調試了,從‘宿主機’可以控制及觀察‘目標機’上驅動程序的運行情況。最常用的調試手段是在驅動程序中必要的位置加入DbgPrint()函數,這個函數可以把指定信息輸出到‘宿主機’windbg.exe窗口中,通過分析這些信息,可以了解驅動程序當前的運行情況。

結束語

WindowsNT是一個復雜而嚴密的系統,驅動程序的開發不可避免的涉及現代操作系統理論及其它許多計算機理論,內涵相當廣泛,本文圍繞著開發實踐從一定深度探討了WindowsNT設備驅動程序開發最基本的知識及一般方法,希望對讀者有所幫助,對于復雜,特殊應用的實現及編程技巧,有待于讀者在各自實際應用中不斷探索。

參考文獻

第10篇

【關鍵詞】ARM;矩陣鍵盤;linux驅動;TQ2440

1.引言

ARM微處理器已廣泛應用于工業控制、消費類電子產品、通信系統等領域。矩陣鍵盤是一種常用的鍵盤形式,它將按鍵設計成M行N列,這樣共需M+N根信號線,卻可驅動M×N個按鍵,大大節約了I/O資源。本文介紹了一種利用TQ2440開發板的GPIO口擴展5×4矩陣鍵盤的方法,并將所有按鍵重新布局成手持終端的鍵盤形式,方便操作。

2.硬件設計

本設計擴展5行4列的矩陣鍵盤,如圖1所示。其中行線ROW1-ROW5連接S3C2440的中斷引腳EINT8,EINT9,EINT11,EINT13,EINT14[1]。這些中斷引腳本身連有10kΩ的上拉電阻,把中斷引腳電平拉高,確保按鍵空閑時不會觸發中斷。列線COL1-COL4連接S3C2440的普通I/O口GPF3,GPF4,GPG7,GPG10。這里需要注意的問題是:確保行線所用的中斷在Linux的其他設備中均未使用到,否則會引起該驅動程序或其他驅動程序初始化失敗。

圖1 5×4矩陣鍵盤電路原理圖

考慮到手持終端設備按鍵的常用性與操作的方便性,只取矩陣鍵盤的前18鍵,并將它們重新布局為圖2的形式。其中Ent鍵具有二重功能,即確認功能(短按)和開關機功能(長按),此功能將在驅動程序中實現。

圖2 鍵盤布局

3.矩陣鍵盤的Linux驅動程序設計

3.1 鍵盤驅動總體概述

驅動程序是操作系統內核和硬件設備之間的接口。設備驅動程序為應用程序屏蔽了硬件的細節,使應用程序可以像操作普通文件一樣操作硬件設備[2]。驅動程序沒有main函數,它以一個模塊初始化函數作為入口,并且它完成初始化之后不再運行,等待系統調用。

驅動程序是linux內核的一部分,所以在程序編寫上要采用linux的表達方式。首先將列I/O端口定義為數組:col_table [] = { S3C2410_GPF3,S3C2410_GPF4, ...},行I/O端口定義為結構型:

button_irqs [] ={ {IRQ_EINT8,S3C2410_GPG0,S3C2410_GPG0_EINT8, 0,"R1"},

{IRQ_EINT9,S3C2410_GPG1,S3C2410_GPG1_EINT9, 1,"R2"},

...}。//中斷號(irq),引腳(pin),引腳設置,序號,名稱

矩陣鍵盤是作為Linux的一個字符設備注冊到系統中的。我們首先向系統注冊矩陣鍵盤設備,包括設備號,設備名及file_operations結構體;file_operations結構體的成員函數是字符設備驅動程序設計的主體內容,這些函數實際會在應用程序進行Linux的open()、write()、read()、close()等系統調用時最終被調用[3]。用戶對鍵盤沒有寫操作,其file_operations結構體的成員函數為open()、read()、close()、poll()。

中斷的注冊和行列初始化在打開鍵盤時(即open()函數中)實現。注冊中斷包括:中斷號,中斷入口程序,中斷方式,中斷名和代號。關鍵語句為:request_irq(button_irqs[i].irq,buttons_interrupt,IRQ_TYPE_EDGE_FALLING,button_irqs[i].name,(void *)&button_irqs[i])。IRQ_TYPE_EDGE_FALLING意思為下降沿觸發。然后再進行行列初始化:設置行線為中斷,使能上拉,在linux中其表達方式為:

s3c2410_gpio_cfgpin(button_irqs[i].pin,S3C2410_GPIO_SFN2); //設置第i行引腳為中斷

s3c2410_gpio_pullup(button_irqs[i].pin,1); //第i行引腳上拉

設置列線為輸出,置低電平。語句表達同理,由于篇幅所限,這里不再一一列出。

read()函數實現從設備中讀取數據。該函數實現無按鍵按下時程序進入休眠,關鍵代碼:

static DECLARE_WAIT_QUEUE_HEAD (button_waitq); //生成一個等待隊列頭隊列,名為button_waitq

static volatile int ev_press = 0; //置1,表示有鍵按下

ev_press為0時執行語句:wait_event_interruptible(button_waitq,ev_press),程序即進入休眠。ev_press為1時把數據從內核空間復制到用戶空間,關鍵語句:copy_to_user(buff,(const void *)key_values,min(sizeof(key_values),count)); //buff為用戶空間的指針,key_values為內核空間指針,最后一個參數為從內核空間向用戶空間拷貝數據的字節數,我們取實際大小與用戶指定大小中的最小值。數據復制成功時返回零;出錯時返回沒有復制成功的數據字節數。

close()函數實現關閉矩陣鍵盤設備,釋放已注冊的中斷,關鍵語句:free_irq (button_irqs[i].irq,(void *)&button_irqs[i])。

Poll()函數實現輪詢,如果沒有按鍵數據,調用linux的poll_wait函數等待;如果有按鍵數據,則select函數會立刻返回。

3.2 中斷處理及鍵盤掃描程序

中斷處理函數的名稱為上面注冊的buttons _interrupt。具體程序流程如圖3所示。當有按鍵按下時,該鍵所在行列導通。列的低電平將該行電平拉低,進而觸發中斷。然后,進入中斷處理函數。由于按鍵存在抖動的問題,單靠一次中斷的觸發就判定有按鍵按下是不可靠的,所以采用定時器延時10ms后再進入鍵盤掃描函數。

本設計的鍵盤掃描程序采用先確定行再確定列的方法,最后對行列進行一定的運算即得鍵值。首先確定行:逐行掃描,判斷是否有行引腳為低電平。若有,保存該行值(row)。繼續確定列:逐列置低電平,當該列為按下所在列時,才會使該行再次為低電平,從而確定列(column)。再對行列進行運算:k=row*4+column,則將矩陣鍵盤的每一鍵對應為鍵號0—19。鍵盤布局為圖2所示形式后,我們只取矩陣鍵盤的前18鍵(鍵號0—17),鍵值保存為k+1。對于Ent鍵,通過按下的時間長短區分是確定功能還是開關機功能,按下時間小于0.5秒為確認功能,按下時間大于1.6秒為開關機功能,時間在0.5秒—1.6秒的視為無效操作。計時方法為:若該行仍為低電平且整數cnt小于1700:延時1ms,cnt++;根據cnt值即得按下時間。開關機功能保存為第18鍵號,鍵值19。

圖3 鍵盤掃描程序流程圖

4.驅動程序的測試

測試程序屬于上層應用程序,直接調用鍵盤驅動程序提供的接口即可實現度鍵盤的操作。我們調用open()函數實現矩陣鍵盤設備的打開,再調用read()函數即可將鍵盤數據讀取出來并保存到自己定義的數組中,最后使用printf()函數將測試結果顯示出來。

按本文介紹的方法設計的矩陣鍵盤,已成功運用到筆者的項目中,鍵盤輸入的正確率和反應時間均符合設計要求。

5.總結

本文介紹了一種直接從ARM的I/O口擴展矩陣鍵盤的方法,它無需增加其它接口元器件,設計快速實用,并實現了在Linux系統下的驅動,為ARM嵌入式設備擴展手持終端式鍵盤提供了一種解決方案。

參考文獻

[1]胡章勇,蔣朝根.Linux的鍵盤驅動與Qt/E的鍵盤映射[J].單片機與嵌入式系統應用,2008(9):35.

[2]李俊.嵌入式Linux設備驅動開發詳解[M].北京:人民郵電出版社,2008:17.

第11篇

關鍵詞:CY7C68013A; 通用串行總線; VC++6.0; 固件; 上位機

中圖分類號:TP368.1 文獻標識碼:A

文章編號:1004-373X(2010)13-0190-04

Design of USB Control System Based on CY7C68013A

ZHAO Tie-jun

(Equipment Power Department, China Coal Beijing Coal Mining Machinery Co. Ltd., Beijing 102400, China)

Abstract: With the increasing development of the communication technology, the universal serial bus (USB) as a new interface technology that makes the connection of PCs with peripheral equipments very simple has been extensively adopted. The feature of USB2.0 is introduced firstly, and then the overall plan for designing the control system by using CY7C68013A is presented. The function of the system firmware and the design of drive program are discussed in detail. The key issues which should be taken more attention during the system design are proposed. The control system firmware is programmed with C language. The control interface on PC is developed under the VC++6.0 development environment. The experiment indicates that the whole system runs perfectly well.

Keywords: CY7C68013A; USB; VC6.0; firmware; PC

0 引 言

通用串行總線 (Universal Serial Bus,USB)作為計算機上的新型接口技術,越來越受到人們的青睞。與以前的RS 232,RS 485,ISA,PCI和并行接口等接口相比,USB避免了接口體積大、接口規范不統一、不支持熱插拔等缺陷,具有使計算機與外部設備連接十分方便的優點[1-2]。目前,很多設備都開始使用USB接口來實現,如鼠標、鍵盤、打印機等。在實際設計工作當中,也越來越多地采用了USB技術,如數據采集等[3-4]。USB的設計和應用已經成為現代電子設計中一個非常重要的部分。

1 USB 2.0特點

USB是一種高效、快速、價格低廉、體積小的新型串行通信接口,其最大的特點是支持熱插拔,可以在不重新啟動計算機的情況下直接將USB外部設備連接到計算機并開始通信。

USB具有以下主要特點[2]:

(1) 節省系統資源。在計算機中,系統為USB主控制器分配一根中斷控制線和一些輸入/輸出地址,USB再為外部設備分配惟一的地址。

(2)可以提供電源。計算機上的USB接口可以向外部設備提供一定的電力支持,其輸出電流最小值為100 mA,最大值為500 mA,輸出電壓為5 V。

(3) 良好的兼容性。USB規范已經有USB 1.0,USB 1.1,USB 2.0,無線USB等多個版本的協議,這些協議都有很好的向下兼容性。

(4) 共享式接口。USB采用“鏈”式的連接方式,同時支持多個設備的連接,一個USB主控制器最多可以連接126個外部設備。

2 CY7C68013A的主要特點

CY7C68013A是Cypress公司的EZ-USB FX2LP系列低功耗版本單片機,具有和8051兼容的CPU和指令系統,同時包括USB接口和完整的USB 2.0協議引擎,并且提供了完善的固件及主機程序開發包。該單片機的CPU采用的是增強型8051內核,比標準的8051的速度快,硬件資源更為豐富,功能更強大。主要具有以下特點[5-6]:

(1) 具有第二個數據指針;

(2) 具有第二個USATRT;

(3) I2C總線接口;

(4) 8個額外的中斷(INT2~INT6,WAKEUP,T2,USART1);

(5) CPU時鐘可以運行在12 MHz,24 MHz,48 MHz。

3 控制系統設計

基于USB的控制系統設計主要包含兩個方面的內容,分別為固件程序的開發和上位機(主機)控制界面的設計。CY7C68013A芯片采用的是一種軟配置模式,即程序和數據都存放在內部RAM中,并從RAM中開始執行。

3.1 啟動模式的選擇

EZ-USB在沒有固件的情況下列舉為一個缺省的USB設備,并且將其固件和描述符等下載到EZ-USB后,開始執行固件程序,此時模擬一個物理上的斷開重新連接過程[6-7]。在列舉為一個USB設備時,根據芯片有沒有連接E2PROM,以及E2PROM中第一個字節值的不同,其處理方式有很多。主要有:不連接E2PROM的缺省設備列舉、C0加載、C2加載等啟動方式。在此系統的設計過程中,采用第一種方式,即芯片沒有連接任何片外存儲器,USB的描述符以及VID,PID和DID等均由芯片內置的邏輯提供,然后根據驅動程序中提供的VID,PID和DID把主機上對應的固件程序下載到片內的RAM中,并執行固件代碼。該方式具有硬件連接簡單,節省器件等特點。

3.2 硬件系統框圖

整個系統的硬件框圖如圖1所示??梢钥闯鯱SB控制系統在整個系統中起到橋梁作用,用于連接上位機和外部設備。

圖1 系統硬件框圖

上位機發送控制指令給USB設備,信息處于下行狀態,解碼后用來控制設備執行相應功能。上位機需要從外設獲得信息(如數據采集),信息處于上行狀態,由USB設備負責控制外設并將數據傳送到上位機,由上位機分析、顯示。

3.3 固件程序設計

在固件中,主要實現芯片設備的控制,以及對USB設備的功能描述等任務,同時負責與上位機通信,響應上位機的標準請求和自定義請求。

描述符主要是讓上位機了解USB功能設備的基本配置信息和能力,如端點、接口等。在此主要使用標準描述符來說明USB設備,如設備描述符、配置描述符、接口描述符、端點描述符、設備限定描述符等。在該設備中,這些描述符的層次結構如圖2所示。

圖2 描述符層次圖

系統中使用了2個配置描述符,分別為高速配置和全速配置,┟扛霆配置使用1個接口,并對應1個接口描述符,每個接口應用了4個端點,對應4個端點描述符。同時端點配置為塊傳輸模式,2、4端點為OUT,6、8端點為IN,最大數據包長度為512 B,上位機通過0端點來操作、控制USB設備。設備描述符中VID=0x04B4,PID=0x1304,用于指示設備供應商和產品信息,并用于上電時幫助主機加載合適的驅動程序,進而下載相應的固件程序。固件中對標準請求的響應部分,主要是讓上位機能夠對描述符進行讀取和寫操作。自定義請求響應主要實現上位機發送控制命令,來使能USB功能設備、以及執行相應的功能的目的,如DR_SendData,DR_ ReadData。

固件設計流程圖如圖3所示。

圖3 固件設計流程圖

用戶初始化設備部分放在TD_Init()子程序中,負責整個USB設備的初始化過程。在定向描述符之后,需要把所用中斷打開,并開啟8051全局中斷EA=1。由于EZ-USB設備啟動需要重列舉,因而需要通過設置和判斷USBCS寄存器的RENUM和DISCON位來模擬設備物理上的斷開和連接過程。用戶設備控制功能的實現放在TD_Poll()子程序中,同時主循環中的SetupCommand()子程序用于接收、分析上位機的控制信號,響應上位機請求(標準請求和用戶自定義請求)。

3.4 上位機界面設計

為了能夠很好地控制USB設備,需要編寫上位機控制界面。界面程序在VC++6.0環境下開發,該環境具有編程簡單、快捷等的特點,便于開發可視化程序[8-9]。Cypress公司為EZ-USB系列芯片提供了開發庫CyAPI.lib,使用其中的控制函數類,可以在VC++6.0環境下開發界面程序[10]。建立MFC(exe)工程后,在工程中加入CyAPI.lib,并且在主文件頭部添加EZ-USB開發環境中提供的CyAPI.h,cyioctl.h頭文件。利用庫中的控制函數,如VendorID,ProductID等,可以獲取USB設備的描述信息,同時也可以編寫相關的控制功能程序。

3.5 系統設計中關鍵問題

(1) 一個設備只能有一個設備描述符,可以有多個配置描述符,多個接口描述符,以及多個端點描述符。

(2) 設備描述符中VID,PID要與驅動中的相一致,否則不能自動加載相應的固件程序。

(3) 固件程序必須轉換為.spt格式,用于固件加載的驅動程序和固件程序應放在一個文件夾。

(4) 端點0為缺省控制端點,其可設置最大數據包長度為64 B,在設備描述符中wMaxPacketSize字段描述。

(5) 傳輸模式有中斷傳輸、塊傳輸、同步傳輸、控制傳輸四類,需根據自己設計需求選擇,同時注意最大數據包長度的設置。

4 驅動程序

對于USB設備,Windows操作系統要想對其實現操作,必須借助于驅動程序來實現。主機和驅動程序直接通信,交換數據,而驅動程序則和硬件資源進行通信,從而很好地控制USB設備。Cypress提供的開發環境中自帶了相關的驅動程序CyLoad.sys和CyUSB.sys,可以直接使用,縮短了系統的開發周期。其中CyLoad.sys用于主機向USB設備下載固件程序,CyUSB.sys實現主機和固件程序通信。為了在CyLoad.sys的幫助下實現固件的自動下載,固件程序CyLoad.HEX必須轉換為適合自動下載的CyLoad.spt文件,并且與CyLoad.sys一起放在CyLoad文件夾下,拷貝到系統system32目錄下。在安裝文件CyUSB.inf中設置的PID,VID必須和描述符中的一致,使得能夠自動加載對應固件。

5 實 驗

實驗系統,采用CY7C68013A-56pin作為USB設備芯片,實現控制LED和讀取I/O數據功能。

由于芯片采用33 V電壓供電,因此可以從主機USB口取電,經LM317電壓調整芯片轉換為33 V,也可外接33 V電壓供電。在PD口接LED,顯示TD_Poll(void)實現的功能(燈亮/滅間隔300 ms),┒PA口LED用于顯示判斷主機發送數據。PB口接高/低電平,用于主機讀取該口數據,可以驗證主機接收數據的正確性。

初始化子程序:

void TD_Init(void)

{

BREAKPT &= ~bmBPEN;

OED=0xFF;//設置PD口為輸出

}

外設功能子程序:

void TD_Poll(void)

{

IOD=0x00; //D口輸出低電平

EZUSB_Delay(300);

IOD=0xFF;// D口輸出高電平

EZUSB_Delay(300);

}

自定義請求響應發送數據子程序:

BOOL DR_SendData(void)

{

EP0BUF[0]=0xB1;//發送數據自定義請求碼

EP0BCH=0;

EP0BCL=2;

EZUSB_Delay(100);

OEA=0xFF;//PA口為輸出

IOA=EP0BUF[1];

EP0CS |= bmHSNAK;

return(TRUE);

}

自定義請求響應接收數據子程序:

BOOL DR_ReadData(void)

{

OEB=0x00;//PB口為輸入

EP0BUF[0]=0xB2;//接收數據自定義請求碼

EP0BUF[1]=IOB;

EP0BCH=0;

EP0BCL=2;

EP0CS |= bmHSNAK;

return(TRUE);

}

主機控制界面運行如圖4所示。

界面中的USB Information分類框中為USB描述相關信息,由主機通過標準請求獲得。Operation分類框中為主機向USB設備PA口發送數據,以及從USB設備的PB讀取數據的

情況。

圖4 主機控制界面

6 結 語

采用CY7C68013A實現USB控制系統,無論在固件程序編寫、主機控制界面開發,以及設備驅動程序的使用等方面,都具有簡單、方便的優點。系統采用設備固件存放在主機上的方法,不但簡化了硬件設計,節約元器件成本,而且也提高了設備的可靠性。同時,此法對以后固件升級或更改設備功能,也十分簡便,只需把固件修改好并放到主機相應位置,在USB設備再次插入主機時,就可以實現固件自動更新。文中給出一些設計過程中需要注意的關鍵問題,對于USB控制設備的設計具有一定的指導作用。上述系統和程序經過實際運行,工作穩定、可靠。

參考文獻

[1]李英偉,王成儒.USB 2.0原理與工程開發[M].北京:國防工業出版社,2007.

[2]胡曉軍,張愛成.USB接口開發技術[M].西安:西安電子科技大學出版社,2005.

[3]錢峰.EZ-USBFX2單片機原理編程及應用[M].北京:北京航空航天大學出版社,2006.

[4]周立功.PDIUSBD12 USB固件編程與驅動開發[M].北京:北京航空航天大學出版社,2003.

[5]薛園園.USB應用開發技術大全[M].北京:人民郵電出版社,2007.

[6]Cypress. EZ-USB FX2LPTM USB microcontroller datasheet[ EB/OL] . [ 2009-05-20] . .

[7]Cypress. EZ-USB FX2 technical reference manual[ EB/OL] . [ 2009-03-18] . .

[8]周曉云.程序設計基礎――可視化及VC++實現[M].北京:高等教育出版社,2004.

第12篇

        關鍵詞:電阻電容檢測;微處理器;usb;visual b + +

        基于usb接口虛擬在線電阻電容測試的方法其總體設計思想為:將電阻電容的參數值轉換成與之成正比關系變化的電壓輸出,經模數(a/d)轉換,然后送pc機進行數據及信息處理,在pc機上進行數據和信息顯示。最終完成電阻電容的在線測試與顯示。

        一、電阻電容測試原理

        電阻電容的參數測試在電子設計中是至關重要的,目前其測試基本上都采用直接測量的方式,即用萬用表直接測試元件的兩端以測得元件參數。但通常設計者們在電路設計初期只能通過理論分析計算需要的電子元件的參數,在實際的設計中,需要測試更換一些電路板上的電子元件。但此時元件已經焊接在電路板上,特別像電阻電容往往都不是分立的元件,直接測試將會造成極大的誤差。傳統的做法是焊開原器件再測量,以避免受板上其他元器件的影響。

        二、visual b + + 6.0

        visual b++6.0是微軟公司推出的一種開發環境,以其強大功能友好的界面,32位面向對象的程序設計而受廣大軟件開發者的青睞,被廣泛應用于各個領域。

        應用程序用visual b+ +開發環境在windows xp系統下編寫,對usb接口的電阻電容測試儀進行打開、讀寫、關閉等操作都通過調用系統api函數完成。應用程序首先調用creat file得到usb設備的句柄,然后利用device io control 函數提交一個i/o控制代碼,通過設備句柄打開連接驅動的輸入輸出緩沖。

        三、通用串行總線(usb)及其接口芯片

        通用串行總線(usb)是一種簡單的計算機外圍接口標準。在早期的計算機系統上常用串口或并口連接外圍設備。每個接口都需要占用計算機的系統資源(如中斷,i/o地址,dma通道等)。無論是串口還是并口都是點對點的連接,每添加一個新的設備,就需要添加一個isa/eisa或pci卡來支持,同時系統需要重新啟動才能驅動新的設備。usb總線是intel、dec、microsoft、ibm等公司聯合提出的一種新的串行總線標準,主要用于pc機與外圍設備的互聯。usb總線具有低成本、使用簡單、支持即插即用、易于擴展等特點,已被廣泛地用在pc機及嵌入式系統上。

        四、usb協議棧驅動程序及設備驅動程序需實現的功能

        usb協議棧驅動程序需實現的功能:提供與設備驅動程序的接口;讀取并解析usb設備描述符,配置描述符;為usb設備分配唯一的地址;使用默認的配置來配置設備;支持基本的usb命令請求;連接設備與相應的驅動程序;轉發設備驅動程序的數據包。

        設備驅動程序需實現以下功能:提供與應用程序的接口;讀取并解析usb設備特有的描述符,獲得設備提供的傳輸通道;發送設備特有的和基本的usb命令請求;通過設備提供的傳輸通道與設備進行數據傳輸;通過usb命令請求重新配置設備。

        五、結論

        系統測試時選定若干電阻和電容的測試結果如表1所示。

數據中3號代表數字變化,數據不能讀出。通過測試結果與實際值的對比,本測試儀已達到設計時的技術指標,基本滿足測試人員的測試要求。