linux-device-driver - 如何读取设备树中保留内存的地址

标签 linux-device-driver device-tree

我正在 Linux 中为小型设备编写设备驱动程序。该设备有一些特定的内存限制,迫使我开辟一 block 内存,并且在我的驱动程序中我需要知道保留内存的地址(和大小)

/ {
    reserved-memory {
        my_reserve: my_reserve@a0000000 {
            compatible = "shared-dma-pool";
            reg = <0 0xa0000000 0 0x20000>;
            no-map;
        };
    };

    my_device {
        compatible = "my_device";
        memory-region = <&my_reserve>;
    };
};

如何在设备驱动程序中读取保留内存的物理地址(即如何读取值 0xa000'0000)?似乎有一个用于保留内存的 API,但我看不到任何返回 struct returned_mem *

最佳答案

如果struct device *hwdev指向您的硬件 struct device (例如,如果 hwdev 指向 devstruct platform_device 成员),则此代码片段说明如何访问保留内存区域的设备树节点并将其转换为 struct resource 。 .

        struct device_node *memnp;
        struct resource mem_res;
        int rc;

        /* Get pointer to memory region device node from "memory-region" phandle. */
        memnp = of_parse_phandle(hwdev->of_node, "memory-region", 0);
        if (!memnp) {
                dev_err(hwdev, "no memory-region node\n");
                rc = -ENXIO;
                goto err1;
        }
        /* Convert memory region to a struct resource */
        rc = of_address_to_resource(memnp, 0, &mem_res);
        /* finished with memnp */
        of_node_put(memnp);
        if (rc) {
                dev_err(hwdev, "failed to translate memory-region to a resource\n");
                goto err1;
        }

起始地址以 mem_res.start 结尾长度由 resource_size(&mem_res); 给出.

关于linux-device-driver - 如何读取设备树中保留内存的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55299544/

相关文章:

linux-kernel - linux内核如何从设备树中获取数据?

linux - 不同子系统驱动程序之间的通信(例如 : IIO and Charging driver)

Linux内核和realtek rtl8139驱动

linux-kernel - 哪个处理器将在多核系统中执行硬件中断

c - 通过/dev/input/eventX读取gpio值

c - 使用设备树引导主线 Linux 内核

linux - 如何解决SMP中的spinlock锁定,irq和function都需要锁?

linux-kernel - 如何正确唤醒中断处理程序内的进程

comments - 如何在设备树源文件中添加注释

android - 使用 AOSP 更改 dts 后如何在没有 make clean 的情况下构建?