usb子系统分析2(usb设备识别过程)

在这里插入图片描述
问题一:USB总线驱动是USB控制器的驱动程序,那控制器是如何识别usb设备?识别后,如何为该设备匹配驱动?匹配驱动后,app是如何访问该usb设备的?

  1. 识别USB设备
    1.1 USB设备插入时,D+ 或者D-会被拉高,从而使USB控制器产生usb_irq中断,中断会唤醒hub_thread线程,线程中调用hub_events
    在这里插入图片描述
    1.2 连接usb设备:hub_events->hub_port_connect_change
    hub_port_connect_change
    -> usb_alloc_dev // 分配usb设备描述符
    -> choose_devnum // 分配usb地址(最大127)
    -> hub_port_init // 初始化端口,与设备建立连接
    ->hub_set_address(udev); //设置地址,告诉USB设备新的地址编号
        ->usb_get_device_descriptor(udev, 8); //获得USB设备描述符前8个字节
    1.3 建立连接后,注册usb设备,匹配usb驱动
    hub_port_connect_change
      ->usb_new_device 
       ->usb_enumerate_device // 读取描述符并解析
        ->usb_get_configuration(udev);
    ->usb_parse_configuration // 解析
    -> device_add // 回到了熟悉的linux设备驱动模型
    1)把device放入usb_bus_type的dev链表,
    2)从usb_bus_type的driver链表里取出usb_driver,
    3)把usb_interface和usb_driver的id_table比较
    3)如果能匹配,调用usb_driver的probe
    1.4 遗留问题
    1)usb设备插入时,中断是如何触发的?中断处理函数又是如何注册的?
    2)usb设备注册时,是如何匹配驱动的?
    细看device_add的实现
    https://blog.csdn.net/yiyeguzhou100/article/details/72637948
    3)驱动的probe函数都会做些什么?以鼠标为例分析usb驱动?
    4)驱动probe完成后,app如何访问usb设备?
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值