LINUX USB驱动开发(1)-USB驱动重要数据结构

本文介绍了Linux USB驱动开发中的关键数据结构,包括设备描述符、配置描述符、接口描述符和端点描述符。USB设备由配置、接口和端点组成,每个部分都有其特定的功能和描述符。接口描述符描述了设备的接口集合,端点描述符则定义了实际数据传输的物理单元。此外,还讨论了USB端点的四种类型以及管道的概念,强调了控制、中断、批量和等时端点在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成:USB总线接口、USB逻辑设备和功能单元:
a – 这里的USB总线接口指的是USB设备中的串行接口引擎(SIE);
b – USB逻辑设备被USB系统软件看作是一个端点的集合;
c – 功能单元被客户软件看作是一个接口的集合。SIE、端点和接口都是USB设备的组成单元;
为了更好地描述USB设备的特征,USB提出了设备架构的概念。从这个角度来看,可以认为USB设备是由一些配置、接口和端点组成,即一个USB设备可以含有一个或多个配置,在每个配置中可含有一个或多个接口,在每个接口中可含有若干个端点。其中,配置和接口是对USB设备功能的抽象,实际的数据传输由端点来完成。在使用USB设备前,必须指明其采用的配置和接口。这个步骤一般是在设备接入主机时设备进行枚举时完成的
设备通常有一个或多个配置;
配置通常有一个或多个接口;
接口通常有一个或多个设置;
接口有零或多个端点。

这样的概念太抽象了,可以这样看:有一个设备,如支持视频和音频的一个播放器。那么,对于上面提到的4个描述符,对它们设置的时候,它们分别对于哪一个描述符呢?
从我现在的理解来看,这样一个设备对应一个设备描述符,支持视频的功能对应一个接口描述符,支持音频功能的对应一个接口描述符。为了支持视频,在下层有多个端口同时工作为提供视频数据传输的支持,所以有多个端点描述符。

1.描述结构

USB设备使用各种描述符来说明其设备架构,包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符,他们通常被保存在USB设备的固件程序中。

设备描述符

设备代表一个USB设备,它由一个或多个配置组成。设备描述符用于说明设备的总体信息,并指明其所含的配置的个数。一个USB设备只能有一个设备描述符。

struct usb_device_descriptor  
{  
    _ _u8 bLength; //描述符长度  
    _ _u8 bDescriptorType; //描述符类型编号  

    _ _le16 bcdUSB; //USB版本号  
    _ _u8 bDeviceClass; //USB分配的设备类code  
    _ _u8 bDeviceSubClass;// USB分配的子类code  
    _ _u8 bDeviceProtocol; //USB分配的协议code  
    _ _u8 bMaxPacketSize0; //endpoint0最大包大小  
    _ _le16 idVendor; //厂商编号  
    _ _le16 idProduct; //产品编号  
    _ _le16 bcdDevice; //设备出厂编号  
    _ _u8 iManufacturer; //描述厂商字符串的索引  
    _ _u8 iProduct; //描述产品字符串的索引  
    _ _u8 iSerialNumber; //描述设备序列号字符串的索引  
    _ _u8 bNumConfigurations; //可能的配置数量  
} _ _attribute_ _ ((packed));  

2配置描述符

一个USB设备可以包含一个或多个配置,如USB设备的低功耗模式和高功耗模式可分别对应一个配置。在使用USB设备前,必须为其选择一个合适的配置。配置描述符用于说明USB设备中各个配置的特性,如配置所含接口的个数等。USB设备的每一个配置都必须有一个配置描述符。

struct usb_config_descriptor  
{  
    _ _u8 bLength; //描述符长度  
    _ _u8 bDescriptorType; //描述符类型编号  

    _ _le16 wTotalLength; //配置所返回的所有数据的大小  
    _ _u8 bNumInterfaces; // 配置所支持的接口数  
    _ _u8 bConfigurationValue; //Set_Configuration命令需要的参数值  
    _ _u8 iConfiguration; //描述该配置的字符串的索引值  
    _ _u8 bmAttributes; //供电模式的选择  
    _ _u8 bMaxPower; //设备从总线提取的最大电流  
} _ _attribute_ _ ((packed));  

3接口描述符

一个配置可以包含一个或多个接口,例如对一个光驱来说,当用于文件传输时,使用其大容量存储接口;而当用于播放CD时,使用其音频接口。接口是端点的集合,可以包含一个或多个可替换设置,用户能够在USB处于配置状态时改变当前接口所含的个数和特性。接口描述符用于说明设备中各个接口的特性,如接口所属的设备类及其子类等。USB设备的每个接口都必须有一个接口描述符

 struct usb_interface_descriptor  
{  
    _ _u8 bLength;           //描述符长度  
    _ _u8 bDescriptorType; //描述符类型  

    _ _u8 bInterfaceNumber;   // 接口的编号  
    _ _u8 bAlternateSetting; //备用的接口描述符编号  
    _ _u8 bNumEndpoints;      //该接口使用的端点数,不包括端点0  
    _ _u8 bInterfaceClass;    //接口类型  
    _ _u8 bInterfaceSubClass; //接口子类型  
    _ _u8 bInterfaceProtocol; //接口所遵循的协议  
    _ _u8 iInterface; //描述该接口的字符串索引值  
} _ _attribute_ _ ((packed));  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值