本文尚在完善中… —

一般设备树的编译是通过内核recipe来实现的,比如MP2目前是在: https://github.com/digi-embedded/meta-digi/blob/kirkstone/meta-digi-arm/recipes-kernel/linux/linux-dey_6.1.bb

我们一般无需更改或做一个bbapend,更方便的方法是,先手动在devshell里编译出设备树,然后在meta-custom中用文件系统复制的方式,把测试过的设备树复制到文件系统该有的位置。并通过UBoot的启动脚本在启动时加载特定设备树文件,从而让嵌入式系统镜像使用该设备树。

一般地,编译完任一个基础镜像后,在~/deyaio/dey4.0/workspace/ccmp25/tmp/work/ccmp25_dvk-dey-linux/linux-dey/6.1-r0/build/arch/arm64/boot/dts/digi中存放的是编译的结果。 而源码则位于:~/deyaio/dey4.0/workspace/ccmp25/tmp/work-shared/ccmp25-dvk/kernel-source/arch/arm64/boot/dts/digi

建议使用DEY AIO来进行系统开发,这部分包括了自定义的文件系统和自用板子设备树的实现。

在DEY AIO项目中,我们可以通过链接文件的方式,来把设备树项目用git的方式管理起来。比如,我们的deyaio目录是在~/deyaio,而我们开发的目录是~/github/dev/ccmp25_plc_dt,这里的ccmp25_plc_dt下的设备树文件用链接方式把设备树文件映射到DEY项目中。

第一步,利用DEY AIO工具编译一个基础镜像,比如core-image-base

第二步,创建git项目,将SmartIOMux导出的设备树文件重命名,比如ccmp257plc.dts,提交一份初始值:

git clone https://github.com/peyoot/ccmp25_dt.git
利用vscode之类编辑器远程创建或修改相关的设备树文件,比如命名为ccmp25-plc.dts,并定时保存工作

第三步:链接文件到digi的dts源码目录,并在Makefile里添加该设备树

cd tmp/work-shared/ccmp25-dvk/kernel-source/arch/arm64/boot/dts/digi
ln -s ~/mygit/github/ccmp25_dt/ccmp25-plc.dts 
nano Makefile

在编译目标中插入ccmp25-plc.dtb

ccmp25-dtbs :=          ccmp25-dvk.dtb \
                        ccmp25-plc.dtb \
                        _ov_board_e55rb-i-mw346-c-mipi-dsi_ccmp25-dvk.dtbo \
                        _ov_board_g101evn010-lvds_ccmp25-dvk.dtbo \

第四步:回到项目文件夹编译

cd ../../../../../../../../..
如果之前session已经发退出,可重新source一下
source dey-setup-environment
bitbake -c devshell virtual/kernel
查一下文件是否在列
ls arch/arm64/boot/dts/digi/
然后编译
make dtbs
如果出错,有语法错误,及时修复再编译,直到编译成功
检查dtb是否已经生成
ls /home/rtu/deyaio/dey4.0/workspace/ccmp25/tmp/work/ccmp25_dvk-dey-linux/linux-dey/6.1-r0/build/arch/arm64/boot/dts/digi/
目录内会有和设备树源码同文件名的dtb文件,就是我们编译好的设备树文件。

第五步:测试设备树文件 首先要把它拷贝出来,因为目录都比较深,所以可以用deyaio的publish.sh脚本,快速拷贝相关文件到release目录内。

第六步:编译boot.txt和install_linux_fw_sd.txt,在启动时加载自定义的设备树。 一般地,在meta-digi/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp2和meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk下有uboot安装镜像的脚本,启动时加载的设备树文件一般由fdt_file定义,所以只需调整install_linux_fw_sd.txt,在bootcmd里加上fdt_file的定义,即可实现卡刷脚本来实现加载自定义的设备树文件。

更高级的用法,应该是在efuse里设置board_name里,以便boot.scr脚本根据板子来选择设备树。这对正式量产的板子是有用的。不过调试阶段,最简单的方法就是更改默认要加载的设备树,并创建install_plc_fw_sd.txt链接文件,并添加它的编译。这样卡刷包里有了区别开发板卡刷的脚本,并且应用了我们自己的设备树。

DEY AIO为节约空间应用了空享缓存的机制,同一个版本可以加快不同项目的编译,当我们对源码有一些修改时,可能需要删除掉共享状态的缓存,以便更改的源码并正确应用,这一般是用:bitbake -c cleansstate your-package来实现。

bitbake -c cleansstate u-boot-dey
mkdir -p ~/mygit/github/ccmp25_dt/uboot/configs
cp tmp/work/ccmp25_dvk-dey-linux/u-boot-dey/2022.10-r0/install_linux_fw_sd.txt ~/mygit/github/ccmp25_dt/uboot/install_plc_fw_sd.txt
加上:BOOT_SCRIPTS += "install_plc_fw_sd.scr:install_plc_fw_sd.scr"
链接回编译目录:ln -s 

cp tmp/work/ccmp25_dvk-dey-linux/u-boot-dey/2022.10-r0/git/configs/ccmp25-dvk_defconfig ~/mygit/github/ccmp25-plc/uboot/configs/ccmp25-dvk_defconfig
nano ~/mygit/github/ccmp25-plc/uboot/configs/ccmp15-dvk_defconfig
改为CONFIG_DEFAULT_FDT_FILE="ccmp25-dvk.dtb"
再链接回编译目录:ln -s

最后编译,应该用bitbakey -C compile u-boot-dey来实现。

uboot设备树的编译

反查设备树

$ fiptool unpack <fip-file> –out <out-folder> Then decompile the extracted hw-config.bin (U-boot device tree) $ dtc -I dtb -O dts -o uboot.dts hw-config.bin Finally inspect the DTS file $ less uboot.dts

下面改用在meta-digi或meta-custom内实现。

在另一个章节会尝用自己的layer来创建uboot的安装脚本,这涉及到对yocto配方的理解和掌握,初学者并不容易。 但对meta-digi的修改则容易很多,只需要有办法管理git和repo源的变更,在upstream更新或是重建项目时,能很快重新应用相关的改动。本章节记叙这一最常见的用法。

1、repo下meta-digi版本变动和管理 deyaio在初始化项目时,已经为meta-digi指定了版本,我们进入meta-digi源码目录时,可以用git branch -a来查询可用的分支,此时一般是这样的:

robin@dev-all-in-one-ubuntu:~/deyaio/dey4.0/sources/meta-digi$ git branch -a
* (no branch)
  remotes/digi/gatesgarth
  remotes/digi/jethro
  remotes/digi/kirkstone
  remotes/digi/kirkstone_ccmp2-cc91-beta
  remotes/digi/morty
  remotes/digi/rocko
  remotes/digi/thud
  remotes/digi/zeus
  remotes/m/main -> digi/kirkstone

由于是通过repo初始化项目,因此当前本地文件本没有使用任一分支,而是由repo init和repo sync拉取源码时的分离头指针。可以用git show或git log -1来查得相关远程分支和哈希值。

我们可以直接检出或切换本地分支来做修改或开发,以便不影响远程分支的情况下保留自己的工作内容。

git checkout -b dev
进行修改操作后,我们可以放入自己的fork出的meta-digi分支下管理,如果涉及到多个layer的变动,也可以在上一级目录里建一个git,把各种变更都放在一个库中管理起来。

任何时候,我们想恢复项目和官方源同步时,我们可以到deyaio目录下,用git reflog配合git reset --hard + git clean -df 即可
用这个方法可以快速在本地修改版本和官方源之间切换。

首先,创建一个meta-custom的分支dev,把我们要的东西放在上面,并入正式版本前,先测试: 在deyaio中,到deyaio/dey4.0/meta-cutom下,用下面命令检出并切换这个测试分支:

git remote -v
git fetch peyoot dev
git checkout dev