USB系列--1-基本结构体

介绍USB设备结构体和设备描述符结构体。

1. USB设备结构体

usb_device位于/linux/include/usb.h

/**
 * struct usb_device - kernel's representation of a USB device
 * @devnum: device number; address on a USB bus
 * @devpath: device ID string for use in messages (e.g., /port/...)
 * @route: tree topology hex string for use with xHCI
 * @state: device state: configured, not attached, etc.
 * @speed: device speed: high/full/low (or error)
 * @tt: Transaction Translator info; used with low/full speed dev, highspeed hub
 * @ttport: device port on that tt hub
 * @toggle: one bit for each endpoint, with ([0] = IN, [1] = OUT) endpoints
 * @parent: our hub, unless we're the root
 * @bus: bus we're part of
 * @ep0: endpoint 0 data (default control pipe)
 * @dev: generic device interface
 * @descriptor: USB device descriptor
 * @bos: USB device BOS descriptor set
 * @config: all of the device's configs
 * @actconfig: the active configuration
 * @ep_in: array of IN endpoints
 * @ep_out: array of OUT endpoints
 * @rawdescriptors: raw descriptors for each config
 * @bus_mA: Current available from the bus
 * @portnum: parent port number (origin 1)
 * @level: number of USB hub ancestors
 * @can_submit: URBs may be submitted
 * @persist_enabled:  USB_PERSIST enabled for this device
 * @have_langid: whether string_langid is valid
 * @authorized: policy has said we can use it;
 *  (user space) policy determines if we authorize this device to be
 *  used or not. By default, wired USB devices are authorized.
 *  WUSB devices are not, until we authorize them from user space.
 *  FIXME -- complete doc
 * @authenticated: Crypto authentication passed
 * @wusb: device is Wireless USB
 * @lpm_capable: device supports LPM
 * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM
 * @usb2_hw_lpm_besl_capable: device can perform USB2 hardware BESL LPM
 * @usb2_hw_lpm_enabled: USB2 hardware LPM is enabled
 * @usb2_hw_lpm_allowed: Userspace allows USB 2.0 LPM to be enabled
 * @usb3_lpm_u1_enabled: USB3 hardware U1 LPM enabled
 * @usb3_lpm_u2_enabled: USB3 hardware U2 LPM enabled
 * @string_langid: language ID for strings
 * @product: iProduct string, if present (static)
 * @manufacturer: iManufacturer string, if present (static)
 * @serial: iSerialNumber string, if present (static)
 * @filelist: usbfs files that are open to this device
 * @maxchild: number of ports if hub
 * @quirks: quirks of the whole device
 * @urbnum: number of URBs submitted for the whole device
 * @active_duration: total time device is not suspended
 * @connect_time: time device was first connected
 * @do_remote_wakeup:  remote wakeup should be enabled
 * @reset_resume: needs reset instead of resume
 * @port_is_suspended: the upstream port is suspended (L2 or U3)
 * @wusb_dev: if this is a Wireless USB device, link to the WUSB
 *  specific data for the device.
 * @slot_id: Slot ID assigned by xHCI
 * @removable: Device can be physically removed from this port
 * @l1_params: best effor service latency for USB2 L1 LPM state, and L1 timeout.
 * @u1_params: exit latencies for USB3 U1 LPM state, and hub-initiated timeout.
 * @u2_params: exit latencies for USB3 U2 LPM state, and hub-initiated timeout.
 * @lpm_disable_count: Ref count used by usb_disable_lpm() and usb_enable_lpm()
 *  to keep track of the number of functions that require USB 3.0 Link Power
 *  Management to be disabled for this usb_device.  This count should only
 *  be manipulated by those functions, with the bandwidth_mutex is held.
 *
 * Notes:
 * Usbcore drivers should not set usbdev->state directly.  Instead use
 * usb_set_device_state().
 */
struct usb_device {
    int     devnum;         //设备号,还记得上一篇USB命名"设备号-端口号:配置.接口"命名方式,每插入一个新设备,USBCore会为其设置一个设备号
    char    devpath[16]; //该设备在SysFS中的路径,一般为"/sys/devices/pci0000:00/0000:00:12.2/_usb_1"
    u32     route;
    enum usb_device_state   state;  //该设备的状态,如刚插上时为Attached
    enum usb_device_speed   speed;  //速度级别 high full low

    struct usb_tt   *tt;            //我们知道高速USB之前还存在全速和低速USB,那么高速USB设备怎么兼容其他
    int     ttport;                 //低速设备,通过使用TT(Transaction Translator)--高速USB中的转换电路

    unsigned int toggle[2];         //对于中断传输、批量传输、和控制传输,传输数据时,需要DATA0和DATA1交
                                    //替进行,toggle就是标识0端点的IN 和 OUT的DATAx的状态
    struct usb_device *parent;      //父hub,如果是roothub,就是NULL
    struct usb_bus *bus;            //设备所在的总线
    struct usb_host_endpoint ep0;   //端点0被特殊对待,在结构体中静态存在

    struct device dev;              //嵌入到usb_device中的device

    struct usb_device_descriptor descriptor;    //设备描述符,描述该设备信息,后面会分析
    struct usb_host_bos *bos;
    struct usb_host_config *config;             //所有的配置信息列表

    struct usb_host_config *actconfig;          //当前活跃的信息
    struct usb_host_endpoint *ep_in[16];        //该设备的输入端点
    struct usb_host_endpoint *ep_out[16];       //输出端点

    char **rawdescriptors;

    unsigned short bus_mA;                      //能够从总线得到的电流值
    u8 portnum;
    u8 level;

    unsigned can_submit:1;
    unsigned persist_enabled:1;
    unsigned have_langid:1;
    unsigned authorized:1;
    unsigned authenticated:1;
    unsigned wusb:1;
    unsigned lpm_capable:1;
    unsigned usb2_hw_lpm_capable:1;
    unsigned usb2_hw_lpm_besl_capable:1;
    unsigned usb2_hw_lpm_enabled:1;
    unsigned usb2_hw_lpm_allowed:1;
    unsigned usb3_lpm_u1_enabled:1;
    unsigned usb3_lpm_u2_enabled:1;
    int string_langid;

    /* static strings from the device */
    char *product;
    char *manufacturer;
    char *serial;

    struct list_head filelist;

    int maxchild;

    u32 quirks;
    atomic_t urbnum;

    unsigned long active_duration;

#ifdef CONFIG_PM
    unsigned long connect_time;

    unsigned do_remote_wakeup:1;
    unsigned reset_resume:1;
    unsigned port_is_suspended:1;
#endif
    struct wusb_dev *wusb_dev;
    int slot_id;
    enum usb_device_removable removable;
    struct usb2_lpm_parameters l1_params;
    struct usb3_lpm_parameters u1_params;
    struct usb3_lpm_parameters u2_params;
    unsigned lpm_disable_count;
};
#define to_usb_device(d) container_of(d, struct usb_device, dev)

2 USB设备描述符结构体

usb_device_descriptor位于“

/* USB_DT_DEVICE: Device descriptor */
struct usb_device_descriptor {
    __u8  bLength;          //该设备描述符的长度
    __u8  bDescriptorType;  // USB_DT_DEVICE = 0x01

    __le16 bcdUSB;          //版本号
    __u8  bDeviceClass;     //
    __u8  bDeviceSubClass;
    __u8  bDeviceProtocol;
    __u8  bMaxPacketSize0;  //端点0一次可以处理的最大字节数
    __le16 idVendor;        //厂商号
    __le16 idProduct;       //产品号
    __le16 bcdDevice;       //版本号
    __u8  iManufacturer;    //分别对应上面的索引值 index
    __u8  iProduct;
    __u8  iSerialNumber;
    __u8  bNumConfigurations;   //设备在当前速度级别下支持的配置数量
} __attribute__ ((packed));
原文地址:http://coderdock.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值