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