news 2026/4/16 14:27:26

用户通用驱动spidev.c与设备匹配问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用户通用驱动spidev.c与设备匹配问题

用户通用驱动spidev.c与设备匹配问题

发现了一个奇怪的现象:

  1. 匹配成功了:驱动确实跑起来了,probe函数被调用了。
  2. 代码却说不匹配spidev_dt_ids里明明没有"spidev",而且probe函数里还打印了“Buggy DT”警告。

设备树定义:

&ecspi1{pinctrl-names="default";pinctrl-0=<&pinctrl_ecspi1>;fsl,spi-num-chipselects=<2>;cs-gpios=<&gpio426GPIO_ACTIVE_LOW>,<&gpio424GPIO_ACTIVE_LOW>;status="okay";dac: dac{compatible="spidev";reg=<0>;spi-max-frequency=<2000000>;};};

spi_driver定义:

staticstructspi_driverspidev_spi_driver={.driver={.name="spidev",.of_match_table=of_match_ptr(spidev_dt_ids),.acpi_match_table=ACPI_PTR(spidev_acpi_ids),},.probe=spidev_probe,.remove=spidev_remove,};

转入of_match_table的设备列表:

staticconststructof_device_idspidev_dt_ids={{.compatible="rohm,dh2228fv"},{.compatible="lineartechnology,ltc2488"},{},};MODULE_DEVICE_TABLE(of,spidev_dt_ids);

发现spidev_dt_ids中并没有定义{ .compatible = "spidev" },,但最后还是能匹配成功。

  1. 先去看spi总线类型结构体:

    structbus_typespi_bus_type={.name="spi",.dev_groups=spi_dev_groups,.match=spi_match_device,.uevent=spi_uevent,};
  2. 找到match函数spi_match_device

    staticintspi_match_device(structdevice*dev,structdevice_driver*drv){conststructspi_device*spi=to_spi_device(dev);conststructspi_driver*sdrv=to_spi_driver(drv);/* Attempt an OF style match */if(of_driver_match_device(dev,drv))return1;/* Then try ACPI */if(acpi_driver_match_device(dev,drv))return1;if(sdrv->id_table)return!!spi_match_id(sdrv->id_table,spi);returnstrcmp(spi->modalias,drv->name)==0;}
    • 第 1 关:OF (设备树) 匹配
      • 代码:of_driver_match_device(dev, drv)
      • 动作:内核拿着你的compatible = "spidev"spidev_dt_ids列表里找。
      • 结果:失败。列表里只有"rohm,dh2228fv""lineartechnology,ltc2488"
    • 第 2 关:ACPI 匹配
      • 动作:x86 架构用的。
      • 结果:失败
    • 第 3 关:ID Table 匹配
      • 动作:检查传统 ID 表。
      • 结果:失败
    • 第 4 关:名称 (Name) 匹配(在这里匹配成功)
      • 代码:return strcmp(spi->modalias, drv->name) == 0;
      • 核心逻辑
        1. 驱动名字drv->name"spidev"
        2. 内核 SPI 核心层在解析设备树时,发现compatible = "spidev",会将其设为该设备的modalias
        3. strcmp("spidev", "spidev")相等。
      • 结果:匹配成功
  • 为什么能匹配?

    靠的是 spi_match_device 最后的字符串名称硬匹配机制(Fallback)。

  • 为什么有警告?

    [root@100ask:~]# dmesg | grep "DT" [ 2146.942455] spidev spi0.0: buggy DT: spidev listed directly in DT

    spidev_probe做了检查:

    if(spi->dev.of_node&&!of_match_device(spidev_dt_ids,&spi->dev)){dev_err(&spi->dev,"buggy DT: spidev listed directly in DT\n");WARN_ON(spi->dev.of_node&&!of_match_device(spidev_dt_ids,&spi->dev));}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:42:36

3个高效步骤:抖音视频批量下载让内容管理效率提升80%

3个高效步骤&#xff1a;抖音视频批量下载让内容管理效率提升80% 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代&#xff0c;高效获取和管理抖音视频已成为教育工作者、市场分析师等专…

作者头像 李华
网站建设 2026/4/16 10:21:25

FSMN VAD开发者手册精读:参数调节最佳实践总结

FSMN VAD开发者手册精读&#xff1a;参数调节最佳实践总结 1. 模型背景与核心价值 FSMN VAD 是阿里达摩院 FunASR 项目中开源的语音活动检测&#xff08;Voice Activity Detection&#xff09;模型&#xff0c;专为中文语音场景优化设计。它不是通用语音模型&#xff0c;而是…

作者头像 李华
网站建设 2026/4/16 10:18:45

3个让你效率倍增的Regex搜索黑科技:重新定义网页内容查找

3个让你效率倍增的Regex搜索黑科技&#xff1a;重新定义网页内容查找 【免费下载链接】chrome-regex-search 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-regex-search 当我在YouTube音乐页面尝试定位所有播放量超过10万的视频时&#xff0c;传统CtrlF搜索只能…

作者头像 李华
网站建设 2026/4/15 21:12:41

探索游戏回放数据解析:ROFL-Player实战指南

探索游戏回放数据解析&#xff1a;ROFL-Player实战指南 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 在电子竞技分析领域&#xff0c;…

作者头像 李华