Q1.USB总线驱动是干嘛用的? A1. 1.识别USB设备 2.给USB设备找到并安装对应的驱动程序 3.提供USB读写函数
新接入的USB设备默认地址(编号)为0,在未分配新编号前,PC主机使用0地址与其通信。 (指匹配到驱动之前,会先与USB设备的prot0进行沟通,然后配置,当总线添加设备后,与驱动匹配后,择交给驱动控制此USB设备) Q2.USB驱动整体框架
usb设备驱动通过使用USB总线驱动的标准接口去控制USB读写。应用层如何控制USB设备,具体传输什么内容,传输什么格式是由对应USB设备的设备驱动决定的。USB主机控制器提供标准的接口规范。
Q3.什么是OHCI EHCI XHCI? A3.这些是USB主机控制器的类型,不同类型遵循的协议和接口硬件不同,传输速录不同。常见的有:
xHCI:支持USB3.0
EHCI:支持USB2.0
Q4.USB描述符怎么理解
A4. USB的设备描述符由多层结构。
一个设备描述符可以有多个配置描述符。(意义?)
一个配置描述符可以有多个接口描述符。(意义?)
一个接口描述符可以有多个端点描述符。
Q5.配置描述符、接口描述符、端点描述符的作用? 配置描述符
接口描述符 一个接口描述符代表一个逻辑上的设备。
端点描述符
Q6.USB设备描述符结构?
Q7.usb_device设备结构体内容
struct usb_device {
int devnum; //设备号,是在USB总线的地址
char devpath [16]; //用于消息的设备ID字符串
enum usb_device_state state; //设备状态:已配置、未连接等等
enum usb_device_speed speed; //设备速度:高速、全速、低速或错误
struct usb_tt *tt; //处理传输者信息;用于低速、全速设备和高速HUB
int ttport; //位于tt HUB的设备口
unsigned int toggle[2]; //每个端点占一位,表明端点的方向([0] = IN, [1] = OUT)
struct usb_device *parent; //上一级HUB指针
struct usb_bus *bus; //总线指针
struct usb_host_endpoint ep0; //端点0数据
struct device dev; //一般的设备接口数据结构
struct usb_device_descriptor descriptor; //USB设备描述符,
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; //每个配置的raw描述符
unsigned short bus_mA; //可使用的总线电流
u8 portnum; //父端口号
u8 level; //USB HUB的层数
unsigned can_submit:1; //URB可被提交标志
unsigned discon_suspended:1; //暂停时断开标志
unsigned persist_enabled:1; //USB_PERSIST使能标志
unsigned have_langid:1; //string_langid存在标志
unsigned authorized:1;
unsigned authenticated:1;
unsigned wusb:1; //无线USB标志
int string_langid; //字符串语言ID
/* static strings from the device */ //设备的静态字符串
char *product; //产品名
char *manufacturer; //厂商名
char *serial; //产品串号
struct list_head filelist; //此设备打开的usbfs文件
#ifdef CONFIG_USB_DEVICE_CLASS
struct device *usb_classdev; //用户空间访问的为usbfs设备创建的USB类设备
#endif
#ifdef CONFIG_USB_DEVICEFS
struct dentry *usbfs_dentry; //设备的usbfs入口
#endif
int maxchild; //(若为HUB)接口数
struct usb_device *children[USB_MAXCHILDREN]; //连接在这个HUB上的子设备
int pm_usage_cnt; //自动挂起的使用计数
u32 quirks;
atomic_t urbnum; //这个设备所提交的URB计数
unsigned long active_duration; //激活后使用计时
#ifdef CONFIG_PM //电源管理相关
struct delayed_work autosuspend; //自动挂起的延时
struct work_struct autoresume; //(中断的)自动唤醒需求
struct mutex pm_mutex; //PM的互斥锁
unsigned long last_busy; //最后使用的时间
int autosuspend_delay;
unsigned long connect_time; //第一次连接的时间
unsigned auto_pm:1; //自动挂起/唤醒
unsigned do_remote_wakeup:1; //远程唤醒
unsigned reset_resume:1; //使用复位替代唤醒
unsigned autosuspend_disabled:1; //挂起关闭
unsigned autoresume_disabled:1; //唤醒关闭
unsigned skip_sys_resume:1; //跳过下个系统唤醒
#endif
struct wusb_dev *wusb_dev; //(如果为无线USB)连接到WUSB特定的数据结构
};
hub_probe时注册的hub_event
hub_event()中处理端口变化
port_event
hub_port_connect_change
hub_port_connect
usb_alloc_dev 分配usb设备描述符
usb_set_device_state 设置当前状态为POWERED
choose_devnum 分配usb地址
hub_port_init 初始化端口 分配地址
usb_new_device
announce_device 内核消息打印
device_add
1)把device放入usb_bus_type的dev链表,
2)从usb_bus_type的driver链表里取出usb_driver,
3)把usb_interface和usb_driver的id_table比较
3)如果能匹配,调用usb_driver的probe
标签:usb,unsigned,描述符,USB,设备,基本概念,struct From: https://blog.51cto.com/u_13911803/8464850