1.USB的拓撲結構決定了主機控制器就是最高統帥,沒有主機控制器的要求設備永遠不能主動發數據。因此主機控制器在USB
的世界裏扮演着重要的角色,它是幕後操縱者。前端
2.數據包的發送, 這個過程包含不少信息, 一切的工做都是主機控制器給咱們作的.
(USB Host控制器主要介紹這兩種, EHCI, OHCI). EHCI主要針對高速的USB設備; 若是要操做全速和低速能夠考慮OHCI。spring
3.USB 設備和主機的接口就是USB Host,一個主機能夠支持多個USB Host. 控制全部的USB設備的通訊。編程
4."控制器的主要工做是什麼? 把數扔出去,把數拿回來。絕對不該該偷偷加工數據."網絡
5.主機控制器控制總線上包的傳輸,使用1ms(全速/低俗)或125us(高速)的幀。在每幀的開始時,主機控制器產生一個幀開始包(SOF: Start of Frame)。架構
6.SOF包用於同步幀的開始和跟蹤幀的數目。包在幀中被傳輸,或由Host到Device(out事務),或由Device到Host(in事務)。傳輸老是
由Host發起(輪詢傳輸)。回此每條USB總線只能有一個Host。每一個包的傳輸都有一個狀態階段同(同步傳輸除外),數據接收者能夠
在其中返回ACK(應答接收),NAK(重試),STALL(錯誤條件)或什麼也沒有(混亂數據階段,設備不可用或已經斷開)。測試
7.主機控制器驅動(driver)的工做:
讓主機控制器工做起來,發揮它的潛力。 讓控制器發數據、收數據 。主機控制器主要包含如下幾步:
7.1 按照主機控制器的要求組織結構體
7.2 將結構體在合適的時間、放在合適的地方
7.3 trigger(觸發)
7.4 等待完成信號
主機控制器Driver開發過程就是上面這幾步。操作系統
8.一個port 多個主人,OHCI的角色是companion,伴侶。地位低點。EHCI處理不了再給它處理。.net
9.關於端口邏輯這塊須要特別注意,Driver設計者要注意:當前端口正在屬於誰。當端口被OHCI所擁有時,你插入個高速設備怎麼辦?
沒辦法!在沒有插入設備時,就不該該讓OHCI擁有這個端口。只有EHCI控制器才能識別出設備是全速、高速仍是低速。設計
10."別人經驗: 未親自測試: 一個端點號可同時設置爲輸入、輸出的!只有Endpoint 0能夠雙向傳輸,由於它是控制端口。其它端口都是單向的."調試
11.把一個Linux設備看成USB從設備應該怎樣寫驅動?
若是選擇較經常使用的設備類,如 HID、CCID、Mass Storage,就不用寫 PC 端的驅動程序。
還有一種常見的作法,將設備端寫成 CDC 類 USB 轉串口模式,PC 端只要實現串口通信就能夠了。
通常來講,設備端必需要有硬件實現的 USB 接口。經過它,依照 USB 規範寫通信協議處理代碼就能夠了。
12.USB設備包括配置(configuration)、接口(interface)和端點(endpoint),USB設備綁定到接口上,而不是整個USB設備。
13."USB通訊最基本的形式是經過端點(USB端點分中斷、批量、等時、控制四種,每種用途不一樣);USB端點只能往一個方向傳送數據,"
14.咱們能夠這樣認爲:設備一般具備一個或者更多的配置,配置常常具備一個或者更多的接口,接口一般具備一個或者更多的設置,接口沒有或具備一個以上的端點。
15.驅動程序把驅動程序對象註冊到USB子系統中,稍後再使用製造商和設備標識來判斷是否已經安裝了硬件。
16.USB核心使用一個列表(是一個包含製造商ID和設備號ID的一個結構體)來判斷對於一個設備該使用哪個驅動程序.
17.在寫一個設備驅動程序以前,咱們還要了解如下兩個概念:模塊和設備文件。模塊:是在內核空間運行的程序,其實是一種目標對象文件,
沒有連接,不能獨立運行,可是能夠裝載到系統中做爲內核的一部分運行,從而能夠動態擴充內核的功能。模塊最主要的用處就是用來實現設備驅動程序。
18.Linux下對於一個硬件的驅動,能夠有兩種方式:直接加載到內核代碼中,啓動內核時就會驅動此硬件設備。另外一種就是以模塊方式,編譯生成一個.ko文件
(在2.4如下內核中是用.o做模塊文件,咱們以2.6的內核爲準,如下同)。當應用程序須要時再加載到內核空間運行。因此咱們所說的一個硬件的驅動程序,
一般指的就是一個驅動模塊。
19.設備文件:對於一個設備,它能夠在/dev下面存在一個對應的邏輯設備節點,這個節點以文件的形式存在,但它不是普通意義上的文件,它是設備文件,
更確切的說,它是設備節點。其中指定了主設備號和次設備號。主設備號代表了某一類設備,通常對應着肯定的驅動程序;次設備號通常是區分不一樣
屬性;例如不一樣的使用方法,不一樣的位置,不一樣的操做。這個設備號是從/proc/devices文件中得到的,因此通常是先有驅動程序在內核中,纔有設備
節點在目錄中。
20.寫一個USB的驅動程序最基本的要作四件事:驅動程序要支持的設備、註冊USB驅動程序、探測和斷開、提交和控制urb(USB請求塊)(固然也能夠不
用urb來傳輸數據,下文咱們會說到)。
21.USB系統架構實際就是包括USB主控制器,USB HUB總線,USB 設備3部分,而域、包、事務、傳輸類型、描述符與數據流模型把它們聯繫組成一個總體,
保證它們之間的正常運做。
22.USB設備系統: USB設備按功能分爲兩部分:集線器(Hub)和功能部件。
23.USB主機和USB設備之間的數據傳輸共有四種類型:控制傳輸、批量傳輸、中斷傳輸和同頻傳輸。
與之對應,USB主機和USB設備之間有四種事務:控制事務、批量事務、中斷事務和同步事務。
USB協議中共定義瞭如下四種描述符:設備描述符; 配置描述符; 接口描述符; 端點描述符.
24. 每一個設備至少支持控制端點0。USB設備應該支持三類端點:控制端點、輸入端點和輸出端點。
======================================================================================================================
1.通用串行總線(USB,Universal Serial Bus)是一種很是實用的通訊接口,其應用日益普遍。有三種方法可使運行Linux操做系統的嵌入式系統支持USB接口,
本文將對這三種方法逐一進行介紹。
2.基於Linux的USB設備與USB主機通常有如下三種通訊方式:1.一些功能最完備結構也最複雜的設備採用用戶定製內核模塊來實如今標準USB總線上運行復雜的
高級協議,而由USB主機上相應的用戶驅動程序和應用來完成鏈接。2.另外一些基於Linux的USB設備則利用USB總線來實現與主機上所運行的某個應用的簡單
的點對點串行鏈接。主機上的應用雖然利用了主操做系統所提供的USB編程接口,但表面看來卻彷佛是在經過一個典型的串口進行通訊。3.最後,還有些
設備以主計算機做爲網關,將USB設備鏈接到辦公局域網或互聯網上,從而使USB設備看起彷彿構成了一個以太網。這種方法專業性較強,但一般可行,是
主機驅動程序使該方法成爲可能。
在這三種方法中,您能夠根據預留給開發的時間長短和指望USB接口在嵌入式應用中所扮演的角色來決定選用那一種方法比較恰當。爲了幫助您作出正確的
選擇,下一節將向您介紹這三種方法分別應用於基於Linux的USB設備時的狀況,但首先讓咱們對USB接口作一個大體介紹。
3.Linux 上的USB驅動程序包含兩類:
1.Linux操做系統中包含了USB主機控制器的驅動程序,於是USB鍵盤、數碼相機以及其餘一些USB設備均可以在一個運行Linux操做系統的桌面工做站上使用。
2.Linux中還包含了一組USB設備控制器的驅動程序,有了這些控制器驅動程序,基於Linux的嵌入式系統就能利用USB接口來與主計算機(運行Linux或其餘操做系統)通訊。
4.大多數USB通訊的實現過程都是雙端的。主機利用一個內核模塊或驅動程序來與USB設備通訊,而USB設備則經過其自身的驅動程序來與主機通訊。根據主機
和USB設備所採用的通訊風格的不一樣,驅動程序能夠很簡單明白,也能夠很複雜,很具挑戰性。
5."重點,重點,重點,!!!-----》USB設備端通訊過程"
5.1 USB設備端通訊過程
1. 經過編寫內核模塊添加USB接口。
2. 向一個基於Linux的設備中添加USB接口的第一種方法是編寫一個用戶定製的Linux內核模塊,這也是可實現最完備功能的一種作法。採用這種方法時一般
須要針對主機的操做系統(Windows, Linux等)開發相應的驅動程序。
3. 一旦在設備中實現了用戶定製的內核模塊,就可使該設備完成至關複雜的功能,例如仿真一個文件系統,從而容許嵌入式應用將其USB主機看成一個遠程存
儲設備。除此之外,採用這種方法以後,設備還能夠具有存儲轉發(store-and-forward)的功能,於是可以在與USB主機的鏈接創建以前對來自嵌入式應用的
數據流進行緩衝。
5.2 USB主機端通訊過程
1.有些很好的主機端USB驅動程序的例子是隨主流Linux操做系統的發佈而提供的,位於The Linux Kernel Archives (kernel.org)發佈的原始內核源代碼中。其中,
Handspring Visor 模塊(drivers/usb/serial/visor.c)是一個編寫得更清晰,也更易理解的模塊,它同時也是USB 主機端模塊(drivers/usb/usb-skeleton.c)的模板。
6."重點,重點,重點,!!!-----》利用USB實現高速串行通訊"
6.1 USB設備端通訊過程;
1. 爲了達到最實用的效果,咱們能夠將USB總線簡單地看做一個高速串口,而後,在一些嵌入式設備和應用中,咱們就能夠用USB接口來模擬串口。StrongARM處
理器的Linux內核就提供了一個名爲usb-char的USB設備驅動程序,它所完成的剛好就是用USB模擬串口的功能。
2. 當須要與USB 主機通訊時,Linux操做系統中的USB設備應用只是簡單地打開一個與其usb-char設備節點的鏈接(鏈接類型爲字符型,major number 爲10, minor
爲240),而後就開始讀寫數據。在與USB 主機的鏈接創建以前,read()和write()操做均返回一個錯誤信息。一旦鏈接創建好,而且設備查詢完成以後,USB
接口就開始象一個點對點的串口同樣與主機進行通訊。
3. 這種進行USB數據傳送的方法很是簡單有效,於是usb-char設備模塊發佈以後一直很受歡迎。並且,該模塊還爲經過其餘方法進行USB通訊提供了一個參考。
6.2 USB主機端通訊過程:
1. 對於運行Linux操做系統的USB 主機,與usb-char相應的USB 主機模塊叫作usbserial。大多數Linux版本中都包含了該模塊,但它並不總能自動加載。一般應
在主機與USB設備之間的鏈接創建以前利用modprobe 或insmod加載該模塊。
2. 筆者並未考慮在運行Win32或其餘類型操做系統的主機上已有相似usbserial的模塊。但用於這些主機上的任何USB驅動程序,只要可以進行bulk-in 和
bulk-out數據傳輸,就極可能是一個近乎完整的驅動程序,只需進行必定的產品調整,並添加與產品綁定的廠商ID。
3.Linux主機上還有另外一種相似usbserial模塊的庫,叫作libusb (參見libusb.sourceforge.net)。該庫經過低級的內核系統調用而不是經過usbserial模塊來
完成USB數據傳輸,於是在Linux kernel版本上更容易設置和使用。同時,該庫還能提供大量實用的調試功能,十分利於對USB連接上運行的複雜的通訊協議進行調試。
7."重點,重點,重點,!!!-----》利用USB實現以太網鏈接"
7.1 USB 設備端通訊過程
1. 若是利用USB鏈接來實現高速串口並不是您所但願,那麼您還能夠將全部USB鏈接用做一個以太網。不論在主機端仍是在設備端,Linux均有模塊能實現這一功能。
iPAQ(掌上電腦)的Linux內核就獨一無二地採用了這種通訊策略,由於iPAQ硬件中既沒有可訪問的串口也沒有專門的網絡接口。
2. StrongARM Linux內核中,有一個叫作usb-eth的模塊(arch/arm/mach-sa1100/usb-eth.c),它利用USB做爲物理媒介,模擬出一個虛構的以太網設備。一旦這種
網絡接口建立起來以後,就能夠爲它分配IP地址,而且外部環境均將其做爲一個普通的以太網硬件對待。一旦USB 主機鏈接創建起來,usb-eth模塊就容許USB設備
「瀏覽」因特網,ping其餘的IP地址,甚至經過DHCP、HTTP、NFS或者遠程網「交談」,以及收發電子郵件。簡而言之,任何可以在真正的以太網接口上運行的應用均可
以原封不動地在usb-eth 上運行,由於這些應用沒法識別它們所使用的其實並不是真正的以太網硬件。
7.2 USB 主機端通訊過程 1. 相應的,在運行Linux操做系統的主機一端,可用來在USB上實現以太網鏈接的內核模塊叫作usbnet。安裝了該模塊以後,一旦主機與USB設備的鏈接創建起來, 它就會建立一個虛擬的以太網接口,在主機一端的內核模塊以及用戶應用看來,這個虛擬的接口與真正的以太網接口別無二致。主機端的應用能夠經過拼一個USB 設備的IP地址來檢查該設備是否已經連上,若是拼操做成功,那麼就表示設備已經鏈接成功。 2.最近出現了一種針對Win32主機的usbnet風格的驅動,叫作Bahia網絡驅動,關於該驅動的詳細信息請訪問www.bahia21.com/download.htm。