USB基本概念二
  llt0tXqeaug8 2023年11月19日 42 0

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()中处理端口变化

USB基本概念二_字符串

port_event

hub_port_connect_change

USB基本概念二_#ifdef_02


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

        

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  zLxnEsMLk4BL   2023年11月19日   31   0   0 变量名字符串bclinux
  X5zJxoD00Cah   2023年11月30日   39   0   0 GroupEmail字符串
  gBkHYLY8jvYd   2023年11月19日   22   0   0 输出格式进制字符串
llt0tXqeaug8