序文
-
Makefile を介して dtsi および .h ヘッダー ファイルに依存する Linux デバイス ツリー dts ソース ファイルとそのデバイス ツリーを手動でコンパイルする場合、シェル スクリプトを作成して直接コンパイルするにはどうすればよいですか?
-
実際には、Makefile をシェル スクリプトとして書き換えるだけです。
デバイスツリーシェルスクリプトをコンパイルします。
- スクリプトの内容は次のとおりです: gen_dtbs.sh
#! /bin/bash
DIR_ROOT=$( cd "$(dirname "${
BASH_SOURCE[0]}")" && pwd)
HOST_DTC=${
DIR_ROOT}/dtc
HOSTCC=gcc
# ${
HOSTCC} -v
# ${
HOST_DTC} --version
suffix_dtb=".dtb"
suffix_dts=".dts"
dtb_d_pre_tmp=".dtb.d.pre.tmp"
dtb_dts_tmp=".dtb.dts.tmp"
dtb_d_dtc_tmp=".dtb.d.dtc.tmp"
dtc_cflags="-E -Wp,-MMD,"
dtc_flags="0 -Wno-interrupt_provider -Wno-unit_address_vs_reg -Wno-avoid_unnecessary_addr_size "
dtc_flags+="-Wno-alias_paths -Wno-graph_child_address -Wno-simple_bus_reg -Wno-unique_unit_address"
dtc_def="-undef -D__DTS__ -x assembler-with-cpp"
dts_src_path=${
DIR_ROOT}
dts_file_string=`find ${
dts_src_path} -maxdepth 2 -type f -name *.dts`
for dts in ${
dts_file_string}
do
# echo ${
dts}
echo ${
dts%.*}
${
HOSTCC} -E ${
dtc_cflags}${
dts%.*}${
dtb_d_pre_tmp} -nostdinc -I${
DIR_ROOT}/include ${
dtc_def} -o ${
dts%.*}${
dtb_dts_tmp} ${
dts%.*}${
suffix_dts}
${
HOST_DTC} -o ${
dts%.*}${
suffix_dtb} -b ${
dtc_flags} -d ${
dts%.*}${
dtb_d_dtc_tmp} ${
dts%.*}${
dtb_dts_tmp}
done
dts_folders=`find ${
dts_src_path} -maxdepth 1 -type d`
for dts in ${
dts_folders}
do
`rm -f ${
dts}/*.d.dtc.tmp`
`rm -f ${dts}/*.d.pre.tmp`
`rm -f ${dts}/*.dtb.dts.tmp`
done
echo " --- build dtbs end --- "
- サンプルプロジェクトのダウンロードアドレス
https://gitee.com/zhangsz0516/make_dtbs.git
シェルスクリプトの説明
-
動作環境:Linux、gccのインストールが必要、makeのインストールは不要
-
準備する必要があるもの: デバイス ツリー dts オリジナル ファイル、依存する dtsi およびデバイス ツリー ヘッダー ファイル
-
dtc コンパイル ツールは、ソース コード Linux kernel scripts/dtc ディレクトリの下にあり、Linux カーネルをコンパイルした後に生成できます。デフォルトでは、Linux は毎回ソース コードからコンパイルされ、ここにコピーすることで直接使用できます。 dtc ツールを生成するためにソース コードをコンパイルする必要はありません。
dtc ツールを入手する
-
dtc ツールは Linux 環境の gcc、つまりホスト gcc でコンパイルされます。クロスコンパイルは必要ありません。dtc ツールは Linux 上で直接コンパイルできません。qemu などのボードをコンパイルできます。
vexpress_defconfig
-
コンパイル方法:
$ make ARCH=arm vexpress_defconfig
$ make ARCH=arm dtbs
- この時点で、scripts/dtc/dtc が生成され、dtc ツールのバージョン番号を確認できます。
$ chmod +x scripts/dtc/dtc
zhangsz@zhangsz:~/linux/kernel/linux-6.0.10$ scripts/dtc/dtc --version
Version: DTC 1.6.1-g0a3a9d34
dtsソースファイルを取得する
- Linux カーネルからのこの例のデバイス ツリー ソース ファイル
デバイスツリーをコンパイルする
-
スクリプト実行権限
chmod +x gen_dtbs.sh
-
実行
source gen_dtbs.sh
または./gen_dtbs.sh
直接実行
- テストの結果、デバイス ツリー バイナリ ファイルが正常に生成されることがわかりました: dtb
まとめ
-
make またはシェル スクリプトを使用して、デバイス ツリー ソース ファイルを手動でコンパイルできます。
-
なお、ここでは前処理に gcc を使用し、C 言語のソースファイルの処理と同様に、デバイスツリーが依存するヘッダファイルをすべてソースコードの形で一時ファイルに置き、dtb ファイルを生成します。 dtcツールを通して