烧录工具及文档:链接:https://pan.baidu.com/s/1jIvihSE 密码:y67p
本文主要讲解三部分:
一、编译原理流程讲解
二、打包脚本讲解
三、生成文件及烧录讲解
一、编译原理流程讲解
. build/envsetup.sh 配置命令环境(运行源码目录下的build.sh即可)
lunch选择编译项目
make installclean 清除编译
make -j4 编译(4代表多核编译)
make otapackage -j4 编译ota包
make基于源码根目录下的的Makefile运行,关于make及makefile语法及安卓mk文件原理不做讲解。
源码根目录下Makefile内容如下:
### DO NOT EDIT THIS FILE ###
include build/core/main.mk
-include device/rockchip/common/prebuild.mk
### DO NOT EDIT THIS FILE ###
此文件引用/build/core目录下mk文件,因此编译image的makefile文件为此目录下的MakeFile文件。
除了make还可以直接执行make systemimage、make bootimage等,就是在这个文件里实现的。
MakeFile中生成boot.img的方法:
$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
$(call pretty,"Target boot image: $@")
$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@
MakeFile中生成ramdisk.img的方法:
BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
以上编译用到了安卓的编译工具。查看MakeFile中的.PHONY伪目标可以找到对应img文件编译的makefile语句。
二、打包脚本讲解
打包脚本文件为源码目录下的mkimage.sh(. mkimage.sh otapackage 是打包ota zip包)
//1.boot.img的生成过程
- if [ $TARGET == $BOOT_OTA ] //TARGET=withoutkernel, BOOT_OTA=ota不相等,执行else
- then
- echo "make ota images... "
- echo -n "create boot.img with kernel... "
- [ -d $OUT/root ] && \
- mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \
- mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk.img --output $OUT/boot.img && \
- cp -a $OUT/boot.img rockdev/Image/
- echo "done."
- else
- echo -n "create boot.img without kernel... "
- [ -d $OUT/root ] && \ //目录out/target/product/rk30sdk/root存在
- mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \ //1.将root下的每个文件加上cpio头+每个文件的内容,打包成cpios格式
- rkst/mkkrnlimg $OUT/ramdisk.img rockdev/Image/boot.img //2. 将这个cpio文件用gzip压缩后写到文件ramdisk.img中
- echo "done." //3. mkkrnlimg会对ramdisk.img加上8个字节的头标志,尾部加上4个字字
- fi
- //2.recovery.img的生成过程
- echo -n "create recovery.img with kernel... "
- [ -d $OUT/recovery/root ] && \
- mkbootfs $OUT/recovery/root | minigzip > $OUT/ramdisk-recovery.img && \
- mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk-recovery.img --output $OUT/recovery.img && \
- cp -a $OUT/recovery.img rockdev/Image/
- echo "done."
- echo -n "create misc.img.... "
- cp -a rkst/Image/misc.img rockdev/Image/misc.img
- cp -a rkst/Image/pcba_small_misc.img rockdev/Image/pcba_small_misc.img
- cp -a rkst/Image/pcba_whole_misc.img rockdev/Image/pcba_whole_misc.img
- echo "done."
-
- //3.system.img的生成过程
- if [ -d $OUT/system ]
- then
- echo -n "create system.img... "
- if [ "$FSTYPE" = "cramfs" ]
- then
- chmod -R 777 $OUT/system
- $FAKEROOT mkfs.cramfs $OUT/system rockdev/Image/system.img
- elif [ "$FSTYPE" = "squashfs" ]
- then
- chmod -R 777 $OUT/system
- mksquashfs $OUT/system rockdev/Image/system.img -all-root >/dev/null
- elif [ "$FSTYPE" = "ext3" ] || [ "$FSTYPE" = "ext4" ]
- then //ext3或ext4的生成过程
- delta=5120
- num_blocks=`du -sk $OUT/system | tail -n1 | awk '{print $1;}'`
- num_blocks=$(($num_blocks + $delta))
- num_inodes=`find $OUT/system | wc -l`
- num_inodes=$(($num_inodes + 500))
- ok=0
- while [ "$ok" = "0" ]; do
- genext2fs -a -d $OUT/system -b $num_blocks -N $num_inodes -m 0 rockdev/Image/system.img >/dev/null 2>&1 && \
- tune2fs -j -L system -c -1 -i 0 rockdev/Image/system.img >/dev/null 2>&1 && \
- ok=1 || num_blocks=$(($num_blocks + $delta))
- done
- e2fsck -fy rockdev/Image/system.img >/dev/null 2>&1 || true
- delta=1024
- num_blocks=`resize2fs -P rockdev/Image/system.img 2>&1 | tail -n1 | awk '{print $7;}'`
- rm -f rockdev/Image/system.img
- ok=0
- while [ "$ok" = "0" ]; do
- genext2fs -a -d $OUT/system -b $num_blocks -N $num_inodes -m 0 rockdev/Image/system.img >/dev/null 2>&1 && \
- tune2fs -O dir_index,filetype,sparse_super -j -L system -c -1 -i 0 rockdev/Image/system.img >/dev/null 2>&1 && \
- ok=1 || num_blocks=$(($num_blocks + $delta))
- done
- e2fsck -fyD rockdev/Image/system.img >/dev/null 2>&1 || true
- else
- mkdir -p rockdev/Image/2k rockdev/Image/4k
- mkyaffs2image -c 2032 -s 16 -f $OUT/system rockdev/Image/2k/system.img
- mkyaffs2image -c 4080 -s 16 -f $OUT/system rockdev/Image/4k/system.img
- fi
- echo "done."
- fi
- chmod a+r -R rockdev/Image/
三、生成文件及烧录讲解
烧录工具及方法:链接:https://pan.baidu.com/s/1jIvihSE 密码:y67p
有三种烧录方法:1、各分区文件分别烧录2、update.img打包文件烧录3、ota文件烧录
这里不介绍具体的方法,方法参见上面文档即可。这里主要讲解
1、各分区文件的作用
2、update.img文件的打包方法
3、ota文件打包方法
1、各分区文件作用
Loader.bin:系统启动必须的引导文件bootloader,即rk3128MiniLoaderAll(L)_V2.31.bin
Paremeter 分区信息表:
FIRMWARE_VER:5.0.2
MACHINE_MODEL:rk312x
MACHINE_ID:007
MANUFACTURER:RK30SDK
MAGIC: 0x5041524B
ATAG: 0x60000800
MACHINE: 312x
CHECK_MASK: 0x80
KERNEL_IMG: 0x60408000
#RECOVER_KEY: 1,1,0,20,0
CMDLINE:console=ttyFIQ0 androidboot.baseband=N/A androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),0x00006000@0x0000E000(kernel),0x00006000@0x00014000(boot),0x00010000@0x0001A000(recovery),0x00020000@0x0002A000(backup),0x00100000@0x0004A000(cache),0x001FE000@0x0014A000(userdata),0x00008000@0x00348000(metadata),0x00002000@0x00350000(kpanic),0x00200000@0x00352000(system),0x00020000@0x00552000(radical_update),-@0x00572000(user)
前面是关于机器固件版本,机器型号,机器制造厂商的信息,后面是一些分区信息。
uboot.img
二级loader,由rk3128MiniLoaderAll(L)_V2.31.bin启动
Misc.img
cpu加电之后,启动bootloader,(即是rk3128MiniLoaderAll(L)_V2.31.bin),然后启动二级loader,就会读取MISC分区第一块的内容, 决定进入recovery模式还是升级基带Baseband Processor(BP)或做其它事情。而更改Misc内容的操作为按下某个按键或者用户设置系统。
kernel.img
内核镜像,经过编译得出zImage,即为Kernel.img。或者SDK包直接附带。
boot.img
系统bootload启动之后,进入正常启动模式,就会读取boot.img进去系统正常模式。
boot.img包括了kernel.img镜像和一个根文件系统(rootfs 即打包的ramdisk.img)
recovery.img
系统bootload启动之后,通过读取Misc分区的内容,确认如果是进入Recovery模式的话,进去读取Recovery.img。
recovery.img包括了一个kernel.img与一个根文件系统(rootfs),kernel镜像与boot,img的完全一样。
system.img
系统库等、自己的APP也可以打包进去
2、update.img文件的打包方法
/RKTools/目录下有对应的工具,包含linux版本工具和windows版本工具。
linux工具在/RKTools/linux/Linux_Pack_Firmware/rockdev目录下。根据里面的readme.txt操作即可,说明如下:
**************Generate update.img******************
1.copy image to "rockdev/Image"
2.copy loader to "rockdev"
3.modify parameter and package-file
4.run mkupdate.sh to make update.img in "rockdev"
***************************************************
**************Unpack update.img********************
run unpack.sh
unpacking file in the "output"
***************************************************
windows工具在/RKTools/windows/AndroidTool/rockdev目录下:
使用步骤
首先,拷贝文件loader文件到工具所在目录下及backkupimage子目录下(如果没有子目录要重建),拷贝各img文件到Image子目录下,拷贝parameter.txt文件到工具所在目录下(名字可能不完全一样。mkimage.sh打包文件后面几句就是拷贝loader和parameter.txt文件的脚本,这里使用脚本里面拷贝的文件即可)。parameter.txt文件也需要拷贝到backupimage子目录下。
然后,修改工具目录下的package-file文件,主要修改对应的文件名。并将这个文件考虑一份到backupimage子目录下。
最后,运行mkupdate.bat即可生成update.img到工具目录下,生成过程会有成功提示。
3、ota文件打包方法
首先编译make otapackage -j4 编译ota包
其次打包
. mkimage.sh ota
生成的ota包在/out/target/product/rk312x目录下。
可以考虑用shell脚本实现update.img文件的打包,从而省却了拷贝文件的过程。