platform-device-model

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Platform Device Model

平台设备模型

Purpose

用途

Explain the Linux driver model for platform (and similar) buses:
struct device
,
device_driver
,
probe
/
remove
, resource acquisition, sysfs, and deferred probe — the glue between device tree and driver code.
讲解适用于平台(及类似)总线的Linux驱动模型:
struct device
device_driver
probe
/
remove
、资源获取、sysfs以及延迟探测——这是设备树与驱动代码之间的衔接机制。

When to Use

适用场景

  • Implementing or debugging
    platform_driver
    lifecycle
  • Exposing driver state via sysfs
  • Understanding uevent /
    udev
    device node creation
  • Before
    skills/kernel-dev/writing-char-drivers
  • 实现或调试
    platform_driver
    生命周期
  • 通过sysfs暴露驱动状态
  • 理解uevent /
    udev
    设备节点创建逻辑
  • 在学习
    skills/kernel-dev/writing-char-drivers
    之前

Workflow

工作流程

1. Object hierarchy

1. 对象层级

bus_type (platform, amba, pci, i2c, spi)
├── struct device        — hardware instance
└── struct device_driver — driver logic
        └── probe(dev) / remove(dev)
Platform devices often come from DT (
of_platform
) or legacy board files.
bus_type (platform, amba, pci, i2c, spi)
├── struct device        — 硬件实例
└── struct device_driver — 驱动逻辑
        └── probe(dev) / remove(dev)
平台设备通常来自设备树(
of_platform
)或传统板级文件。

2. Platform driver skeleton

2. 平台驱动框架

c
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);
Prefer
devm_*
helpers for automatic unwind.
c
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_* 会在移除时自动清理 */
}

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. Device properties (DT / ACPI)

3. 设备属性(DT / ACPI)

c
u32 speed;
device_property_read_u32(&pdev->dev, "clock-speed", &speed);
bool flag = device_property_present(&pdev->dev, "feature-x");
c
u32 speed;
device_property_read_u32(&pdev->dev, "clock-speed", &speed);
bool flag = device_property_present(&pdev->dev, "feature-x");

4. Sysfs (driver visibility)

4. Sysfs(驱动可见性)

c
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);
c
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);

/* 在probe中调用 */
device_create_file(&pdev->dev, &dev_attr_status);

5. Deferred probe

5. 延迟探测

Return
-EPROBE_DEFER
when a clock, regulator, or bus is not ready — core retries later.
当时钟、调节器或总线未就绪时返回
-EPROBE_DEFER
——内核核心层会稍后重试。

6. Debug

6. 调试

bash
ls /sys/bus/platform/devices/
ls /sys/bus/platform/drivers/
cat /sys/kernel/debug/devices_deferred  # if debugfs enabled
udevadm monitor
bash
ls /sys/bus/platform/devices/
ls /sys/bus/platform/drivers/
cat /sys/kernel/debug/devices_deferred  # 若debugfs已启用
udevadm monitor

7. Agent usage

7. Agent 使用示例

/platform-device-model Convert legacy board file driver to DT platform_driver with devm_ioremap
/platform-device-model 将传统板级文件驱动转换为使用devm_ioremap的DT platform_driver

Common Problems

常见问题

SymptomCauseFix
-EBUSY
on probe
Resource claimed twiceCheck
status
/ duplicate nodes
No
/dev
node
Char device not registeredSee
writing-char-drivers
Deferred foreverSupplier driver missingFix DT dependency chain
Remove crashManual free vs devm mismatchUse devm consistently
Name mismatch
.name
vs
compatible
OF uses
of_match_table
症状原因解决方法
探测时返回
-EBUSY
资源被重复占用检查
status
/ 重复节点
/dev
节点
字符设备未注册参考
writing-char-drivers
永久延迟探测依赖的供应商驱动缺失修复DT依赖链
移除时崩溃手动释放与devm机制不匹配统一使用devm机制
名称不匹配
.name
compatible
不一致
OF使用
of_match_table

Related Skills

相关技能

  • skills/kernel-dev/device-tree
    — hardware description
  • skills/kernel/device-drivers
    — IRQ, DMA, regmap depth
  • skills/kernel-dev/writing-char-drivers
    — userspace interface
  • skills/kernel-dev/bus-drivers-i2c-spi
    — other bus types
  • skills/low-level-programming/linux-kernel-modules
    — module loading
  • 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
    — 模块加载