Linux驅動開發之USB裝置檢測流程

2021-10-20 04:13:07 字數 2495 閱讀 1209

最近工作中,因為工作需要,特地學習了一下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...