自定义设备树的实现
本文尚在完善中… —
一般设备树的编译是通过内核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内实现。
meta-digi中修改或创建uboot的安装脚本
在另一个章节会尝用自己的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中添加uboot的脚本并编译
首先,创建一个meta-custom的分支dev,把我们要的东西放在上面,并入正式版本前,先测试: 在deyaio中,到deyaio/dey4.0/meta-cutom下,用下面命令检出并切换这个测试分支:
git remote -v git fetch peyoot dev git checkout dev