如何使用设备树在一个Linux内核驱动程序中映射两个设备的资源?

汉斯·W·赫克尔

我正在使用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。

汉斯·W·赫克尔

同时,我自己找到了解决方案。秘密是魔术功能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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

该URL“/会话”没有映射到一个有效的资源| 如何使用winAppDriver / Windows应用程序,驱动程序用java运行桌面应用程序的测试?

如何在Linux设备驱动程序中设置errno?

如何从Linux驱动程序访问和调试FDT / DTS设备树(seg-fault)

Linux内核设备驱动程序,将DMA从设备插入用户空间内存

使用设备树的驱动程序绑定,而驱动程序中没有兼容的字符串

Linux内核驱动程序模块:使用单个驱动程序处理多个设备文件

使用QAF时,如何在TestNG XML文件中配置一个测试以启动两个驱动程序,例如Chrome驱动程序和Android驱动程序

如何使用两个不同的驱动程序(MongoDB Scala驱动程序和Salat)从MongoDb读取和写入

音频驱动程序应存在于Linux内核中,但无法识别设备

一个简单的字符设备驱动程序

设备驱动程序是否集成在内核中?

如何为USB-HID设备使用Linux内核驱动程序绑定/取消绑定接口?

Linux:以独立方式编译内核设备驱动程序

Linux:如何查找用于设备的设备驱动程序?

内核中内置了哪些设备驱动程序?

一个USB设备,两个串行接口:如何?

Linux内核驱动程序-SPI如何识别SPI设备?

是否可以编写一个应用程序来接口和激活底层的Linux内核设备驱动程序?

如何在/ dev /子目录(内核驱动程序)中创建多个设备

如果两个不同的Linux Distro使用相同的内核,它们将支持相同的设备驱动程序吗?

Linux内核中的WS2812设备驱动程序

使用读写操作编写一个简单的杂项char设备驱动程序

如何从 Windows 内核驱动程序获取设备实例路径?

如何让 Selenium 仅使用一个驱动程序 selenium(使用 c# 和 chromedriver)来操作两个浏览器窗口?

如何制作一个/a(API 或驱动程序)来处理 Linux 中 USB 设备端的所有 USB 串行请求?

如何将树莓派上的 gpio 引脚与设备驱动程序中的设备树一起使用?

我可以使用一个 Selenium 驱动程序运行两个独立的 Google Chrome 窗口吗?

如何使用一个公共 IP 映射两个 azure 应用程序?

注释掉一个printk 语句会导致Linux 设备驱动程序测试崩溃