免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2182 | 回复: 0
打印 上一主题 下一主题

[内核模块] usb驱动之设备插拔检测 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-07-23 09:26 |只看该作者 |倒序浏览
本帖最后由 gami 于 2017-07-23 09:28 编辑

先看一张熟悉的图:

可见usb设备都是接在hub上的,设备的检测自然跟hub相关了,这里以root hub为例。
看usb hub驱动代码,跟usb设备检测相关的有如下几处(按在hub_probe中的调用顺序):
1.INIT_WORK(&hub->events, hub_event);
2.usb_fill_int_urb(hub->urb, hdev, pipe, *hub->buffer, maxp, hub_irq,
       hub, endpoint->bInterval);
3.status = usb_submit_urb(hub->urb, GFP_NOIO);
第3处即向root_hub提交一个中断传输的urb,我们来看这个urb的完成函数hub_irq:

这个函数比较简单,最后又调用usb_submit_urb提交中断urb,以实现对中断端点的轮询。
这个中断urb最终会调到root_hub的定时器函数rh_timer_func,具体调用过程请分析usb_create_hcd/usb_add_hcd,usb_submit_urb,这里不赘述
这个定时器函数里,调用hc_driver的hub_status_data读取root hub的端口变化状态
kick_hub_wq实现如下:

向工作队列hub_wq提交了一个工作任务,工作函数为前面第1处的hub_event,
hub_event最终会调到hub_port_connect,处理端口设备的connect,disconnect
如果是connect,则会调用usb_alloc_dev/usb_new_device创建新的usb_device,踏上match与probe usb_device_driver和usb_driver的漫长之旅...


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP