1

我在http://www.technovelty.org/code/linux/plugging-in-usb.html阅读了一篇文章。它非常好。

连接设备的枚举究竟是在哪个函数中由主机完成的,以及在哪个函数中发送 uevent?

我在 usb_new_device 等函数中引入了 printks,如果我使用“udevadm monitor --kernel”,它甚至会在 hub.c 的 usb_new_device 中调用的枚举函数之前显示内核事件?

日志如下

[110.819399] 123456 hub_irq

[110.824952]123456 hub_port_connect_change

[110.979624]123456 hub_port_init

[111.059625]usb 2-1.2:使用 fsl-ehci 和地址 3 的新高速 USB 设备

[111.189722] 123456 usb_new_device

[111.196219]usb 2-1.2:找到新的 USB 设备,idVendor=05ac,idProduct=12a0

[111.203113]usb 2-1.2:新的 USB 设备字符串:Mfr=1,Product=2,SerialNumber=3

[111.210438] USB 2-1.2:产品:iPhone

[111.214196] USB 2-1.2:制造商:Apple Inc.

[111.218728]usb 2-1.2:序列号:9356b662a93170509226069e5adf53f2351d774e

内核 [110.940183] 添加 /devices/platform/fsl-ehci.1/usb2/2-1/2-1.2 (usb)

检查时间戳,尽管 udevadm 输出在最后(udevadm 在用户空间中运行),但它实际上在 [110.940183] 得到了事件,因为在 [111.189722] 调用了 usb_new_device

4

1 回答 1

3

我几乎是 Linux 内核文盲,所以不能 100% 确定这个信息..但是在http://www.cs.fsu.edu/~baker/devices/lxr/http/find的帮助下设法追踪了 USB 初始化?v=2.6.11.8

这是Linux 2.6.11.8内核上的USB主机代码流程(如果有错误请纠正我)

usb_init()     // invoked in ../core/usb.c it initializes host, major, usbfs and usb_hub 
usb_hub_init() // in core/hub.c it creates a kernel thread hub_thread()
hub_thread()   // in core/hub.c
hub_events()   // next this if called 
hub_port_connect_change() // then this..
于 2013-09-28T01:27:42.997 回答