Rockchip-4B Android 刷机天坑指南
- documentation
- 记一次糟糕的刷机经历
- FIXED:
No configuration exists for this target on this architecture. Stop.
- FIXED:
error: 'commit_id.xml', needed by 'out/target/product/rk3399/vendor/commit_id.xml', missing and no known rule to make it
- FIXED:
error: prebuilts/clang/host/linux-x86/: platform/prebuilts/clang/host/linux-x86 checkout
- FIXED:
awk: line 2: function strtonum never defined
- FIXED:
fatal error: openssl/bio.h: No such file or directory
- FIXED:
"Creating Comm Object failed!"
documentation
✨✨✨ 核心刷机资料,包含各种工具 Rock/flash the image - Radxa Wiki
升级 XX?: Burning Firmware — Firefly Wiki
https://mega.nz/folder/gxVRiara#_ExDV9pfNpqabzDTtpN-UA
记一次糟糕的刷机经历
intro
首先关于 rc 的刷机部分,官方参考文章主要有以下:
理论上,刷对应版本就去翻对应的网页,但在 rc 这里不是这样的,rc 的文档写的,应该说相当随意,然后历史遗留痕迹太大, 不懂得维护。
从经验上看,rc 可能在持续更新,比如在 android 7 的时代写一篇 7 的刷机文档,10 的时代写了一篇 10 的刷机文档,里面总体来说,可能没有什么大错误,但是坑不少。
我恰巧目标平台是 10,10 的刷机文档竟然出乎意料地是最坑的。
比起 11 它没有给出一键刷机的指令,这也许可以接受,(其实无非就是把几个脚本合起来了而已);但比起 7 它竟然少了最后一步生成gpt.img
的步骤,而在 7、11 里都是有的……我还是在花了很长时间的搜索后才在 7 的文档里找到这一步的答案。
咋还能升级升垮了呢?这是让我觉得 rc 最不专业的一点。
!!!warning 尽管 rc 每个版本都给出了分步编译的说明,u-boot -> kernel -> aosp -> img
等,但是考虑到中途实在有太多步,并且他们基于(提前使用)软链接的一些设置很容易造成项目紊乱,为此我又多花了一天时间,怎么刷机都刷不过。最后还是使用一键脚本编译,然后刷机一次性通过。
所以尽管10的文档里没有给出一键刷机的说明,但是仓库里其实有的,注意项目根目录下的`build-rockpi-4b.sh`,运行仿造11的命令:`./build-rockpi-4b.sh -UACKup` 即可(不用管意思,一把梭就可以)。
step 1. 生成 gpt.img
接下来是刷机第一步(拉取代码,直到生成gpt.img
)
VERSION=10
TAG=q # 10 -> q, 11 -> r
DIR=rockpi4-android-$VERSION
BRANCH=rockchip-android-$VERSION
mkdir $DIR && cd $DIR
repo init -u https://github.com/radxa/manifests.git -b $BRANCH \
-m rockchip-$TAG-release.xml
repo sync -d --no-tags -j4
./build-rockpi-4b.sh -UACKup
如果之前已经整编过,那么运行./build-xx.sh
一键编译应该只需要半个小时左右,否则就是正常安卓编译+kernel 编译时间,预留四小时吧。
在./build-xx.sh
之后,期间生成 image 的过程里会把rockdev
文件夹链接到根目录,也就是:
rockdev -> ./RKTools/linux/Linux_Pack_Firmware/rockdev/
而在这个rockdev
目录下,又有一个Image
文件夹软链接,它指向当前文件夹下正在编译的那个Image
(默认有多个,比如:Image-aosp_arm
、Image-RockPi4B
等),我们目前的一键编译会将Image
指向Image-RockPi4B
。
而在该Image
目录下,有一个gpt.img
文件,这个就是完整的刷机包。
step 2. install rkdeveloptool
由于我们购买的 rc4b 已经焊死了一个emmc
,所以我们无需额外的 sd 卡,直接基于 emmc 就可以(根据测试,官网中说的短路也是不用的)
使用emmc
首先需要下载rkdevleloptool
(linux 或 mac: rockchip-linux/rkdeveloptool)或者RkDevTool
(windows)。
具体下载与安装也可以直接使用以下:
# mac
brew install automake autoconf libusb lsusb
# linux
sudo apt-get install -y libudev-dev libusb-1.0-0-dev dh-autoreconf
# both
git clone https://github.com/rockchip-linux/rkdeve loptool
cd rkdeveloptool
autoreconf -i
./configure
make
# global
sudo cp rkdeveloptool /usr/bin/
参考:- Rockpi4/dev/usb-install/zh cn - Radxa Wiki
step 3. 基于rkdeveloptool
的emmc
刷机要点
首先是认识接口与接线顺序。
rc4b 只有一个 typeC 口是用于供电的,其它四个 usb 口其中两个是 usb2.0,两个是 usb3.0(蓝色)。
两个蓝色 usb3.0 中,上面(离主板距离更高)那个是 otg 口,口后面有个开关,往板角方向掰是usb device
模式,这样连接电脑后电脑可以检测到 rc4b 里面的系统(adb
才有用);否则是udb host
模式,用于其他用途。
rc4b 还有三个按键,按官方文档:引导 Rock PI 进入 Maskrom 模式 描述从 typeC 口上的那个按键往下的三个键分别是maskrom | recovery | reset
键,但我目前测试下来第二个键才是maskrom
,这个具体哪个对哪个,可能还是要结合实际测试。
而基于 rkdeveloptool
是基于 maskrom
工作的,如果设备不是处于该模式,则无法基于 rkdeveloptool
对设备进行操作。
- 先将公对公线连上 otg 到电脑(电脑如果是 c 口,要用 usb 转 c 转接器,直接用公接 c 线到我的 mac 没反应)
- 按住 rc4b 的
maskrom
键 - 将 rc4b 接电(这个电口既可以插插座,也可以接电脑,无所谓,用于供电的)
- 松开
maskrom
键
只要是先按着maskrom
键然后接电的,开发板就是进入了maskrom
模式,这是要点一;
只要先接上 otg,接着就能检测到maskrom
,这是要点二。
可以用watch rkdeveloptool ld
(需要brew install watch
)监控maskrom
连接情况(接电后一秒就有反应了)
也可以用lsusb
(或者lsusb 2>/dev/null
抑制内部错误信息)查看是否有Fuzhou
的 usb 行信息:
这样,我们确认了已经连接上。
接下来我们要下载官方的loader
用于初始化RAM
。我其实在仓库根目录也看到了一个 loader:
用来试了一下,发现不行,所以用官方的就好: 通过 USB 烧写镜像到 eMMC 模块:
!!!tip 解压那个zero.img.gz
可以用gunzip zero.img.gz
,以得到zero.img
。
假设当前目录结果如下:
其中 rk3399_loader_v1.20.119.bin
是下载的官方 bin 文件,zero.img
也是下载的官方空镜像,而ROCKPI-4AB-2020-10-15-11-14-gpt.img
是官方打包好的安卓 10 镜像,gpt-4b.img
是我们自己编译好的安卓镜像。
于是可以用以下脚本方便一键刷机/复原:
# LOADER="rk3399_loader_v1.20.119.bin"
LOADER="loader.bin"
# function
export f() {
rkdeveloptool db $LOADER
rkdeveloptool wl 0 $1
rkdeveloptool rd
}
# burn image of official packed android 10 for test
f ROCKPI-4AB-2020-10-15-11-14-gpt.img
# burn image of `gpt.img`
f gpt-4b.img
# clear image
f zero.img
可以这么做,达到清空镜像再重新安装我们的 4b 镜像:
f zero.img
f gpt-4b.img
值得注意的是,这么做之后,如果你实时监控maskrom
状态(watch rkdeveloptool ld
)会看到在f zero.img
之后系统依旧是maskrom
状态,而在f gpt-4b.img
之后系统将复原(也就是说,zero.img
不会中断maskrom
状态。
同时,如果你也在监控adb
状态(watch adb devices
)会看到,在f gpt-4b.img
后几秒,有一个recovery
状态的设备发现,再过几秒就没了;然后开发板重启,再过几秒后,蓝灯闪烁就代表已经系统已经成功在运行,此时adb
里会有一个正常的设备出现。
而当adb
里有设备时可以使用投屏功能。
基于adb
的scrcpy
投屏
访问:- Genymobile/scrcpy: Display and control your Android device 或者直接 brew/apt install scrcpy
即可安装scrcpy
。
无需任何额外配置,在adb
有效后,使用scrcpy
就能看到系统效果。
!!!tip 目前发现,自己编译的 android 系统明显比官方打包的要好,没有抖动之类的问题,据博文猜测应该是官方打包的太旧了。
关于 sd 卡刷
其实 sd 卡刷理论上比emmc
要更傻瓜一些,因为有现成的Etcher
之类的软件三步烧到卡里,然后插到板子上,就可以自动启动了。
我之前花了很长时间纠结无法开机的问题,主要是因为镜像不对,而非按键之类的操作有误。
这也是卡刷的一个缺点,出了问题也不方便调试。
而我们的 rockchip-4b-plus,已经有了一块内置焊死的emmc
,所以也确实没必要用 sd 卡,尽管都可以。sd 卡的话就不用去安装 rockchip 官方的 rkdeveloptool
工具。
具体参考官方说明:
其他关于 rc 的吐槽
从今天起,只要你也吐槽 rockchip 的产品、文档,那我们就能成为朋友!
在 rc 镜像生成部分,rockdev
目录下可以看到 readme 是这么写的:
但实际上,我们根本就没有必要把loader
copy 到什么地方去,可能是他们的脚本里自带了,也有可能是他们后来更新了。
再联系他们各大版本的文档的同步、准确性等问题……
总之,标准的天坑。
FIXED: No configuration exists for this target on this architecture. Stop.
mark::update@2022-02-25: 在编译 kernel 时,今天一直碰到这个问题。
一开始是我在回滚了 kernel 之后出现的,后来我仔细查看了 git log,发现有一个 commit 里包含很多 config.go
文件,我猜想这些文件是不能丢掉的。
我原以为,是 rk 的 git 操作没到位,一些新的文件没合到 git 里。
直到后来我才意识到,(不确定)是在 repo sync 的时候,自动生成的,当然,这个生成的一部分文件,也就属于新增文件,不在 commit 里了。
因此,当我回滚了操作,甚至直接删光 kernel 文件夹再 repo sync kernel
,也不能获得那些 config 文件。
最终导致 kernel 无法编译。
总之,要么 make clean
,要么 指定lunch
,要么就 repo sync
重新同步一下,也没有其他办法了……终归有个办法可以用的……
FIXED: error: 'commit_id.xml', needed by 'out/target/product/rk3399/vendor/commit_id.xml', missing and no known rule to make it
It arises up when we build the AOSP, and the python
is disallowed without the commit_id.xml
, so just put it:
TEMPORARY_DISABLE_PATH_RESTRICTIONS=true
FIXED: error: prebuilts/clang/host/linux-x86/: platform/prebuilts/clang/host/linux-x86 checkout
ref:
FIXED: awk: line 2: function strtonum never defined
sudo apt-get install gawk
ref:
FIXED: fatal error: openssl/bio.h: No such file or directory
sudo apt-get install aptitude
sudo aptitude install libssl-dev
ref:
FIXED: "Creating Comm Object failed!"
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666",GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android.rules
ref: