usb:通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯。
有一个称为主机控制器的设备,该控制器和一个根Hub作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。 每条USB总线上最多可以接127个设备。
常见的USB主控制器规格有:
OHCI:主要是非PC系统上的USB芯片
UHCI:大多是Intel和Via主板上的USB控制器芯片。他们都是由USB1.1规格的。
EHCI:是由Intel等几个厂商研发,兼容OHCIUHCI ,遵循USB2.0规范。
设备逻辑结构:
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点。每个USB设备都可以包含一个或多个配置不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB协议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集。
USB设备中设备中的唯一可寻址的部分是设备端点,端点的作用类似于寄存器。每个端点在设备内部有唯一的端点号这个端点号是在设备设计时给定的。主机和设备的通信最终都作用于设备上的各个端点。每个端点所支持的操作都是单向的,要么只读,要么只写。
USB描述:
在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型 、生产厂商等信息。这些固定格式的数据,我们称之为USB描述符。标准的USB数据,我们就称之为USB描述符。标准的USB设备有5 种USB描述符:设备描述符,配置描述符,接口描述符 ,端点描述符, 字符串描述符。
usb描述描述符:
struct usb_device_descriptor { //usb设备描述符结构体
__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));
struct usb_config_descriptor { //usb配置描述符结构体
__u8 bLength; //描述符长度
__u8 bDescriptorType; //描述符编号类型
__le16 wTotalLength;
__u8 bNumInterfaces; //配置所支持的接口数
__u8 bConfigurationValue; //set_Configuration命令所需要的参数
__u8 iConfiguration;
__u8 bmAttributes;
__u8 bMaxPower;
} __attribute__ ((packed));
struct usb_interface_descriptor { //usb接口描述结构体
__u8 bLength;
__u8 bDescriptorType;
__u8 bInterfaceNumber;
__u8 bAlternateSetting;
__u8 bNumEndpoints;
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
__u8 iInterface;
} __attribute__ ((packed));
struct usb_endpoint_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bEndpointAddress; //端点地址:0-3位是端点号,第七位是方向(0输出,1输入)
__u8 bmAttributes; //端点属性:bit[0:1],00控制,01同步,02批量,03中断
__le16 wMaxPacketSize; //本端点接收或发送最大信息包的大小
__u8 bInterval; //轮询数据传送端点的最大时间间隔,
//轮询数据传送时间间隔,
//批量传送及控制传送忽略,
//同步必须为1,
//中断传送1-255
/* NOTE: these two are _only_ in audio endpoints. */
/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
__u8 bRefresh;
__u8 bSynchAddress;
} __attribute__ ((packed));
struct usb_string_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 wData[1]; /* UTF-16LE encoded */
} __attribute__ ((packed));
struct usb_interface { //usb接口
/* array of a
有一个称为主机控制器的设备,该控制器和一个根Hub作为一个整体。这个根Hub下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。 每条USB总线上最多可以接127个设备。
常见的USB主控制器规格有:
OHCI:主要是非PC系统上的USB芯片
UHCI:大多是Intel和Via主板上的USB控制器芯片。他们都是由USB1.1规格的。
EHCI:是由Intel等几个厂商研发,兼容OHCIUHCI ,遵循USB2.0规范。
设备逻辑结构:
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点。每个USB设备都可以包含一个或多个配置不同的配置使设备表现出不同的功能组合,配置由多个接口组成。在USB协议中,接口代表一个基本的功能,一个功能复杂的USB设备可以具有多个接口,而接口是端点的汇集。
USB设备中设备中的唯一可寻址的部分是设备端点,端点的作用类似于寄存器。每个端点在设备内部有唯一的端点号这个端点号是在设备设计时给定的。主机和设备的通信最终都作用于设备上的各个端点。每个端点所支持的操作都是单向的,要么只读,要么只写。
USB描述:
在每一个USB设备内部,包含了固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型 、生产厂商等信息。这些固定格式的数据,我们称之为USB描述符。标准的USB数据,我们就称之为USB描述符。标准的USB设备有5 种USB描述符:设备描述符,配置描述符,接口描述符 ,端点描述符, 字符串描述符。
usb描述描述符:
struct usb_device_descriptor { //usb设备描述符结构体
__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));
struct usb_config_descriptor { //usb配置描述符结构体
__u8 bLength; //描述符长度
__u8 bDescriptorType; //描述符编号类型
__le16 wTotalLength;
__u8 bNumInterfaces; //配置所支持的接口数
__u8 bConfigurationValue; //set_Configuration命令所需要的参数
__u8 iConfiguration;
__u8 bmAttributes;
__u8 bMaxPower;
} __attribute__ ((packed));
struct usb_interface_descriptor { //usb接口描述结构体
__u8 bLength;
__u8 bDescriptorType;
__u8 bInterfaceNumber;
__u8 bAlternateSetting;
__u8 bNumEndpoints;
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
__u8 iInterface;
} __attribute__ ((packed));
struct usb_endpoint_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bEndpointAddress; //端点地址:0-3位是端点号,第七位是方向(0输出,1输入)
__u8 bmAttributes; //端点属性:bit[0:1],00控制,01同步,02批量,03中断
__le16 wMaxPacketSize; //本端点接收或发送最大信息包的大小
__u8 bInterval; //轮询数据传送端点的最大时间间隔,
//轮询数据传送时间间隔,
//批量传送及控制传送忽略,
//同步必须为1,
//中断传送1-255
/* NOTE: these two are _only_ in audio endpoints. */
/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
__u8 bRefresh;
__u8 bSynchAddress;
} __attribute__ ((packed));
struct usb_string_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 wData[1]; /* UTF-16LE encoded */
} __attribute__ ((packed));
struct usb_interface { //usb接口
/* array of a