linux USB 編程


Linux USB架構

 

 

 

可以看出一個USB體系需要4個驅動:USB設備驅動(主要編寫這部分)USB主控制器驅動Gadget驅動UDC驅動

 

USB主要有4個功能:

MassStorage:大容量存儲,如硬盤,U盤。

USB-HID:人體接口設備,鼠標,鍵盤。

RNDIS:網卡。

CDC-ACMu轉串口。

 

USB描述符:

 

USB驅動程序位於不同的內核子系統和USB主控制器之間,USB核心為USB驅動提供了用於訪問和控制USB硬件的軟件接口,使得USB設備驅動程序不必考慮USB硬件控制器。

 

 

從上圖看,一個USB驅動是對應一個接口的,所以一個設備可能有多個驅動。

USB總線驅動與設備

驅動結構體

一個USB驅動使用struct usb_driver來描述(每種總線都有driver這種結構):

 

 

而上圖中設備列表中的usb_device_id如下:

 

 

填充上面的ip_table需要定義通過USB_DEVICE來定義一種USB設備的USB_DEVICE(vend,prod)

 

上面是定義一種,下面的宏是定義一類

 

注冊驅動:

 

設備結構體

 

 

配置描述符:

配置結構體:

Linux內核使用Struct usb_host_config來描述一個USB配置

 

配置描述符結構體:

 

 

接口描述符:

接口結構體:

Linux kernel使用struct usb_interface來描述usb接口:

 

接口設置結構體

設置和配置是有區別的:

一個配置包含一個或多個接口

一個接口包含一個或多個設置

下面是一個例子:

 

 

Linux kernel使用struct usb_host_interface來描述USB接口設置:

 

接口描述符結構體

 

端點描述符:

端點結構體

Linux kernel使用struct usb_host_endpoint來描述USB端點:

 

端點描述符結構體

Linux內核使用struct usb_endpoint_decriptor來對USB描述符中的端點描述符進行描述

 

 

URB

USB請求塊是USB設備驅動中用來描述與USB設備通信所用的基本載體和核心數據結構,非常類似於網絡設備驅動中的sk_buff結構體,是USB主機與設備通信的“電波”。

URB處理的流程如下:

1. USB設備驅動程序創建並且初始化一個訪問特定USB設備特定端點的urb,並提交給USB core

2. USB core提交urbUSB主控制器驅動程序;

3. USB主控制器驅動程序根據該urb描述的信息,來訪問USB設備。

4. 當設備訪問結束后,USB主控制器驅動程序通知USB設備驅動程序。

流程一

創建urb

 

初始化URB

 

 

流程二

 

流程三,流程四:

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM