## 第?13?章?USB 驅動
通用串行總線(USB)是一個在主機和許多外設之間的連接. 最初它被創建來替代許多慢速和不同的總線-并口, 串口, 和鍵盤連接--有一個單個的所有設備都可以連接的總線類型.[[45](#)] USB 已經成長超出了這些慢速連接并且現在支持幾乎每種可以連接到 PC 的設備. USB 規范的最新版本增加了高速連接, 理論上到 480 MBps.
拓撲結構上, 一個 USB 子系統沒有如同一個總線一樣分布; 它更多是一個樹, 有幾個點對點連接. 這些連接是 4-線 電纜(地, 電源, 和 2 個信號線)來連接一個設備和一個集線器, 如同雙絞線以太網. USB 主控制器負責詢問每個 USB 設備是否它有數據發送. 由于這個拓撲關系, 一個 USB 設備在沒有首先被主控制器詢問時從不啟動發送數據. 這個配置允許一個非常容易即插即用的系統, 這樣各種設備可自動被主機配置.
在技術層面這個總線是非常簡單的, 因為它是一個單主實現, 其中主機查詢各種外設. 除了這個固有的限制, 這個總線有一些有趣的特性, 例如一個設備能夠請求一個固定的數據傳送帶寬, 為了可靠地支持視頻和音頻 I/O. 另一個重要的特性是它只作為設備和主機之間的一個通訊通道, 對它傳遞的數據沒有特殊的含義和結構要求.
實際上, 有一些結構, 但是它大部分精簡為適應一個預先定義的類別: 例如, 一個鍵盤不會分配帶寬, 而一些視頻攝像頭會.
USB 協議規范定義了一套標準, 任何特定類型的設備都可以遵循. 如果一個設備遵循這個標準, 那么給那個設備的一個特殊的驅動就不必了. 這些不同的類型稱為類, 并且包含如同存儲設備, 鍵盤, 鼠標, 游戲桿, 網絡設備, 和貓. 其他不適合這些類的設備需要一個特殊的供應商-特定的驅動給這些特別的設備. 視頻設備和 USB-到-串口 設備是一個好的例子, 這里沒有定義好的標準, 并且需要一個驅動給每個來自不同制造商的不同的設備.
這些特性, 連同固有的設計上的熱插拔能力, 使 USB 稱為一個方便的, 低成本的機制來連接(和去連接)多個設備到計算機, 而不必關機, 開盒子, 并且旋開螺釘和電線.
Linux 內核支持 2 類 USB 驅動: 位于主機系統的驅動和位于設備的驅動. 給主機系統的 USB 驅動控制插入其中的 USB 設備, 從主機的觀點看(一個通常的 USB 主機是一個桌面計算機). 在設備中的 USB 驅動, 控制單個設備如何作為一個 USB 設備看待主機系統. 由于術語" USB 設備驅動"是非常迷惑, USB 開發者已經創建了術語" USB 器件驅動"來描述控制一個連接到計算機的 USB 設備的驅動(記住 Linux 也運行在這些小的嵌入式的設備中). 本章詳述了運行在一臺桌面計算機上的 USB 系統如何工作的. USB 器件驅動此時超出了本書的范圍.
如同圖[USB 驅動概覽](# "圖?13.1.?USB 驅動概覽")所示, USB 驅動位于不同的內核子系統(塊, 網絡, 字符, 等等)和硬件控制器之間. USB 核心提供了一個接口給 USB 驅動用來存取和控制 USB 硬件, 而不必擔心出現在系統中的不同的 USB 硬件控制器.
**圖?13.1.?USB 驅動概覽**

**圖?13.2.?USB 設備概覽**

- Linux設備驅動第三版
- 第 1 章 設備驅動簡介
- 1.1. 驅動程序的角色
- 1.2. 劃分內核
- 1.3. 設備和模塊的分類
- 1.4. 安全問題
- 1.5. 版本編號
- 1.6. 版權條款
- 1.7. 加入內核開發社團
- 1.8. 本書的內容
- 第 2 章 建立和運行模塊
- 2.1. 設置你的測試系統
- 2.2. Hello World 模塊
- 2.3. 內核模塊相比于應用程序
- 2.4. 編譯和加載
- 2.5. 內核符號表
- 2.6. 預備知識
- 2.7. 初始化和關停
- 2.8. 模塊參數
- 2.9. 在用戶空間做
- 2.10. 快速參考
- 第 3 章 字符驅動
- 3.1. scull 的設計
- 3.2. 主次編號
- 3.3. 一些重要數據結構
- 3.4. 字符設備注冊
- 3.5. open 和 release
- 3.6. scull 的內存使用
- 3.7. 讀和寫
- 3.8. 使用新設備
- 3.9. 快速參考
- 第 4 章 調試技術
- 4.1. 內核中的調試支持
- 4.2. 用打印調試
- 4.3. 用查詢來調試
- 4.4. 使用觀察來調試
- 4.5. 調試系統故障
- 4.6. 調試器和相關工具
- 第 5 章 并發和競爭情況
- 5.1. scull 中的缺陷
- 5.2. 并發和它的管理
- 5.3. 旗標和互斥體
- 5.4. Completions 機制
- 5.5. 自旋鎖
- 5.6. 鎖陷阱
- 5.7. 加鎖的各種選擇
- 5.8. 快速參考
- 第 6 章 高級字符驅動操作
- 6.1. ioctl 接口
- 6.2. 阻塞 I/O
- 6.3. poll 和 select
- 6.4. 異步通知
- 6.5. 移位一個設備
- 6.6. 在一個設備文件上的存取控制
- 6.7. 快速參考
- 第 7 章 時間, 延時, 和延后工作
- 7.1. 測量時間流失
- 7.2. 獲知當前時間
- 7.3. 延后執行
- 7.4. 內核定時器
- 7.5. Tasklets 機制
- 7.6. 工作隊列
- 7.7. 快速參考
- 第 8 章 分配內存
- 8.1. kmalloc 的真實故事
- 8.2. 后備緩存
- 8.3. get_free_page 和其友
- 8.4. 每-CPU 的變量
- 8.5. 獲得大量緩沖
- 8.6. 快速參考
- 第 9 章 與硬件通訊
- 9.1. I/O 端口和 I/O 內存
- 9.2. 使用 I/O 端口
- 9.3. 一個 I/O 端口例子
- 9.4. 使用 I/O 內存
- 9.5. 快速參考
- 第 10 章 中斷處理
- 10.1. 準備并口
- 10.2. 安裝一個中斷處理
- 10.3. 前和后半部
- 10.4. 中斷共享
- 10.5. 中斷驅動 I/O
- 10.6. 快速參考
- 第 11 章 內核中的數據類型
- 11.1. 標準 C 類型的使用
- 11.2. 安排一個明確大小給數據項
- 11.3. 接口特定的類型
- 11.4. 其他移植性問題
- 11.5. 鏈表
- 11.6. 快速參考
- 第 12 章 PCI 驅動
- 12.1. PCI 接口
- 12.2. 回顧: ISA
- 12.3. PC/104 和 PC/104+
- 12.4. 其他的 PC 總線
- 12.5. SBus
- 12.6. NuBus 總線
- 12.7. 外部總線
- 12.8. 快速參考
- 第 13 章 USB 驅動
- 13.1. USB 設備基礎知識
- 13.2. USB 和 sysfs
- 13.3. USB 的 Urbs
- 13.4. 編寫一個 USB 驅動
- 13.5. 無 urb 的 USB 傳送
- 13.6. 快速參考
- 第 14 章 Linux 設備模型
- 14.1. Kobjects, Ksets 和 Subsystems
- 14.2. 低級 sysfs 操作
- 14.3. 熱插拔事件產生
- 14.4. 總線, 設備, 和驅動
- 14.5. 類
- 14.6. 集成起來
- 14.7. 熱插拔
- 14.8. 處理固件
- 14.9. 快速參考
- 第 15 章 內存映射和 DMA
- 15.1. Linux 中的內存管理
- 15.2. mmap 設備操作
- 15.3. 進行直接 I/O
- 15.4. 直接內存存取
- 15.5. 快速參考
- 第 16 章 塊驅動
- 16.1. 注冊
- 16.2. 塊設備操作
- 16.3. 請求處理
- 16.4. 一些其他的細節
- 16.5. 快速參考
- 第 17 章 網絡驅動
- 17.1. snull 是如何設計的
- 17.2. 連接到內核
- 17.3. net_device 結構的詳情
- 17.4. 打開與關閉
- 17.5. 報文傳送
- 17.6. 報文接收
- 17.7. 中斷處理
- 17.8. 接收中斷緩解
- 17.9. 連接狀態的改變
- 17.10. Socket 緩存
- 17.11. MAC 地址解析
- 17.12. 定制 ioctl 命令
- 17.13. 統計信息
- 17.14. 多播
- 17.15. 幾個其他細節
- 17.16. 快速參考
- 第 18 章 TTY 驅動
- 18.1. 一個小 TTY 驅動
- 18.2. tty_driver 函數指針
- 18.3. TTY 線路設置
- 18.4. ioctls 函數
- 18.5. TTY 設備的 proc 和 sysfs 處理
- 18.6. tty_driver 結構的細節
- 18.7. tty_operaions 結構的細節
- 18.8. tty_struct 結構的細節
- 18.9. 快速參考