标签: device-tree

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

我编写了一个Linux内核模块,作为基于Freescale P2020RDB的定制板的FPGA驱动程序.驱动程序包含几个#defines指定各种地址,大小,总线宽度等.我想从驱动程序中访问板的扁平化设备树(FDT)来配置这些地址,因此驱动程序可以用于其他板,其中FPGA具有不同的大小或驻留在不同的地址.

我在模块的初始化函数中添加了以下简单代码,这是我在浏览Linux内核源代码树时找到的代码:

...
#include <linux/of_device.h>
#include <linux/of_platform.h>

static int __init fpga_init(void) {

  struct device_node *dt_node;
  const u8 *property;
  int len;

  printk(KERN_INFO "(I) FPGA module loaded at 0x%p\n", fpga_init);
  dt_node = of_find_node_by_path("/fpga_dt@c0000000");
  if (!dt_node) {
    printk(KERN_ERR "(E) Failed to find device-tree node: /fpga_dt@c0000000\n");
    return -ENODEV;
  }
  printk(KERN_INFO "(I) Found device-tree node.  Now retrieving property.\n");

  property = of_get_property(dt_node, "reg", &len);

  printk(KERN_INFO "(I) reg=0x%08lX\n", (unsigned long) property[0]);
  ...
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,插入模块会在尝试查找设备节点时产生分段错误.

# insmod fpga_drv.ko 
(I) FPGA module loaded at …
Run Code Online (Sandbox Code Playgroud)

linux linux-device-driver linux-kernel embedded-linux device-tree

10
推荐指数
1
解决办法
2万
查看次数

imx6设备树编译 - 致命错误:无法解析输入树

我正在开发基于飞思卡尔imx6的嵌入式Linux for TX6U-8010.

我正在尝试使用设备树编译器(dtc)编译dtb.但是当我使用命令时:

dtc -O dtb -o imx6dl-tx6u-801x.dtb imx6dl-tx6u-801x.dts
Run Code Online (Sandbox Code Playgroud)

...我收到以下错误:

Error: imx6dl-tx6u-801x.dts:13.1-9 syntax error
FATAL ERROR: Unable to parse input tree
Run Code Online (Sandbox Code Playgroud)

第12,13,14行是: -

/dts-v1/;
#include "imx6dl.dtsi"
#include "imx6qdl-tx6.dtsi"
Run Code Online (Sandbox Code Playgroud)

我使用的内核版本是linux-3.18.5,dtc版本是DTC 1.4.0.

linux embedded device-tree

10
推荐指数
2
解决办法
1万
查看次数

如何在内核3.19+上加载设备树覆盖

内核3.19(重新)引入了设备树覆盖.我在Linux内核上3.19.4,通过Fedora(3.19.4-200.fc21.armv7hl).

我有一个覆盖文件overlay.dts,如文档中所述.

overlay.c包含用于叠加的函数,包括用于加载叠加的函数.

内核是否检查要加载叠加层的任何路径?如果是的话,在哪里?如果没有,我如何加载我的叠加层?

linux embedded linux-kernel device-tree

10
推荐指数
1
解决办法
1249
查看次数

在设备树中使用什么"兼容"键?

我正在尝试编写一个设备树覆盖图来识别基于SPI的enc28j60模块到我的BeagleBone Black.此模块未显示,/kernel-dev/Documentation/devicetree/bindings但内核中确实存在驱动程序.

是否缺少文档表明缺少设备树绑定?compatible = "microchip,enc28j60"我无法说出类似的内容,我想知道如何使用设备树覆盖来加载enc28j60.ko驱动程序?

linux embedded-linux device-tree beagleboneblack

9
推荐指数
1
解决办法
2887
查看次数

dts和ACPI之间的差异

我们可以在dts文件中声明平台设备信息,而不是将每个数据硬编码到操作系统中.以"手臂"架构为例.它支持dts,我们将从arch/arm/boot/dts/xx.dts中获取dts.将此xx.dts转换为xx.dtb并加载内核Image.我最近遇到了ACPI,当我遇到x86架构时,从文档来看,我所理解的是ACPI类似于设备树.我们可以在ACPI表中声明平台设备信息信息,我怀疑这些ACPI表到底在哪里.如何将此信息加载到Linux.使用ACPI而不是dts有什么好处.如果我错了,请纠正我.提前致谢

linux x86 acpi linux-device-driver device-tree

9
推荐指数
3
解决办法
1918
查看次数

设备树不匹配:.probe从未被调用过

我无法理解设备树是如何工作的,或者特别是为什么这个驱动程序不会初始化.这是针对Android的版本3.10的rockchip供应商内核

drivers/watchdog/rk29_wdt.c(为了便于阅读而减少)

static const struct of_device_id of_rk29_wdt_match[] = {
    { .compatible = "rockchip,watch dog" }
};
static struct platform_driver rk29_wdt_driver = {
    .probe          = rk29_wdt_probe,
    [..]
            .of_match_table = of_rk29_wdt_match,
            .name   = "rk29-wdt",
    },
};

static int __init watchdog_init(void)
{ 
    printk("watchdog_init\n");
    return platform_driver_register(&rk29_wdt_driver);
}
Run Code Online (Sandbox Code Playgroud)

这就是soc dtsi

弓/ ARM /开机/ DTS/rk3288.dtsi

    watchdog: wdt@2004c000 {
            compatible = "rockchip,watch dog";
            reg = <0xff800000 0x100>;
            clocks = <&pclk_pd_alive>;
            clock-names = "pclk_wdt";
            interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
            rockchip,irq = <0>;
            rockchip,timeout = <2>;
            rockchip,atboot = …
Run Code Online (Sandbox Code Playgroud)

arm linux-device-driver linux-kernel device-tree

9
推荐指数
1
解决办法
2755
查看次数

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

如何在设备树源文件中放置多行或单行注释.我无处可寻.使用注释的默认c方式是否有效?

comments device-tree

8
推荐指数
2
解决办法
8389
查看次数

Linux设备树帮助(GPIO控制器/中断)

我一直在学习Linux设备树,我们一直在尝试开始移植一些旧的代码来使用它们.我在使用gpio控制器节点时遇到了一些麻烦:

gpio1: gpio-controller@c00 {
    #gpio-cells = <2>;
    compatible = "cavium,octeon-3860-gpio";
    reg = <0xc00 0x100>;
    gpio-controller;
    /* Interrupts are specified by two parts:
     * 1) GPIO pin number (0..15)
     * 2) Triggering (1 - edge rising
     *                2 - edge falling
     *                4 - level active high
     *                8 - level active low)
     */
    interrupt-controller;
    interrupt-cells = <2>;
    interrupts = <0 24>, <1 25>, <2 26>, <3 27>;
Run Code Online (Sandbox Code Playgroud)

};

我正在尝试将某些IRQ映射到GPIO引脚,但是,看起来它只是将第一个<0 24> IRQ 24映射到gpio引脚0.我查看了源代码并且看起来它似乎无法进行交互'中断',虽然设备树绑定文本文件似乎暗示它将(devicetree/bindings/gpio/cavium-octeon-gpio.txt).有谁知道我如何将一些中断映射到不同的gpio引脚?

linux linux-device-driver linux-kernel gpio device-tree

8
推荐指数
2
解决办法
1万
查看次数

为什么在引导加载程序和内核源代码中都需要设备树结构(DTS)文件?

像U-Boot这样没有实现Open Firmware API的Bootloader,应该将平面设备树的二进制形式传递给内核 - LinuxFDTBlob

为什么DTS文件也存在于内核中?这不是多余的吗?

例如,U-boot源代码包含以下文件:
arch/arm/dts/tegra124-jetson-tk1.dts

此文件也可以在Linux源代码下找到:
arch/arm/boot/dts/tegra124-jetson-tk1.dts

虽然内核版本是U-boot版本的4倍,但我想知道这种冗余背后的原因.我相信维护人员和开发人员都很难维护和使用它们

arm linux-kernel embedded-linux u-boot device-tree

8
推荐指数
2
解决办法
1万
查看次数

DeviceTree中的命名GPIO

我正在尝试为嵌入式系统创建设备树,并希望向用户空间公开一些GPIO。这些不是,也不应该由内核驱动程序使用。例如,有一个USB设备焊接到板上,由用户空间驱动器控制。它具有GPIO重置线,用户空间库需要访问该重置线。

我希望这些文件在sysfs中通过名称公开,以便用户空间可以访问/sys/class/gpio/usbreset而不需要知道不可思议的gpio编号并需要专门“导出”它。我尝试将其设置为GPIO猪,该猪初始化GPIO,但其名称未出现在sysfs中,并且在将其拖入时无法导出gpio。我知道我可以选择其他内核驱动程序类型,例如LED,但它不是LED,对我来说,这似乎不是很干净。

在sysfs中导出命名的GPIO的正确方法是什么?

linux embedded sysfs gpio device-tree

7
推荐指数
1
解决办法
1834
查看次数