news 2026/9/3 3:01:05

用户通用驱动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/9/2 23:27:21

3种部署策略:让你的Mac鼠标体验跃升专业级

3种部署策略&#xff1a;让你的Mac鼠标体验跃升专业级 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 在macOS系统中&#xff0c;第三方鼠标常常面临滚动卡…

作者头像 李华
网站建设 2026/9/2 22:42:32

iverilog仿真环境配置完整指南

以下是对您提供的博文《IVerilog仿真环境配置完整指南&#xff1a;从零构建可复用的数字电路验证平台》进行 深度润色与专业重构后的终稿 。全文已彻底去除AI生成痕迹&#xff0c;采用真实工程师口吻撰写&#xff0c;结构更自然、逻辑更连贯、技术细节更扎实&#xff0c;语言…

作者头像 李华
网站建设 2026/9/2 22:39:09

Motrix浏览器扩展高效配置指南

Motrix浏览器扩展高效配置指南 【免费下载链接】motrix-webextension A browser extension for the Motrix Download Manager 项目地址: https://gitcode.com/gh_mirrors/mo/motrix-webextension 一、扩展功能概述 Motrix WebExtension是一款能够将浏览器下载任务无缝转…

作者头像 李华
网站建设 2026/9/2 22:03:08

文件格式选择建议:PNG与JPG的实际差异

文件格式选择建议&#xff1a;PNG与JPG的实际差异 在使用图像修复工具&#xff08;如 fft npainting lama 重绘修复系统&#xff09;进行图片移除、水印清除或瑕疵修复时&#xff0c;你可能已经注意到——上传 PNG 和 JPG 格式的同一张图&#xff0c;最终修复效果和输出质量常…

作者头像 李华
网站建设 2026/9/2 22:03:13

如何高效采集抖音内容?这款工具让下载效率提升10倍

如何高效采集抖音内容&#xff1f;这款工具让下载效率提升10倍 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 作为内容创作者或研究人员&#xff0c;你是否还在为抖音视频的批量下载而烦恼&#xff1f;手动…

作者头像 李华