标签: device-tree

如何编译dts Linux设备树源文件到dtb?

我有一个设备树文件(.dts),我想为我的powerpc基板编译文件.

我怎样才能在我的机器上进行,这不是基于powerpc的?我可以使用我的Ubuntu系统上安装的DTC吗?或者更像是使用单独的编译器并传递ARCH信息(比如使用工具链)?

powerpc cross-compiling linux-kernel embedded-linux device-tree

36
推荐指数
3
解决办法
5万
查看次数

如何使用设备树覆盖在Beaglebone Black上添加i2c设备?

我为什么要读这个?

如果您有Beaglebone Black(BBB)并且想要将自己的设备连接到它(不是斗篷),您可能已经听说过设备树.在我的情况下,我想将RTC设备连接到BBB上的I2C总线.网络上散布着大量的信息,本文旨在概述我发现的内容以及完成任务的指南.

因此,我将给出一个在BBB上激活I2C总线的完整示例,以及使用内核中包含的设备驱动程序连接DS1308 RTC芯片.听起来不错?

请继续阅读,如果有任何不明确的地方请留下评论.如果您有点匆忙,您也可以在Github上抓取设备树覆盖代码并飞走.

首先要做的事情.

我在我的BBB上使用ArchLinux ARM主要是因为Arch Linux非常棒而且我使用debianoid发行版可能太愚蠢了.这是系统的屏幕截图 ..

BBB上的ArchLinux屏幕截图

你可能会注意到内核版本已经超过了3.x的东西.您在screenfetch中看不到的是内核使用Capemgr实用程序支持设备树覆盖.

什么是设备树?

我会尽快做到,你可以在这里,这里,这里这里找到更深层次的知识.设备树是描述平台上底层硬件的结构.它在嵌入式设备中被大量使用,因为SOC和其他东西没有像PCI这样可以发现设备的总线.它们必须静态定义并附加到"平台总线",以便为内核附带的设备驱动程序提供句柄.

在将设备树引入Linux之前,所有这些工作都必须使用特定的C头文件和自定义实现来完成,然后所有这些都必须合并到主线内核中.因此,这是一个可以想象的详尽的任务,它来到了着名的Linus Torvalds咆哮.在这里,您还可以使用更多设备树背景.

是的很好,但它是如何工作的?

描述我们正在使用的.dts设备树(设备树源)文件,这些文件是人类可读的,并由设备树编译器(dtc)编译成设备树blobs(.dtb),二进制格式.当系统引导引导加载程序(例如u-boot)时,将该blob移交给内核.内核解析它并创建设备树给出的所有设备.

如果您不相信我,请使用设备树编译器进入BBB正在使用的设备树.

如果您尚未安装,请获取相应的包装..

pacman -Sy dtc-overlay
dtc -f -I fs /proc/device-tree | less
Run Code Online (Sandbox Code Playgroud)

less由于该命令生成了大量输出,因此建议使用该寻呼机的管道.结果应该看起来像这样......

在此输入图像描述

设备树的所有部分也可以在内核源代码中进行调查,但由于还有一个包含机制,因此信息在几个文件中分开.

 <kernel-source>/arch/arm/boot/dts/.. 
Run Code Online (Sandbox Code Playgroud)

一些相关文件是:

  • am335x-bone-common.dtsi
  • am335x-boneblack.dts
  • am33xx.dtsi

注:该.dtsi文件是等同于.h在C文件或C++,因为他们得到包括(因此"我"末)的.dts 文件

它们都描述了与处理器相关的设备,Beaglebone平台上的常用设备或仅适用于Beaglebone Black的设备.

你提到叠加层,那是什么?

好问题,我看到你还在和我在一起.正如我之前所说,内核启动时会解析设备树blob.因此,当您的系统启动并运行时,整个魔法已经结束.在像BBB这样的平台上有一大堆扩展板(Capes),这需要你每次去另一个斗篷使用时重新编译设备树.

因此,您具有覆盖机制,允许您在运行时在设备树中添加或修改设备!惊人.

注意:为了能够编译设备树覆盖,请确保安装适当的包,如上所述( …

device-tree beagleboneblack

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

仅使用Yocto/bitbake快速重建设备树?

因此,每次修改设备树时,我通常会更改自定义配方中的dts并重建图像.重建需要很长时间才能重建整个内核,然后需要构建映像并最终部署到目标设备.

是否有任何我只缺少重建设备树的技巧?

更新:

我已经将g0hl1n的答案标记为正确答案,因为这是我的问题的答案.但是,我发现使用Yocto中的内核非常麻烦:奇怪的,长路径和每次重建时文件被覆盖的风险,tmp/work-shared中内核的源代码,而内核是在tmp/work中构建的.

相反,我已经将内核开发从Yocto中移除了.Yocto有很好的工具来创建SDK(请参阅populate_sdk任务),通过快速重建和手动(或脚本化)部署,可以轻松地为内核开发设置环境.完成工作后,可以使用git diff将更改移动到配方.

以下页面上的说明非常有用:http://jumpnowtek.com/beaglebone/Working-on-the-BeagleBone-kernel.html

linux-kernel bitbake device-tree yocto

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

可视化Linux内核使用的设备树文件(dtb)的工具?

我正在寻找一个工具,它可以图形化地表示Linux内核中使用的硬件设备树.我试图了解特定arm芯片组的linux内核.这将是一个非常有用的工具.

linux arm linux-kernel embedded-linux device-tree

15
推荐指数
3
解决办法
3万
查看次数

如何编写Linux .dts设备树文件?

我将在我的开发板上启动Linux,我需要一个dts文件(设备树文件)来描述整个硬件.但是我对这个文件的语法知之甚少,这还不足以在主板上正确运行Linux.

我现在知道的只是如何描述一个单元的中断号,频率,地址,父单元及其兼容的驱动程序类型(如下所述):

ps7_scuwdt_0: ps7-scuwdt@f8f00620 {
                        compatible = "xlnx,ps7-scuwdt-1.00.a";
                        device_type = "watchdog";
                        interrupt-parent = <&ps7_scugic_0>;
                        interrupts = < 1 14 769 >;
                        reg = < 0xf8f00620 0xe0 >;
                } ;
Run Code Online (Sandbox Code Playgroud)

其他高级用法或语法对我来说并不熟悉.

linux linux-kernel device-tree

15
推荐指数
2
解决办法
3万
查看次数

Hello Word设备树基于设备驱动程序

我已阅读并几乎浏览了设备树和设备树覆盖上的所有Linux内核文档.我无法理解是否必须在平台的设备树中创建新的主菜,或者为此创建新的覆盖基于设备树的新驱动程序的设备.我正在寻找一个简单的led发光驱动器示例,其中led连接到GPIO引脚,其配置在板的平台上的设备树覆盖或设备树片段中提到.如何使用用户空间应用程序构建/推送和测试.

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

12
推荐指数
1
解决办法
5133
查看次数

ARM Linux Atags与设备树

设备树和ATAG有什么区别?此外,ATAG是必须的,内核是否期望它们在固定地址,或者它是否期望它们在r0-r3中?

linux arm linux-kernel device-tree

11
推荐指数
2
解决办法
9177
查看次数

用于树莓派的设备树驱动的内核

我想用设备树驱动的linux内核启动raspberry pi,有什么特别的事情要做吗?

任何人都可以指出为raspberry pi设置基于设备树的内核启动所需的内容.

我可能需要使用raspberry pi内核源代码,其中设备的驱动程序应该与设备树兼容.如果是这样,我在哪里可以找到Raspberry Pi的内核源代码?

linux-device-driver linux-kernel raspberry-pi device-tree

11
推荐指数
1
解决办法
8674
查看次数

Raspberry Pi 3上的常见时钟框架驱动程序Hello World

我正在尝试为我通过I2C连接到Raspberry PI 3的时钟编写一个通用时钟框架驱动程序.注意:我对Linux和内核编程都很陌生.

更新:成功!

下面的代码适用于Hello World驱动程序,我必须对设备树进行的唯一更改才能让我的驱动程序加载是添加i2c1节点的子节点(在arch/arm/boot/dts/bcm2708_common.dts中) ):

i2c1: i2c@7e804000 {
        compatible = "brcm,bcm2708-i2c";
        reg = <0x7e804000 0x1000>;
        interrupts = <2 21>;
        clocks = <&clk_core>;
        #address-cells = <1>;
        #size-cells = <0>;
        status = "disabled";
        myclock: clock-generator@6a {
                #clock-cells = <0>;
                compatible = "dbc,myclock";
                reg = <0x6a>;
                clock-frequency = <75000000>;
        };
};
Run Code Online (Sandbox Code Playgroud)

有了这个,我现在看到我希望在dmesg中看到的printk消息.

什么工作

  • 带时钟的评估板通过串行总线连接到PI.已通过i2cdetect/i2cdump验证.I2C器件是@从地址0x6a.
  • 我从Ubuntu(在VirtualBox上运行)交叉编译了我自己的Raspberry PI 3内核版本(4.4.16-v7)并成功将其部署到PI.用uname -a验证(检查我添加到Makefile的EXTRAVERSION信息).
  • 我创建了一个Hello World设备驱动程序,我可以使用insmod加载.
  • 我创建了一个Hello World设备驱动程序,我可以将其添加到设备树中(在bcm2708_common.dtsi和bcm2710-rpi-3-b.dts中).我可以将新设备树部署到PI.已验证设备驱动程序正在使用printk语句加载(在PI引导后使用dmesg查看)以及在引导后检查lsmod.
  • 我在drivers/clk(clk-myclock.c)中创建了一个Hello World公共时钟框架驱动程序的初始尝试.此驱动程序最终将用于更改时钟速率,因此我在clk_ops结构中实现recalc_rate,round_rate和set_rate.我将此驱动程序添加到drivers/clk/Makefile,并为drivers/clk/Kconfig添加了一个配置选项.我使用menuconfig来启用该选项,并且我已经验证了正在构建模块(clk-myconfig.o是由构建创建的).

什么不起作用

我现在正在尝试将我的Hello World ccf驱动程序添加到Raspberry Pi上的设备树中.我不太了解设备树,无法知道添加它的位置(甚至PI是否实际支持ccf).

我尝试过的两件主要事情是:

  • 将设备作为子项添加到bcm2708_common.dtsi中的i2c0和i2c1下.

  • 在bcm2708_common.dtsi的clocks {}部分添加设备,然后从i2c0和i2c1的clocks属性引用我的新时钟.

据我所知,我的驱动程序永远不会被加载或使用.这是因为我没有看到我的调试消息(来自我的*_probe函数顶部的printk调用),并且在启动后我没有看到我的模块在lsmod中加载.

看看arch/arm/boot/dts/zynq-zc702.dts文件,看来电路板有一个i2cswitch(compatible ="nxp,pca9548")作为i2c0设备的子节点,以及一个i2c0子节点,并且然后是一个常见的时钟框架驱动程序("silabs,si570").我不知道Raspberry PI上相应的hw架构可能是什么(或者在哪里可以看出来)以支持I2C链中的任意新I2C设备.

问题

  1. PI上是否支持通用时钟框架?

  2. 如何将任意新的I2C设备添加到Raspberry PI设备树? …

c linux linux-kernel device-tree

11
推荐指数
1
解决办法
679
查看次数

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万
查看次数