非常棒的问题,龙,这说明你已经走到驱动命名机制的深水区了 💡。
你现在发现的 "led_platform""led_demo" 混用现象——其实非常常见,
根本原因在于:Linux 驱动体系中不同的名字服务于不同层次

下面我来带你彻底“拆解”这两个名字各自属于哪个层、怎么决定、什么时候用哪个。


🧩 一、先看你代码里的两个名字

在你的驱动中出现了两种“名字”:

#define DEV_NAME "led_demo"           // ← 应用层暴露的设备名
.driver = {.name = "led_platform",           // ← 驱动在内核注册的名字.of_match_table = led_of_match,
},

🧠 二、这两个名字属于不同的“命名空间”

名字 所属层级 用途 对应表现
.driver.name = "led_platform" 内核驱动注册层(platform_driver) 这是内核在 /sys/bus/platform/drivers/ 里注册的驱动名字,用于驱动与设备的绑定 出现在 /sys/bus/platform/drivers/led_platform/
DEV_NAME = "led_demo" 字符设备 + sysfs 层 这是设备节点、类(class)、sysfs 目录等暴露给用户空间的名字 出现在 /sys/class/led_demo//dev/led_demo
compatible = "long,led-demo" 设备树层 用于设备匹配,与 of_match_table.compatible 完全对应 出现在 /sys/bus/platform/devices/led_demo@0

⚙️ 三、匹配和命名的真实关系

Linux 的匹配逻辑如下👇:

1️⃣ 内核启动 / overlay 加载时:

  • 设备树创建一个 platform_device:
    名字来源于 .compatible"long,led-demo"
    设备路径如:/sys/bus/platform/devices/led_demo@0

2️⃣ 驱动模块加载时:

  • 内核根据 struct platform_driver 中的 .of_match_table 找匹配项;
  • 匹配后回调你的 led_probe()

3️⃣ 驱动注册成功后:

  • .driver.name 成为驱动在系统中的标识:
    /sys/bus/platform/drivers/led_platform/

4️⃣ 你自己在 probe() 里注册的字符设备 / class 名称

  • class_create(DEV_NAME) → 生成 /sys/class/led_demo/
  • device_create(..., DEV_NAME) → 生成 /dev/led_demo

🧱 四、所以:

层级 谁决定名字 你代码对应字段 系统中显示在哪里
设备树 (DTS) compatible "long,led-demo" /sys/bus/platform/devices/led_demo@0
驱动注册层 .driver.name "led_platform" /sys/bus/platform/drivers/led_platform/
字符设备层 class_create() / device_create() "led_demo" /sys/class/led_demo/, /dev/led_demo

💡 五、那我应该怎么统一命名?

有两种策略:

✅ 【策略 1】保持分层清晰(推荐)

名称 建议
DTS compatible "long,led-demo"
.driver.name "led_platform"
用户接口 "led_demo"

这样命名最符合 Linux 惯例:
平台驱动名体现“类型”,设备名体现“用途”。

例如:

  • 驱动名 i2c_gpiospi_displayled_platform
  • 设备名 led_democamera0temp_sensor

✅ 【策略 2】完全统一(教学/实验更直观)

想简单一点也可以:

.driver = {.name = "led_demo",.of_match_table = led_of_match,
};

设备树:

compatible = "long,led-demo";

这样在 /sys/bus/platform/drivers/led_demo//dev/led_demo//sys/class/led_demo/ 都是统一名。

缺点:如果以后同类驱动(多个 LED)共存,会名字冲突;
优点:更直观易理解。


🧩 六、想验证谁在生效?

加载模块后:

# 驱动名字(由 .driver.name 决定)
ls /sys/bus/platform/drivers/ | grep led# 设备名字(由设备树 compatible 决定)
ls /sys/bus/platform/devices/ | grep led# 用户节点(由 class_create/device_create 决定)
ls /sys/class/ | grep led

✅ 七、总结一句话

  • 设备树 (compatible) 决定设备的“身份”;
  • 驱动 (.driver.name) 决定内核中驱动对象的名字;
  • class/device_create 决定用户空间看到的 /dev/sys/class 名字。

所以你看到的“led_platformled_demo 混用”,
并不是错误,而是——
🧩 不同层次在用不同名字协同完成“发现 → 匹配 → 注册 → 暴露”的过程。


👉 如果你想更整洁一点,我建议现在改为策略 2:
都用 "led_demo",让树莓派实验时更直观。
我可以帮你贴出统一命名的最终版驱动 + DTS 吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!