最近工作中,因為工作需要,特地學習了一下usb裝置的檢測流程,做個筆記。
從中斷響應到probe對應的usb裝置驅動:
hub_irq -> kick_hub_wq -> queue_work -> hub_event -> port_event -> hub_port_connect_change -> hub_port_connect -> usb_alloc_dev -> choose_devnum -> hub_port_init -> hub_set_address -> usb_get_device_descriptor -> usb_new_device -> usb_enumerate_autosuspend -> announce_device -> device_add ->bus_probe_device。
原始碼路徑:kernel/drviers/usb/core/hub.c。
/* completion function, fires on port status changes and various faults */
static void hub_irq(struct urb *urb)
hub->nerrors = 0;
kick_hub_wq(hub);
resubmit:
if (hub->quiescing)
return;
status = usb_submit_urb(hub->urb, gfp_atomic);
if (status != 0 && status != -enodev && status != -eperm)
dev_err(hub->intfdev, "resubmit --> %d\n", status);
}
原始碼路徑:kernel/drviers/usb/core/hub.c。
static void kick_hub_wq(struct usb_hub *hub)
原始碼路徑:kernel/drviers/usb/core/hub.c。
static void hub_event(struct work_struct *work)
} ……
}
原始碼路徑:kernel/drviers/usb/core/hub.c。
static void port_event(struct usb_hub *hub, int port1)__must_hold(&port_dev->status_lock)
原始碼路徑:kernel/drviers/usb/core/hub.c。
static void hub_port_connect_change(struct usb_hub *hub, int port1, u16 portstatus, u16 portchange)__must_hold(&port_dev->status_lock)
原始碼路徑:kernel/drviers/usb/core/hub.c。
static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, u16 portchange)
……/* reset (non-usb 3.0 devices) and get descriptor */
usb_lock_port(port_dev);
status = hub_port_init(hub, udev, port1, i);
usb_unlock_port(port_dev);
……/* run it through the hoops (find a driver, etc) */
if (!status)
} ……
}}
原始碼路徑:kernel/drviers/usb/core/usb.c。
原始碼路徑:kernel/drviers/usb/core/hub.c。
static int hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, int retry_counter)……}
retval = usb_get_device_descriptor(udev, usb_dt_device_size);
}
原始碼路徑:kernel/drviers/usb/core/hub.c。
int usb_new_device(struct usb_device *udev)
原始碼路徑:kernel/drviers/usb/core/hub.c。
static void announce_device(struct usb_device *udev)
linux裝置驅動 USB
系統核心中有usb匯流排驅動程式,作用是識別裝置,查詢並安裝裝置驅動程式,提供讀寫函式 當乙個usb裝置插入時,會有以下操作 1.某條線被拉低,硬體感知有裝置接入 2.usb匯流排驅動程式為裝置分配新位址,並告訴usb裝置 3.獲取描述符 4.根據獲取的裝置描述符中的資訊在usb匯流排中新增devi...
USB裝置驅動
1.linux usb架構 usb通訊都是由host端發起的。usb裝置驅動程式分配並初始化乙個urb發給usb core,usb core改一改,發給usb主機控制器驅動,usb主機控制器驅動把它解析成包,在匯流排上進行傳送。usb core是由核心實現的,其實也就是把host control d...
USB裝置驅動
把usb裝置接到pc 右下角彈出 發現android phone 跳出乙個對話方塊,提示你安裝驅動程式 問1.既然還沒有 驅動程式 為何能知道是 android phone 答1.windows裡已經有了usb的匯流排驅動程式,接入usb裝置後,是 匯流排驅動程式 知道你是 android phon...