mcpField
P
platform-device-model

platform-device-model

github.com/mohitmishra786开发269298 次安装18 周前更新
代码仓库

关于 platform-device-model

面向 Linux 驱动开发者的平台设备模型技能,讲解设备与驱动生命周期、资源处理、sysfs 和延迟探测,衔接设备树描述与驱动代码。

主要功能

  1. 01平台设备与驱动生命周期
  2. 02probe 和 remove 处理
  3. 03使用 devm 辅助函数获取资源
  4. 04读取 DT 和 ACPI 设备属性
  5. 05sysfs 属性与延迟探测
  6. 06通过 sysfs 和 udevadm 调试

适用场景

  1. 01实现或调试 platform_driver
  2. 02将板级文件驱动转换为 DT platform_driver
  3. 03通过 sysfs 暴露驱动状态
  4. 04排查延迟探测和资源冲突

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill platform-device-model

安装后在 Claude Code 中输入/platform-device-model确认已加载。

详细介绍

平台设备模型

目的

说明 Linux 平台总线(及类似总线)的驱动模型:struct device、device_driver、probe/remove、资源获取、sysfs 和延迟探测——这是设备树与驱动代码之间的连接纽带。

适用场景

  • 实现或调试 platform_driver 生命周期
  • 通过 sysfs 暴露驱动状态
  • 理解 uevent / udev 设备节点的创建过程
  • 在使用 skills/kernel-dev/writing-char-drivers 之前

工作流

1. 对象层级
bus_type (platform, amba, pci, i2c, spi)
├── struct device        — hardware instance
└── struct device_driver — driver logic
        └── probe(dev) / remove(dev)

平台设备通常来自 DT(of_platform)或旧式板级文件。

2. 平台驱动骨架
static int my_probe(struct platform_device *pdev)
{
    struct resource *res;
    void __iomem *base;

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    base = devm_ioremap_resource(&pdev->dev, res);
    if (IS_ERR(base))
        return PTR_ERR(base);

    platform_set_drvdata(pdev, priv);
    return 0;
}

static void my_remove(struct platform_device *pdev)
{
    /* devm_* auto-cleanup on remove */
}

static struct platform_driver my_pdrv = {
    .probe  = my_probe,
    .remove = my_remove,
    .driver = {
        .name = "my-dev",
        .of_match_table = my_of_match,
    },
};
module_platform_driver(my_pdrv);

优先使用 devm_* 辅助函数,以便自动回滚。

3. 设备属性(DT / ACPI)
u32 speed;
device_property_read_u32(&pdev->dev, "clock-speed", &speed);
bool flag = device_property_present(&pdev->dev, "feature-x");
4. Sysfs(驱动可见性)
static ssize_t status_show(struct device *dev,
                           struct device_attribute *attr, char *buf)
{
    return sysfs_emit(buf, "ok\n");
}
static DEVICE_ATTR_RO(status);

/* in probe */
device_create_file(&pdev->dev, &dev_attr_status);
5. 延迟探测

当时钟、稳压器或总线尚未就绪时,返回 -EPROBE_DEFER——内核核心会稍后重试。

6. 调试
ls /sys/bus/platform/devices/
ls /sys/bus/platform/drivers/
cat /sys/kernel/debug/devices_deferred  # if debugfs enabled
udevadm monitor
7. Agent 用法
/platform-device-model Convert legacy board file driver to DT platform_driver with devm_ioremap

常见问题

现象原因修复方法
探测时出现 -EBUSY资源被重复占用检查 status / 重复节点
没有 /dev 节点字符设备未注册参见 writing-char-drivers
一直处于延迟状态缺少供应方驱动修复 DT 依赖链
移除时崩溃手动释放与 devm 不匹配始终一致地使用 devm
名称不匹配.name 与 compatible 不一致OF 使用 of_match_table

相关技能

  • skills/kernel-dev/device-tree — 硬件描述
  • skills/kernel/device-drivers — IRQ、DMA、regmap 深入内容
  • skills/kernel-dev/writing-char-drivers — 用户空间接口
  • skills/kernel-dev/bus-drivers-i2c-spi — 其他总线类型
  • skills/low-level-programming/linux-kernel-modules — 模块加载

评论

支持 Markdown