查看: 3717|回复: 3

[评测分享] 【米尔MYS-8MMX试用】linux USB 总线匹配规则

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 597 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2021-10-17 18:26:12 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 robe.zhang 于 2021-10-17 18:27 编辑

    【米尔MYS-8MMX试用】linuxUSB 总线匹配规则

    linux 中USB 驱动代码是通用的,跨平台架构,所有linux 上的 usb 驱动代码都是一样的。不仅仅 米尔MYS-8MMX 开发板是这样,其他 NXP imx8m 平台也是这样,其他架构的 USB 总线都是这样。本文适用于一切linux 系统,只是以米尔MYS-8MMX开发板的源码来追踪分析的

    linux USB驱动框架比较复杂,比I2C、SPI,TTY 框架复杂的多,但是仍然遵循 linux 驱动模型,按照linux驱动模型一点点追踪还是可以搞明白的

    本文先说 linux USB 总线设备和驱动匹配规则,追踪代码:

    总线模块初始化:
    1.png
    第 994 行注册usb总线:
    2.png
    总线中仅有四个成员:
    3.png
    分析 usb_device_match 函数,就是匹配规则:
    4.png
    第 796 – 804 行:是 usbdevice 匹配规则。
    第 805 – 823 行:是 usbdevice interface 匹配规则。

    usb device 匹配规则:
    匹配规则相当简单,简单到只要确认设备类型,驱动类型的一个参数,搞定。
    5.png
    6.png
    并且linux 系统中只有一个 usbdriver,那就是
    7.png
    所有usb 设备插入电脑,usb hub会枚举并添加USB设备,usb driver 立马匹配并运行probe成员函数,使用USB设备的描述符信息注册 interface endpoint 设备。
    (为什么是usb hub,不理解的可以看usb协议和usb网络拓扑)
    Generic_probe 函数
    8.png
    usb_choose_configuration 函数选择一个配置:
    usb_set_configuration 函数用此设置usb设备
    9.png
    初始化所有interfaces 设备
    10.png
    注册 interfaces 设备
    11.png
    注册 endpoint 设备:
    12.png
    13.png
    usb device interface 匹配规则
    设备类型是 interfaces:
    14.png
    驱动也必须是 interfaces 驱动才会继续匹配,不然之间返回
    15.png
    匹配时先匹配 driver 的 id_table,匹配则成功直接返回
    16.png
    Id_table 不匹配的话,则继续匹配 dynids,匹配则成功直接返回,不匹配就失败了。
    17.png
    Linux usb 总线匹配规则:
    Usb device 和usb devicedriver 匹配,并且一定会成功。匹配结束。
    Usb interfaces 和usbinterfaces driver 匹配,先匹配driver 的Id_table,成功返回,不成功继续匹配 dynids,成功返回,不成功也返回。匹配结束。

    不管是 id_table 匹配,还是dynids 匹配,都调用了同一个函数 usb_match_one_id
    18.png
    usb_match_one_id 先用 usb 设备和 id_table 匹配,适配成功继续 interface 设备和 id_table 匹配,此过程中,任何一项适配失败,终止此过程,进入 dynids 匹配。
    dynids 匹配同样调用了 usb_match_one_id函数,先用 usb 设备和 id_table 匹配,适配成功继续 interface 设备和 id_table 匹配,此过程中,任何一项适配失败,终止此过程,整个匹配过程结束,返回。
    详细适配过程:
    19.png
    20.png
    匹配过程比较杂乱,上结论:
    Usb 设备匹配成功的话,一定是以下两种情况,其他所有的情况都匹配不成功。
    1,驱动的 id_table和device描述符匹配成功,并且和interfaces 描述符也匹配成功。
    2,驱动的 dynids和device描述符匹配成功,并且和interfaces 描述符也匹配成功。
    和device描述符匹配成功的话,凡是驱动中有的以下这些项,必须匹配成功,否则匹配失败:
    21.png
    和interfaces 描述符匹配成功的话,凡是驱动中有的以下这些项,必须匹配成功,否则匹配失败:
    22.png






    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-1-31 23:05
  • 签到天数: 144 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2021-10-18 10:41:03 | 显示全部楼层
    单看代码的话,感觉也不难。
    看来我还是需要仔细学习USB手册,再结合代码来学习。
    谢谢楼主分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 597 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2021-10-19 15:18:19 | 显示全部楼层
    jobszheng5 发表于 2021-10-18 10:41
    单看代码的话,感觉也不难。
    看来我还是需要仔细学习USB手册,再结合代码来学习。
    谢谢楼主分享 ...


    单看 C 语句容易;20 万行代码的框架,理清楚就不容易了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 250 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2021-10-24 09:04:17 | 显示全部楼层
    围观大佬解读USB驱动
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 10:13 , Processed in 0.149167 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.