【问题标题】:How to map resources of two devices in one Linux kernel driver using device tree?如何使用设备树在一个 Linux 内核驱动程序中映射两个设备的资源?
【发布时间】:2016-05-03 15:11:52
【问题描述】:

我正在使用 CPU 的内部寄存器为看门狗编写 Linux 内核驱动程序,并在(持久)RAM 中的一个专用位置存储调试信息,以防看门狗触发复位。

在旧世界中,我的板文件中有两个 IORESOURCE_MEM 类型的资源:内部寄存器(内部寄存器的基地址加上偏移量)和 RAM 中的位置(绝对内存地址)。

我可以通过platform_get_resource() 使用适当的索引访问这些,然后我可以重新映射。

在具有设备树的新世界中,我的看门狗节点位于内部 CPU 寄存器的域中,我可以毫无问题地访问它们。

但是如何在 RAM 中添加我的内存位置? RAM 的基地址与 CPU 内部寄存器不同,所以我不能在“reg”条目中添加另一个范围(如reg = <0x20300 0x408>, <0x3BFFE000 0x1000>;)。我是否需要像这样添加一个新的“设备”?

PRAM {
    #address-cells = <1>;
    #size-cells = <1>;       
    PRAM0: Watchdog_Crash_Debug_Context {            
        reg = <0x3BFFE000 0x1000>;
    };
};

但是如何在看门狗设备驱动程序中引用它呢?还是在看门狗设备树条目中?

Linux 版本为 4.1.18。

【问题讨论】:

  • 软件看门狗的硬件?
  • 硬件看门狗(在 Marvell Armada XP 上)

标签: c linux linux-kernel device-tree


【解决方案1】:

与此同时,我自己也找到了解决方案。秘诀就是of_parse_phandle()的神奇功能。

设备树设置:

soc {
    ...
    internal-regs {
        ...
        watchdog_global {
            ...
            PRAM_address = <&PRAM0>;
        };
    };
};


PRAM {
    #address-cells = <1>;
    #size-cells = <1>;
    ranges = <0 0 0x3b000000 0x5000000>;

    PRAM0: Watchdog_Crash_Debug_Context {            
        reg = <0xFFE000 0x1000>;
    };
};

在代码中的使用(真的很简单!):

struct device_node *PRAM_node = of_parse_phandle(pdev->dev.of_node, "PRAM_address", 0);
debug_info = of_iomap(PRAM_node, 0);
of_node_put(PRAM_node);

其中pdev-&gt;dev.of_node 指的是设备树节点watchdog_globaldebug_info 是指向自定义结构的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2011-07-29
    • 2014-03-10
    • 2018-04-26
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多