我要在我的开发板上启动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 >;
} ;
我不熟悉其他高级用法或语法。
答案 0 :(得分:16)
看看董事会的dts,它与你的开发板非常相似。使用它作为参考,并根据参考板和开发板之间的差异对dts进行更改。
同时检查以下内容:
- Device-tree Documentation project在eLinux(有很多链接可以开始阅读)
- Series of articles关于设备树的基础知识
- Walkthrough迁移到设备树。
答案 1 :(得分:4)
使用QEMU虚拟设备的最小reg
+ interrupt
示例
我们的示例将以下设备树节点添加到QEMU将使用的versatilepb
设备树-M versatilepb
:
lkmc_platform_device@101e9000 {
compatible = "lkmc_platform_device";
reg = <0x101e9000 0x1000>;
interrupts = <18>;
interrupt-controller;
#interrupt-cells = <2>;
clocks = <&pclk>;
clock-names = "apb_pclk";
lkmc-asdf = <0x12345678>;
};
然后,通过使用Linux内核模块与设备进行交互,我们将测试以下DTS功能:
这些是示例的主要组成部分:
.dts
patch on Linux fork
reg
和interrupt
匹配QEMU多功能机器(代表SoC)中硬编码的数字compatible
匹配内核模块中的platform_driver.name
,并通知内核哪个模块将处理此设备lkmc-asdf = <0x12345678>;
,使用of_property_read_u32
-dtb
参数-M versatilepb
设备树还有许多我们尚未涉及的功能,但是这个示例应该让您入门,并且可以轻松地让您使用任何新功能。
更多资源:
dtc
来解决纯语法问题。例如,它显示了如何通过路径简单地合并节点:https://unix.stackexchange.com/a/375923/32558 答案 2 :(得分:3)
让我们举一个例子,我将解释其中的每一个如下
auart0: serial@8006a000 {
compatible = "fsl,imx28-auart", "fsl,imx23-auart";
reg = <0x8006a000 0x2000>;
interrupts = <112>;
dmas = <&dma_apbx 8>, <&dma_apbx 9>;
dma-names = "rx", "tx";
};
所需属性:
- 兼容:应该是“fsl,-auart”。支持的SoC包括
imx23和imx28。
- reg:为设备设置的寄存器的地址和长度
- 中断:应包含auart中断号码
- dmas:DMA说明符,由一个到DMA控制器节点的phandle组成
和AUART DMA通道ID
- dma-names:RX通道的“rx”,TX通道的“tx”。
注意:每个auart端口都应该在“别名”中正确编号别名
节点。
如需更多高级属性,请转到此链接,非常有用
Device Tree Explanation
希望它有所帮助!
答案 3 :(得分:0)
与其他答案互补:
请记住,官方内核源代码中的root/Documentation/devicetree
(https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree?h=v5.2-rc5)下还有一个设备树部分。