介绍USB设备结构和设备描述符号结构。1.USB设备结构usb_device位于/linux/include/usb.h/***structusb_device-内核对USB设备的表示*@devnum:设备号;USB总线上的地址*@devpath:用于消息中的设备ID字符串(例如,/port/...)*@route:用于xHCI的树形拓扑十六进制字符串*@state:设备状态:已配置,未附加,等*@speed:设备速度:高/满/低(或错误)*@tt:交易翻译信息;与低速/全速开发、高速集线器一起使用*@ttport:该tt集线器上的设备端口*@toggle:每个端点一位,具有([0]=IN,[1]=OUT)端点*@parent:我们的集线器,除非我们是根*@bus:我们是总线的一部分*@ep0:端点0数据(默认控制管道)*@dev:通用设备接口*@descriptor:USB设备描述符*@bos:USB设备BOS描述符集*@config:所有设备配置*@actconfig:活动配置*@ep_in:IN端点数组*@ep_out:arraOUT端点的y个*@rawdescriptors:每个配置的原始描述符*@bus_mA:总线可用的电流*@portnum:父端口号(原点1)*@level:USB集线器祖先的数量*@can_submit:可以提交URB*@persist_enabled:为此设备启用USB_PERSIST*@have_langid:string_langid是否有效*@authorized:政策说我们可以使用它;*(用户空间)策略决定我们是否授权此设备被使用。默认情况下,授权有线USB设备。*WUSB设备不是,直到我们从用户空间授权它们。*FIXME--完整文档*@authenticated:加密认证通过*@wusb:设备是无线USB*@lpm_capable:设备支持LPM*@usb2_hw_lpm_capable:设备可以执行USB2硬件LPM*@usb2_hw_lpm_besl_capable:设备可以执行USB2硬件BESLLPM*@usb2_hw_lpm_enabled:启用USB2硬件LPM*@usb2_hw_lpm_allowed:用户空间允许USB2.0LPM启用*@usb3_lpm_u1_enabled:启用USB3硬件U1LPM*@usb3_lpm_u2_enabled:启用USB3硬件U2LPM*@string_langid:字符串的语言ID*@product:iProduct字符串,如果存在(静态)*@manufacturer:iManufacturer字符串,如果存在(静态)*@serial:iSerialNumber字符串,如果存在(静态)*@filelist:对该设备打开的usbfs文件*@maxchild:集线器端口数*@quirks:整个设备的怪癖*@urbnum:数字为整个设备提交的URB*@active_duration:设备未挂起的总时间*@connect_time:设备首次连接的时间*@do_remote_wakeup:应启用远程唤醒*@reset_resume:需要重置而不是恢复*@port_is_suspended:上游端口已挂起(L2或U3)*@wusb_dev:如果这是无线USB设备,请链接到WUSB*设备的特定数据。*@slot_id:xHCI分配的插槽ID*@removable:设备可以物理移除来自此端口*@l1_params:USB2L1LPM状态和L1超时的最大努力服务延迟。*@u1_params:USB3U1LPM状态的退出延迟,以及集线器启动的超时。*@u2_params:USB3U2LPM状态的退出延迟和集线器启动的超时。*@lpm_disable_count:usb_disable_lpm()和usb_enable_lpm()使用的引用计数*用于跟踪需要USB3.0链路电源的功能数量*此usb_device禁用管理。这个计数应该只*由那些函数操纵,并保持bandwidth_mutex。**注意:*USBcore驱动程序不应直接设置usbdev->state。而是使用*usb_set_device_state()。*/structusb_device{intdevnum;还记得之前“设备号-端口号:配置.接口”的USB命名方式吗。每插入一个新设备,USBCore都会为它设置一个设备号。字符开发路径[16];//设备在SysFS中的路径,一般为"/sys/devices/pci0000:00/0000:00:12.2/_usb_1"u32route;枚举usb_device_state状态;//设备的状态,比如刚刚插入时的Attached枚举usb_device_speed速度;//速度等级highfulllowstructusb_tt*tt;//我们知道在高速USB之前有全速和低速USB之分,那么高速USB设备如何兼容其他intttport;//低速设备,通过使用TT(TransactionTranslator)--高速USB中的转换电路unsignedinttoggle[2];//对于中断传输、批量传输、控制传输,在传输数据时,需要交替DATA0和DATA1//,toggle是识别0端点IN和OUT的DATAx的状态structusb_device*parent;//parenthub,如果是roothub,则为NULLstructusb_bus*bus;//设备所在总线structusb_host_endpointep0;//端点0被特殊处理,在structdevicedev结构中静态存在;//嵌入usb_device的设备structusb_device_descriptordescriptor;//设备描述符,描述设备信息,后面会分析structusb_host_bos*bos;结构usb_host_config*配置;//所有配置信息列表structusb_host_config*actconfig;//当前活动信息structusb_host_endpoint*ep_in[16];//设备的输入端点structusb_host_endpoint*ep_out[16];//输出端点字符**rawdescript或;无符号短总线_mA;//能够从总线路得到的电流值u8portnum;u8级;未签名的can_submit:1;未签名的persist_enabled:1;未签名的have_langid:1;未签名授权:1;未签名认证:1;未签名的wusb:1;无符号lpm_capable:1;未签名的usb2_hw_lpm_capable:1;未签名的usb2_hw_lpm_besl_capable:1;未签名的usb2_hw_lpm_enabled:1;未签名的usb2_hw_lpm_allowed:1;未签名的usb3_lpm_u1_enabled:1;未签名的usb3_lpm_u2_enabled:1;intstring_langid;/*来自设备的静态字符串*/char*product;字符*制造商;字符*序列号;结构列表头文件列表;诠释最大孩子;u32怪癖;atomic_t城市编号;unsignedlongactive_duration;#ifdefCONFIG_PMunsignedlongconnect_time;未签名的do_remote_wakeup:1;未签名的reset_resume:1;unsignedport_is_suspended:1;#endifstructwusb_dev*wusb_dev;intslot_id;枚举usb_device_removable移除祝福;结构usb2_lpm_parametersl1_params;结构usb3_lpm_parametersu1_params;结构usb3_lpm_parametersu2_params;unsignedlpm_disable_count;};#defineto_usb_device(d)container_of(d,structusb_device,dev)2USB设备描述符结构体usb_device_descriptor位置于``/*USB_DT_DEVICE:Devicedescriptor*/structusb_device_descriptor{__u8bLength;//设备描述符的长度__u8bDescriptorType;//USB_DT_DEVICE=0x01__le16bcdUSB;//版本号__u8bDeviceClass;//__u8bDeviceSubClass;__u8bDeviceProtocol;__u8bMaxPacketSize0;//端点0一次可以处理的最大字节数__le16idVendor;//制造商编号__le16idProduct;//产品编号__le16bcdDevice;//版本号__u8iManufacturer;//对应以上索引值index__u8iProduct;__u8i序列号;__u8bNumConfigurations;//设备在当前速度级别下支持的配置数量}__attribute__((packed));
