Device Tree Compilerのエラー2.2-8 syntax errorを解決する

目的

以下のUdemyの教材

www.udemy.com

で,Device Treeの第14章にてDTC(Device Tree Compiler)のコンパイルで以下のエラー2.2-8 syntax errorが出て,全く先に進めなかったのだが,解決策をひとつ見つけたので紹介しておく.

$ cat PCDEV0.dts 
/dts-v1/;
/plugin/;
/ {
    fragment@0 {
        target = <&pcdev1>;
        __OVERLAY__ {
            status = "disabled";
        };
    };
    fragment@1 {
        target = <&pcdev2>;
        __OVERLAY__ {
            status = "disabled";
        };
    };
    fragment@2 {
        target = <&pcdev3>;
        __OVERLAY__ {
            org,size = <1048>;
            org,device-serial-num = "PCDEV4XXXXXX";
        };
    };
};
$ dtc -I dts -O dtb -o PCDEV0.dtbo PCDEV0.dts 
Error: PCDEV0.dts:2.2-8 syntax error
FATAL ERROR: Unable to parse input tree

なお,使用しているLinuxディストリビューションは,Ubuntu 16.04*1で,DTCはバージョン1.4.0である.

$ uname -a
Linux so2akt-VirtualBox 4.15.0-142-generic #146~16.04.1-Ubuntu SMP Tue Apr 13 09:27:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ dtc -v
Version: DTC 1.4.0

結論

Ubuntu 16.04のaptでインストールされるDTCのバージョン1.4.0が古いのか,バグがあるのかという原因で,ビルドエラーが出る.そのためより新しいバージョンを使う必要があり,ソースコードからビルドして1.4.7を作るシェルがGitHubで提供されていたため,それを使うことで解決できた:

github.com

$ wget https://raw.githubusercontent.com/beagleboard/bb.org-overlays/master/dtc-overlay.sh
$ sudo chmod 777 dtc-overlay.sh 
$ sudo -s
# ./dtc-overlay.sh 
# dtc -v
Version: DTC 1.4.7
# dtc -I dts -O dtb -o PCDEV0.dtbo PCDEV0.dts 
PCDEV0.dtbo: Warning (unit_address_vs_reg): /fragment@0: node has a unit name, but no reg property
PCDEV0.dtbo: Warning (unit_address_vs_reg): /fragment@1: node has a unit name, but no reg property
PCDEV0.dtbo: Warning (unit_address_vs_reg): /fragment@2: node has a unit name, but no reg property
# ls
PCDEV0.dtbo  PCDEV0.dts

なお,そのシェル実行前には,念のため

$ sudo apt-get remove device-tree-compiler

にて既存のDTC 1.4.0を削除してから実行した.

詳細

Googleで検索すると,いくらか同等の現象に直面している人がいたが,なかなか対策がわからなかった.

Ubuntuの新しいものにアップグレード,または新規インストールすれば簡単に済む話でもあるが,仕事上で16.04を使う必要があってその環境をそのままこのUdemyの学習に使用しているので面倒だと考えているときに,ちょうどRaspberry Piのフォーラム

forums.raspberrypi.com

で同じ現象が紹介されており,そのリンク先にソースコードからDTCをビルドするシェルが紹介されていたので,この対策に至った*2

コンソール実行の生データは以下のとおり:

root@so2akt-VirtualBox:~/workspace/ldd/custom_drivers/overlays# uname -a
Linux so2akt-VirtualBox 4.15.0-142-generic #146~16.04.1-Ubuntu SMP Tue Apr 13 09:27:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
root@so2akt-VirtualBox:~/workspace/ldd/custom_drivers/overlays# cat PCDEV0.dts 
/dts-v1/;
/plugin/;
/ {
    fragment@0 {
        target = <&pcdev1>;
        __OVERLAY__ {
            status = "disabled";
        };
    };
    fragment@1 {
        target = <&pcdev2>;
        __OVERLAY__ {
            status = "disabled";
        };
    };
    fragment@2 {
        target = <&pcdev3>;
        __OVERLAY__ {
            org,size = <1048>;
            org,device-serial-num = "PCDEV4XXXXXX";
        };
    };
};
root@so2akt-VirtualBox:~/workspace/ldd/custom_drivers/overlays# dtc -I dts -O dtb -o PCDEV0.dtbo PCDEV0.dts 
Error: PCDEV0.dts:2.2-8 syntax error
FATAL ERROR: Unable to parse input tree
root@so2akt-VirtualBox:~/workspace/ldd/custom_drivers/overlays# dtc -v
Version: DTC 1.4.0
so2akt@so2akt-VirtualBox:~$ sudo apt-get remove device-tree-compiler
so2akt@so2akt-VirtualBox:~/Downloads$ wget https://raw.githubusercontent.com/beagleboard/bb.org-overlays/master/dtc-overlay.sh
--2023-02-16 11:28:41--  https://raw.githubusercontent.com/beagleboard/bb.org-overlays/master/dtc-overlay.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1245 (1.2K) [text/plain]
Saving to: ‘dtc-overlay.sh’

dtc-overlay.sh                                     100%[================================================================================================================>]   1.22K  --.-KB/s    in 0s      

2023-02-16 11:28:42 (107 MB/s) - ‘dtc-overlay.sh’ saved [1245/1245]

so2akt@so2akt-VirtualBox:~/Downloads$ sudo chmod 777 dtc-overlay.sh 
[sudo] password for so2akt: 
so2akt@so2akt-VirtualBox:~/Downloads$ sudo -s
root@so2akt-VirtualBox:~/Downloads# ./dtc-overlay.sh 
Cloning into '/home/so2akt/git/dtc'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (31/31), done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 5874 (delta 9), reused 0 (delta 0), pack-reused 5843
Receiving objects: 100% (5874/5874), 1.37 MiB | 826.00 KiB/s, done.
Resolving deltas: 100% (4323/4323), done.
Checking connectivity... done.
     CLEAN (libfdt)
     CLEAN (pylibfdt)
     CLEAN (tests)
     CLEAN
Already on 'master'
Your branch is up-to-date with 'origin/master'.
Already up-to-date.
Switched to a new branch 'v1.4.7-build'
     CLEAN (libfdt)
     CLEAN (pylibfdt)
     CLEAN (tests)
     CLEAN
     DEP tests/dumptrees.c
     DEP tests/trees.S
     DEP tests/testutils.c
     DEP tests/value-labels.c
     DEP tests/asm_tree_dump.c
     DEP tests/truncated_memrsv.c
     DEP tests/truncated_string.c
     DEP tests/truncated_property.c
     DEP tests/check_full.c
     DEP tests/check_header.c
     DEP tests/check_path.c
     DEP tests/overlay_bad_fixup.c
     DEP tests/overlay.c
     DEP tests/subnode_iterate.c
     DEP tests/property_iterate.c
     DEP tests/integer-expressions.c
     DEP tests/utilfdt_test.c
     DEP tests/path_offset_aliases.c
     DEP tests/add_subnode_with_nops.c
     DEP tests/dtbs_equal_unordered.c
     DEP tests/dtb_reverse.c
     DEP tests/dtbs_equal_ordered.c
     DEP tests/extra-terminating-null.c
     DEP tests/incbin.c
     DEP tests/boot-cpuid.c
     DEP tests/phandle_format.c
     DEP tests/path-references.c
     DEP tests/references.c
     DEP tests/string_escapes.c
     DEP tests/propname_escapes.c
     DEP tests/appendprop2.c
     DEP tests/appendprop1.c
     DEP tests/del_node.c
     DEP tests/del_property.c
     DEP tests/setprop.c
     DEP tests/set_name.c
     DEP tests/rw_tree1.c
     DEP tests/open_pack.c
     DEP tests/nopulate.c
     DEP tests/mangle-layout.c
     DEP tests/move_and_save.c
     DEP tests/sw_states.c
     DEP tests/sw_tree1.c
     DEP tests/nop_node.c
     DEP tests/nop_property.c
     DEP tests/setprop_inplace.c
     DEP tests/stringlist.c
     DEP tests/addr_size_cells2.c
     DEP tests/addr_size_cells.c
     DEP tests/notfound.c
     DEP tests/sized_cells.c
     DEP tests/char_literal.c
     DEP tests/get_alias.c
     DEP tests/node_offset_by_compatible.c
     DEP tests/node_check_compatible.c
     DEP tests/node_offset_by_phandle.c
     DEP tests/node_offset_by_prop_value.c
     DEP tests/parent_offset.c
     DEP tests/supernode_atdepth_offset.c
     DEP tests/get_path.c
     DEP tests/get_phandle.c
     DEP tests/getprop.c
     DEP tests/get_name.c
     DEP tests/path_offset.c
     DEP tests/subnode_offset.c
     DEP tests/find_property.c
     DEP tests/root_node.c
     DEP tests/get_mem_rsv.c
     DEP libfdt/fdt_overlay.c
     DEP libfdt/fdt_addresses.c
     DEP libfdt/fdt_empty_tree.c
     DEP libfdt/fdt_strerror.c
     DEP libfdt/fdt_rw.c
     DEP libfdt/fdt_sw.c
     DEP libfdt/fdt_wip.c
     DEP libfdt/fdt_ro.c
     DEP libfdt/fdt.c
     DEP util.c
     DEP fdtoverlay.c
     DEP fdtput.c
     DEP fdtget.c
     DEP fdtdump.c
     LEX convert-dtsv0-lexer.lex.c
     DEP convert-dtsv0-lexer.lex.c
     DEP srcpos.c
     BISON dtc-parser.tab.c
     DEP dtc-parser.tab.c
     LEX dtc-lexer.lex.c
     DEP dtc-lexer.lex.c
     DEP treesource.c
     DEP livetree.c
     DEP fstree.c
     DEP flattree.c
     DEP dtc.c
     DEP data.c
     DEP checks.c
    CHK version_gen.h
    UPD version_gen.h
     DEP util.c
    CHK version_gen.h
     CC srcpos.o
     CC util.o
     CC convert-dtsv0-lexer.lex.o
     LD convert-dtsv0
     CC dtc.o
     CC checks.o
     CC data.o
     CC flattree.o
     CC fstree.o
     CC livetree.o
     CC treesource.o
     CC dtc-lexer.lex.o
     CC dtc-parser.tab.o
     LD dtc
     CC fdtdump.o
     LD fdtdump
     CC fdtget.o
     CC libfdt/fdt.o
     CC libfdt/fdt_ro.o
     CC libfdt/fdt_wip.o
     CC libfdt/fdt_sw.o
     CC libfdt/fdt_rw.o
     CC libfdt/fdt_strerror.o
     CC libfdt/fdt_empty_tree.o
     CC libfdt/fdt_addresses.o
     CC libfdt/fdt_overlay.o
     AR libfdt/libfdt.a
     LD fdtget
     CC fdtput.o
     LD fdtput
     CC fdtoverlay.o
     LD fdtoverlay
     LD libfdt/libfdt-1.4.7.so
## Skipping pylibfdt (install python dev and swig to build)
Installing into: /usr/local/bin/
    CHK version_gen.h
## Skipping pylibfdt (install python dev and swig to build)
     INSTALL-BIN
     INSTALL-LIB
     INSTALL-INC
## Skipping pylibfdt (install python dev and swig to build)
dtc: Version: DTC 1.4.7
root@so2akt-VirtualBox:~/Downloads# dtc -v
Version: DTC 1.4.7
root@so2akt-VirtualBox:~/workspace/ldd/custom_drivers/overlays# dtc -I dts -O dtb -o PCDEV0.dtbo PCDEV0.dts 
PCDEV0.dtbo: Warning (unit_address_vs_reg): /fragment@0: node has a unit name, but no reg property
PCDEV0.dtbo: Warning (unit_address_vs_reg): /fragment@1: node has a unit name, but no reg property
PCDEV0.dtbo: Warning (unit_address_vs_reg): /fragment@2: node has a unit name, but no reg property
root@so2akt-VirtualBox:~/workspace/ldd/custom_drivers/overlays# ls
PCDEV0.dtbo  PCDEV0.dts

参考サイト

  1. Dtc compilation fails - Raspberry Pi Forums
  2. RobertCNelson dtc_overlay.sh

リンク先はすべて2023/02/16現在のもの

*1:これが一番の問題!

*2:思わず,上記UdemyのQ&Aに諦めた!というメッセージを投稿してしまい,すぐ1時間後くらいに解決した!というメッセージを投稿してしまった