Linux 设备树文件手动编译的 shell 脚本

前言

  • 前面通过 Makefile 实现手动编译 Linux 设备树 dts 源文件及其 设备树依赖 dtsi、.h 头文件,如何写成一个 shell 脚本,直接编译呢?

  • 其实就是 把 Makefile 重新编写为 shell 脚本即可

编译设备树 shell 脚本

  • 脚本内容如下: 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

shell 脚本说明

  • 运行环境: Linux,需要安装 gcc,不需要安装 make

  • 需要准备:设备树 dts 原文件,以及依赖的 dtsi 与 设备树头文件

  • dtc 编译工具,源码 Linux 内核 scripts/dtc 目录下,编译过 Linux 内核后,就可以产生,默认Linux 每次都是源码编译,这里直接复制出来即可使用,不需要源码编译生成 dtc 工具。

获取 dtc 工具

  • dtc 工具是有Linux 环境 gcc 编译的,也就是 host gcc,不需要交叉编译,Linux 下不能直接编译 dtc 工具,可以编译一个 board,如 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 或 shell 脚本,手动编译 设备树源文件

  • 注意这里使用了 gcc 做了预处理,把设备树依赖的头文件等全部以源码的方式放在一个临时文件里面,就像是 C 语言源文件的处理一样,这样再通过 dtc 工具,生成 dtb 文件

猜你喜欢

转载自blog.csdn.net/tcjy1000/article/details/130996396
今日推荐