设备树编译器无法识别包含文件的C语法

31

我想要手动编译我的板子的设备树。我已经从官方源码下载了最新版本的dtc,但是当我尝试运行下面的命令时,我遇到了一个错误,建议我将所有的#include指令更改为/include/以及#define等。

dtc -I dts -O dtb -p 0x1000 meson-gxl-s905x-khadas-vim.dts -o kvim1.dtb

我的开发板是Khadas Vim,搭载了一颗amlogic S905x SoC处理器。所有的include文件都已经存在,但仍然出现错误:

Translated Content:

我的开发板是Khadas Vim,搭载了一颗amlogic S905x SoC处理器。所有的include文件都已经存在,但仍然出现错误:

Error: meson-gxl-s905x-khadas-vim.dts:8.1-9 syntax error
FATAL ERROR: Unable to parse input tree
第8行是:

#include <dt-bindings/input/input.h>

#include改为/include/将会抑制错误!

如果你知道关于设备树“语言”的某些参考资料(除了U-boot文档),请介绍一下。

1个回答

41

这不是一个设备树语法问题,您只需要使用C预处理器cpp对.dts文件进行预处理,以便获得可以直接由设备树编译器解析的文件。


在您的特定情况下,假设您当前的目录是内核根目录,您需要使用以下两个命令:

cpp -nostdinc -I include -I arch  -undef -x assembler-with-cpp  arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts meson-gxl-s905x-khadas-vim.dts.preprocessed

dtc -I dts -O dtb -p 0x1000 meson-gxl-s905x-khadas-vim.dts.preprocessed -o kvim1.dtb

kvim1.dtb: Warning (unit_address_vs_reg): Node /scpi/clocks/scpi_clocks@0 has a unit name, but no reg property
kvim1.dtb: Warning (unit_address_vs_reg): Node /soc/bus@c8100000/pinctrl@14 has a unit name, but no reg property
kvim1.dtb: Warning (unit_address_vs_reg): Node /soc/periphs@c8834000/rng has a reg or ranges property, but no unit name
kvim1.dtb: Warning (unit_address_vs_reg): Node /soc/periphs@c8834000/pinctrl@4b0 has a unit name, but no reg property
kvim1.dtb: Warning (unit_address_vs_reg): Node /soc/periphs@c8834000/eth-phy-mux has a reg or ranges property, but no unit name
kvim1.dtb: Warning (unit_address_vs_reg): Node /gpio-keys-polled/button@0 has a unit name, but no reg property
kvim1.dtb: Warning (simple_bus_reg): Node /soc/bus@c8100000/pinctrl@14 missing or empty reg/ranges property
kvim1.dtb: Warning (simple_bus_reg): Node /soc/periphs@c8834000/rng simple-bus unit address format error, expected "0"
kvim1.dtb: Warning (simple_bus_reg): Node /soc/periphs@c8834000/pinctrl@4b0 missing or empty reg/ranges property
kvim1.dtb: Warning (simple_bus_reg): Node /soc/periphs@c8834000/eth-phy-mux simple-bus unit address format error, expected "55c"

验证 kvim1.dtb 是否已构建:

ls -ail kvim1.tdb
4359446 -rw-rw-r-- 1 user user 27568 Jun  2 12:05 kvim1.dtb

请参考官方网站和git仓库获取官方设备树规范。official web sitegit repository


2
alias dtcpp="cpp -nostdinc -undef -x assembler-with-cpp" 是一个方便的别名。 - Sergey
谢谢,找到这个问题和答案比每次需要从Linux内核的Makefile中提取它要容易得多! - BytePorter
一个关于别名的好提示可能是(对于某些板子),还可以添加-I来指定内核包含目录(其中一些包含不是其他设备树,而是内核包含):例如-I/usr/src/linux-6.1.44/include - d.c.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接