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 *
struct device *hwdev
ハードウェアを指している場合struct device
(たとえば、hwdev
のdev
メンバーを指している場合struct 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);
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加