linux驱动程序设计之USB

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值