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函数.

参考:

<>