最终的目标是刷入firefly的3399的镜像,同时更新内核到linux5.10版本(4.4的内核应该是相同的方法,我目前没有去折腾,暂时不用了)。
1. 平台: rk3399 am40 4g+32g
2. 内核:暂无
3. 交叉编译工具 :暂时不编译
4. 宿主机:ubuntu18.04
5. 需要的素材和资料:暂无
本节主要是一些软件的操作方法:
这些主要是一些调试方法,需要熟悉一下。
因为rk系列镜像有很多种方法和形式,这里特别说明一下:
uboot相关的是:u-boot.img,trust.img
内核相关的是:boot.img
这个还是比较简单,但是需要在linux电脑中使用dtc命令
如果没有该命令,则安装sudo apt-get install device-tree-compiler
dtc -I dtb -O dts rk3399-smart-am40.dtb -o rk3399-smart-am40-20231110.dts
其中rk3399-smart-am40.dtb 是输入文件名
rk3399-smart-am40-20231110.dts 是输出文件名
前面的-I(大写字母i) -O(大写字母o)
警告信息不管了。
1.2.1 简单的dts转dtb是很容易的
dtc -I dts -O dtb -o output.dtb input.dts
其中,-I选项用于指定输入文件的格式,这里使用的是dts格式,表示设备树源码;-O选项用于指定输出文件的格式
1.2.2 但是内核中的dts一般由很多dtsi组合而成,而且还包含了一些h文件
一般就是编译内核的时候会自动生成对应的dtb文件,但是有时候我只是想比较一下dts文件的差别,就懒得去编译内核了,就自己找了一个脚本。
这是一个shell脚本,自定义文件名是build_dts_dtb.sh,放在kernel源码的根目录(新建文件需要增加执行权限哈)
#!/bin/sh
# @Author: dazhi
# @Date: 2023-06-02 16:07:52
# @Last Modified by: dazhi
# @Last Modified time: 2023-06-02 16:42:53
#echo $#
if [ $# -eq 1 ];then
FILE_NAME=$1
else
FILE_NAME=rk3399-box-rev2-am40 #rk3399/jc-rk3399-linux
fi
FILE_NAME=${FILE_NAME%%.*}
echo $FILE_NAME
if [ -f arch/arm64/boot/dts/rockchip/$FILE_NAME.dts ];then
echo "start compile $FILE_NAME.dts"
else
echo "$FILE_NAME.dts not exist!!!"
echo "Usage : $0 dts-filename[dir:arch/arm64/boot/dts/rockchip/] "
echo "like: $0 rk3399-firefly-linux "
exit 1
fi
#exit 0
cpp -Wp,-MD,x.pre.tmp -nostdinc -I. -I include/ -undef -D__DTS__ -x assembler-with-cpp -o x.dts.tmp arch/arm64/boot/dts/rockchip/$FILE_NAME.dts
dtc -I dts -O dts -i arch/arm64/boot/dts/rockchip/ -o a.dts x.dts.tmp
dtc -I dts -O dtb -i arch/arm64/boot/dts/rockchip/ -o $FILE_NAME.dtb x.dts.tmp
rm x.dts.tmp
#echo "compile $FILE_NAME.dts done"
#./scripts/resource_tool arch/arm64/boot/dts/rockchip/$FILE_NAME.dtb logo.bmp logo_r.bmp > /dev/null
echo "resource done"
脚本可以带一个参数,用于指定一个dts文件名(如果不指定文件名,会使用默认文件名)
有一些警告不用管了。
脚本是先编译成dtb文件,然后再把dtb转成一个dts文件
在脚本文件所在的目录中(即kernel目录下),生成的文件名为a.dts
resource.img 是boot.img的组成部分
resource.img是由rk-kernel.dtb和logo.bmp与logo_kernel.bmp文件组合而成
其中bmp文件是可选的。
2.1.1 需要的软件工具:
内核源码目录下 scripts/resource_tool
这个是由resource_tool.c 编译生成,如果没有该工具,请参考解决linux5.15编译时不生成boot.img 的问题-CSDN博客中的错误提示3,里面包含源码
2.1.2 生成需要的文件
dtb文件,logo.bmp logo_kernel.bmp (bmp文件不是必须)
2.1.3 生成的命令
./scripts/resource_tool rk-kernel.dtb logo* > /dev/null
这样resource.img就生成在当前目录了。
有时候需要把已经有的resource.img解包出来,得到dtb文件,对dtb文件进行一些反编译或者其他的操作。
./scripts/resource_tool --verbose --unpack --image=resource.img
在out目录中可以看到解析出来的文件。(图中用的boot-11.img解析出来的resource文件,解析后,软件自动命名boot-11.img-second,所以这里用的是这个文件名,没有用resource.img)
参考解决linux5.15编译时不生成boot.img 的问题-CSDN博客
有时候我自己有内核(Image文件),但是dtb文件我想用原来系统自带的,或者,我想验证一下我编译的dts能否启动,但是Image用原谅系统自带的,这样就直接用原来的Image和我自己编译的resource进行合并,生成新的boot.img,用来验证自己的dtb有什么问题。
3.2.1 生成命令
./scripts/mkbootimg --kernel ./arch/arm64/boot/Image --second resource.img -o boot.img
根据实际情况修改对应文件的路径,Image和resource.img是可以根据自己的需要指定不同的文件的。
mkbootimg命令 请参考解决linux5.15编译时不生成boot.img 的问题-CSDN博客
使用file查看一下文件的格式。
需要用到工具android-unpackbootimg
运行命令(linux下):
./unpackbootimg --input boot.img -o boot
解包出来的文件生成在boot目录中
其他文件不用关心
并不是所有的boot.img 都可以这么解包!!!
比如firefly的镜像中的boot.img就无法解析出来。
这个boot.img 是RKDevTool.exe解包FIREFLY-RK3399_Ubuntu20.04-r240_v2.5.1d_230330.img出来的,大小有128M,使用file命令查看是ext4的文件系统格式。
这个文件需要使用挂载文件系统的办法查看和修改。(mnt-temp是一个新建的文件夹)
卸载使用命令:sudo umount mnt-temp (不要在mnt-temp目录中执行)
打包也是有的,但是我目前很少用,这里就不再提及。主要是解包,直接使用RKDevTool.exe工具解包,解包的文件在RKDevTool.exe所在目录的output目录中。
比如Armbian_23.02.2_am40_jammy_current_6.1.11.img 就无法(使用RKDevTool.exe)解包。
那这时可以尝试以下两个方法中的一个:
4.1.1 可以在虚拟机中双击该img文件,则该img自动挂载到系统中,就可以打开查看了。
4.1.2 7z解压软件可以打开img文件
其他的压缩软件(试了rar,和360zip)不行。
点击文件,鼠标右键,选中7-zip,然后打开压缩文件即可
如果是这种解包的方法,Image和dtb在boot目录下查找。
注意: 正常应该使用RKDevTool.exe(可能linux下也有对应的方法,我这就没有研究了)解包,这个工具无法解压时,可以尝试后面的方法(不一定百分之百可行)。
5.1 其实就是注意一下地址和分区信息
图中rootfs的地址就不同,一般是参考parameter.txt为准。尤其是刚刚使用了该img(parameter.txt是从该img解包出来的)烧写过机器的情况,那么此时机器中的分区情况肯定就跟该img中的parameter.txt中指定的是一致的,需要特别注意分区情况!!!!
线刷的基本模式,uboot正常时(同时还需要boot.img中的dtb设置正常),可以进入到该模式
6.1.1.1 上电启动的时候,按住recovery按键。(注意:usb的线必须先连接到电脑,注意图中蓝色部分的字)
am40我基本是这样使用的(蓝色字体)。
6.1.1.2 进入系统后,reboot loader (好像安卓下不可用)
6.1.1.3 在uboot命令阶段,使用uboot命令 reboot loader (firefly的uboot是支持的,其他不清楚)
6.1.1.4 在uboot启动阶段(上电的时候),按住ctrl+d 可以自动进入
6.1.1.5 在uboot命令阶段,输入download
6.1.1.6 在uboot命令阶段,输入rockusb 0 mmc 0 也是可以的
(驱动程序DriverAssitant_v4.5必须安装好)
这时候就可以下载了。
6.1.3.1 uboot被破坏,这个时候uboot不能正常启动,上电后应该是自动进入maskrom模式(可以按住recovery按键试试)。
6.1.3.2 boot.img 中dtb文件有问题,初始化emmc故障,这个时候无法进入loader模式,也无法自动进入到maskrom模式(需要手动短路两个点进入maskrom模式才可以)。类似如下打印信息:
Hit key to stop autoboot('CTRL+C'): 0
Device 'mmc@fe310000': seq 0 is in use by 'sdhci@fe330000'
Card did not respond to voltage select!
mmc_init: -95, time 51
Could not get mmc 0
## Booting Rockchip Format Image
Could not find kernel partition, ret=-1
no mmc device at slot 1
Card did not respond to voltage select!
mmc_init: -95, time 50
starting USB...
Bus usb@fe380000: USB EHCI 1.00
Bus usb@fe3a0000: USB OHCI 1.0
Bus usb@fe3c0000: USB EHCI 1.00
Bus usb@fe3e0000: USB OHCI 1.0
scanning bus usb@fe380000 for devices... 1 USB Device(s) found
scanning bus usb@fe3a0000 for devices... 1 USB Device(s) found
scanning bus usb@fe3c0000 for devices... 3 USB Device(s) found
scanning bus usb@fe3e0000 for devices... 1 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
Device 0: unknown device
ethernet@fe300000 Waiting for PHY auto negotiation to complete. done
Speed: 100, full duplex
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
6.1.3.3 usb下载线要连接,尤其是使用按键进入的时候。
当emmc中的uboot无法正常启动时,一般需要进入到该模式。
uboot正常,但是boot.img中的dtb文件异常,也会导致无法进入loader模式,就需要手动进入到maskrom模式。
需要在上电之前,短路两个点了,然后不放开,再进行上电,直到出现maskrom的提示。
firefly的提供这个两个点:
am40上,要仔细找一下,对比那三个比较大的电容,可以定位到。
6.2.1.1 实际是 :如果进入maskrom,需要短接emmc-clk信号到地。(这是firefly的图)
maksrom 模式下,miniloaderAll.bin是必须要下载的,否则无法下载成功。
比如我在这个模式下更新boot.img,就必须选中loader。
7.1 boot的组合成分
7.2 那么在调试的时候,可以任意的调整Image或者resource.img文件,去验证自己的内核或者dtb文件的正确性。
比如:正常的Image+待验证的dtb,可以验证dtb是否正常
正常的dtb+待验证的Image,看看自己内核的配置是否正常,驱动是否正常?
7.3 因需要的文件比较多,所以做了一个文件共享
也欢迎大家私信我哈。
7.4 注意:只要能进入maskrom,一切都有救。进不了,就成了废品了。 一般情况下使用loader模式更新足够了,只有loader模式进不了的情况才会启动maskrom了。
7.5 logo.bmp和logo_kernel.bmp只是影响开机logo的显示,不会有其他问题。