1. 程式人生 > >ehci及其伴隨ohci主機控制器驅動分析

ehci及其伴隨ohci主機控制器驅動分析

1. 正常插入

插上U盤產生中斷呼叫usb_hcd_irq:
usb_hcd_irq
    ehci_irq
        usb_hcd_resume_root_hub
            queue_work(pm_wq, &hcd->wakeup_work); //hcd.c中的__usb_create_hcd中INIT_WORK(&hcd->wakeup_work, hcd_resume_work);
                hcd_resume_work
                usb_remote_wakeup
                usb_autoresume_device
                __pm_runtime_resume
                rpm_resume
                rpm_callback
                __rpm_callback
                usb_runtime_resume
                usb_resume_both
                usb_resume_interface
                hub_resume
                hub_activate
                    kick_hub_wq
                        queue_work(hub_wq, 
&hub->events) //hub.c的hub_probe中INIT_WORK(&hub->events, hub_event); hub_event //hub.c usb_reset_device //hub.c usb_reset_and_verify_device hub_port_init //hub.c
hub_port_reset //hub.c hub_set_address port_event hub_port_connect_change hub_port_connect usb_new_device usb_enumerate_device
//hub.c 列舉裝置 正常拔出 hub_irq 作為一箇中斷傳輸最先呼叫

 


2. 斜著插入U盤,使D+先接觸,還會呼叫到其伴隨的ohci控制器驅動

ohci和ehci在 hub_port_init() 中加 dump_stack() 顯示的呼叫路徑是一樣的!
在 kick_hub_wq 中繼續 dump_stack() 直到 usb_hcd_resume_root_hub() 也應該是一樣的

不同之處:

//ehci:
start_kernel
rest_init
cpu_startup_entry
do_idle
arch_cpu_idle
el1_irq              //起源於硬體中斷,產生中斷進入中斷處理,el1_irq彙編,中斷總入口
gic_handle_irq
__handle_domain_irq
generic_handle_irq
handle_fasteoi_irq   //這個是有IO中斷直接觸發的
handle_irq_event
handle_irq_event_percpu
__handle_irq_event_percpu
    usb_hcd_irq
        ehci_irq
            usb_hcd_resume_root_hub
//ohci:
ksoftirqd        //起源於軟中斷
ret_from_fork
kthread
worker_thread
process_one_work  //kick_hub_wq中queue_work(hub_wq, &hub->events),hub_irq中呼叫了kick_hub_wq
hub_event
hub_port_init
hub_port_reset
hub_ext_port_status
usb_control_msg
usb_start_wait_urb
usb_submit_urb
usb_hcd_submit_urb  //這裡面觸發了這個中斷
el1_irq             //這個中斷是?
gic_handle_irq
__handle_domain_irq
generic_handle_irq
handle_fasteoi_irq
handle_irq_event
handle_irq_event_percpu
__handle_irq_event_percpu
    usb_hcd_irq
        ohci_irq
            usb_hcd_poll_rh_status
                ohci_hub_status_data
                    usb_hcd_resume_root_hub

 

3. 結論
插入U盤產生的IO中斷直接作用在ehci上,並由ehci先處理一遍。當由於速率識別,導致中斷不再ehci上,此傳輸完成,hub_irq被呼叫,
然後它執行hub_event,之後觸發一個硬中斷,此中斷由ohci處理了!