我有一个设备树文件(.dts),我想为我的powerpc基板编译文件.
我怎样才能在我的机器上进行,这不是基于powerpc的?我可以使用我的Ubuntu系统上安装的DTC吗?或者更像是使用单独的编译器并传递ARCH信息(比如使用工具链)?
powerpc cross-compiling linux-kernel embedded-linux device-tree
如果您有Beaglebone Black(BBB)并且想要将自己的设备连接到它(不是斗篷),您可能已经听说过设备树.在我的情况下,我想将RTC设备连接到BBB上的I2C总线.网络上散布着大量的信息,本文旨在概述我发现的内容以及完成任务的指南.
因此,我将给出一个在BBB上激活I2C总线的完整示例,以及使用内核中包含的设备驱动程序连接DS1308 RTC芯片.听起来不错?
请继续阅读,如果有任何不明确的地方请留下评论.如果您有点匆忙,您也可以在Github上抓取设备树覆盖代码并飞走.
我在我的BBB上使用ArchLinux ARM主要是因为Arch Linux非常棒而且我使用debianoid发行版可能太愚蠢了.这是系统的屏幕截图 ..
你可能会注意到内核版本已经超过了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),这需要你每次去另一个斗篷使用时重新编译设备树.
因此,您具有覆盖机制,允许您在运行时在设备树中添加或修改设备!惊人.
注意:为了能够编译设备树覆盖,请确保安装适当的包,如上所述( …
因此,每次修改设备树时,我通常会更改自定义配方中的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内核中使用的硬件设备树.我试图了解特定arm芯片组的linux内核.这将是一个非常有用的工具.
我将在我的开发板上启动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内核文档.我无法理解是否必须在平台的设备树中创建新的主菜,或者为此创建新的覆盖基于设备树的新驱动程序的设备.我正在寻找一个简单的led发光驱动器示例,其中led连接到GPIO引脚,其配置在板的平台上的设备树覆盖或设备树片段中提到.如何使用用户空间应用程序构建/推送和测试.
设备树和ATAG有什么区别?此外,ATAG是必须的,内核是否期望它们在固定地址,或者它是否期望它们在r0-r3中?
我想用设备树驱动的linux内核启动raspberry pi,有什么特别的事情要做吗?
任何人都可以指出为raspberry pi设置基于设备树的内核启动所需的内容.
我可能需要使用raspberry pi内核源代码,其中设备的驱动程序应该与设备树兼容.如果是这样,我在哪里可以找到Raspberry Pi的内核源代码?
我正在尝试为我通过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消息.
我现在正在尝试将我的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设备.
PI上是否支持通用时钟框架?
如何将任意新的I2C设备添加到Raspberry PI设备树? …
我正在开发基于飞思卡尔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.
device-tree ×10
linux-kernel ×8
linux ×5
arm ×2
bitbake ×1
c ×1
embedded ×1
powerpc ×1
raspberry-pi ×1
yocto ×1