專利名稱:基于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及USB人機接口設(shè)備及嵌入式Linux領(lǐng)域,具體涉及一種基 于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法。
背景技術(shù):
USB (通用串行總線)是主機和外圍設(shè)備之間的外部總線連接方式。USB 以單一類型總線連接各種不同類型設(shè)備,主要是用于中速和高速外設(shè),通 過PCI總線和PC的內(nèi)部系統(tǒng)數(shù)據(jù)線連接,實現(xiàn)數(shù)據(jù)的傳輸。USB同時又是 一種通信協(xié)議規(guī)范,定義了一套任何特定類型的設(shè)備都可以遵循的標(biāo)準(zhǔn), 用于支持主機(Host)和設(shè)備(slave device)之間的數(shù)據(jù)傳輸。USB總線 規(guī)范定義了人機接口設(shè)備(HID, Human Interface Device)類設(shè)備的規(guī)范, HID規(guī)范專門定義了人機接口設(shè)備和主機之間進行通信的協(xié)議。人機接口設(shè) 備不需要安裝專用的驅(qū)動程序,插入Windows、 Linux等操作系統(tǒng)能夠被自 動識別,通過系統(tǒng)自帶的HID設(shè)備類驅(qū)動與應(yīng)用程序建立通信,應(yīng)用程序 只需要訪問系統(tǒng)應(yīng)用程序接口就能訪問USB HID設(shè)備。
USB總線拓?fù)渲饕蓛蓚€組成部分主機和設(shè)備,相應(yīng)的,Linux內(nèi)核 支持兩種類型USB驅(qū)動程序主機系統(tǒng)(host)的驅(qū)動程序和設(shè)備(slave device)的從USB固件驅(qū)動程序。主機系統(tǒng)上來看,主機系統(tǒng)的USB驅(qū)動 程序控制插入其中的USB設(shè)備;USB設(shè)備上來看,從USB固件驅(qū)動程序控制 該設(shè)備如何作為一個從USB設(shè)備和主機通信-
現(xiàn)有Linux操作系統(tǒng)下的從USB固件驅(qū)動程序支持從USB串口設(shè)備類 和從USB以太網(wǎng)設(shè)備類兩種實現(xiàn)方法。在主機系統(tǒng)上,這兩種方法分別被 識別為虛擬串口設(shè)備和虛擬網(wǎng)絡(luò)設(shè)備。但是使用上述兩種設(shè)計方法,在不 同的主機操作系統(tǒng)下,需要用戶開發(fā)驅(qū)動程序,才能實現(xiàn)USB外圍設(shè)備與 上行主機的通信,同時需要考慮不同操作系統(tǒng)下的兼容問題。此外,這兩 種方法都不支持熱插拔功能,當(dāng)設(shè)備插拔后,從設(shè)備端固件程序無法識別插拔事件和USB總線復(fù)位過程,導(dǎo)致從設(shè)備端固件無法對USB總線進行重 新初始化,進而導(dǎo)致主機和從USB設(shè)備無法進行通信。
發(fā)明內(nèi)容
本發(fā)明的目的在于解決上述現(xiàn)有技術(shù)的缺點和不足,提供一種基于嵌 入式Linux的從USB HID裝置和固件實現(xiàn)方法,其可以實現(xiàn)用戶無需開發(fā) 和安裝驅(qū)動程序而直接使用,不用考慮不同操作系統(tǒng)的兼容性問題。本發(fā) 明的目的還在于通過USB HID協(xié)議方式,在裝置和主機系統(tǒng)之間實現(xiàn)數(shù)據(jù) 通信。
本發(fā)明基于嵌入式Lirmx操作系統(tǒng)的從USB HID裝置是一個硬件控制 電路,包括處理器CPU、從USB控制芯片、DMA控制器、內(nèi)存控制器、電 源模塊、系統(tǒng)總線、內(nèi)部存儲器、非易失性存儲器;所述相關(guān)硬件模塊依 次連接;所述硬件控制電路通過USB總線與主機系統(tǒng)連接。
基于嵌入式Linux的從USB HID固件實現(xiàn)方法,主要是指運行在硬件 系統(tǒng)上的固件系統(tǒng),即是運行于SoC控制電路的軟件系統(tǒng)。在本發(fā)明的固 件實現(xiàn)方法的設(shè)計上,主要由以下子系統(tǒng)構(gòu)成(1)嵌入式Linux操作系 統(tǒng)此操作系統(tǒng)采用基于硬件架構(gòu)的Linux內(nèi)核,針對硬件控制電路進行 了相關(guān)移植和配置,并選用合適的文件系統(tǒng)和應(yīng)用程序,向固件系統(tǒng)提供 運行的軟件平臺;(2)從USB HID固件驅(qū)動程序;此固件驅(qū)動程序運行于 嵌入式Linux操作系統(tǒng)的內(nèi)核空間,根據(jù)從USB控制芯片規(guī)范,設(shè)計了符 合USB HID協(xié)議的設(shè)備驅(qū)動程序,并提供了USB總線動態(tài)監(jiān)測功能,向應(yīng) 用程序告知USB插拔事件消息;(3) USB通信控制程序USB通信控制程 序運行于嵌入式Linux操作系統(tǒng)的用戶空間,調(diào)用Linux API (A卯licati on Programming Interface)操作從USB控制芯片,接收和發(fā)送數(shù)據(jù)到US B總線,并接收USB插拔事件消息,重新啟動數(shù)據(jù)收發(fā)過程,進而提供熱插 拔功能。
利用上述基于嵌入式Linux操作系統(tǒng)的從USB HID固件實現(xiàn)方法,其 具體運行步驟如下
6(1) 嵌入式Linux操作系統(tǒng)運行于SoC控制電路中,啟動硬件設(shè)備, 引導(dǎo)嵌入式Linux操作系統(tǒng),運行于硬件控制電路中,并為其他程序提供 運行和操作環(huán)境;
(2) 從USBHID固件驅(qū)動程序設(shè)置從USB控制芯片寄存器,并動態(tài)配 置設(shè)備描述符、配置描述符、接口描述符、端口描述和HID描述符;
(3) 啟動USB通信控制程序,初始化USB通信過程,準(zhǔn)備與主機系統(tǒng)
通信;
(4) USB通信控制程序檢測從USB HID固件驅(qū)動程序發(fā)送的USB插拔 事件消息,重新初始化USB通信過程;
(5) USB通信控制程序發(fā)送和收到主機的數(shù)據(jù),交給需要此數(shù)據(jù)的數(shù) 據(jù)處理程序;
(6) 主機操作系統(tǒng)的通用驅(qū)動程序讀取從USBHID裝置的所有描述符, 識別HID設(shè)備,準(zhǔn)備進行數(shù)據(jù)通信;
上述步驟中,步驟(1)所述嵌入式Linux操作系統(tǒng)采用2.6及以上版 本內(nèi)核,內(nèi)核主要由進程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口和進 程通信等五個子系統(tǒng)組成,針對SoC硬件控制電路的CPU芯片類型和硬件 架構(gòu),嵌入式Limix操作系統(tǒng)進行了相應(yīng)的移植和配置工作。嵌入式Linux 操作系統(tǒng)提供了運行時可擴展功能,當(dāng)操作系統(tǒng)啟動后可以向操作系統(tǒng)添 加設(shè)備驅(qū)動,從USB HID固件驅(qū)動程序采用了這種技術(shù)。Linux操作系統(tǒng)向 應(yīng)用程序提供了系統(tǒng)調(diào)用接口 API,并提供了用戶空間運行環(huán)境。
上述步驟中,步驟(2)所述固件驅(qū)動程序采用Linux模塊機制(見odule) 技術(shù),可以被Limix內(nèi)核動態(tài)加載和釋放,固件程序使用Linux系統(tǒng)調(diào)用, 動態(tài)連接到Lirmx內(nèi)核或從Limix內(nèi)核中釋放。固件系統(tǒng)的結(jié)構(gòu)依次為 USB通信控制程序、Linux系統(tǒng)調(diào)用接口、虛擬文件系統(tǒng)、字符設(shè)備驅(qū)動接 口、從USB HID固件驅(qū)動程序、硬件部分。其中從USB HID固件驅(qū)動程序 的功能構(gòu)成包括(1)從USB控制芯片初始化與控制子模塊;(2)USB數(shù) 據(jù)接收子模塊;(3)USB數(shù)據(jù)發(fā)送子模塊;(4) USB中斷服務(wù)子模塊;(5) USB字符驅(qū)動實現(xiàn)子模塊。Linux系統(tǒng)調(diào)用接口向應(yīng)用程序提供API調(diào)用; 虛擬文件系統(tǒng)向"rmx系統(tǒng)調(diào)用接口提供各種文件操作接口;字符設(shè)備驅(qū)動接口抽象各種字符設(shè)備操作,并向虛擬文件系鄉(xiāng)充注冊各種設(shè)備操作;從
USBHID固件驅(qū)動程序操作從USB控制芯片,完成相關(guān)的USB HID協(xié)議,并 向字符設(shè)備驅(qū)動接口注冊設(shè)備信息;硬件部分主要為含有從USB控制芯片 的硬件控制電路。
上述步驟中,步驟(3)所述USB通信控制程序是Linux應(yīng)用程序,調(diào) 用Linux API (Application Program Interface)完成USB的初始化、數(shù) 據(jù)讀寫操作、接收USB插拔事件消息和重新初始j七。
上述步驟中,步驟(4)所述USB通信控制程序的檢測功能采用線程技 術(shù),此線程接收來自內(nèi)核空間從USB HID固件驅(qū)動程序的中斷服務(wù)子模塊 的插拔事件消息,對該消息進行分析并處理USB插拔事件,對USB設(shè)備進 行重新初始化。
上述步驟中,步驟(5)所述USB通信控制程序的數(shù)據(jù)收發(fā)功能調(diào)用Linux 系統(tǒng)API,調(diào)用系統(tǒng)讀函數(shù)讀取來自USB總線的數(shù)據(jù),調(diào)用系統(tǒng)寫函數(shù)發(fā)送 數(shù)據(jù)到USB總線。數(shù)據(jù)收發(fā)功能實現(xiàn)了該裝置和主機系統(tǒng)之間的數(shù)據(jù)通信, 數(shù)據(jù)通信過程采用USB HID協(xié)議。
上述步驟中,步驟(6)所述主機操作系統(tǒng)的通用驅(qū)動程序,讀取從USB 控制芯片的HID設(shè)備描述符,具體包括如下歩驟(1) USB設(shè)備插入主機, 主機査詢USB集線器獲得準(zhǔn)確的信息;(2)主*幾USB等待至少100毫秒, 讓設(shè)備供電處于穩(wěn)定狀態(tài),然后USB設(shè)備使能端口,并向USB設(shè)備發(fā)送復(fù) 位請求;(3)復(fù)位結(jié)束后,USB設(shè)備初始化寄存器,USB設(shè)備通過默認(rèn)地 址對總線標(biāo)準(zhǔn)請求進行響應(yīng);(4) USB主機通過默認(rèn)地址獲取USB設(shè)備的 設(shè)備描述符、配置描述符、接口描述符、端點描述符、HID描述符;(5) USB主機對USB設(shè)備分配一個設(shè)備地址;(6)主機根據(jù)獲得的配置信息, 向USB設(shè)備發(fā)送配置請求,設(shè)備完成響應(yīng)后,完成設(shè)備枚舉過程。
本發(fā)明基于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法的優(yōu)點在 于為了解決現(xiàn)有技術(shù)的不足,本發(fā)明提供了一種基于嵌入式Linux操作 系統(tǒng)的從USB HID裝置及固件實現(xiàn)方法,實現(xiàn)了主機不用安裝專用的驅(qū)動 就可以識別和訪問該裝置,并提供了動態(tài)檢測插拔事件功能。本發(fā)明提供 的方法優(yōu)勢在于第一,在各操作系統(tǒng)下不用開發(fā)和安裝專用的驅(qū)動程序,當(dāng)裝置插入主機系統(tǒng)時,可以被主機操作系統(tǒng)識別,并直接利用操作系統(tǒng) 接口函數(shù)訪問該裝置;第二,實時監(jiān)測USB總線的連接狀態(tài),識別插拔事 件,提供熱插拔功能,提高設(shè)備的易用性。第三,固件程序可以動態(tài)配置 USBHID描述符,使裝置不和鍵盤、鼠標(biāo)等常用設(shè)備沖突,主機可以更方便 的識別此裝置,提高系統(tǒng)的穩(wěn)定性。
;
圖1是基于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法的硬件結(jié) 構(gòu)示意圖2是基于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法的固件系 統(tǒng)結(jié)構(gòu)框圖3是基于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法的插拔事 件處理流程圖4是基于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法的USB通 信控制程序初始化的流程圖。
具體實施例方式
有關(guān)本發(fā)明的技術(shù)內(nèi)容及詳細(xì)說明,現(xiàn)結(jié)合
如下
(1)圖1示出本發(fā)明的硬件結(jié)構(gòu),本發(fā)明是一種從USB HID裝置(100)。
其硬件結(jié)構(gòu)組成包括
(1.1) 從USBHID裝置(100)是一個SoC控制電路,包含處理器CPU (101)、從USB控制芯片(102) 、 DMA控制器(103)、內(nèi)存控制器(104)、
電源模塊(105)、內(nèi)部存儲器(106)、系統(tǒng)總線(107)、非易失性存儲 器(108)。
(1.2) 從USBHID裝置(100)通過供電線路(110)連接供電裝置, 供電線路(110)連接到電源模塊(105),電源模塊(105)對從USB HID 裝置(100)的電路進行供電。此處的供電裝置可以是主機系統(tǒng)或者獨立的
供電電源。(1.3) 從USB HID裝置(100)可以是通過USB數(shù)據(jù)線(109)連接 上行計算機,上行計算機通過USB總線接收數(shù)據(jù)和發(fā)送數(shù)據(jù)到從USB HID 裝置(100)。此處的數(shù)據(jù)可以是任何二進制數(shù)據(jù)流,裝置和計算機通過此 數(shù)據(jù)迸行數(shù)據(jù)通信交互。
(1.4) 從USB控制芯片(102)通過USB總線與上行計算機連接。在 裝置內(nèi)部,從USB控制芯片(102)連接到系統(tǒng)總線(107),其中處理器 CPU (101)通過系統(tǒng)總線(107)對從USB控制芯片(102)進行操作和配 置。從USB控制芯片(102)也可以通過DMA控制器(103)控制數(shù)據(jù)交換。 從USB控制芯片(102)可以動態(tài)配置,由軟件控制其配置行為。在本發(fā)明 中,此從USB控制芯片被配置為USB HID從設(shè)備,定義HID描述符時,類 別字段被設(shè)置為0x03 (HID類別),使用的協(xié)議設(shè)置為Oxll (自定義類別)。
(1. 5)本發(fā)明的固件實現(xiàn)方法是指裝置的固件系統(tǒng),即是運行于SoC 控制電路的軟件系統(tǒng)。軟件系統(tǒng)保存在非易失性存儲器(108)中,裝置上 電啟動后,軟件系統(tǒng)被搬移到內(nèi)部存儲器(106)中,并在處理器CPU(lOl) 上運行。軟件系統(tǒng)主要包括嵌入式Linux操作系統(tǒng)、從USBHID控制芯 片的設(shè)備驅(qū)動程序和USB通信控制程序。
(2)圖2示出本發(fā)明的固件系統(tǒng)結(jié)構(gòu),其結(jié)構(gòu)組成包括嵌入式Linux 操作系統(tǒng)、從USBHID固件驅(qū)動程序、USB通信控制程序。其中,從USBHID 固件驅(qū)動程序運行于嵌入式Linux操作系統(tǒng)的內(nèi)核空間,USB通信控制程序 運行于嵌入式Linux操作系統(tǒng)的用戶空間。固件系統(tǒng)保存在硬件控制電路 的非易失性存儲器中,硬件控制電路上電啟動后,固件系統(tǒng)被搬移到內(nèi)存 中,并在CPU上運行。
本發(fā)明的嵌入式Linux操作系統(tǒng)提供從USB HID固件驅(qū)動程序的模塊 設(shè)置選項,在KConfig文件和Makefile中添加了 CONFIG—USB—HID宏定義, 用于編譯從USB HID固件驅(qū)動程序。配置CONFIG一USB一HID宏定義為模塊選 項,當(dāng)編譯Linux內(nèi)核時,從USB HID固件驅(qū)動程序被編譯成為一個驅(qū)動
模塊,此模塊可以在運行時動態(tài)加載。
本發(fā)明的從USB HID固件驅(qū)動程序由五個功能子模塊組成
10(2.1) USB芯片初始化與控制子模塊設(shè)置從USB控制芯片的時鐘, 使能此芯片,并配置從USB芯片的寄存器組;
(2.2) USB數(shù)據(jù)接收子模塊查詢數(shù)據(jù)隊列中是否有數(shù)據(jù)存在,如果 有數(shù)據(jù),喚醒等待中的應(yīng)用程序,通知其把數(shù)據(jù)隊列中的數(shù)據(jù)取走,并處 理數(shù)據(jù)隊列,然后進入等待模式;
(2.3) USB數(shù)據(jù)發(fā)送子模塊把應(yīng)用程序的數(shù)據(jù)拷貝到數(shù)據(jù)隊列中, 并喚醒讀USB中斷服務(wù)子模塊,通知其把數(shù)據(jù)發(fā)送到從USB控制芯片中, 并等待從USB控制芯片完成數(shù)據(jù)傳送操作;
(2.4) USB中斷服務(wù)子模塊處理從USB控制芯片的中斷,根據(jù)中斷 類型,完成USB的枚舉、數(shù)據(jù)接收、數(shù)據(jù)發(fā)送、數(shù)據(jù)隊列喚醒等操作;如 果中斷類型是USB枚舉,把驅(qū)動中準(zhǔn)備好的設(shè)備描述符、配置描述符、接 口描述符、端口描述符、HID描述符通過默認(rèn)端口 O發(fā)送到計算機,枚舉完 成后,計算機識別此裝置為HID設(shè)備;如果中斷類型是USB數(shù)據(jù)接收,表 示有數(shù)據(jù)到達(dá)從USB控制芯片,把收到的數(shù)據(jù)拷貝到數(shù)據(jù)隊列中,并喚醒 在數(shù)據(jù)隊列上的USB數(shù)據(jù)接收子模塊;如果中斷類型是USB數(shù)據(jù)發(fā)送,查 詢數(shù)據(jù)隊列上是否有數(shù)據(jù)需要發(fā)送,如果有數(shù)據(jù)需要發(fā)送,把數(shù)據(jù)寫入從 USB控制芯片中,并等待其完成數(shù)據(jù)發(fā)送。
(2.5) USB字符驅(qū)動實現(xiàn)子模塊按照Linux字符設(shè)備驅(qū)動程序相關(guān) 規(guī)范,從USB HID固件驅(qū)動程序進行封裝;完成字符設(shè)備驅(qū)動的讀操作、 寫操作、控制操作、中斷服務(wù)操作、打開/關(guān)閉操作等注冊;并向文件系統(tǒng) 注冊字符設(shè)備節(jié)點"/dev/usbhid〃,應(yīng)用程序在用戶空間操作此設(shè)備節(jié)點, 進行相關(guān)操作;初始化字符設(shè)備驅(qū)動中的緩沖區(qū)、信號量等數(shù)據(jù)結(jié)構(gòu);創(chuàng) 建并注冊net link結(jié)構(gòu),此結(jié)構(gòu)負(fù)責(zé)向用戶空間廣播USB插拔事件消息。
本發(fā)明的USB通信控制程序由四個功能子模塊組成
(2.6) 初始化子模塊調(diào)用Linux API的打開函數(shù),打開設(shè)備節(jié)點 "/dev/usbhid"以獲得設(shè)備描述符;創(chuàng)建插拔事件消息處理線程,此線程
就是插拔事件消息處理子模塊;創(chuàng)建數(shù)據(jù)發(fā)送線程,此線程就是數(shù)據(jù)發(fā)送 子模塊;創(chuàng)建數(shù)據(jù)接收線程,此線程就是數(shù)據(jù)接收子模塊。(2.7) 插拔事件消息處理子模塊調(diào)用netlink接收函數(shù),等待接收 固件驅(qū)動程序發(fā)送過來的插拔事件消息,如果接收到此消息,結(jié)束數(shù)據(jù)發(fā) 送子模塊和數(shù)據(jù)接收子模塊,關(guān)閉"/dev/usbhid"設(shè)備節(jié)點,然后重新 打開從"/dev/usbhid"設(shè)備節(jié)點,并重新初始化通信控制程序中的數(shù)據(jù)收 發(fā)功能。
(2.8) 數(shù)據(jù)發(fā)送子模塊調(diào)用Linux API寫函數(shù),把數(shù)據(jù)發(fā)送到USB 總線上。
(2.9) 數(shù)據(jù)接收子模塊調(diào)用Linux API讀函數(shù),接收USB總線上的 數(shù)據(jù),并提交給需要此數(shù)據(jù)的其他數(shù)據(jù)處理程序。
(3) 如圖3所示,本發(fā)明的插拔事件處理流程
當(dāng)本裝置重新插入主機系統(tǒng),從USB控制芯片檢測到USB總線復(fù)位信 號并觸發(fā)中斷,中斷服務(wù)程序處理此中斷,然后調(diào)用枚舉函數(shù)完成枚舉過 程,并重新啟動固件驅(qū)動程序中的數(shù)據(jù)收發(fā);在枚舉過程后,通過netlink 方式發(fā)送廣播到用戶空間,通知USB通信控制程序;USB通信控制程序關(guān)閉 從USB設(shè)備,結(jié)束數(shù)據(jù)收發(fā)功能,然后重新打開從USB設(shè)備,并重新初始 化通信控制程序中的數(shù)據(jù)收發(fā)功能;從USB芯片設(shè)備驅(qū)動程序重新注冊字 符設(shè)備驅(qū)動,初始化所有的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備好下一次的數(shù)據(jù)傳送。
(4) 如圖4所示,本發(fā)明的USB通信控制模塊的初始化流程
USB通信控制模塊首先調(diào)用Linux API打開設(shè)備節(jié)點"/dev/usbhid", 此設(shè)備節(jié)點對應(yīng)內(nèi)核空間中的從USB芯片設(shè)備,從USB芯片固件驅(qū)動程序 的USB字符驅(qū)動實現(xiàn)模塊被調(diào)用;USB通信控制模塊完成初始化后創(chuàng)建插拔 事件消息處理線程,此線程檢測從USB HID控制芯片固件驅(qū)動程序發(fā)送的 插拔事件消息,重新初始化USB通道;創(chuàng)建USB數(shù)據(jù)發(fā)送線程,此線程負(fù) 責(zé)把數(shù)據(jù)傳送到驅(qū)動程序,既而發(fā)送USB總線上;創(chuàng)建USB數(shù)據(jù)接收線程, 此線程負(fù)責(zé)接收來自驅(qū)動程序的USB總線數(shù)據(jù)。
實施例
結(jié)合附圖來進行說明,整個系統(tǒng)按照硬件和固件實現(xiàn)兩個大的部分來 描述。硬件部分采用基于SoC技術(shù)的計算裝置,處理器采用基于ARM核心的 XSCALE處理器,這塊芯片內(nèi)部帶有一個從USB控制芯片,支持16個端口, 由軟件對其進行配置和操作。
固件實現(xiàn)主要是指裝置的固件系統(tǒng),即是運行于CPU和存儲單元中的 軟件系統(tǒng)。軟件系統(tǒng)主要包括嵌入式Linux操作系統(tǒng)、從USB HID固件 驅(qū)動程序、USB通信控制程序;其中,從USBHID固件驅(qū)動程序運行于內(nèi)核 空間,USB通信控制程序運行于用戶空間。
嵌入式Unux操作系統(tǒng),針對具體硬件架構(gòu)做了相應(yīng)移植工作,Linux 提供了系統(tǒng)調(diào)用接口、虛擬文件系統(tǒng)和相關(guān)的字符設(shè)備驅(qū)動接口層。本發(fā) 明根據(jù)Linux驅(qū)動程序設(shè)計的要求,推導(dǎo)出從USB HID驅(qū)動程序的相關(guān)接 口,主要包括hid_open, hid_write, hid—read等,并將這些函數(shù)注冊到操 作系統(tǒng)。本發(fā)明中的USB通信控制程序調(diào)用Linux系統(tǒng)API函數(shù),主要包 括open、 read、 write等,對從USB設(shè)備進行打開、讀取數(shù)據(jù)、發(fā)送數(shù)據(jù) 操作。
固件實現(xiàn)的詳細(xì)處理步驟是這樣的-
首先把從USB HID固件驅(qū)動程序編譯進Linux操作系統(tǒng),并把操作系 統(tǒng)、固件驅(qū)動程序、USB通信控制程序放入非易失性存儲器中。打開硬件電 路的電源,運行Linux操作系統(tǒng),Linux在引導(dǎo)和初始化過程中,調(diào)用并運 行從USB HID固件驅(qū)動模塊,完成對從USB芯片的初始化工作,包括對時 鐘配置,相關(guān)寄存器的設(shè)置,以及芯片的使能,這些可以參照芯片手冊完 成。同時根據(jù)驅(qū)動程序中定義的相關(guān)描述符,配置從USB控制芯片,把其 配置成為HID設(shè)備。在完成Linux引導(dǎo)過程后,完成對從USB控制芯片初 始化,并運行固件驅(qū)動程序模塊后,需要在用戶空間運行USB通信控制程 序,此程序打開從USB設(shè)備,并創(chuàng)建若干數(shù)據(jù)通信線程和插拔監(jiān)控線程。
在完成上述軟件配置和運行工作后,只要此裝置連接到主機系統(tǒng)USB 端口,主機會按照USB HID規(guī)范對其進行識別和配置,在正確識別和配置 從USBHID裝置后,就表明此裝置的初始化過程成功(這個過程被稱為USB 枚舉過程)。之后,主機的數(shù)據(jù)收發(fā)等操作可以通過操作系統(tǒng)的通用驅(qū)動程序完成,
一般說來通過調(diào)用POSIX標(biāo)準(zhǔn)下open、 read、 write函數(shù)可以完成對從USB HID裝置的數(shù)據(jù)傳送操作。
本發(fā)明基于嵌入式Linux的從USB HID裝置及固件實現(xiàn)方法,可以實 現(xiàn)用戶不需開發(fā)和安裝驅(qū)動程序即可直接使用該裝置,并支持多個操作系 統(tǒng)下使用,具有即插即用、兼容性好、高速、支持熱插拔等特點。
應(yīng)該注意的是,上述實施例僅用于說明之目的,而無意于對本發(fā)明進 行限制。本文參照較佳的具體實施例對本發(fā)明進行了說明,但本發(fā)明的實 施方式并不受上述實施例的限制,任何應(yīng)該包括從屬權(quán)利要求范圍之內(nèi)所 有功能的改變、修飾、替代、組合、簡化,均為等效的置換方式,都包含 在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1、一種基于嵌入式Linux的從USB HID裝置,其特征在于該裝置是一個硬件控制電路,該裝置包括處理器CPU(101)、從USB控制芯片(102)、DMA控制器(103)、內(nèi)存控制器(104)、電源模塊(105)、內(nèi)部存儲器(106)、系統(tǒng)總線(107)、非易失性存儲器(108)。
2、 如權(quán)利要求l所述的基于嵌入式Linux的從USB HID裝置,其特征 在于從USB HID裝置(100)通過供電線路(110)連接供電裝置,供電 線路(110)連接到電源模塊(105),電源模塊(105)對從USB HID裝置(100)的電路進行供電,此處的供電裝置為主機系統(tǒng)或者獨立的供電電源。
3、 如權(quán)利要求l所述的基于嵌入式Linux的從USB HID裝置,其特征 在于從USB HID裝置(100)可以是通過USB數(shù)據(jù)線(109)連接上行計 算機,上行計算機通過USB總線接收數(shù)據(jù)和發(fā)送數(shù)據(jù)到從USB HID裝置(100),此處的數(shù)據(jù)是任何二進制數(shù)據(jù)流,裝置和計算機通過此數(shù)據(jù)進行 數(shù)據(jù)通信交互。
4、 如權(quán)利要求l所述的基于嵌入式Linux的從USB HID裝置,其特征 在于從USB控制芯片(102)通過USB總線與上行計算機連接;在裝置內(nèi) 部,從USB控制芯片(102)連接到系統(tǒng)總線(107),其中處理器CPU (101) 通過系統(tǒng)總線(107)對從USB控制芯片(102)進行操作和配置;從USB 控制芯片(102)也可以通過DMA控制器(103)控制數(shù)據(jù)交換;從USB控 制芯片(102)可以動態(tài)配置,由軟件控制其配置行為。
5、 一種基于嵌入式Linux的從USB HID固件實現(xiàn)方法,其特征在于包含(1) 嵌入式Linux操作系統(tǒng)此操作系統(tǒng)采用基于硬件架構(gòu)的Linux 內(nèi)核,針對硬件控制電路進行了相關(guān)移植和配置,并選用合適的文件系統(tǒng) 和應(yīng)用程序,向固件系統(tǒng)提供運行的軟件平臺;(2) 從USB HID固件驅(qū)動程序;此固件驅(qū)動程序運行于嵌入式Limix操作系統(tǒng)的內(nèi)核空間,根據(jù)從USB控制芯片規(guī)范,設(shè)計了符合USB HID協(xié) 議的設(shè)備驅(qū)動程序,并提供了 USB總線動態(tài)監(jiān)測功能,向應(yīng)用程序告知USB 插拔事件消息;(3) USB通信控制程序USB通信控制程序運行于嵌入式Linux操作 系統(tǒng)的用戶空間,調(diào)用Linux API (Application Programming Interface) 操作從USB控制芯片,接收和發(fā)送數(shù)據(jù)到USB總線,并接收USB插拔事件 消息,重新啟動數(shù)據(jù)收發(fā)過程,進而提供熱插拔功能。
6、 如權(quán)利要求5所述的基于嵌入式Linux的從USB HID固件實現(xiàn)方法, 其特征在于所述嵌入式Linux操作系統(tǒng)提供從USB HID固件驅(qū)動程序的 模塊設(shè)置選項,在KConfig文件和Makefile中添加了 CONFIGJJSB—HID宏 定義,用于編譯從USB HID固件驅(qū)動程序。
7、 如權(quán)利要求5所述的基于嵌入式Linux的從USB HID固件實現(xiàn)方法, 其特征在于所述從USB HID固件驅(qū)動程序,包含(1) 從USB控制芯片初始化與控制子模塊其功能用于設(shè)置從USB控 制芯片的時鐘,使能此芯片,并配置從USB芯片的寄存器組;(2) USB數(shù)據(jù)接收子模塊其功能用于接收USB HID數(shù)據(jù);(3) USB數(shù)據(jù)發(fā)送子模塊其功能用于發(fā)送USB HID數(shù)據(jù);(4) USB中斷服務(wù)子模塊其功能用于處理從USB控制芯片的中斷,對主機的枚舉請求、發(fā)送數(shù)據(jù)請求、接收數(shù)據(jù)請求進行響應(yīng);(5) USB字符驅(qū)動實現(xiàn)子模塊其功能用于按照Linux字符設(shè)備驅(qū)動 程序相關(guān)規(guī)范,從USB HID固件驅(qū)動程序進行封裝。
8、 如權(quán)利要求5所述的基于嵌入式Linux的從USB HID固件實現(xiàn)方法, 其特征在于所述USB通信控制程序,包含(l)初始化子模塊調(diào)用Linux API的打開函數(shù),以獲得設(shè)備描述符; 創(chuàng)建插拔事件消息處理線程,此線程就是插拔事件消息處理子模塊;創(chuàng)建 數(shù)據(jù)發(fā)送線程,此線程就是數(shù)據(jù)發(fā)送子模塊;創(chuàng)建數(shù)據(jù)接收線程,此線程就是數(shù)據(jù)接收子模塊;(2) 插拔事件消息處理子模塊等待接收固件驅(qū)動程序發(fā)送過來的插 拔事件消息,如果接收到此消息,結(jié)束數(shù)據(jù)發(fā)送子模塊和數(shù)據(jù)接收子模塊, 關(guān)閉設(shè)備,然后重新打開設(shè)備,并重新初始化通信控制程序中的數(shù)據(jù)收發(fā) 功能;(3) 數(shù)據(jù)發(fā)送子模塊調(diào)用Linux API寫函數(shù),把數(shù)據(jù)發(fā)送到USB總線上;(4) 數(shù)據(jù)接收子模塊調(diào)用Linux API讀函數(shù),接收USB總線上的數(shù) 據(jù),并提交給需要此數(shù)據(jù)的其他數(shù)據(jù)處理程序。
全文摘要
本發(fā)明公開了一種基于嵌入式Linux的從USB HID固件實現(xiàn)方法,包含(1)嵌入式Linux操作系統(tǒng);(2)從USB HID固件驅(qū)動程序;(3)USB通信控制程序。利用本發(fā)明可以快速完成基于嵌入式Linux的從USB HID固件系統(tǒng)的開發(fā),以實現(xiàn)用戶無需開發(fā)和安裝驅(qū)動程序而直接使用,不用考慮不同操作系統(tǒng)的兼容性問題。本發(fā)明的目的還在于通過USB HID協(xié)議方式,在設(shè)備和主機系統(tǒng)之間實現(xiàn)數(shù)據(jù)通信。
文檔編號G06F13/38GK101593164SQ200910063150
公開日2009年12月2日 申請日期2009年7月13日 優(yōu)先權(quán)日2009年7月13日
發(fā)明者俊 周, 菲 諶, 涌 黃 申請人:中國船舶重工集團公司第七○九研究所