1. 程式人生 > >usb 子系統(一): 子系統架構

usb 子系統(一): 子系統架構

一、USB協議基礎知識  

前序:USB概念概述

  USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB)。

  USB 分為主從兩大體系,一般而言, PC 中的 USB 系統就是作主,而一般的 USB 滑鼠, U 盤則是典型的 USB 從系統。

  USB主控制器這一塊,我們至少要開發出 USB 的主控制器與從控制器,滑鼠是低速裝置,所需的是最簡單的一類從控制器。主控制器則複雜得多,因為太過於複雜了,所以就形成了一些標準。在一個複雜的系統中,標準的好處就是可以讓開發者把精力集中在自己負責的一塊中來,只需要向外界提供最標準的介面,而免於陷於技術的汪洋大海中。

  USB 主控制器主要有 1.1 時代的 OHCI 和 UHCI , 2.0 時代的 EHCI ,這些標準規定了主控制器的功能和介面(暫存器的序列及功能),對我們驅動工程師而言,這樣的好處就是隻要你的驅動符合標某一標準,你就能輕而易舉的驅動所有這個標準的主控制器。要想把主控制器驅動起來,本來是一件很難的事情,估計全球的 IT 工程師沒幾個能有這樣的水平,但有了標準,我們就可以輕鬆的佔有這幾個高水平的 IT 工程師的勞動成果。

  主控制器和驅動有了,我們還需要 USB 協議棧,這就是整個 USB 系統的軟體部分的核心(有的資料中直接把其稱為 USB 核心), USB 協議棧一方面向使用 USB 匯流排的裝置驅動提供操作 USB 匯流排的 API ,另一方面則管理上層驅動傳下來的的資料流,按 USB 主控制器的要求放在控制器驅動規定的位置, USB 主控制器會排程這些資料。

  我們這裡用到了排程這個詞, USB 主控制器的排程其實和火車的排程 CPU 的排程有相似之處,物理上的通路只有一條,但 USB 中規定的邏輯上的通路卻有許多條,有時一個裝置就會佔用幾條邏輯通道,而 USB 系統中又會有多個裝置同時執行。這就好像是隻有一條鐵路線,但來來往往的火車卻有許多, USB 主控制器的作用就是排程這些火車,而 USB 協議棧的作用則向上層的 USB 裝置驅動提供不同的車次。

  有了以上的這些模組,才能為 USB 滑鼠設計驅動,這一點上 ps/2 滑鼠的驅動和 USB 滑鼠的驅動結構基本一樣,只不過我們的資料通路是 USB 匯流排。

  USB 系統甚至把裝置驅動都給標準化了,只要是支援 USB 的主機,就可以支援任何一個廠商的 USB 滑鼠,任何一個廠商的 U 盤,只要是被 USB 系統包函的裝置,只要這些裝置支援相應的標準,就無需重新設計驅動而直接使用。

  下是簡單的列出了 USB 裝置型別,理想的情況 USB 系統要對這些裝置作完整的支援,裝置也必須符合 USB 規範中的要求。

1 - audio :表示一個音訊設   備。

2 - communication   device :通訊裝置,如電話, moden 等等。

3 - HID :人機互動裝置,如鍵盤,滑鼠等。

6 - image 圖象裝置,如掃描器,攝像頭等,有時數碼相    機也可歸到這一類。

7 -印表機類。如單向,雙向印表機等。

8 - mass   storage 海量儲存類。所有帶有一定儲存功能的都可以歸到這一類。如數碼相機大多數都歸這一類。

9 - hub 類。

11 - chip   card/smart   card 。

13 -- Content Security

14 -- Video  ( Interface )

15 -- Personal Healthcare

220 -- Diagnostic Device

224 -- Wireless Controller  ( Interface )

239 -- Miscellaneous

254 -- Application Specific  ( Interface )

255 - vendor   specific. 廠家的自定義類,主要用於一些特殊的裝置。如介面轉接卡等。

  隨著 USB 技術的發展, USB 系統中的一些不足也逐漸被承認, OTG 就是這種情況下的主要產物。

  現在市面上有些裝置(比如一些 MP4 )即能插上電腦當 U 盤使,也能被 U 盤插上讀取 U 盤。這樣的裝置在 USB 系統中是作主還是作從呢?

  這就是 OTG(On-The-Go), 即可以作主也可以作從,傳說中的雌雄同體。這主要是為嵌入式裝置準備的,因為 USB 是一種主從系統,不能支援點對點平等的傳輸資料, OTG 正是在這種需求下產生的, OTG 不僅支援控制器的主從切換,在一定層度上,也支援相同裝置之間的資料交換。 

1、USB的傳輸線結構

        一條USB的傳輸線分別由地線、電源線、D+、D-四條線構成,D+和D-是差分輸入線(抗干擾),它使用的是3.3V的電壓,而電源線和地線可向裝置提供5V電壓,最大電流為500MA。OTG 的做法就是增來一個 ID pin 來判斷裝置是接入裝置的是主還是從。vbus 主要是供電, D+/D- 則是用來傳輸資料,就是我們前面所講的主裝置和從裝置間唯一的一條鐵路。

訊號線名稱

顏色

1

Vbus

2

D-

3

D+

4

GNU

shell (金屬殼)

屏敝層

2、USB可以熱插拔的硬體原理

  USB主機是如何檢測到裝置的插入的呢?首先,在USB集線器的每個下游埠的D+和D-上,分別接了一個15K歐姆的下拉電阻到地。這樣,在集線器的埠懸空時,就被這兩個下拉電阻拉到了低電平。而在USB裝置端,在D+或者D-上接了1.5K歐姆上拉電阻。對於全速和高速裝置,上拉電阻是接在D+上;而低速裝置則是上拉電阻接在D-上。這樣,當裝置插入到集線器時,由1.5K的上拉電阻和15K的下拉電阻分壓,結果就將差分資料線中的一條拉高了。集線器檢測到這個狀態後,它就報告給USB主控制器(或者通過它上一層的集線器報告給USB主控制器),這樣就檢測到裝置的插入了。USB高速裝置先是被識別為全速裝置,然後通過HOST和DEVICE兩者之間的確認,再切換到高速模式的。在高速模式下,是電流傳輸模式,這時將D+上的上拉電阻斷開。

3、USB主機控制器

  USB主機控制器屬於南橋晶片的一部分,通過PCI匯流排和處理器通訊。USB主機控制器分為UHCI(英特爾提出)、OHCI(康柏和微軟提出)、 EHCI。其中OHCI驅動程式用來為非PC系統上以及帶有SiS和ALi晶片組的PC主辦上的USB晶片提供支援。UHCI驅動程式多用來為大多數其他PC主機板(包括Intel和Via)上的USB晶片提供支援。ENCI相容OHCI和UHCI。UHCI的硬體線路比OHCI簡單,所以成本較低,但需要較複雜的驅動程式,CPU負荷稍重。主機控制器驅動程式完成的功能主要包括:解析和維護URB,根據不同的端點進行分類快取URB;負責不同USB傳輸型別的排程工作;負責USB資料的實際傳輸工作;實現虛擬跟HUB的功能。

4、USB裝置的構成

  USB裝置的構成包括了配置,介面和端點。

  1. 裝置通常具有一個或者更多個配置

  2. 配置經常具有一個或者更多個介面

  3. 介面通常具有一個或者更多個設定

  4. 介面沒有或者具有一個以上的端點

  需要注意的是,驅動是繫結到USB介面上,而不是整個裝置。

5、主控制怎麼正確訪問各種不同的USB裝置

  每一個USB裝置接入PC時,USB匯流排驅動程式都會使用預設的地址0(僅未分配地址的裝置可以使用)跟USB裝置通訊,然後給它分配一個編號,接在USB總線上的每一個USB裝置都有自己的編號(地址),PC機想訪問某個USB裝置時,發出的命令都含有對應的編號(地址)就可以了。

  USB匯流排驅動程式獲取USB設定資訊。USB裝置裡都會有一個叫 EEPROM的東東,它就是用來儲存裝置本身資訊的。它與Flash雖說都是要電擦除的,但它可以按位元組擦除,Flash只能一次擦除一個 block

6、usb-firmware簡易框架

 usb firmware主要工作是滿足usb 協議所定義的標準請求(usb協議第9章第4節),不同的firmware因為硬體不同而操作有所不同,但目的都是完成主控制器對裝置的標準請求,大致框圖如下:

7、USB傳輸事務

USB通訊最基本的形式是通過一個名為端點(endpoint)的東西。它是真實存在的。

  端點只能往一個方向傳送資料(端點0除外,端點0使用message管道,它既可以IN又可以OUT),或者IN,或者OUT。除了端點0,低速裝置只能有2個端點,高速裝置也只能有15個IN端點和15個OUT端點。

  主機和端點之間的資料傳輸是通過管道。

  端點只有在device上才有,協議說端點代表在主機和裝置端點之間移動資料的能力。

  USB通訊都是由host端發起的。

  首先明確一點USB協議規定所有的資料傳輸都必須由主機發起。所以這個傳輸的一般格式:令牌包(表明傳輸的型別),資料包(實際傳輸的資料),握手包(資料的正確性)。首先是由主機控制器發出令牌包然後主機/裝置傳送資料包,甚至可以沒有,最後裝置/主機發送握手包,這麼一個過程就叫做一個USB傳輸事務。一個USB傳輸事務就實現了一次從主機和裝置間的通訊。USB的事務有:OUT、IN、SETUP事務。

  令牌包:可分為OUT包、IN包、SetUp包和幀起始包OUT包就是說明接下來的資料包的方向時從主機到裝置。

  資料包:裡面包含的就是我們實際要傳輸的東東了。

  握手包:傳送方傳送了資料,接受方收沒收到是不是該吱個聲呀。

  一個數據包裡面包含有很多的域,裡面包含了很多資訊,一般有同步的域,資料包的核心資訊的域,資料校驗的域。

  令牌包:SYNC + PID + ADDR + ENDP + CRC5 :(同步) + (IN/OUT/SetUp) + (裝置地址)+(裝置端點) + (校驗)

  資料包:分為DATA0包和DATA1包,當USB傳送資料的時候,當一次傳送的資料長度大於相應端點的容量時,就需要把資料包分為好幾個包,分批發送,DATA0包和DATA1包交替傳送,即如果第一個資料包是 DATA0,那第二個資料包就是DATA1

      SYNC + PID + DATA0/1 + CRC5:(同步) + (DATA0/1) + (資料) + (校驗)。

      但也有例外情況,在同步傳輸中(四類傳輸型別中之一),所有的資料包都是為DATA0,格式如下: SYNC + PID + 0~1023位元組 + CRC16:(同步) + (DATA0) + (資料) + (校驗)。

      握手包:SYNC+PID:(同步)+(HandShake)

8、USB協議的四種傳輸型別

  因為usb支援的裝置實在是太多,而且不同的裝置對於傳輸資料各有各的要求和這就導致了我們需要不同的傳輸方式。USB支援4種傳輸方式:控制傳輸;批量傳輸;中斷傳輸;實(等)時傳輸

  控制傳輸:首先發送 Setup 傳輸事務,然後IN/OUT傳輸事務,最後是 STATUS transaction,向主機彙報前面SETUP  IN/OUT階段的結果。控制傳輸主要用於向裝置傳送配置資訊、獲取裝置資訊、傳送命令道裝置,或者獲取裝置的狀態報告。控制傳輸一般傳送的資料量較小,當USB裝置插入時,USB核心使用端點0對裝置進行配置,另外,埠0與其他端點不一樣,端點0可以雙向傳輸。

  批量傳輸:由OUT事務和IN事務構成,用於大容量資料傳輸,沒有固定的傳輸速率,也不佔用頻寬,當匯流排忙時,USB會優先進行其他型別的資料傳輸,而暫時停止批量轉輸。批量傳輸通常用在資料量大、對資料實時性要求不高的場合,例如USB印表機、掃描器、大容量儲存裝置、U盤等。

  中斷傳輸:由OUT事務和IN事務構成,中斷傳輸就是中斷端點以一個固定的速度來傳輸較少的資料,USB鍵盤和滑鼠就是使用這個傳輸方式。這裡說的中斷和硬體上下文中的中斷不一樣,它不是裝置主動傳送一箇中斷請求,而是主機控制器在保證不大於某個時間間隔內安排一次傳輸。中斷傳輸對時間要求比較嚴格,所以可以用中斷傳輸來不斷地檢測某個裝置,當條件滿足後再使用批量傳輸傳輸大量的資料。

  等時傳輸:由OUT事務和IN事務構成,有兩個特殊地方,第一,在同步傳輸的INOUT事務中是沒有握手階段;第二,在資料包階段所有的資料包都為DATA0 。等時傳輸同樣可以傳輸大批量資料,但是對資料是否到達沒有保證,它對實時性的要求很高,例如音訊、視訊等裝置(USB攝像頭,USB話筒)。

  這4種傳輸方式由4個事務組成:

  IN事務:IN事務為host輸入服務,當host需要從裝置獲得資料的時候,就需要IN事務。

  OUT事務:OUT事務為host輸出服務,當host需要輸出資料到裝置的時候,就需要OUT事務。

  SETUP事務:SETUP事務為host控制服務,當host希望傳輸一些USB規範的預設操作的時候就需要使用setup事務。

  SOF事務:這個用於幀同步。

  然後這4種事務又由3類包(token包,handshake包,data包)組成,每類又分幾種:

  in包:in包用於指明當前的事務為in型別的。

  out包: out包用於指明當前事務為out型別的。

  setup包: setup包指明當前事務為setup型別的。

  sof包: sof包指明當前事務為setup型別的。

 

  ack包:ack握手包指明當前的事務的資料包傳輸是成功的。

  nak包:nak握手包指明當前裝置忙,不能處理資料包,請主機稍後再次傳送。

  stall包:stall握手包指明當前裝置不能接受或者傳輸資料,表示一個嚴重的錯誤。

 

  data0包:該資料包的型別為0。

  data1包:該資料包的型別為1。

  下圖是一個USB滑鼠插入Linux系統時完整的列舉過程,一共發生了11次傳輸,每次傳輸包括幾個事務,每個事務又包括幾個包,每個包包括幾個域。

  這裡有一個概念需要注意,這裡的中斷傳輸與硬體中斷那個中斷是不一樣的,這個中斷傳輸實際是靠USB host control輪詢usb device來實現的,而USB host control對於CPU則是基於中斷的機制。

  拿USB滑鼠為例,USB host control對USB滑鼠不斷請求,這個請求的間隔是很短的,在USB spec Table 9-13端點描述符中的bInterval域中指定的,當滑鼠發生過了事件之後,滑鼠會發送資料回host,這時USB host control中斷通知CPU,於是usb_mouse_irq被呼叫,在usb_mouse_irq裡,就可以讀取滑鼠發回來的資料,當讀完之後,驅動再次呼叫usb_submit_urb發出請求,就這麼一直重複下去,一個usb滑鼠的驅動也就完成了。

  下面是USB滑鼠中斷傳輸圖,可以看到USB host control向usb device傳送了IN包,沒有資料的時候device回覆的是NAK,有資料的時候才向host control傳送DATA包。

 

9、USB裝置被識別的過程

  當USB裝置插上主機時,主機就通過一系列的動作來對裝置進行列舉配置。

  1接入態Attached):裝置接入主機後,主機通過檢測訊號線上的電平變化來發現裝置的接入;

  2供電態Powered):就是給裝置供電,分為裝置接入時的預設供電值,配置階段後的供電值(按資料中要求的最大值,可通過程式設計設定)

  3預設態Default):USB在被配置之前,通過預設地址0與主機進行通訊;

  4地址態Address):經過了配置,USB裝置被複位後,就可以按主機分配給它的唯一地址來與主機通訊,這種狀態就是地址態;

  5配置態Configured):通過各種標準的USB請求命令來獲取裝置的各種資訊,並對裝置的某此資訊進行改變或設定。

  6掛起態Suspended):匯流排供電裝置在3ms內沒有匯流排動作,即USB匯流排處於空閒狀態的話,該裝置就要自動進入掛起狀態,在進入掛起狀態後,總的電流功耗不超過280UA

10、標準的USB裝置請求命令

  USB裝置請求命令是在控制傳輸的第一個階段:setup事務傳輸的資料傳輸階段傳送給裝置的。

  標準USB裝置請求命令共有11個,大小都是8個位元組,具有相同的結構,由5 個欄位構成。通過標準USB準裝置請求,我們可以獲取儲存在裝置EEPROM裡面的資訊;知道裝置有哪些的設定或功能獲得裝置的執行狀態改變裝置的配置等。

  標準USB準裝置請求 bmRequestType(1) bRequest(2) wvalue(2) wIndex(2) wLength(2)

bmRequestType

    [7 bit]= 0主機到裝置; 1裝置到主機

    [6-5 bit]= 00標準請求命令; 01類請求命令; 10使用者定義命令; 11保留

    [4-0 bit]= 00000 接收者為裝置; 00001 接收者為介面; 00010 接收者為端點; 00011 接收者為其他接收者;其他其他值保留

  bRequest:

    0 0 GET_STATUS:用來返回特定接收者的狀態

    1 1 CLEAR_FEATURE:用來清除或禁止接收者的某些特性

    2 3 SET_FEATURE:用來啟用或啟用命令接收者的某些特性

    3 5 SET_ADDRESS:用來給裝置分配地址

    4 6 GET_DEscriptOR:用於主機獲取裝置的特定描述符

    5 7 SET_DEscriptOR:修改裝置中有關的描述符,或者增加新的描述符

    6 8 GET_CONFIGURATION:用於主機獲取裝置當前裝置的配置值、

    7 9 SET_CONFIGURATION:用於主機指示裝置採用的要求的配置

    8 10 GET_INTERFACE:用於獲取當前某個介面描述符編號

    9 11 SET_INTERFACE:用於主機要求裝置用某個描述符來描述介面

    10 12 SYNCH_FRAME:用於裝置設定和報告一個端點的同步

  wvalue這個欄位是 request 的引數,request 不同,wValue就不同。

  wIndexwIndex,也是request 的引數,bRequestType指明 request 針對的是裝置上的某個介面或端點的時候,wIndex 就用來指明是哪個介面或端點。

  wLength控制傳輸中 DATA transaction 階段的長度。

、Linux USB系統架構

這個是USB系統的拓撲圖,4個部分構成:USB主機控制器,根集線器,集線器,裝置。其中Root Hub與USB主機控制器是繫結在一起的。

  在機箱的尾部面板上,物理上存在一,二或四個USB埠。埠可以用來連線一個普通裝置或者一個hub,hub是一個USB裝置,可以用來擴充套件連線USB裝置的埠數量。最大連線USB裝置數量是減去連在總線上的hub數量(如果有50個hub,那麼最多77(=127-50)個裝置能夠連線),剩下的就是能夠連線USB裝置的數量。Hub總是高速的,如果一個hub是自供電的,那麼任何裝置都能夠附著到上面。但是如果hub是匯流排供電的,那麼僅僅低供電(最大100mA)裝置能夠附著到上面,一個匯流排供電的hub不應該連線到另一個匯流排供電的hub-你應該在匯流排供電和自供電間交替.

  通常情況下主機控制器的物理埠由一個虛擬的root hub臉管理。這個hub是有主機控制器(host controller)的裝置驅動虛擬的,用來統一管理匯流排拓撲,因此USB子系統的驅動能夠用同樣的方法管理每個埠。

  USB通訊都是由host端發起的。USB裝置驅動程式分配並初始化一個URB發給USB Core,USB Core改一改,發給USB主機控制器驅動,USB主機控制器驅動把它解析成包,在總線上進行傳送。

  USB Core是由核心實現的,其實也就是把host control driver裡的功能更集中的向上抽象了一層,它是用來對最上層的USB裝置驅動遮蔽掉host control的不同。

  USB通訊最基本的形式是通過一個名為端點(endpoint)的東西。它是真實存在的。端點只能往一個方向傳送資料(端點0除外,端點0使用message管道,它既可以IN又可以OUT),或者IN,或者OUT(前面已經介紹過)。除了端點0,低速裝置只能有2個端點,高速裝置也只能有15個IN端點和15個OUT端點。主機和端點之間的資料傳輸是通過管道。端點只有在device上才有,協議說端點代表在主機和裝置端點之間移動資料的能力。

   Linux系統下的usb部分分為四個部門或者叫做四大家族,他們是host控制器驅動、hub驅動、usb core、裝置類驅動他們共同配合著完成了對usb裝置的訪問操作。

列舉和裝置描述符

  每當一個USB裝置附著到總線上,它將會被USB子系統列舉.也就是分配唯一的裝置號(1-127)然後讀取裝置描述符.描述符是一個包含關於裝置的資訊和屬性的資料結構.USB標準定義了一個描述符層次結構,下圖所示:



 標準描述符

  裝置描述符: 描述USB裝置的大概資訊,其中包括適用於裝置的全域性資訊,所有裝置的配置。一個USB裝置只有一個裝置描述符。

  配置描述符: 描述了特定的裝置配置資訊。一個USB裝置可以有一或多個配置描述符。每個配置有一個或多個介面(interface),並且每個介面有零或多個端點(endpoint)。一個端點在一個單獨的配置下,是不和其他的介面共享的,但是一個單獨的介面對於同一個端點能夠有幾種可選的配置。端點可以沒有限制的在一部分不同的配置下的介面間共享。配置僅僅能夠通過標準的控制傳輸set_configuration來啟用。不同的配置能夠用來全域性配置資訊,例如供電消耗。

  介面描述符: 描述了一個配置內的特定介面。一個配置提供一個或多個介面,每個介面帶有零個或多個端點描述符描述了在配置內的唯一配置。一個可以包含可選的配置的介面使得配置好的端點和/或他們的特效能夠多種多樣。預設的介面設定總是設定為零。可替換的設定能夠在標準控制傳輸的set_interface來選擇一個。例如一個多功能裝置帶有話筒的攝像頭,可以有三種可用的配置來改變分配在總線上的頻寬。

Camera activated
Microphone activated
Camera and microphone activated

  端點描述符: 包含主機用來決定每個端點頻寬的資訊。一個端點象徵一個USB裝置的邏輯資料來源或接收端(logic data source or sink)。端點零是用來所有的控制傳輸並且該端點沒有裝置描述符。USB spec交替使用pipe和endpoint術語。

  字串描述符: 是可選項,提供了unicode編碼的額外的可讀資訊。他們可以是廠商和裝置名稱或序列號。

裝置型別

  標準的裝置和介面描述符包含有關分類的內容:classsub-classprotocol。這些欄位主機可以用來裝置或介面和驅動聯絡。依賴於分類說明是如何指定的?對於class欄位和介面描述符的合法欄位是由USB Device Working Group來定義的。

  在Class Specification中將裝置或介面分組歸類並指定特性,這樣就使得主機開發軟體能夠基於這個類別進行管理多種多樣的實現。這樣的主機軟體通過裝置中的描述資訊將操作方法繫結到指定的裝置。一個類別規格作為所有的該類別的裝置或介面的最小操作框架服務。(PS:也就是說,所有該類別的裝置或介面,都是以類別規格定義為介面框架。)

人機介面裝置

  HID分類,主要是包含人們控制計算機系統的裝置。典型的HID分類裝置包含: 

  鍵盤和滑鼠裝置例如:標準的滑鼠裝置,追蹤球,遊戲手柄。

  前端面板控制   例如:旋鈕,開關,按鍵,滾動器。

  可能在電話裝置,遠端控制VCR,遊戲或模擬裝置上存在控制器。

再瞭解一下USB驅動框架:

  

  USB匯流排和USB裝置使用軟體進行抽象描述起來是非常複雜的,一方面是協議使然,一方面也是因為它們使用太廣泛了,抽象時考慮很太多情況。幸運的是,核心開發者們抽象出來的核心USB 子系統把很多複雜性都隱藏了。

針對上面這幅圖,為了理解什麼是USB子系統,我們要做以下說明:
  a) USB 驅動都是誇kernel子系統的,因為最終USB裝置是要通過BLCOCK 或CHAR裝置的方式呈現給我們的,所以USB Driver之上還有一層。
  b) USB driver利用USB Core提供的API來簡單優雅的完成驅動工作,這裡USB Core抽象了複雜的USB協議。
  c) 主機控制器驅動位於USB軟體的最下層,提供主機控制器硬體的抽象,隱藏硬體的細節,在主機控制器之下是物理的USB及所有與之連線的USB裝置。主機控制器驅動只和USB Core進行關聯,USB Core將使用者的請求對映到相關的主機控制器驅動,從而使使用者無需去訪問主機控制器。
  d) USB Core和USB主機控制器驅動就構成了我們的USB子系統,USB Core負責實現一些核心的功能,例如協議之類,提供一個用於訪問和控制USB硬體的介面,使裝置驅動不用去考慮系統當前使用哪種主機控制器。自從有了USB子系統,寫USB驅動的時候,只需要呼叫USB Core export的介面,就幾乎能完成所有工作。
  e) USB匯流排將USB裝置和USB驅動關聯起來。

USB子系統初始化

usb初始化函式定義在核心原始碼(2.6.37)drivers/usb/core/usb.c:

複製程式碼
/*
 * Init
 */
static int __init usb_init(void)
{
    int retval;
    if (nousb) {
        pr_info(
            
           

相關推薦

usb 子系統 子系統架構

一、USB協議基礎知識   前序:USB概念概述   USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB)。   USB 分為主從兩大體系,一般而言, P

轉載Docker源碼分析Docker架構

但是 server engine 設計實現 傳統 microsoft {} 操作 libc 原文地址: http://www.infoq.com/cn/articles/docker-source-code-analysis-part1 作者:孫宏亮 1 背景 1.1 D

線上雲評測系統日誌系統架構的確定

1.專案目標:通過小組團隊合作完成本次“線上雲評測系統“實訓 2.專案介紹: OJ(Online Judge)是一個線上的程式評測系統,學生通過該系統可以充分鍛鍊自身的程式設計水平。 社群是一個交流平臺,使用者可以互相交流,獲得對自己有幫助的資訊。 我們的專案把‘’OJ系統

從 paxos 到 zookeeper分散式架構之從集中式到分散式

1.1 序言 隨著計算機系統規模變得越來越大,將所有的業務單元集中部署在一個或者若干個大型機上的體系結構,已經越來越不能滿足當今計算機系統,尤其是大型網際網路系統的快速發展,各種靈活多變的系統架構模型層出不窮。同時,隨著微型計算機的出現,越來越多的廉價的PC機成

【Java安全技術探索之路系列Java可擴充套件安全架構】之十四JAASJAAS架構介紹

【Java安全技術探索之路系列:Java可擴充套件安全架構】章節目錄 JAAS,即Java認證和授權服務。 認證是通過驗證使用者或裝置的身份來判斷真實性和可信賴性的過程。 授權是根據提出請求的身份被授予的許可權來提供訪問資源或執行功能的許可權。

TAF /tars必修課整體架構理解

來自零點智慧社群 一、前言 TAF,一個後臺邏輯層的高效能RPC框架,目前支援C++,Java, node 三種語言, 往後可能會考慮提供更多主流語言的支援如 go等,自定義協議JCE,同時也支援HTTP。 它集可擴充套件協議編解碼、高效能RPC通訊框架、名字路由與發現、釋出監控、日誌統計、

Docker原始碼分析Docker架構

1 背景 1.1 Docker簡介 Docker是Docker公司開源的一個基於輕量級虛擬化技術的容器引擎專案,整個專案基於Go語言開發,並遵從Apache 2.0協議。目前,Docker可以在容器內部快速自動化部署應用,並可以通過核心虛擬化技術(namespaces及c

Linux kernel的中斷子系統綜述

lock www. api cdc 電平 還需 結構 現在 ces 一、前言一個合格的linux驅動工程師需要對kernel中的中斷子系統有深刻的理解,只有這樣,在寫具體driver的時候才能:1、正確的使用linux kernel提供的的API,例如最著名的request

高性能服務器架構緩沖策略

lin 特點 領域 思路 不能 查表 edi 操作 帶寬 原文鏈接:https://mp.weixin.qq.com/s?__biz=MzA5ODExMTkwMA==&mid=402675187&idx=1&sn=d240f6d1430b86bc00

大型站點技術架構PDF閱讀筆記

coo fun function end 關系 spl 閱讀 each 數據庫 1、數據庫讀寫分離: 2、系統吞吐量和系統並發數以及系統響應時間之間的關系: 3、系統負載的概念: 4、反向代理的概念: 5、使用緩存來讀取數據:

docker學習docker安裝和架構

本筆記根據51CTO的CloudMan博主的部落格而記錄的。 本節主要學習 docker安裝和解除安裝 docker的架構 一、Docker的安裝和解除安裝   Docker的安裝   1、安裝之前,要先把舊版的Docker給解除安裝了,以下是Docker官網上的安裝前解除安裝Dock

搭建eclipse+tomcat+maven+shiro+springmvc+jpa專案技術選型及架構文件

一、Java語言 Java是一門面向物件程式語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向物件程式語言的代表,極好地實現了面向物件理論,允許程式設計師以優雅的思維方式進行復雜的程式設計。

MySQL效能管理及架構設計什麼影響了資料庫查詢速度、什麼影響了MySQL效能

一、什麼影響了資料庫查詢速度 1.1 影響資料庫查詢速度的四個因素     1.2 風險分析 QPS: Queries Per Second意思是“每秒查詢率”,是一臺伺服器每秒能夠相應的查詢次數,是對一個特定的查詢伺服

TiDB EcoSystem Tools 原理解讀TiDB-Binlog 架構演進與實現原理

簡介 TiDB-Binlog 元件用於收集 TiDB 的 binlog,並提供實時備份和同步功能。該元件在功能上類似於 MySQL 的主從複製,MySQL 的主從複製依賴於記錄的 binlog 檔案,TiDB-Binlog 元件也是如此,主要的不同點是 TiDB 是分散式的,因此需要收集各個 TiDB 例項產

Java架構之訊息佇列 訊息佇列的概述

訊息佇列系列分享大綱:  一、訊息佇列的概述 二、訊息佇列之RabbitMQ的使用 三、訊息佇列之Kafka的使用 四、訊息佇列之RabbitMQ的原理詳解 五、訊息佇列之Kafka的原理詳解 六、訊息佇列之面試集錦 1.訊息佇列的概述 訊息佇列(Me

小白學安卓Android系統架構和應用開發特色

一、Android架構 Android大致可以分為四層架構: Linux核心層 系統執行庫層 應用框架層 應用層 Linux核心層 Android系統是基於Linux核心的,這一層為Android裝置的各種硬體提供了底層的驅動,如顯示驅動

Spring原始碼解析--《SPRING技術內幕:深入解析Spring架構與設計原理》讀書筆記IOC容器初始化過程

通過閱讀相關章節內容,Spring中IOC容器的載入中,我們需要了解下列幾個概念: Resource:是一個定位、訪問資源的抽象介面,包含了多種資源操作的基礎方法定義,如getInputStream()、exists()、isOpen()、getD

Kubernetes安裝架構及功能說明

叢集功能各模組功能描述 Master節點: Master節點上面主要由四個模組組成,APIServer,schedule,controller-manager,etcd APIServer: APIServer負責對外提供RESTful的kubernetes API的服務,它是系統管理指令的統一

架構運維篇Centos7/Linux安裝jdk環境

前言 最近聯絡安裝部署了多臺阿里雲ECS和亞馬遜雲EC2 伺服器,重複性的工作簡單總結了一下,希望大家都有收穫。 一、檢查歷史安裝環境(新環境就不需要了) 檢視命令  #java -version 如果沒有則說明沒有安裝過,如果有jdk版本資訊那

微服務架構學習筆記gRPC Spring Boot Starter 2.2.0 釋出,及使用步驟

簡介 gRPC Spring Boot Starter 專案是一個 gRPC 的 Spring Boot 模組。通過在 Spring Boot 中內嵌一個 gRPC Server 對外提供服務,並支援 Spring Cloud 的服務發現、註冊、鏈路跟蹤等等。 更新內容 在 2.