【问题标题】:How to read address of reserved memory in device tree如何读取设备树中保留内存的地址
【发布时间】:2019-03-25 21:09:38
【问题描述】:

我正在 Linux 中为小型设备编写设备驱动程序。设备有一些特殊的内存限制,迫使我要切出一块内存,在我的驱动程序中,我需要知道保留内存的地址(和大小)

/ {
    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 reserved_mem *

【问题讨论】:

    标签: linux-device-driver device-tree


    【解决方案1】:

    如果struct device *hwdev 指向您的硬件struct device(例如,如果hwdev 指向struct platform_devicedev 成员),那么这个sn-p 说明了如何访问设备树节点保留的内存区域并将其转换为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(&amp;mem_res);给出。

    【讨论】:

    • of_parse_phandle 也需要一个索引参数。除此之外,这就像一个魅力。
    • 很抱歉错过了索引参数。我现在已经添加了。很高兴听到你让它正常工作!
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多