news 2026/2/1 5:21:14

用户通用驱动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/1/30 16:46:13

解锁暗黑破坏神2存档自由:d2s-editor全方位存档编辑工具深度解析

解锁暗黑破坏神2存档自由&#xff1a;d2s-editor全方位存档编辑工具深度解析 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款基于Web技术构建的开源存档编辑工具&#xff0c;专为《暗黑破坏神2》及其重制版玩家…

作者头像 李华
网站建设 2026/2/1 3:17:57

OBS NDI插件技术解析与实战指南:构建低延迟IP视频传输系统

OBS NDI插件技术解析与实战指南&#xff1a;构建低延迟IP视频传输系统 【免费下载链接】obs-ndi NewTek NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi 引言&#xff1a;IP视频传输的技术革新 在媒体制作领域&#xff0c;传统基…

作者头像 李华
网站建设 2026/1/30 7:56:13

Android自动打卡:告别迟到焦虑的免root全攻略

Android自动打卡&#xff1a;告别迟到焦虑的免root全攻略 【免费下载链接】AutoDingding 钉钉自动打卡 项目地址: https://gitcode.com/gh_mirrors/au/AutoDingding 还在为每天早上匆忙打卡而焦虑&#xff1f;还在担心因忘记打卡影响全勤奖&#xff1f;Android自动打卡工…

作者头像 李华
网站建设 2026/1/30 16:26:52

风扇智能控温大师:让电脑安静降温的开源神器

风扇智能控温大师&#xff1a;让电脑安静降温的开源神器 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanContr…

作者头像 李华
网站建设 2026/1/29 20:36:16

FPGA上构建8位加法器:手把手教程(含代码)

以下是对您提供的博文内容进行 深度润色与工程化重构后的版本 。整体风格更贴近一位资深FPGA工程师在技术博客或教学分享中的真实表达&#xff1a;语言自然、逻辑递进、去模板化、重实践洞察&#xff0c;同时强化了“人话解释”、“踩坑经验”、“设计权衡”与“可复用思维”…

作者头像 李华