在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

linux-usb子系統的核心描述

嵌入式小生 ? 來源:嵌入式小生 ? 2023-01-14 09:37 ? 次閱讀

一、導讀

本文將描述linux-usb子系統的核心,主要分析其核心的初始化流程,文中源碼基于內核版本:4.1.15。

linux usb子系統框架的核心位于/drivers/usb/core/目錄中,文件結構如下圖所示:

ad39d590-93a3-11ed-bfe3-dac502259ad0.png

目錄中各文件功能大致如下:

ad63df16-93a3-11ed-bfe3-dac502259ad0.png

二、USB核心的初始化

在linux內核的啟動階段USB模塊最早輸出日志信息如下:

(1)[0.475284]usbcore:registerednewinterfacedriverusbfs
(2)[0.475348]usbcore:registerednewinterfacedriverhub
(3)[0.475400]usbcore:registerednewdevicedriverusb

從上述輸出日志可知:第(1)行表示成功注冊USB文件系統,且在系統正常啟動后,會生成對應的/sys/bus/usb/目錄。第(2)行表示成功注冊USB HUB驅動。第(3)行表明成功注冊USB通用設備驅動,即usb_generic_driver。通常USB設備都是以設備的身份先與usb_generic_driver匹配,匹配成功后,會分裂出接口,當對接口調用 device_add()后,會觸發USB接口和USB驅動的匹配。

USB核心由/drivers/usb/core/usb.c文件描述。該文件以linux內核模塊的方式設計,使用subsys_initcall(usb_init);將usb核心模塊導出。其中,usb核心的初始化由usb_init()完成,實現如下:

staticint__initusb_init(void)
{
intretval;
if(usb_disabled()){
pr_info("%s:USBsupportdisabled
",usbcore_name);
return0;
}
usb_init_pool_max();//初始化pool_max參數

usb_debugfs_init();//初始化usb的調試文件系統debugfs

usb_acpi_register();//初始化acpi
retval=bus_register(&usb_bus_type);//向linux內核注冊usb總線類型
if(retval)
gotobus_register_failed;
//注冊usb通知器
retval=bus_register_notifier(&usb_bus_type,&usb_bus_nb);
if(retval)
gotobus_notifier_failed;
//usb設備號初始化
retval=usb_major_init();
if(retval)
gotomajor_init_failed;
//注冊usbfs驅動程序
retval=usb_register(&usbfs_driver);
if(retval)
gotodriver_register_failed;
//初始化usb的devio
retval=usb_devio_init();
if(retval)
gotousb_devio_init_failed;
//初始化usb的hub
retval=usb_hub_init();
if(retval)
gotohub_init_failed;
//注冊通用usb設備驅動
retval=usb_register_device_driver(&usb_generic_driver,THIS_MODULE);
if(!retval)
gotoout;

usb_hub_cleanup();
hub_init_failed:
usb_devio_cleanup();
usb_devio_init_failed:
usb_deregister(&usbfs_driver);
driver_register_failed:
usb_major_cleanup();
major_init_failed:
bus_unregister_notifier(&usb_bus_type,&usb_bus_nb);
bus_notifier_failed:
bus_unregister(&usb_bus_type);
bus_register_failed:
usb_acpi_unregister();
usb_debugfs_cleanup();
out:
returnretval;
}

從上述代碼可見,usb_init()中執行了如下操作:

(1)判斷linux內核是否開啟了對USB的支持,如果不支持則直接返回。

(2)初始化調試文件系統關于usb的目錄和文件:

staticintusb_debugfs_init(void)
{
//創建usb目錄
usb_debug_root=debugfs_create_dir("usb",NULL);
if(!usb_debug_root)
return-ENOENT;
//在usb目錄下創建devices文件
usb_debug_devices=debugfs_create_file("devices",0444,
usb_debug_root,NULL,
&usbfs_devices_fops);
if(!usb_debug_devices)
{
debugfs_remove(usb_debug_root);
usb_debug_root=NULL;
return-ENOENT;
}

return0;
}

(3)初始化usb與acpi相關的參數:

ad8a6500-93a3-11ed-bfe3-dac502259ad0.png

(4)向linux內核注冊usb總線類型,usb總線類型定義如下:

structbus_typeusb_bus_type={
.name="usb",
.match=usb_device_match,
.uevent=usb_uevent,
};

(5)注冊usb總線通知器

(6)初始化usb主設備號:

intusb_major_init(void)
{
interror;
//注冊usb字符設備
error=register_chrdev(USB_MAJOR,"usb",&usb_fops);
if(error)
printk(KERN_ERR"Unabletogetmajor%dforusbdevices
",
USB_MAJOR);

returnerror;
}

(7)注冊usbfs驅動程序,usbfs以usb驅動程序的形式進行定義:

structusb_driverusbfs_driver={
.name="usbfs",
.probe=driver_probe,
.disconnect=driver_disconnect,
.suspend=driver_suspend,
.resume=driver_resume,
};

(8)初始化usb的devio,實質上是初始化USB字符設備,devio用于USB設備與用戶空間進行通信

int__initusb_devio_init(void)
{
intretval;

retval=register_chrdev_region(USB_DEVICE_DEV,USB_DEVICE_MAX,
"usb_device");
if(retval){
printk(KERN_ERR"Unabletoregisterminorsforusb_device
");
gotoout;
}
cdev_init(&usb_device_cdev,&usbdev_file_operations);
retval=cdev_add(&usb_device_cdev,USB_DEVICE_DEV,USB_DEVICE_MAX);
if(retval){
printk(KERN_ERR"Unabletogetusb_devicemajor%d
",
USB_DEVICE_MAJOR);
gotoerror_cdev;
}
//注冊usbdev_nb通知器
usb_register_notify(&usbdev_nb);
out:
returnretval;

error_cdev:
unregister_chrdev_region(USB_DEVICE_DEV,USB_DEVICE_MAX);
gotoout;
}

(9)初始化usb的hub,hub也是以USB驅動方式進行設計(/drivers/usb/core/hub.c):

staticstructusb_driverhub_driver={
.name="hub",
.probe=hub_probe,
.disconnect=hub_disconnect,
.suspend=hub_suspend,
.resume=hub_resume,
.reset_resume=hub_reset_resume,
.pre_reset=hub_pre_reset,
.post_reset=hub_post_reset,
.unlocked_ioctl=hub_ioctl,
.id_table=hub_id_table,
.supports_autosuspend=1,
};

intusb_hub_init(void)
{
if(usb_register(&hub_driver)

(10)注冊通用usb設備驅動usb_generic_driver,定義如下(/drivers/usb/core/generic.c):

structusb_device_driverusb_generic_driver={
.name="usb",
.probe=generic_probe,
.disconnect=generic_disconnect,
#ifdefCONFIG_PM
.suspend=generic_suspend,
.resume=generic_resume,
#endif
.supports_autosuspend=1,
};

?從前文描述可知:在linux啟動過程中或者是在插入USB設備后,通常USB設備都是以設備的身份先與usb_generic_driver匹配,這時候由.probe指向的generic_peobe()會執行,當匹配成功后,會分裂出接口,當對接口調用device_add()后,會觸發USB接口和USB接口驅動的匹配。

generic_probe()函數實現如下:

staticintgeneric_probe(structusb_device*udev)
{
interr,c;

/*Chooseandsettheconfiguration.Thisregisterstheinterfaces
*withthedrivercoreandletsinterfacedriversbindtothem.
*/
if(udev->authorized==0)
dev_err(&udev->dev,"Deviceisnotauthorizedforusage
");
else{
//選擇配置
c=usb_choose_configuration(udev);
if(c>=0){
//設置配置
err=usb_set_configuration(udev,c);
if(err&&err!=-ENODEV){
dev_err(&udev->dev,"can'tsetconfig#%d,error%d
",
c,err);
/*Thisneednotbefatal.Theusercantryto
*setotherconfigurations.*/
}
}
}
/*USBdevicestate==configured...usable*/
usb_notify_add_device(udev);//通知usb設備添加,對應注冊的回調函數會被執行。

return0;
}

三、總結

本文主要描述linux-usb核心的初始化,usb核心是usb子系統的內層,其他的usb模塊都基于這個內層再設計。除此之外,著重描述了usb_init()函數的具體執行步驟,如下圖所示:

ada72064-93a3-11ed-bfe3-dac502259ad0.jpg





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • USB接口
    +關注

    關注

    9

    文章

    702

    瀏覽量

    55830
  • ACPI
    +關注

    關注

    1

    文章

    11

    瀏覽量

    8972
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21743

原文標題:Linux-USB驅動框架 | usb核心

文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    關于Linux設備驅動中input子系統的介紹

    對于輸入類設備如鍵盤、鼠標、觸摸屏之類的Linux驅動,內核提供input子系統,使得這類設備的處理變得非常便捷。總體上來講,input子系統由三部分組成: 事件驅動input核心設備
    發表于 01-09 16:06 ?2730次閱讀

    Linux下輸入子系統上報觸摸屏坐標

    ??在 Linux 中,輸入子系統是由輸入子系統設備驅動層、輸入子系統核心層(Input Core)和輸入
    的頭像 發表于 09-25 08:56 ?2550次閱讀
    <b class='flag-5'>Linux</b>下輸入<b class='flag-5'>子系統</b>上報觸摸屏坐標

    Linux LED子系統詳解

    Linux LED子系統詳解
    的頭像 發表于 06-10 10:37 ?1593次閱讀
    <b class='flag-5'>Linux</b> LED<b class='flag-5'>子系統</b>詳解

    嵌入式技術:Linux驅動USB必須了解的四個描述

    module_init,只不過因為這部分代碼是核心,開發者通常把它看作一個子系統,而不僅僅是一個模塊。因為USB core模塊代表的不是某一個設備,而是所有USB設備賴以生存的模塊。因
    發表于 05-09 09:06

    輸入子系統的作用與框架

    了一個底層驅動(成為serio)的集合,支持對串口和鍵盤控制器等硬件輸入的訪問  輸入子系統使得應用編程人員和驅動編程人員編程的時候變得簡單統一。3、輸入子系統框架linux輸入子系統
    發表于 10-19 17:13

    基于USB設備的Linux網絡驅動程序開發

    介紹Linux 的體系結構及其網絡子系統,并結合USB 設備在Linux 下的訪問機制,給出了一種USB 網絡驅動程序的設計方法。該設計方法
    發表于 08-11 11:23 ?20次下載

    基于Linux內核輸入子系統的驅動研究

    Linux因其完全開放的特性和穩定優良的性能深受歡迎,當推出了內核輸入子系統后,更方便了嵌入式領域的驅動開放。介紹了Linux的設備驅動基礎,詳細闡述了基于Linux內核輸入
    發表于 09-12 16:38 ?23次下載

    Linux內核輸入子系統的驅動研究

    Linux內核輸入子系統的驅動研究
    發表于 10-31 14:41 ?14次下載
    <b class='flag-5'>Linux</b>內核輸入<b class='flag-5'>子系統</b>的驅動研究

    Linux usb子系統子系統架構

    USB 分為主從兩大體系,一般而言, PC 中的 USB 系統就是作主,而一般的 USB 鼠標, U 盤則是典型的 USB
    發表于 05-07 10:35 ?1342次閱讀

    詳細了解Linux設備模型中的input子系統

    linux輸入子系統linux input subsystem)從上到下由三層實現,分別為:輸入子系統事件處理層(EventHandler)、輸入
    發表于 05-12 09:04 ?1068次閱讀
    詳細了解<b class='flag-5'>Linux</b>設備模型中的input<b class='flag-5'>子系統</b>

    Windows 子系統助力 Linux 2.0

    Windows 子系統助力 Linux 2.0
    的頭像 發表于 01-04 11:17 ?691次閱讀

    從軟件角度分析linux內核USB子系統的熱插拔過程

    本文從軟件角度分析linux內核USB子系統的熱插拔過程,以實際分析思路和過程行文,基于linux內核版本:4.19.4,記錄分析USB
    的頭像 發表于 01-15 09:28 ?5795次閱讀

    Linux中內存管理子系統開發必知的3個結構概念

    Linux中內存管理子系統使用節點(node)、區域(zone)和頁(page)三級結構描述物理內存。
    的頭像 發表于 08-28 09:34 ?960次閱讀
    <b class='flag-5'>Linux</b>中內存管理<b class='flag-5'>子系統</b>開發必知的3個結構概念

    Linux內核之LED子系統(二)

    這里說一說LED子系統的一些核心源代碼文件,是如何實現LED子系統
    發表于 10-02 16:55 ?1060次閱讀
    <b class='flag-5'>Linux</b>內核之LED<b class='flag-5'>子系統</b>(二)

    深度解析linux時鐘子系統

    linux內核中實現了一個CLK子系統,用于對上層提供各模塊(例如需要時鐘信號的外設,USB等)的時鐘驅動接口,對下層提供具體SOC的時鐘操作細節。
    的頭像 發表于 09-29 16:46 ?650次閱讀
    深度解析<b class='flag-5'>linux</b>時鐘<b class='flag-5'>子系統</b>
    主站蜘蛛池模板: 久久综合社区 | 超h 高h 污肉1v1御书屋 | 国产 高清 在线 | 国产男人女人做性全过程视频 | 一区二区免费在线观看 | 韩彩英三级无删版甜性涩爱 | 欧美色欧美亚洲高清在线视频 | 欧美另类xx | 看毛片网站 | 成人观看天堂在线影片 | 波多野结衣在线观看一区二区 | 都市激情综合 | 色色色色色色网 | 五月丁香啪啪 | 国产午夜精品理论片久久影视 | 91免费视| 日本级毛片免费观看 | 午夜影视在线 | 亚洲国产精品热久久2022 | 国产经典三级在线 | 黄色片香蕉视频 | 五月天丁香花婷婷 | 亚久久| 久久香蕉国产精品一区二区三 | 天天操天天干天天 | 成人激情站 | 欧美婷婷六月丁香综合色 | 自拍偷拍综合网 | 热re99久久国产精品 | 久久精品国产精品亚洲人人 | 506rr亚洲欧美 | 亚洲色图20p | 亚洲成a人片7777 | 欧美日韩a | 在线观看免费视频网站色 | 免费看大黄| 亚瑟 国产精品 | 特级片毛片 | 四虎影院网站 | 五月月色开心婷婷久久合 | 东北美女野外bbwbbw免费 |