Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92
前面小结了U盘枚举成功后驱动加载流程,这里对U盘插入后枚举过程做小结.
先看hub初始化:
usb_hub_init -> hub.c
usb_register //注册到usb core中.
kthread_run(hub_thread, NULL, "khubd"); //创建"khubd"线程
hub_thread ->
hub_events //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.
wait_event_freezable(khubd_wait, ....) //休眠等待hub事件(检测到有usb插入)
另一方面,host controller里有个定时器,会定期检查有没有设备插入:
rh_timer_func -> hcd.c
usb_hcd_poll_rh_status ->
usb_hcd_giveback_urb ->
urb->complete(urb) //complete在hub初始化的时候usb_fill_int_urb()被赋值,对应的是hub_irq().
hub_irq ->
kick_khubd ->
wake_up(&khubd_wait)
这时khubd线程被唤醒:
hub_thread -> hub.c<
OS: Android 6.0
Kernel: 3.10.92
前面小结了U盘枚举成功后驱动加载流程,这里对U盘插入后枚举过程做小结.
先看hub初始化:
usb_hub_init -> hub.c
usb_register //注册到usb core中.
kthread_run(hub_thread, NULL, "khubd"); //创建"khubd"线程
hub_thread ->
hub_events //while循环,第一次进来后hub event list是空,马上退出然后进入休眠.
wait_event_freezable(khubd_wait, ....) //休眠等待hub事件(检测到有usb插入)
另一方面,host controller里有个定时器,会定期检查有没有设备插入:
rh_timer_func -> hcd.c
usb_hcd_poll_rh_status ->
usb_hcd_giveback_urb ->
urb->complete(urb) //complete在hub初始化的时候usb_fill_int_urb()被赋值,对应的是hub_irq().
hub_irq ->
kick_khubd ->
wake_up(&khubd_wait)
这时khubd线程被唤醒:
hub_thread -> hub.c<