Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
上一篇文件小结了USB设备的枚举过程,而设备是插入到hub上才被检测到的.
这里小结hub的初始化,假设初始化之前USB设备已经插入,并且这里讨论的是
root hub,非root hub的行为会和usb设备类似.
usb core初始化会创建一个hub thread, 来处理USB设备插入后的枚举事件.
usb_init -> core/usb.c
usb_hub_init -> hub.c
usb_register //和其他USB设备一样注册到core中,让core知道它的存在.
hub_thread ->
hub_events //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.
wait_event_freezable //休眠等待测到有usb插入.
对于root hub,它和host controller一起的,也就是说有host controller,就一定有root hub存在,
在host controller初始化时会一并将root hub注册.
ehci_rk_init -> echi-rockchip.c
platform_driver_register ->
ehci_rk_probe ->
usb_add_hcd ->
usb_alloc_dev //分配root hub的usb_device
register_root_hub ->
usb_new_device ->
usb_enumerate_device //枚举获取root hub信息
device_add -> 进而调用hub drvier的probe
hub_probe -> hub.c
hub_configure ->
usb_get_status //获得hub device状态
usb_alloc_urb //分配urb
usb_fill_int_urb //填充中断类型的urb(hub支持control/int类型), 注意这里的hub_irq()参数,后面会重点提到.
hub_activate ->
schedule_delayed_work ->
hub_init_func2 ->
hub_activate //HUB_INIT2阶段
schedule_delayed_work ->
hub_init_func3 ->
hub_activate ->//HUB_INIT3阶段
usb_submit_urb //提交urb
kick_khubd ->
wake_up(&khubd_wait) -> //接下来就是枚举设备的过程了.
hub_thread ->
hub_events ->
hub_port_connect_change ->
usb_alloc_dev
usb_set_device_state //USB_STATE_POWERED:上电状态
choose_devnum
hub_port_init
usb_new_device
usb_enumerate_device
device_add //接着就会调用到对应设备的probe函数.
参考:
<>