一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

USB設(shè)備的Bulk模式驅(qū)動程序設(shè)計(jì)

 lchjczw 2012-03-10

引言

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

  USB設(shè)備驅(qū)動的整體結(jié)構(gòu)

  USB設(shè)備驅(qū)動的整體結(jié)構(gòu)包括如下五個(gè)主要部分:USB應(yīng)用程序接口、USB設(shè)備驅(qū)動函數(shù)、USB中斷服務(wù)程序、USB回調(diào)接口程序USB標(biāo)準(zhǔn)事件處理程序。


1 USB設(shè)備驅(qū)動程序的整體結(jié)構(gòu)


  USB應(yīng)用程序接口

  USB應(yīng)用程序接口主要功能是對USB驅(qū)動器進(jìn)行軟硬件初始化、打開端口、關(guān)閉端口、讀端口、寫端口和端口控制操作。當(dāng)設(shè)備驅(qū)動器裝入系統(tǒng)設(shè)備表時(shí),I/O系統(tǒng)就調(diào)用該應(yīng)用程序接口。

  USB應(yīng)用程序接口的一個(gè)例程所包含的函數(shù):
  ·USB_init( ) -- USB端口驅(qū)動函數(shù)的安裝和初始化、硬件配置。
  ·USB_open( ) -- 打開USB端口。
  ·USB_close( ) -- 關(guān)閉USB端口。
  ·USB_read( ) -- USB端口進(jìn)行讀操作。
  ·USB_write( ) -- USB端口進(jìn)行寫操作。
  ·USB_ioctl( ) -- USB設(shè)備進(jìn)行I/O控制操作。
  USB設(shè)備驅(qū)動函數(shù)
  1USB_init()-- 初始化USB端口
  USB_init函數(shù)初始化特定USB端口驅(qū)動器,進(jìn)行軟硬件配置。
  初始化步驟如下:
  (1 USB設(shè)備驅(qū)動器安裝到I/O系統(tǒng)設(shè)備表中。
 ?。?/SPAN>2 獲取USB控制器使用的中斷號。
 ?。?/SPAN>3 獲取各端口所需的系統(tǒng)資源,包括內(nèi)存、信號量和消息隊(duì)列。
 ?。?/SPAN>4 初始化USB驅(qū)動器數(shù)據(jù)結(jié)構(gòu)與USB端口狀態(tài)寄存器。
 ?。?/SPAN>5 啟動USB標(biāo)準(zhǔn)事件處理程序。
 ?。?/SPAN>6 啟用控制端口0USB中斷最小支持集。
  2、USB_open()-- 打開USB端口

  USB_open函數(shù)允許應(yīng)用程序打開一個(gè)USB端口,選擇DMA數(shù)據(jù)傳輸方式。

  執(zhí)行打開調(diào)用的典型步驟如下:

 ?。?/SPAN>1 如果不是默認(rèn)的控制端口0,要檢查端口狀態(tài)是否為"CONFIGURED"。

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

 ?。?/SPAN>3 確認(rèn)端口對當(dāng)前選擇的接口有效。

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

 ?。?/SPAN>5 設(shè)置端口為打開狀態(tài)。

  3、USB_close()-- 關(guān)閉USB端口

  USB_close函數(shù)允許USB應(yīng)用程序關(guān)閉一個(gè)端口,并關(guān)閉DMA通道。

  執(zhí)行關(guān)閉調(diào)用的典型步驟為:

 ?。?/SPAN>1 關(guān)閉DMA通道,放棄端口對DMA控制器的使用。

  (2 設(shè)置端口為關(guān)閉狀態(tài)。

  4、USB_read()-- USB端口進(jìn)行讀操作

  USB_read函數(shù)允許USB應(yīng)用程序從輸出端口或控制端口讀取數(shù)據(jù)。

  調(diào)用讀函數(shù)的典型步驟為:

 ?。?/SPAN>1 設(shè)置端口號、類型和方向。

  (2 確認(rèn)端口處于打開狀態(tài)。

  (3 設(shè)置端口信號量,避免多次調(diào)用。

 ?。?/SPAN>4 調(diào)用readDMA( ) 進(jìn)行DMA寫操作。函數(shù)內(nèi)執(zhí)行步驟為:

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

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

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

   (d) USB主機(jī)發(fā)送一個(gè)零字節(jié)包,完成控制狀態(tài)步驟。

 ?。?/SPAN>5 釋放端口信號量。

 ?。?/SPAN>6 返回接收到的字節(jié)數(shù)或錯(cuò)誤信息。

  5、USB_write()-- USB端口進(jìn)行寫操作

  USB_write函數(shù)允許USB應(yīng)用程序寫數(shù)據(jù)到輸入端口或控制端口。

  執(zhí)行寫調(diào)用的典型步驟為:

 ?。?/SPAN>1 確認(rèn)端口號、類型和方向。
 
 ?。?/SPAN>2 確認(rèn)端口處于打開狀態(tài)。

 ?。?/SPAN>3 獲取端口信號量,避免多次調(diào)用。

 ?。?/SPAN>4 調(diào)用writeDMA( )進(jìn)行DMA寫操作。函數(shù)內(nèi)執(zhí)行步驟為:

   (a) DMA將內(nèi)存數(shù)據(jù)傳送到目標(biāo)端口的FIFO,并等待DMA完成中斷。

   (b) 若從接收FIFO接收到USB主機(jī)的一個(gè)零字節(jié)包,或者出現(xiàn)等待超時(shí),則退出并返回傳輸?shù)淖止?jié)數(shù)。

   (c) 重復(fù)執(zhí)行(a)~(c)步驟直至全部數(shù)據(jù)傳輸完畢時(shí),轉(zhuǎn)(d)步驟執(zhí)行。

   (d) 強(qiáng)制向USB主機(jī)發(fā)送最后的零字節(jié)包或短包用來結(jié)束傳輸過程。

 ?。?/SPAN>5 如果是控制端口,等待來自USB主機(jī)的零字節(jié)包,完成控制狀態(tài)步驟。

 ?。?/SPAN>6 釋放端口信號量。

 ?。?/SPAN>7 返回傳輸?shù)淖止?jié)數(shù)或錯(cuò)誤信息。

  6、USB_ioctl()-- USB設(shè)備進(jìn)行I/O控制操作

  USB_ioctl函數(shù)設(shè)置端口狀態(tài)寄存器并執(zhí)行I/O端口控制功能。

  USB應(yīng)用程序根據(jù)控制對象不同分別調(diào)用提供應(yīng)用程序控制USB接口的能力的controlIoctl()epIoctl()函數(shù)。controlIoctl()函數(shù)執(zhí)行USB控制器整體I/O出控制功能。epIoctl()函數(shù)執(zhí)行個(gè)別USB端口的I/O控制功能。。

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

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

  USB控制器應(yīng)支持的控制功能包括:

  ·支持遠(yuǎn)程喚醒功能。

  ·設(shè)置USB端口進(jìn)入/退出掛起狀態(tài)。

  ·復(fù)位USB端口。

  ·設(shè)置USB控制器消息隊(duì)列等待超時(shí)。

  ·DMA選擇端口FIFO。

  ·允許/禁止可選中斷。

  ·讀取幀時(shí)間戳起始位。

  ·進(jìn)行枚舉測試。

  ·返回接口、備用接口和當(dāng)前USB端口配置狀態(tài)。

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

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

  端口應(yīng)支持的控制功能包括:

 ?。?/SPAN>1 獲得USB端口狀態(tài)。

 ?。?/SPAN>2 設(shè)置USB端口進(jìn)入/退出阻塞狀態(tài)。

  (3 設(shè)置USB端口消息隊(duì)列等待超時(shí)。



  USB中斷服務(wù)程序

  USB控制器產(chǎn)生單一中斷,多個(gè)端口共享。每個(gè)端口產(chǎn)生ACK、NACK/ERROR中斷。輸出端口產(chǎn)生接收零字節(jié)包或短包中斷??刂贫丝?/SPAN>0接收設(shè)置包時(shí)產(chǎn)生中斷。USB控制器產(chǎn)生USB事件中斷,如幀起始(SOF)、掛起、恢復(fù)和復(fù)位。

  USB中斷服務(wù)程序執(zhí)行下列步驟:

 ?。?/SPAN>1 識別發(fā)生了USB中斷的類型。

 ?。?/SPAN>2 清除中斷產(chǎn)生的條件。

 ?。?/SPAN>3 USB狀態(tài)寄存器,獲取當(dāng)前配置、接口或幀起始時(shí)間戳狀態(tài)信息。

 ?。?/SPAN>4 USB控制器消息隊(duì)列或回調(diào)函數(shù)的接收消息隊(duì)列發(fā)送一條消息。

  USB標(biāo)準(zhǔn)事件處理程序

  USB驅(qū)動器初始化后,啟動USB標(biāo)準(zhǔn)事件處理程序負(fù)責(zé)處理枚舉過程和異步USB事件。

  事件處理程序使用控制端口0,直到完成枚舉過程。當(dāng)USB應(yīng)用程序處于非活動狀態(tài)時(shí),除控制端口0以外端口均不可訪問。事件處理程序在端口0上執(zhí)行控制操作,響應(yīng)USB標(biāo)準(zhǔn)請求,并負(fù)責(zé)通知USB應(yīng)用程序枚舉完成和接口活動狀態(tài),USB事件通過回調(diào)接口傳遞到USB外設(shè)應(yīng)用程序。當(dāng)對USB端口枚舉操作完成,USB應(yīng)用程序就可打開并使用USB端口。

  處理一個(gè)USB任務(wù)的執(zhí)行過程為:

 ?。?/SPAN>1 讀取USB控制器消息隊(duì)列。

 ?。?/SPAN>2 如果接收到設(shè)置包,則調(diào)用標(biāo)準(zhǔn)請求處理函數(shù)。

 ?。?/SPAN>3 如果接收到事件,則調(diào)用USB事件處理函數(shù)。

 ?。?/SPAN>4 確定當(dāng)前狀態(tài)和有效配置/接口。

 ?。?/SPAN>5 更新USB控制器和端口數(shù)據(jù)結(jié)構(gòu)。

 ?。?/SPAN>6 重復(fù)(1)~(5)步驟。

  USB回調(diào)接口程序

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

 ?。?/SPAN>1 復(fù)位 關(guān)閉端口,等待枚舉測試。

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

 ?。?/SPAN>3 接口改變 關(guān)閉端口,從新接口打開端口。

 ?。?/SPAN>4 掛起 進(jìn)入低功耗模式。

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

  (6 幀起始 執(zhí)行應(yīng)用程序規(guī)定的處理。

  總結(jié)

  本文提供了進(jìn)行USB端口Bulk模式驅(qū)動程序設(shè)計(jì)的過程,實(shí)現(xiàn)在USB接口設(shè)備與Host主機(jī)之間進(jìn)行高速數(shù)據(jù)傳輸,對于嵌入式環(huán)境以及windows多線程環(huán)境下的USB設(shè)備的高速數(shù)據(jù)傳輸同樣適用

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    熟女少妇一区二区三区蜜桃| 大香蕉精品视频一区二区| 日本深夜福利在线播放| 国产欧美日韩在线一区二区| 男女一进一出午夜视频| 99视频精品免费视频| av在线免费观看一区二区三区| 白白操白白在线免费观看 | 国产一级内片内射免费看| 日本加勒比在线播放一区| 国产伦精品一区二区三区精品视频| 插进她的身体里在线观看骚| 亚洲av首页免费在线观看| 区一区二区三中文字幕| 91超频在线视频中文字幕| 欧美日本亚欧在线观看| 黄色美女日本的美女日人| 国产成人免费激情视频| 国产又大又硬又粗又黄| 国产又粗又猛又爽又黄| 亚洲欧美中文字幕精品| 欧美一二三区高清不卡| 搡老熟女老女人一区二区| 激情五月综五月综合网| 国产女性精品一区二区三区| 久久精品国产99国产免费| 在线观看免费午夜福利| 日韩高清一区二区三区四区| 日韩成人h视频在线观看| 欧美日韩国产精品自在自线| 亚洲中文字幕人妻系列| 深夜福利亚洲高清性感| 91精品视频全国免费| 国内九一激情白浆发布| 国产成人午夜av一区二区| 欧美大黄片在线免费观看| 国产欧美日韩综合精品二区| 欧美亚洲国产日韩一区二区| 中文字幕人妻av不卡| 国产色第一区不卡高清| 久久福利视频视频一区二区 |