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裝置的...