usb介面驅動載入流程分析

2021-06-22 10:35:47 字數 2405 閱讀 1666

usb介面驅動載入流程分析

struct usb_device_driver usb_generic_driver = ;

struct bus_type usb_bus_type = ;

系統初始化時usb core會呼叫:

retval = usb_register_device_driver(&usb_generic_driver, this_module);

此動作會:

usb_generic_driver.drvwrap.driver.bus = &usb_bus_type;

當usb裝置(

只有裝置先被註冊之後才會分析介面,才會註冊介面) 被探測並被註冊到系統後(用device_add),會呼叫usb_bus_type.mach()(只要是usb裝置,都會跟 usb_generic_driver匹配上),之後會呼叫usb_probe_device(),從而引發usb_generic_driver的 probe()呼叫.

note:

usb裝置首先以裝置的身份與usb_generic_driver匹配,成功之後,會**出介面,當對介面呼叫device_add()後,會引起介面 和介面驅動的匹配,這個匹配還是用usb_bus_type.mach()函式。因為介面的device->bus=& usb_bus_type, 這跟usb裝置是一樣的,所以,都會呼叫到usb_bus_type.mach(),但裝置和介面的處理流程是不一樣的

static int generic_probe(struct usb_device *udev)}}

usb_notify_add_device(udev);

return 0;

}generic_probe所做的工作:

從裝置可能的眾多配置中選擇乙個合適的,然後去配置裝置,從而讓裝置進入期待已久的configured狀態。

int usb_choose_configuration(struct usb_device *udev);

從udev->descriptor.bnumconfigurations個配置裡選擇乙個合適的配置(struct usb_host_config),並返回該配置的索引值

例如:我機器上的的 usb 驅動載入時,輸出:

usb 1-1: configuration #1 chosen from 3 choices

表示:此裝置有3個配置,而驅動最終選擇了索引號為1的配置,至於選擇策略是怎樣的,請看usb_choose_configuration()函式

int usb_set_configuration(struct usb_device *dev, int configuration)}}

if ((!cp && configuration != 0))

return -einval;

if (cp && configuration == 0)

dev_warn(&dev->dev, "config 0 descriptor??\n");        //

假如配置的索引號為0,打出警告

n = nintf = 0;

if (cp)

for (; n < nintf; ++n) }//

以上**為配置的bnuminte***ces個介面分配空間

i = dev->bus_ma - cp->desc.bmaxpower * 2;

if (i < 0)

dev_warn(&dev->dev, "new config #%d exceeds power "

"limit by %dma\n",

configuration, -i);

}ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),

usb_req_set_configuration, 0, configuration, 0,

null, 0, usb_ctrl_set_timeout);

if (ret < 0)

dev->actconfig = cp;                    //

傳送usb_req_set_configuration的urb資訊來設定裝置的配置為cp,同時記錄在dev->actconfig裡

usb_set_device_state(dev, usb_state_configured);    //

設定裝置的status 為usb_state_configured

for (i = 0; i < nintf; ++i)

kfree(new_inte***ces);

for (i = 0; i < nintf; ++i)

create_intf_ep_devs(intf);

}usb_autosuspend_device(dev);

return 0;}

0

給主人留下些什麼吧!~~

USB裝置驅動程式載入流程

使用者插入usb裝置 usb匯流排 或者是pci匯流排,這個不太清楚,反正就是匯流排來著 識別到插入了usb裝置。匯流排和usb裝置進行通訊,獲取usb的硬體id 產品id,以及bcdversion。根據這些資訊組成裝置硬體id號 vid x pid x rev x。匯流排根據usb裝置的插槽位置,...

USB載入式流介面驅動要點分析和實現步驟

為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成 較高usb裝置驅動程式層和較低的u...

USB裝置驅動載入過程

本文摘自 使用者插入usb裝置 usb匯流排 或者是pci匯流排,這個不太清楚,反正就是匯流排來著 識別到插入了usb裝置。匯流排和usb裝置進行通訊,獲取usb的硬體id 產品id,以及bcdversion。根據這些資訊組成裝置硬體id號 vid x pid x rev x。匯流排根據usb裝置的...