linux

Linux驱动如何管理设备树

小樊
35
2025-12-15 23:36:15
栏目: 智能运维

Linux 驱动与设备树的管理机制

一 核心流程总览

二 驱动侧如何读取设备树信息

三 典型驱动绑定示例

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/clk.h>

static const struct of_device_id mydev_dt_ids[] = {
    { .compatible = "vendor,mydev" },
    { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mydev_dt_ids);

static int mydev_probe(struct platform_device *pdev)
{
    struct device_node *np = pdev->dev.of_node;
    struct resource res;
    void __iomem *base;
    int irq, ret;
    struct clk *clk;

    /* 1) 地址映射 */
    ret = of_address_to_resource(np, 0, &res);
    if (ret) return ret;
    base = devm_ioremap_resource(&pdev->dev, &res);
    if (IS_ERR(base)) return PTR_ERR(base);

    /* 2) 中断 */
    irq = of_irq_get(np, 0);
    if (irq < 0) return irq;

    /* 3) 时钟 */
    clk = devm_clk_get(&pdev->dev, NULL);
    if (IS_ERR(clk)) return PTR_ERR(clk);
    ret = clk_prepare_enable(clk);
    if (ret) return ret;

    /* TODO: 硬件初始化,注册字符/网络/其他接口 */

    dev_info(&pdev->dev, "mydev probed @ %pa, irq %d\n", &res.start, irq);
    return 0;
}

static int mydev_remove(struct platform_device *pdev)
{
    /* TODO: 关闭时钟、资源释放 */
    return 0;
}

static struct platform_driver mydev_driver = {
    .driver = {
        .name = "mydev",
        .of_match_table = mydev_dt_ids,
    },
    .probe = mydev_probe,
    .remove = mydev_remove,
};
module_platform_driver(mydev_driver);
MODULE_LICENSE("GPL");

四 构建 传递 与 动态管理

五 调试与最佳实践

0
看了该问题的人还看了