《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于Linux2.6的USB設備的驅動實現
基于Linux2.6的USB設備的驅動實現
摘要: 嵌入式linux系統環境以其易于移植裁減、內核小、效率高、完整、原代碼開放及性能優異等特點,在嵌入式領域得到了非常廣泛的應用。Linux的USB設備端的源代碼中主要有USB device的海量存儲設備、串口設備、網絡設備等設備驅動程序及各種USB device控制器芯片的驅動程序。市場上USB設備控制器芯片種類繁多,大多數用戶需要針對特定應用來開發相關的USB設備控制器驅動程序,才能使設備正常工作在linux操作系統下。
Abstract:
Key words :

 

      嵌入式linux系統環境以其易于移植裁減、內核小、效率高、完整、原代碼開放及性能優異等特點,在嵌入式領域得到了非常廣泛的應用。Linux的USB設備端的源代碼中主要有USB device的海量存儲設備、串口設備、網絡設備等設備驅動程序及各種USB device控制器芯片的驅動程序。市場上USB設備控制器芯片種類繁多,大多數用戶需要針對特定應用來開發相關的USB設備控制器驅動程序,才能使設備正常工作在linux操作系統下。
 
  1 USB設備端驅動系統
  Linux Gadget子系統主要分為三層:第一層為芯片驅動層,負責將各種USB device控制器抽象為統一的函數接口,以供上層驅動程序調用;第二層主要是對操作函數的簡單封裝;第三層為設備驅動層,可根據系統的需求實現所對應的功能。圖1所示是Linux Gadget子系統的驅動層次。Linux Gadget子系統的設備驅動層主要根據各個類別的規范及協議實現各種設備的驅動,本設計需要使一個嵌入式設備擁有移動硬盤的功能,所以,可以根據海量存儲類的規范及協議來實現該功能。
  1.1 UDC驅動的基本構架
  圖2所示是UDC驅動的基本構架圖。在控制器驅動程序中,首先應注冊platform驅動,調用其probe函數搜索設備,并在probe函數內初始化usb_ep和usb_gadget等結構,然后注冊設備,并申請中斷,接著等待中斷進入中斷服務子程序,最后聲明和實現usb_gadget_register_driver注冊函數并輸出給上層驅動。在該過程中,聯系它們的紐帶是一些全局結構體變量。
 
  1.2 Gadget API
  Gadget API為Gadget系統定義了統一的數據結構和接口函數,它和主機端的USB Core地位類似,但功能僅限于提供編程接口,如用結構體usb_gadget_ops和usb_ep_ops對設備控制器驅動操作函數和端點操作函數進行重新封裝。比較特殊的是Gadget驅動程序注冊函數usb_gadget_register_driver,它們是由設備控制器(UDC)驅動直接提供的,用于將UDC綁定到gadget driver。這增加了Gadget Driver和UDC之間的依賴性。
  在設備端,Gadget系統雖然類似主機驅動系統分了三層結構,但Gadget API只定義了一些數據結構、宏和功能函數,并對UDC驅動程序進行了簡單包裝,而沒有驅動管理等功能。
 
  1.3設備應用驅動程序
  設備端應用程序(Gadget Driver)用于控制USB設備功能的實現,使設備表現出“網絡連接”、“打印機”或“大容量存儲設備”等特性。本文以大容量移動存儲設備為例來實現移動硬盤的功能。
  BULK ONLY傳輸指的是主機和大容量存儲設備之間的一種數據傳輸方式。
 
  2設備端驅動調度
  在嵌入式Linux操作系統中,Gadget driver和Gadget API可完成部分USB協議處理、BULK ONLY等傳輸協議以及指令的解析處理,用戶只需要在設備控制器驅動程序中完成部分USB協議處理和Gadget API的銜接工作。
  圖3所示的流程圖給出了USB設備端驅動程序的基本調度思想。該方案的主要思路是被動的接受主機端的傳輸命令(任何類型的通信都由USB主機發起,USB設備間不能直接通信),然后通過中斷觸發的方式完成主機端的數據傳輸。當產生設備端中斷時,設備控制器驅動程序首先判斷中斷類型。當其為批量傳輸端點IN中斷時,驅動程序會將該EP下鏈接的REQ中的數據依次寫入USB2.0 OTG IP的設備控制器的內存區;當其為批量傳輸OUT中斷時,驅動程序會將設備控制器內存區的數據讀入REQ中的buffer中;當其為端點0的控制傳輸中斷時,驅動程序將讀取端點緩沖區的數據,并解析當前的設備請求。如果主機傳輸給設備的設備請求為USB REO SEDRESS(設置設備地址)、USB_REQ_GET_STATUS(獲取設備狀態)、USB_REQ_SET_FEATURE(設置設備特性),設備控制器驅動程序會自行響應請求。但是,如果是其它設備請求,如GET_DESCRIPTOR(獲取設備描述符)時,設備控制器驅動便會將該請求提交給Gadget Driver,然后由Gadget Driver排隊將該設備請求提交給端點,以等待下次控制端點中斷。
  控制傳輸比較復雜,它需要完成建立階段、數據傳輸階段和狀態階段。整個控制端點中斷的處理可通過四個狀態實現,分別是:端點0空閑(EP0_IDLE)、 數據IN傳輸(EP0 IN DATA_PHASE)、數據OUT傳輸(EP0 OUT DATA_PHASE)和狀態階段(EPO_STATUS)。
  EP0_IDLE狀態主要處理建立階段的setup令牌,并根據獲得的設備請求處理能夠處理的設備請求,同時把不能處理的設備請求(如獲取設備描述符,配置描述符等)提交給上層Gadget Driver;EP0_OUT_DATA_PHASE狀態主要處理數據階段的OUT傳輸;EP0_OUT_DATA_PHASE狀態主要處理數據階段的IN傳輸;EP0_STATUS狀態則主要完成控制傳輸過程中的狀態階段。
  在圖3所示的流程圖中,EP0為控制傳輸端點,EP1、EP2、EP3為批量傳輸端點,它們主要包括端點傳輸類型、端點緩沖區大小等信息。REQ為Gadget Driver提交的端點請求,主要包含傳輸的數據長度和地址。
 
  3 UDC的設計與實現
  設備控制器驅動主要分為Gadget Driver接口模塊、Gadget API函數模塊、中斷處理模塊、數據結構定義、初始化模塊、硬件讀寫模塊等,各模塊可以單獨進行設計。
 
  3.1  數據結構定義
  根據Gadget API提供的數據結構,可以定義自己的數據結構(如設備數據結構otg_udc,端點數據結構otg_udc_ep等)來描述該USB設備控制器。
 
  定義完特定的設備控制器驅動的數據結構后,再進行相應的映射(static struct otg_ip_udcmemory),以便將具體的設備控制器、設備端點和Gadget的抽象數據結構聯系起來。
 
  3.2 Gadget Driver接口模塊
  UDC驅動提供有usb_gadget_driver_register模塊,該模塊可實usb_gadget_register_driver等綁定函數的功能,以綁定UDC和Gadget Driver。
 
  3.3 Gadget API函數模塊
  Linux USB gadget driver API定義了一個通用的gadget driver的接口,利用gadget driver可通過API與底層USB controller driver進行通信。該API屏蔽了底層硬件的不同,故可使gadget driver只注重功能的實現,而盡量與硬件無關。其代碼如下:
  該模塊主要實現Gadget API定義的函數功能,如結構體usb_ep_ops和usb_gadget_ops中的函數,以及usb_gadget_register_driver注冊函數等。這些函數可供Gadget Driver調用。
 
  3.4  中斷處理模塊
  由于設備是被動的接受主機的控制,設備的所有行為都是基于設備中斷的觸發,因此,函數主要處理Reset中斷、Resume中斷、Suspend中斷、EP0中斷以及其他端口中斷。
 
  3.5  初始化模塊
  初始化主要是打開中斷、打開并設置端點、設置最大總線轉向時間(此時問即包間最大等待時間),還要設置最大緩沖區長度等。

  3.6  硬件讀寫模塊
  和主機控制器驅動程序類似,設備控制器的讀寫方式分為PIO讀寫和DMA讀寫兩種模式,讀寫內容也分為寄存器讀寫和端點緩沖區讀寫。在讀寫過程中,所有讀寫地址都必須是雙字節對齊模式。
 
  4  驅動測試結果
 
  本文研究的HCD已經應用于實際的工程中,驅動測試的硬件環境如圖4所示。
  本系統的硬件平臺是Realview EB,這是一個高度集成的開發板,其母板上的硬件資源包括:一個FPGA (Xilinx Virtex-II XC2V6000)、靜態和動態內存、集成外圍設備和兩個用于Core Tiles連接的tile連接器。設計時可通過增加一個額外的Core Tile(ARM926EJS CORE)來創建一個微處理系統。Logic Tile(Xilinx XC2V6000)中包含有一塊具有主機控制器功能的芯片otg_ip,otg_ip可通過片內總線AHB掛載在母板EB上。在該開發板上運行Linux系統時,可通過交叉編譯調試環境將開發報與一臺PC機相連,這樣,調試信息就可以通過串口打印在該主機的終端上。otg_ip可通過ULPI接口連接PHY芯片,并與USB設備相連。
 
  設備控制器驅動模塊otg_ip_udc.ko和g_filestorage.ko成功加載后,再將其作為移動優盤插入電腦主機的USB接口,驅動即可成功識別。圖5所示是內核打印的信息結果。
 
  USB通用串行總線具有傳輸速率高、功耗低、可熱插拔和發展快速等優點,而Linus操作系統則具有易于移植和裁減、內核小、效率高、原代碼開放等特點,本文通過將其結合而給出的Linux環境下的USB設備驅動方法,可以快速地實現大容量的存儲功能,實驗表明:該系統的數據讀寫速度可以達到681 kB/s,而且效果良好。
此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美一区永久视频免费观看| 欧美精品久久99| 亚洲国产日韩欧美| 午夜免费电影一区在线观看| 亚洲天堂免费在线观看视频| 亚洲精品小视频| 亚洲人成在线观看| 亚洲经典在线| 亚洲福利国产| 亚洲高清自拍| 亚洲国产91色在线| 亚洲国语精品自产拍在线观看| 永久免费毛片在线播放不卡| 合欧美一区二区三区| 国产综合视频| 狠狠久久五月精品中文字幕| 国产日韩视频| 国产亚洲欧美另类中文| 国产一区二区剧情av在线| 国产一区二区电影在线观看| 国产亚洲精品bt天堂精选| 国产午夜久久| 黄色一区二区在线| 亚洲成色最大综合在线| 亚洲激情av| 99精品热6080yy久久| 在线亚洲一区观看| 亚洲欧美日韩精品久久| 欧美在线观看天堂一区二区三区| 久久精品久久综合| 最新亚洲电影| 亚洲视频导航| 欧美亚洲网站| 久久久在线视频| 欧美刺激性大交免费视频| 欧美久久婷婷综合色| 国产精品国产三级国产普通话蜜臀| 国产精品久久久久毛片软件| 国产欧美日韩不卡免费| 国内成人在线| 亚洲激情视频在线播放| 一区二区三区四区国产精品| 亚洲女同在线| 亚洲黄色影片| 亚洲小说欧美另类婷婷| 久久久久成人网| 欧美久久成人| 国产视频欧美视频| 91久久中文| 亚洲欧美一区二区在线观看| 亚洲大黄网站| 亚洲深夜激情| 久久香蕉国产线看观看网| 欧美日本在线| 国产三级欧美三级日产三级99| 在线播放中文一区| 一区二区三区视频在线播放| 欧美影院在线| 一区二区三区三区在线| 久久成人在线| 欧美日本韩国| 国产亚洲福利一区| 亚洲精品中文字幕女同| 午夜精品久久久久久久蜜桃app| 亚洲国产精品成人va在线观看| 中文在线资源观看网站视频免费不卡| 久久丁香综合五月国产三级网站| 欧美大片免费久久精品三p| 国产精品看片资源| 亚洲国产三级网| 校园春色综合网| 一区二区三区欧美在线| 久久不射中文字幕| 欧美国产在线电影| 国产一区白浆| 亚洲视频一区二区| 亚洲精品久久嫩草网站秘色| 欧美中文字幕在线视频| 欧美日韩精品在线| 狠狠色狠狠色综合人人| 亚洲无玛一区| 99re热这里只有精品免费视频| 久久成人免费视频| 欧美小视频在线| 亚洲国产精品一区二区久| 午夜精品视频在线观看| 一区二区三区视频在线| 免费看成人av| 国产私拍一区| 亚洲在线中文字幕| 一区二区三区精品国产| 免费日本视频一区| 国产主播一区二区三区| 亚洲在线视频观看| 亚洲视频精选在线| 欧美精品一卡二卡| 亚洲高清在线观看| 久久国产精品一区二区| 性欧美精品高清| 国产精品夫妻自拍| 日韩天天综合| 亚洲精品日韩久久| 巨乳诱惑日韩免费av| 国产欧美一区二区三区视频| 一区二区三区黄色| 亚洲深夜福利网站| 欧美日韩国产精品| 亚洲破处大片| 亚洲美女视频在线观看| 美乳少妇欧美精品| 国产资源精品在线观看| 午夜欧美电影在线观看| 亚洲欧美日韩中文视频| 欧美性久久久| 在线亚洲+欧美+日本专区| 一区二区三区日韩欧美| 欧美日本在线观看| 亚洲日本在线观看| 亚洲美女啪啪| 欧美精品在线观看一区二区| 亚洲欧洲日韩综合二区| 亚洲精品乱码久久久久久黑人| 免费不卡视频| 亚洲激情欧美激情| 99精品国产99久久久久久福利| 欧美激情按摩在线| 亚洲人成毛片在线播放| 日韩一级精品| 欧美视频一区二区在线观看| 9l国产精品久久久久麻豆| 亚洲一区二区动漫| 国产精品久久久一区二区三区| 在线一区二区日韩| 欧美一区二区三区视频免费播放| 国产精品一区亚洲| 欧美一区二区成人6969| 久久久精品性| 亚洲高清不卡在线观看| 日韩一区二区精品| 欧美视频免费在线| 亚洲在线观看免费视频| 久久精品30| 在线日韩欧美| 一本色道久久综合亚洲精品不卡 | 亚洲欧美日韩一区在线| 国产毛片一区| 亚洲福利久久| 欧美激情一区二区三区四区| 一区二区三区高清在线| 欧美在线观看www| 精久久久久久| 一区二区av在线| 国产精品普通话对白| 欧美有码视频| 欧美wwwwww| 亚洲视频在线播放| 久久免费视频网| 亚洲狠狠婷婷| 亚洲欧美日韩精品综合在线观看| 国产一区二区你懂的| 亚洲精品久久| 国产精品普通话对白| 久久精品午夜| 欧美三级第一页| 性欧美大战久久久久久久久| 免费av成人在线| 中日韩美女免费视频网址在线观看| 欧美一区二区免费视频| 在线观看91精品国产麻豆| 亚洲天堂男人| 激情欧美一区二区三区在线观看| 夜夜嗨一区二区三区| 国产欧美一区二区三区视频| 亚洲精品极品| 国产日韩一区二区三区在线播放 | 欧美一区二区三区视频| 亚洲国产精品一区二区www| 欧美亚洲系列| 最近中文字幕日韩精品| 欧美一级视频精品观看| 亚洲欧洲另类国产综合| 欧美在线免费观看| 亚洲精品国产精品国自产观看| 久久成人资源| 一本色道久久88亚洲综合88| 久久亚洲国产成人| 中文在线资源观看网站视频免费不卡| 久久伊人亚洲| 亚洲免费在线电影| 欧美看片网站| 亚洲动漫精品| 国产免费成人| 亚洲一二区在线| 亚洲高清123| 久久久精品一区| 亚洲一区综合| 欧美三区在线视频| 亚洲全部视频| 韩国女主播一区| 欧美一区不卡|