成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

USB設備的Bulk模式驅動程序設計

2010-08-28 10:45:56來源:西部e網作者:

  摘要 本文介紹了USB設備Bulk模式驅動程序的設計。該設計使用FIFO消息隊列、信號量機制和定時器中斷機制,可在不同的操作系統中實現。文中所用到的程序體系結構對于實現不同USB設備進行Bulk模式通訊是通用的。


  引言

  通用串行總線(USB)是一種串行接口,具有自動配置能力和良好的兼容性,從而簡化了計算機與外設的連接,被計算機外設硬件制造商廣泛采納。USB總線標準由1.1版升級到2.0版后,傳輸率由12Mbps增加到了480Mbps,更適宜于高速數據傳輸。USB設備支持打印機、掃描儀、數碼相機等外設時,由于這些外設與主機間傳輸的數據量大,要求驅動程序采用Bulk模式進行高速數據傳輸。

  USB設備驅動的整體結構

  USB設備驅動的整體結構包括如下五個主要部分:USB應用程序接口、USB設備驅動函數、USB中斷服務程序、USB回調接口程序、USB標準事件處理程序。


圖1 USB設備驅動程序的整體結構


  USB應用程序接口

  USB應用程序接口主要功能是對USB驅動器進行軟硬件初始化、打開端口、關閉端口、讀端口、寫端口和端口控制操作。當設備驅動器裝入系統設備表時,I/O系統就調用該應用程序接口。

  USB應用程序接口的一個例程所包含的函數:

  ·USB_init( ) -- USB端口驅動函數的安裝和初始化、硬件配置。

  ·USB_open( ) -- 打開USB端口。

  ·USB_close( ) -- 關閉USB端口。

  ·USB_read( ) -- 對USB端口進行讀操作。

  ·USB_write( ) -- 對USB端口進行寫操作。

  ·USB_ioctl( ) -- 對USB設備進行I/O控制操作。

  USB設備驅動函數

  1、USB_init()-- 初始化USB端口

  USB_init函數初始化特定USB端口驅動器,進行軟硬件配置。

  初始化步驟如下:

  (1) 將USB設備驅動器安裝到I/O系統設備表中。

  (2) 獲取USB控制器使用的中斷號。

  (3) 獲取各端口所需的系統資源,包括內存、信號量和消息隊列。

  (4) 初始化USB驅動器數據結構與USB端口狀態寄存器。

  (5) 啟動USB標準事件處理程序。

  (6) 啟用控制端口0和USB中斷最小支持集。

  2、USB_open()-- 打開USB端口

  USB_open函數允許應用程序打開一個USB端口,選擇DMA數據傳輸方式。

  執行打開調用的典型步驟如下:

  (1) 如果不是默認的控制端口0,要檢查端口狀態是否為"CONFIGURED"。

  (2) 如果不允許多次打開,要確認端口還沒有打開。

  (3) 確認端口對當前選擇的接口有效。

  (4) 選擇DMA傳輸,設置DMA控制器使用該端口的FIFO作為目的地址。

  (5) 設置端口為打開狀態。

  3、USB_close()-- 關閉USB端口

  USB_close函數允許USB應用程序關閉一個端口,并關閉DMA通道。

  執行關閉調用的典型步驟為:

  (1) 關閉DMA通道,放棄端口對DMA控制器的使用。

  (2) 設置端口為關閉狀態。

  4、USB_read()-- 對USB端口進行讀操作

  USB_read函數允許USB應用程序從輸出端口或控制端口讀取數據。

  調用讀函數的典型步驟為:

  (1) 設置端口號、類型和方向。

  (2) 確認端口處于打開狀態。

  (3) 設置端口信號量,避免多次調用。

  (4) 調用readDMA( ) 進行DMA寫操作。函數內執行步驟為:

   (a) 啟動DMA從端口接收FIFO的讀操作,將數據從端口傳送到內存。

   (b) 等待DMA完成中斷。(DMA中斷向端口消息隊列發送一條消息表示數據傳輸完成。)

   (c) 重復進行(a)~(c)步驟直至接收到全部數據或USB主機結束傳輸。如果USB控制器檢測到短包中斷或零字節包,或者出現等待超時,則停止DMA傳送,并轉(d)步驟執行。

   (d) 向USB主機發送一個零字節包,完成控制狀態步驟。

  (5) 釋放端口信號量。

  (6) 返回接收到的字節數或錯誤信息。

  5、USB_write()-- 對USB端口進行寫操作

  USB_write函數允許USB應用程序寫數據到輸入端口或控制端口。

  執行寫調用的典型步驟為:

  (1) 確認端口號、類型和方向。
 
  (2) 確認端口處于打開狀態。

  (3) 獲取端口信號量,避免多次調用。

  (4) 調用writeDMA( )進行DMA寫操作。函數內執行步驟為:

   (a) DMA將內存數據傳送到目標端口的FIFO,并等待DMA完成中斷。

   (b) 若從接收FIFO接收到USB主機的一個零字節包,或者出現等待超時,則退出并返回傳輸的字節數。

   (c) 重復執行(a)~(c)步驟直至全部數據傳輸完畢時,轉(d)步驟執行。

   (d) 強制向USB主機發送最后的零字節包或短包用來結束傳輸過程。

  (5) 如果是控制端口,等待來自USB主機的零字節包,完成控制狀態步驟。

  (6) 釋放端口信號量。

  (7) 返回傳輸的字節數或錯誤信息。

  6、USB_ioctl()-- 對USB設備進行I/O控制操作

  USB_ioctl函數設置端口狀態寄存器并執行I/O端口控制功能。

  USB應用程序根據控制對象不同分別調用提供應用程序控制USB接口的能力的controlIoctl()和epIoctl()函數。controlIoctl()函數執行USB控制器整體I/O出控制功能。epIoctl()函數執行個別USB端口的I/O控制功能。。

  1) controlIoctl( ) -- 控制器控制函數

  controlIoctl()函數對USB控制器進行控制操作。執行I/O功能之前獲取USB控制器信號量,避免多次調用影響正在傳輸數據的端口。完成I/O操作后釋放信號量。

  USB控制器應支持的控制功能包括:

  ·支持遠程喚醒功能。

  ·設置USB端口進入/退出掛起狀態。

  ·復位USB端口。

  ·設置USB控制器消息隊列等待超時。

  ·為DMA選擇端口FIFO。

  ·允許/禁止可選中斷。

  ·讀取幀時間戳起始位。

  ·進行枚舉測試。

  ·返回接口、備用接口和當前USB端口配置狀態。

  2) epIoctl() -- 端口控制函數

  epIoctl()函數對端口進行控制操作。執行I/O功能之前獲取USB控制器信號量,避免多次調用影響正在傳輸數據的端口。完成I/O操作后釋放信號量。

  端口應支持的控制功能包括:

  (1) 獲得USB端口狀態。

  (2) 設置USB端口進入/退出阻塞狀態。

  (3) 設置USB端口消息隊列等待超時。

  USB中斷服務程序

  USB控制器產生單一中斷,多個端口共享。每個端口產生ACK、NACK/ERROR中斷。輸出端口產生接收零字節包或短包中斷。控制端口0接收設置包時產生中斷。USB控制器產生USB事件中斷,如幀起始(SOF)、掛起、恢復和復位。

  USB中斷服務程序執行下列步驟:

  (1) 識別發生了USB中斷的類型。

  (2) 清除中斷產生的條件。

  (3) 讀USB狀態寄存器,獲取當前配置、接口或幀起始時間戳狀態信息。

  (4) 向USB控制器消息隊列或回調函數的接收消息隊列發送一條消息。

  USB標準事件處理程序

  USB驅動器初始化后,啟動USB標準事件處理程序負責處理枚舉過程和異步USB事件。

  事件處理程序使用控制端口0,直到完成枚舉過程。當USB應用程序處于非活動狀態時,除控制端口0以外端口均不可訪問。事件處理程序在端口0上執行控制操作,響應USB標準請求,并負責通知USB應用程序枚舉完成和接口活動狀態,USB事件通過回調接口傳遞到USB外設應用程序。當對USB端口枚舉操作完成,USB應用程序就可打開并使用USB端口。

  處理一個USB任務的執行過程為:

  (1) 讀取USB控制器消息隊列。

  (2) 如果接收到設置包,則調用標準請求處理函數。

  (3) 如果接收到事件,則調用USB事件處理函數。

  (4) 確定當前狀態和有效配置/接口。

  (5) 更新USB控制器和端口數據結構。

  (6) 重復(1)~(5)步驟。

  USB回調接口程序

  回調應用程序接口是向應用程序提供反饋信息的一種接口,包括向應用程序通知USB事件的消息,如復位、配置改變、接口改變、掛起、恢復和幀起始。使用USB的應用程序要以下列方式回應這些消息:

  (1) 復位 關閉端口,等待枚舉測試。

  (2) 配置改變 關閉端口,按新配置打開端口。

  (3) 接口改變 關閉端口,從新接口打開端口。

  (4) 掛起 進入低功耗模式。

  (5) 恢復 退出低功耗模式。

  (6) 幀起始 執行應用程序規定的處理。

  總結

  本文提供了進行USB端口Bulk模式驅動程序設計的過程,實現在USB接口設備與Host主機之間進行高速數據傳輸,對于嵌入式環境以及windows多線程環境下的USB設備的高速數據傳輸同樣適用。

關鍵詞:USB

贊助商鏈接:

主站蜘蛛池模板: 德清县| 金门县| 永仁县| 青川县| 阿巴嘎旗| 新绛县| 滁州市| 尤溪县| 忻州市| 昌平区| 莒南县| 大竹县| 九江县| 社会| 白山市| 浦城县| 灵山县| 楚雄市| 三门峡市| 防城港市| 石棉县| 吉安县| 师宗县| 厦门市| 崇明县| 丰县| 绥德县| 通化市| 弋阳县| 庐江县| 河间市| 滁州市| 凌海市| 密云县| 民权县| 惠安县| 岗巴县| 肃南| 谢通门县| 鹤山市| 寿阳县|