platform-device-model
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePlatform Device Model
平台设备模型
Purpose
用途
Explain the Linux driver model for platform (and similar) buses: , , /, resource acquisition, sysfs, and deferred probe — the glue between device tree and driver code.
struct devicedevice_driverproberemove讲解适用于平台(及类似)总线的Linux驱动模型:、、/、资源获取、sysfs以及延迟探测——这是设备树与驱动代码之间的衔接机制。
struct devicedevice_driverproberemoveWhen to Use
适用场景
- Implementing or debugging lifecycle
platform_driver - Exposing driver state via sysfs
- Understanding uevent / device node creation
udev - 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 () or legacy board files.
of_platformbus_type (platform, amba, pci, i2c, spi)
├── struct device — 硬件实例
└── struct device_driver — 驱动逻辑
└── probe(dev) / remove(dev)平台设备通常来自设备树()或传统板级文件。
of_platform2. 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 helpers for automatic unwind.
devm_*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 when a clock, regulator, or bus is not ready — core retries later.
-EPROBE_DEFER当时钟、调节器或总线未就绪时返回——内核核心层会稍后重试。
-EPROBE_DEFER6. Debug
6. 调试
bash
ls /sys/bus/platform/devices/
ls /sys/bus/platform/drivers/
cat /sys/kernel/debug/devices_deferred # if debugfs enabled
udevadm monitorbash
ls /sys/bus/platform/devices/
ls /sys/bus/platform/drivers/
cat /sys/kernel/debug/devices_deferred # 若debugfs已启用
udevadm monitor7. 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_driverCommon Problems
常见问题
| Symptom | Cause | Fix |
|---|---|---|
| Resource claimed twice | Check |
No | Char device not registered | See |
| Deferred forever | Supplier driver missing | Fix DT dependency chain |
| Remove crash | Manual free vs devm mismatch | Use devm consistently |
| Name mismatch | | OF uses |
| 症状 | 原因 | 解决方法 |
|---|---|---|
探测时返回 | 资源被重复占用 | 检查 |
无 | 字符设备未注册 | 参考 |
| 永久延迟探测 | 依赖的供应商驱动缺失 | 修复DT依赖链 |
| 移除时崩溃 | 手动释放与devm机制不匹配 | 统一使用devm机制 |
| 名称不匹配 | | OF使用 |
Related Skills
相关技能
- — hardware description
skills/kernel-dev/device-tree - — IRQ, DMA, regmap depth
skills/kernel/device-drivers - — userspace interface
skills/kernel-dev/writing-char-drivers - — other bus types
skills/kernel-dev/bus-drivers-i2c-spi - — module loading
skills/low-level-programming/linux-kernel-modules
- — 硬件描述
skills/kernel-dev/device-tree - — IRQ、DMA、regmap深入讲解
skills/kernel/device-drivers - — 用户空间接口
skills/kernel-dev/writing-char-drivers - — 其他总线类型
skills/kernel-dev/bus-drivers-i2c-spi - — 模块加载
skills/low-level-programming/linux-kernel-modules