问题标签 [device-tree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - Linux:使用 U-Boot 和平面映像树 (FIT) 的引导参数
我正在尝试自己构建 U-Boot 以在 Jetson TK1 板上启动 Linux。当我们推动验证启动时,我使用平面映像树(统一内核映像、设备树 blob ......)来描述我的系统。U-Boot 可以加载 ITB 文件并尝试启动内核,但系统在此消息后挂起。
我认为这是因为没有将引导参数传递给内核(最初的启动添加了大量参数),但我对如何将参数传递给内核有点傻眼。我尝试设置 bootargs 环境变量,但这并没有改变这种情况。
使用 ITB 文件时如何将内核参数传递给内核?
命令行参数(取自示例 extlinux.conf 的 APPEND 命令):
ITS 文件内容:
U-Boot 输出:
linux-kernel - 读取具有中断属性的设备树节点
我有以下来自两个不同设备树源的片段。
我想知道中断 = <1 4>; 中断 = <42 2>;代表?
我们从哪里获得 <1 4> 、 <42 2> 值?
linux-device-driver - 带 Linux 设备树的 max732x.c I2C IO 扩展器 + GPIO 键不工作
我正在使用飞思卡尔 MX6 和飞思卡尔 3.10.31 修改内核。我有一个用作 IO 扩展器的 Maxim MAX7325,它的按钮连接到 P0-P2。7325的中断线连接到GPIO_3焊盘(我相信是GPIO1_3 ...)
我在设备树中设置了 7325 和 gpio-keys,如下所示:
和
似乎发生的是当调用 MAX7325 驱动程序的探针时,client->dev.platform_data 为 NULL。正因为如此,当稍后调用 max732x_irq_setup 时,它并没有设置 chip->gpio_chip.to_irq 指针指向 max732x_gpio_to_irq 函数(可能是因为它没有正确的信息来使其工作。)后来,当 gpio_keys尝试配置第一个输入,当它尝试设置中断并且没有设置其他键时失败。
我确实确定使用 P0 映射到 GPIO 240 的 /sys 接口,所以是的,GPIO 242 是我试图设置的 sw2 GPIO-KEY。
我想知道,这个驱动程序不能与设备树一起使用吗?我没有看到它试图获取任何设备树属性,但我查看的其他 IO 扩展器驱动程序也没有,所以我认为 I2C 内核可能正在读取设备树并应该以某种方式从那里填写 platform_data它调用驱动程序的探测函数(?)
我在这方面相当新,所以任何帮助将不胜感激。=)我确实在网上阅读了一些设备树文档,但我认为这是相当具体的事情,我没有正确地做,他们没有涵盖......(?)
我确实在内核中配置了 CONFIG_GPIO_MAX732X_IRQ ......我曾经尝试为 max7325 I2c1 节点设置中断控制器属性,但我不确定是否需要(?)
linux-kernel - 不同的 Linux 设备树驱动程序应该如何共享公共寄存器?
我正在将 Linux 内核移植到不受支持的 ARM SoC 平台上。不幸的是,在这个 SoC 上,不同的外设有时会在同一内存区域内共享寄存器或混合寄存器。这让我对设备树规范感到悲痛,该规范似乎不支持不同设备共享同一组寄存器或混合在同一地址空间中的寄存器的概念。我在设备树上阅读的各种文档都没有建议处理这个问题的正确方法。
我在多个驱动程序中指定相同寄存器区域的简单方法会为尝试将相同寄存器区域映射为另一个驱动程序的第二个设备抛出“无法请求资源区域”。据我了解,这是内核强制执行有关寄存器区域的设备树规则的结果。
解决这个困境的首选通用解决方案是什么?是否应该有一个更高级别的驱动程序来编组对共享寄存器区域的访问?现有 Linux 内核中是否有解决此特定问题的示例(我找不到任何示例,但我可能不确定要查找什么)?
linux-kernel - 我可以在不创建平台设备的情况下查询设备树项目吗?
我正在编写一个内核模块,旨在对 ARM+FPGA SOC 系统的设备驱动程序内核模块进行功能测试。我的方法涉及通过查询设备树来查找设备驱动程序正在使用哪些中断。在设备驱动程序本身中,我使用注册平台驱动程序,platform_driver_register
并在.probe
函数中传递了一个platform_device*
包含该指针的device
指针。有了这个,我可以调用of_match_device
and irq_of_parse_and_map
,检索 irq 号码。
我不想注册第二个平台驱动程序只是为了在测试模块中以这种方式查询设备树。有没有其他方法可以查询设备树(也许更直接,也许是按名称?)
linux-kernel - 内核模块中的驱动程序代码不执行?
为什么这个内核模块在我加载它时什么都不做?
它必须打印Hello, world\n
,如果我这样做lsmod
,模块似乎已加载:
但在控制台和dmesg
.
如果我使用module_init
并且module_exit
一切正常,但我需要指向platform_device *pdev
设备的指针,我该怎么办?
编辑:
原始模块如下所示:
在我的设备树 blob 中存在此条目:
linux-kernel - 嵌入式 Linux 新手问题
所以我正在学习嵌入式 Linux 并且有一些我似乎无法找到答案的问题。
1)编译时内核是否依赖dtb/dts文件?我认为内核只需要知道芯片架构(即arm)并且dtb文件由引导加载程序(uBoot)加载,因此内核只需要加载由dtb文件配置的驱动程序。
2)混合和匹配:我的印象是我可以混合和匹配引导加载程序、dtb、内核、rootfs和模块的任何组合,给出以下
- 内核:必须知道它是为哪个芯片编译的
- dtb:必须知道板子细节和芯片,即多少ram,为SPI配置一个GPIO
- 引导加载程序:必须知道芯片和 uEnv.txt 必须有内核和 dtb 位置的参数
- rootfs:完全独立
- 模块:必须使用特定版本的内核编译
3) 驱动程序:如果我想加载一个 SPI 驱动程序,我是否需要任何特定的东西,或者内核是否知道如何操作它,因为 dtb 文件设置了所需的寄存器?
4)模块:这些只是依赖于内核还是他们需要了解芯片和电路板(当我说芯片时,我的意思是他们需要了解的不仅仅是简单的 arm 或 x86 架构)?
在此先感谢您,我知道这些是一些基本问题,但感谢您提供任何帮助。
embedded-linux - 从 /proc/device-tree/i2c@XXXXX/clock-frequency 读取 I2C 总线频率
我正在开发一些用户空间验证工具。我需要在其中验证 i2c 频率。
在我的 DT 文件中,我设置了 ,然后从用户空间clock-frequency = <400000>;
读回它 。/proc/device-tree/i2c@XXXXX/clock-frequency
但我得到了一些垃圾数据。
输出:
它是压缩形式的吗?如果是,我该如何解压?
命令输出file
:
linux-kernel - linux内核如何从设备树中获取数据?
我是 Linux 内核的初学者。
据我所知,在旧版本的内核中有一个特定于板的文件,其中注册了所有设备(通过使用一些 APIplatform_get_register
等)。
在较新版本的内核中,设备所需的信息通过设备树传递。
我的问题是内核如何从设备树中获取驱动程序的信息?设备如何通过设备树在内核中注册?
linux-kernel - 如何通过设备树配置时钟?
我试图为内核中包含的新设备配置时钟。我有一个旧版本的内核,其中已包含该设备。
所以我尝试对时钟的内核进行类似的更改。但是在旧版本的内核中,有一个用于为几乎所有设备配置时钟的 C 文件,但我在较新的内核中找不到任何类似的文件。
经过调查,我发现在较新版本的内核中,用于配置时钟的参数通过设备树传递给内核。所以我尝试更改 DT 以包含新设备的时钟,但我无法完全成功。所以我的问题是:
1)内核如何获取参数和寄存器地址以配置特定设备的时钟
2)我们可以在内核或驱动程序中访问这些信息(如寄存器加法器)吗?
3)有没有其他方法,我们可以直接在驱动程序或内核中使用寄存器来设置时钟(如频率)