Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
上一篇文件小结了USB设备的枚举过程,而设备是插入到hub上才被检测到的.
这里小结hub的初始化,假设初始化之前USB设备已经插入,并且这里讨论的是
root hub,非root hub的行为会和u***设备类似.
u*** core初始化会创建一个hub thread, 来处理USB设备插入后的枚举事件.
u***_init -> core/u***.c
u***_hub_init -> hub.c
u***_register //和其他USB设备一样注册到core中,让core知道它的存在.
hub_thread ->
hub_events //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.
wait_event_freezable //休眠等待测到有u***插入.
对于root hub,它和host controller一起的,也就是说有host controller,就一定有root hub存在,
在host controller初始化时会一并将root hub注册.
ehci_rk_init -> echi-rockchip.c
platform_driver_register ->
ehci_rk_probe ->
u***_add_hcd ->
u***_alloc_dev //分配root hub的u***_device
register_root_hub ->
u***_new_device ->
u***_enumerate_device //枚举获取root hub信息
device_add -> 进而调用hub drvier的probe
hub_probe -> hub.c
hub_configure ->
u***_get_status //获得hub device状态
u***_alloc_urb //分配urb
u***_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阶段
u***_submit_urb //提交urb
kick_khubd ->
wake_up(&khubd_wait) -> //接下来就是枚举设备的过程了.
hub_thread ->
hub_events ->
hub_port_connect_change ->
u***_alloc_dev
u***_set_device_state //USB_STATE_POWERED:上电状态
choose_devnum
hub_port_init
u***_new_device
u***_enumerate_device
device_add //接着就会调用到对应设备的probe函数.
Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
上一篇文件小结了USB设备的枚举过程,而设备是插入到hub上才被检测到的.
这里小结hub的初始化,假设初始化之前USB设备已经插入,并且这里讨论的是
root hub,非root hub的行为会和u***设备类似.
u*** core初始化会创建一个hub thread, 来处理USB设备插入后的枚举事件.
u***_init -> core/u***.c
u***_hub_init -> hub.c
u***_register //和其他USB设备一样注册到core中,让core知道它的存在.
hub_thread ->
hub_events //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.
wait_event_freezable //休眠等待测到有u***插入.
对于root hub,它和host controller一起的,也就是说有host controller,就一定有root hub存在,
在host controller初始化时会一并将root hub注册.
ehci_rk_init -> echi-rockchip.c
platform_driver_register ->
ehci_rk_probe ->
u***_add_hcd ->
u***_alloc_dev //分配root hub的u***_device
register_root_hub ->
u***_new_device ->
u***_enumerate_device //枚举获取root hub信息
device_add -> 进而调用hub drvier的probe
hub_probe -> hub.c
hub_configure ->
u***_get_status //获得hub device状态
u***_alloc_urb //分配urb
u***_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阶段
u***_submit_urb //提交urb
kick_khubd ->
wake_up(&khubd_wait) -> //接下来就是枚举设备的过程了.
hub_thread ->
hub_events ->
hub_port_connect_change ->
u***_alloc_dev
u***_set_device_state //USB_STATE_POWERED:上电状态
choose_devnum
hub_port_init
u***_new_device
u***_enumerate_device
device_add //接着就会调用到对应设备的probe函数.
举报