106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用

最终的目标是刷入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

一、dtb、dts 互转

1.1 dtb转dts

这个还是比较简单,但是需要在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) 

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第1张图片

警告信息不管了。

1.2 dts转dtb

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文件名(如果不指定文件名,会使用默认文件名)

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第2张图片

有一些警告不用管了。

脚本是先编译成dtb文件,然后再把dtb转成一个dts文件

在脚本文件所在的目录中(即kernel目录下),生成的文件名为a.dts

二、resource.img的生成与解包

resource.img 是boot.img的组成部分

resource.img是由rk-kernel.dtb和logo.bmp与logo_kernel.bmp文件组合而成

其中bmp文件是可选的。

2.1 resource.img的生成

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就生成在当前目录了。

2.2 resource.img的解包

有时候需要把已经有的resource.img解包出来,得到dtb文件,对dtb文件进行一些反编译或者其他的操作。

        ./scripts/resource_tool --verbose --unpack --image=resource.img

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第3张图片

在out目录中可以看到解析出来的文件。(图中用的boot-11.img解析出来的resource文件,解析后,软件自动命名boot-11.img-second,所以这里用的是这个文件名,没有用resource.img) 

三、boot.img的生成与解包

3.1 内核直接生成boot.img文件

参考解决linux5.15编译时不生成boot.img 的问题-CSDN博客

3.2 自己使用Image和resource.img合成

有时候我自己有内核(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博客

3.3 boot.img的解包

使用file查看一下文件的格式。

需要用到工具android-unpackbootimg

运行命令(linux下):

./unpackbootimg --input boot.img -o boot

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第4张图片

解包出来的文件生成在boot目录中

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第5张图片

其他文件不用关心 

3.3.1 注意

并不是所有的boot.img 都可以这么解包!!!

比如firefly的镜像中的boot.img就无法解析出来。

这个boot.img 是RKDevTool.exe解包FIREFLY-RK3399_Ubuntu20.04-r240_v2.5.1d_230330.img出来的,大小有128M,使用file命令查看是ext4的文件系统格式。

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第6张图片

这个文件需要使用挂载文件系统的办法查看和修改。(mnt-temp是一个新建的文件夹)

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第7张图片

卸载使用命令:sudo umount mnt-temp (不要在mnt-temp目录中执行)

四、update.img的解包

        打包也是有的,但是我目前很少用,这里就不再提及。主要是解包,直接使用RKDevTool.exe工具解包,解包的文件在RKDevTool.exe所在目录的output目录中。

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第8张图片

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第9张图片

4.1 并不是所有的img都能这么解开。

比如Armbian_23.02.2_am40_jammy_current_6.1.11.img 就无法(使用RKDevTool.exe)解包。

那这时可以尝试以下两个方法中的一个:

4.1.1 可以在虚拟机中双击该img文件,则该img自动挂载到系统中,就可以打开查看了。

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第10张图片

4.1.2 7z解压软件可以打开img文件

其他的压缩软件(试了rar,和360zip)不行。

点击文件,鼠标右键,选中7-zip,然后打开压缩文件即可

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第11张图片

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第12张图片

如果是这种解包的方法,Image和dtb在boot目录下查找。

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第13张图片

注意: 正常应该使用RKDevTool.exe(可能linux下也有对应的方法,我这就没有研究了)解包,这个工具无法解压时,可以尝试后面的方法(不一定百分之百可行)。

五、parameter.txt文件的内容一个注意事项

5.1 其实就是注意一下地址和分区信息

        106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第14张图片

   图中rootfs的地址就不同,一般是参考parameter.txt为准。尤其是刚刚使用了该img(parameter.txt是从该img解包出来的)烧写过机器的情况,那么此时机器中的分区情况肯定就跟该img中的parameter.txt中指定的是一致的,需要特别注意分区情况!!!!

六、maskrom与loader模式的简要说明

6.1 loader模式

        线刷的基本模式,uboot正常时(同时还需要boot.img中的dtb设置正常),可以进入到该模式

6.1.1 进入loader模式的办法(下面是介绍多种方法,选择其中一种就可以了)

        6.1.1.1  上电启动的时候,按住recovery按键。(注意:usb的线必须先连接到电脑,注意图中蓝色部分的字)

       am40我基本是这样使用的(蓝色字体)。

        6.1.1.2  进入系统后,reboot loader   (好像安卓下不可用) 

        6.1.1.3  在uboot命令阶段,使用uboot命令 reboot loader  (firefly的uboot是支持的,其他不清楚)

        106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第15张图片

        6.1.1.4  在uboot启动阶段(上电的时候),按住ctrl+d 可以自动进入

        6.1.1.5  在uboot命令阶段,输入download

        106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第16张图片

        6.1.1.6  在uboot命令阶段,输入rockusb 0 mmc 0 也是可以的
       

6.1.2 进入loader之后,下载软件提示如下:

(驱动程序DriverAssitant_v4.5必须安装好)

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第17张图片

这时候就可以下载了。

6.1.3 无法进入loader模式的原因:

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下载线要连接,尤其是使用按键进入的时候。

6.2 maskrom模式

        当emmc中的uboot无法正常启动时,一般需要进入到该模式。

        uboot正常,但是boot.img中的dtb文件异常,也会导致无法进入loader模式,就需要手动进入到maskrom模式。

6.2.1 手动进入maskrom,

        需要在上电之前,短路两个点了,然后不放开,再进行上电,直到出现maskrom的提示。

        firefly的提供这个两个点:

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第18张图片

        am40上,要仔细找一下,对比那三个比较大的电容,可以定位到。

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第19张图片

6.2.1.1 实际是 :如果进入maskrom,需要短接emmc-clk信号到地。(这是firefly的图)

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第20张图片

6.2.2 从loader进入到maskrom模式

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第21张图片

        

6.3 maskrom模式一定要下载miniloaderAll.bin

        maksrom 模式下,miniloaderAll.bin是必须要下载的,否则无法下载成功。

比如我在这个模式下更新boot.img,就必须选中loader。

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第22张图片

七、总结:

7.1 boot的组合成分

        106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第23张图片

7.2 那么在调试的时候,可以任意的调整Image或者resource.img文件,去验证自己的内核或者dtb文件的正确性。

        比如:正常的Image+待验证的dtb,可以验证dtb是否正常

                正常的dtb+待验证的Image,看看自己内核的配置是否正常,驱动是否正常?

7.3  因需要的文件比较多,所以做了一个文件共享

也欢迎大家私信我哈。

106.am40刷机(linux)折腾记2-前期的准备工作2-软件使用_第24张图片

7.4 注意:只要能进入maskrom,一切都有救。进不了,就成了废品了。 一般情况下使用loader模式更新足够了,只有loader模式进不了的情况才会启动maskrom了。

7.5 logo.bmp和logo_kernel.bmp只是影响开机logo的显示,不会有其他问题。

你可能感兴趣的:(am40,linux,rk3399,linux,rk3399)