我正在使用CPU的内部寄存器和(持久)RAM中的专用位置编写用于看门狗的Linux内核驱动程序,以便在看门狗触发复位的情况下存储调试信息。
在旧世界中,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。
同时,我自己找到了解决方案。秘密是魔术功能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->dev.of_node
引用设备树节点,watchdog_global
并且debug_info
是指向自定义结构的指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句