目录
0 前言
RK3399适合学习Android,一是网上资料比较多,二是官网适配了Android8.1系统,甚至有学者移植了Android 10系统,比较能跟上现阶段的Android版本。主要从Android8.1深度定制(包括kernel)、uboot定制、开机LOGO/动画定制、多屏显示几个方面学习RK3399,其中应用层以显示系统(我是做Android显示的)为主,其他功能为辅。
1 准备工作
1 首先准备ubuntu系统、sourceInsight等工具,配置自己熟悉的系统环境;
2 然后熟悉RK3399架构、寄存器与指令集、电路图、芯片手册等。
3 官方使用手册:RK3399 官网wiki Android8.1源码在线
相关资料:ARMv8架构 ARMv8指令集 RK3399裸机开发
2 开发工具
2.1 SourceInsight4.0
(1) 护眼背景
Options-->Preferences-->Colors & Fonts-->Windows Background里面设置:
色调:85;饱和度:123;亮度:205,
R: 199; G: 237; B: 204;
2.2 VirtualBox
我用的VirtualBox虚拟机软件装的ubuntu18,因为他是免费的,并且操作简单,可以在官网下载。然后使用mobaXterm作为终端通过ssh连接ubuntu。virtualBox安装扩展包
2.3 FillZilla
tftp文件传输软件,虽然mobaXterm也有这个功能,但比较慢,推荐这个,在没法使用共享文件夹的时候用这个。VirtualBox可以创建共享文件夹,但我没搞好,用的samba共享文件夹。
2.4 github
可以使用CSDN免费的github: github
git clone https://codechina.csdn.net/ZHUYJUN/rk3399.git
git add .
git commit -m "Initial commit"
git push -u origin master
2.5 刷机工具
windows: AndroidTool
Android8.1使用的是RK固件,parameter.txt
文件来定义分区,使用脚本show_rk_parameter.sh读取源码分区:
show_rk_parameter.sh device/rockchip/rk3399/parameter.txt
Rockusb Mode
--------
NAME OFFSET LENGTH
uboot 0x00002000 0x00002000
trust 0x00004000 0x00002000
misc 0x00006000 0x00002000
resource 0x00008000 0x00008000
kernel 0x00010000 0x00010000
boot 0x00020000 0x00010000
recovery 0x00030000 0x00020000
backup 0x00050000 0x00038000
security 0x00088000 0x00002000
cache 0x0008a000 0x00100000
system 0x0018a000 0x00500000
metadata 0x0068a000 0x00008000
vendor 0x00692000 0x00100000
oem 0x00794000 0x00100000
frp 0x00894000 0x00000400
userdata 0x00894400 -
Maskrom Mode
--------
NAME OFFSET LENGTH
uboot 0x00004000 0x00002000
trust 0x00006000 0x00002000
misc 0x00008000 0x00002000
resource 0x0000a000 0x00008000
kernel 0x00012000 0x00010000
boot 0x00022000 0x00010000
recovery 0x00032000 0x00020000
backup 0x00052000 0x00038000
security 0x0008a000 0x00002000
cache 0x0008c000 0x00100000
system 0x0018c000 0x00500000
metadata 0x0068c000 0x00008000
vendor 0x00694000 0x00100000
oem 0x00796000 0x00100000
frp 0x00896000 0x00000400
userdata 0x00896400 -
脚本代码:
#!/bin/sh
PARAMETER_FILE="$1"
[ -f "$PARAMETER_FILE" ] || { echo "Usage: $0 <parameter_file>"; exit 1; }
show_table() {
echo "$1"
echo "--------"
printf "%-20s %-10s %s\n" "NAME" "OFFSET" "LENGTH"
for PARTITION in `cat ${PARAMETER_FILE} | grep '^CMDLINE' | sed 's/ //g' | sed 's/.*:\(0x.*[^)])\).*/\1/' | sed 's/,/ /g'`; do
NAME=`echo ${PARTITION} | sed 's/\(.*\)(\(.*\))/\2/'`
START=`echo ${PARTITION} | sed 's/.*@\(.*\)(.*)/\1/'`
LENGTH=`echo ${PARTITION} | sed 's/\(.*\)@.*/\1/'`
START=$((START + $2))
printf "%-20s 0x%08x %s\n" $NAME $START $LENGTH
done
}
show_table "Rockusb Mode" 0
echo
show_table "Maskrom Mode" 0x2000
linux:rkdeveloptool / upgrade_tool // 刷机前要进入刷机模式
sudo upgrade_tool ul bootloader.bin # 烧写 bootloader
sudo upgrade_tool di -p paramater # 烧写 parameter
sudo upgrade_tool di -uboot uboot.img
sudo upgrade_tool di -trust trust.img
sudo upgrade_tool di -m misc.img
sudo upgrade_tool di -baseparameter baseparameter.img
sudo upgrade_tool di -b boot.img // Android 内核的内存启动盘 (initrd),是内核启动后最先加载的根文件系统
sudo upgrade_tool di -k kernel.img // Android 内核
sudo upgrade_tool di -resource/-re resource.img // 资源映像,内有内核开机图片和内核设备树信息 (Device Tree Blob)
sudo upgrade_tool di -r recovery.img
sudo upgrade_tool di -s system.img
sudo upgrade_tool di -vendor vendor.img
sudo upgrade_tool di -oem oem.img
备注:编译kernel会生成boot.img kernel.img 和 resource.img,但修改驱动一般只烧写kernel.img
官方Android8.1固件分区表:
2.6 Android编译方法
./FFTools/make.sh -k -j8 # 单独编译kernel
./FFTools/make.sh -u -j8 # 单独编译uboot
./FFTools/make.sh -a -j8 # 单独编译android上层
./FFTools/make.sh -j8 # 同时编译ubooot、kernel、android
2.7 解包RK固件
安装解包软件:
git clone https://github.com/TeeFirefly/rk2918_tools.git
cd rk2918_tools
make
sudo cp afptool img_unpack img_maker mkkrnlimg /usr/local/bin
解包官方固件:
$ cd /path/to/your/firmware/dir
$ img_unpack Firefly-RK3399_20161027.img img
rom version: 6.0.1
build time: 2016-10-27 14:58:18
chip: 33333043
checking md5sum....OK
解包update.img:
$ cd img
$ afptool -unpack update.img update
Check file...OK
------- UNPACK -------
package-file 0x00000800 0x00000280
Image/MiniLoaderAll.bin 0x00001000 0x0003E94E
Image/parameter.txt 0x00040000 0x00000350
Image/trust.img 0x00040800 0x00400000
Image/uboot.img 0x00440800 0x00400000
Image/misc.img 0x00840800 0x0000C000
Image/resource.img 0x0084C800 0x0003FE00
Image/kernel.img 0x0088C800 0x00F5D00C
Image/boot.img 0x017EA000 0x0014AD24
Image/recovery.img 0x01935000 0x013C0000
Image/system.img 0x02CF5000 0x2622A000
RESERVED 0x00000000 0x00000000
UnPack OK!
2.8 合成RK固件[1]
(1) 合成 update.img :
# 当前的目录仍然为 update/ ,内有 package-file, package-file 所列的文件均存在
# 将参数文件拷贝一份到 paramter, 因为 afptool 默认要用到
$ cp Image/parameter.txt parameter
$ afptool -pack . ../update_new.img
------ PACKAGE ------
Add file: ./package-file
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/parameter.txt
Add file: ./Image/trust.img
Add file: ./Image/uboot.img
Add file: ./Image/misc.img
Add file: ./Image/resource.img
Add file: ./Image/kernel.img
Add file: ./Image/boot.img
Add file: ./Image/recovery.img
Add file: ./Image/system.img
Add file: ./RESERVED
Add CRC...
------ OK ------
Pack OK!
(2) 合成 release_update.img :
$ img_maker -rk33 loader.img update_new.img release_update_new.img
generate image...
append md5sum...
success!
参考资料:
[1] 定制Android