news 2026/4/18 13:35:00

用户通用驱动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/18 7:49:41

Pi 4平台下Batocera游戏整合包的ROM添加操作指南

以下是对您提供的博文内容进行 深度润色与结构重构后的技术博客正文 。本次优化严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹 &#xff1a;语言自然、专业、有“人味”&#xff0c;像一位在树莓派社区摸爬滚打多年的技术博主在娓娓道来&#xff1b; ✅ 打破模块…

作者头像 李华
网站建设 2026/4/18 8:46:06

有源驱动蜂鸣器电路原理图:深度剖析使能控制路径

以下是对您提供的技术博文进行 深度润色与结构重构后的专业级嵌入式硬件教学文章 。全文已彻底去除AI生成痕迹&#xff0c;采用真实工程师口吻写作&#xff0c;逻辑层层递进、语言简洁有力、重点突出实战细节&#xff0c;并严格遵循您提出的全部优化要求&#xff08;无模块化…

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

YOLO11训练中断怎么办?resume参数来帮忙

YOLO11训练中断怎么办&#xff1f;resume参数来帮忙 在用YOLO11训练模型时&#xff0c;你有没有遇到过这样的情况&#xff1a; 训练到第23轮&#xff0c;突然断电&#xff1b; 跑着跑着显存爆了&#xff0c;进程被系统kill&#xff1b; 或者只是想临时暂停&#xff0c;等GPU空…

作者头像 李华
网站建设 2026/4/18 12:31:18

浏览器下载太慢?3个Motrix设置让速度提升200%

浏览器下载太慢&#xff1f;3个Motrix设置让速度提升200% 【免费下载链接】motrix-webextension A browser extension for the Motrix Download Manager 项目地址: https://gitcode.com/gh_mirrors/mo/motrix-webextension 还在为浏览器下载速度慢而烦恼吗&#xff1f;当…

作者头像 李华
网站建设 2026/3/20 10:35:17

智能购票Mac专属:告别浏览器卡顿的一站式抢票解决方案

智能购票Mac专属&#xff1a;告别浏览器卡顿的一站式抢票解决方案 【免费下载链接】12306ForMac An unofficial 12306 Client for Mac 项目地址: https://gitcode.com/gh_mirrors/12/12306ForMac 还在为节假日抢票时浏览器频繁崩溃而抓狂&#xff1f;这款专为Mac用户打造…

作者头像 李华