RK3128系统&驱动开发分享——(二)、编译及烧录

烧录工具及文档:链接: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的生成过程

  1. if [ $TARGET == $BOOT_OTA ]   //TARGET=withoutkernel, BOOT_OTA=ota不相等,执行else
  2. then
  3.     echo "make ota images... "
  4.     echo -"create boot.img with kernel... "
  5.     [ -d $OUT/root ] && \
  6.     mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \
  7.     mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk.img --output $OUT/boot.img && \
  8.     cp -a $OUT/boot.img rockdev/Image/
  9.     echo "done."
  10. else
  11.     echo -"create boot.img without kernel... "
  12.     [ -d $OUT/root ] && \                                    //目录out/target/product/rk30sdk/root存在
  13.     mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \    //1.将root下的每个文件加上cpio头+每个文件的内容,打包成cpios格式
  14.     rkst/mkkrnlimg $OUT/ramdisk.img rockdev/Image/boot.img   //2. 将这个cpio文件用gzip压缩后写到文件ramdisk.img中
  15.     echo "done."                                             //3. mkkrnlimg会对ramdisk.img加上8个字节的头标志,尾部加上4个字字
  16. fi
  17.     //2.recovery.img的生成过程
  18.     echo -"create recovery.img with kernel... "
  19.     [ -d $OUT/recovery/root ] && \
  20.     mkbootfs $OUT/recovery/root | minigzip > $OUT/ramdisk-recovery.img && \
  21.     mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk-recovery.img --output $OUT/recovery.img && \
  22.     cp -a $OUT/recovery.img rockdev/Image/
  23.     echo "done."

  24.     echo -"create misc.img.... "
  25.     cp -a rkst/Image/misc.img rockdev/Image/misc.img
  26.     cp -a rkst/Image/pcba_small_misc.img rockdev/Image/pcba_small_misc.img
  27.     cp -a rkst/Image/pcba_whole_misc.img rockdev/Image/pcba_whole_misc.img
  28.     echo "done."
  29.    
  30.    //3.system.img的生成过程

  31. if [ -d $OUT/system ]
  32. then
  33.     echo -"create system.img... "
  34.     if [ "$FSTYPE" = "cramfs" ]
  35.     then
  36.         chmod -R 777 $OUT/system
  37.         $FAKEROOT mkfs.cramfs $OUT/system rockdev/Image/system.img
  38.     elif [ "$FSTYPE" = "squashfs" ]
  39.     then
  40.         chmod -R 777 $OUT/system
  41.         mksquashfs $OUT/system rockdev/Image/system.img -all-root >/dev/null
  42.     elif [ "$FSTYPE" = "ext3" ] || [ "$FSTYPE" = "ext4" ]
  43.     then                                                      //ext3或ext4的生成过程
  44.         delta=5120
  45.         num_blocks=`du -sk $OUT/system | tail -n1 | awk '{print $1;}'`
  46.         num_blocks=$(($num_blocks + $delta))

  47.         num_inodes=`find $OUT/system | wc -l`
  48.         num_inodes=$(($num_inodes + 500))

  49.         ok=0
  50.         while [ "$ok" = "0" ]; do
  51.             genext2fs --d $OUT/system -b $num_blocks -N $num_inodes -m 0 rockdev/Image/system.img >/dev/null 2>&&& \
  52.             tune2fs --L system ---i 0 rockdev/Image/system.img >/dev/null 2>&&& \
  53.             ok=|| num_blocks=$(($num_blocks + $delta))
  54.         done
  55.         e2fsck -fy rockdev/Image/system.img >/dev/null 2>&|| true

  56.         delta=1024
  57.         num_blocks=`resize2fs -P rockdev/Image/system.img 2>&| tail -n1 | awk '{print $7;}'`
  58.         rm -f rockdev/Image/system.img
  59.         ok=0
  60.         while [ "$ok" = "0" ]; do
  61.             genext2fs --d $OUT/system -b $num_blocks -N $num_inodes -m 0 rockdev/Image/system.img >/dev/null 2>&&& \
  62.             tune2fs -O dir_index,filetype,sparse_super --L system ---i 0 rockdev/Image/system.img >/dev/null 2>&&& \
  63.             ok=|| num_blocks=$(($num_blocks + $delta))
  64.         done
  65.         e2fsck -fyD rockdev/Image/system.img >/dev/null 2>&|| true
  66.     else
  67.         mkdir -p rockdev/Image/2k rockdev/Image/4k
  68.         mkyaffs2image -c 2032 -s 16 -f $OUT/system rockdev/Image/2k/system.img
  69.         mkyaffs2image -c 4080 -s 16 -f $OUT/system rockdev/Image/4k/system.img
  70.     fi
  71.     echo "done."
  72. fi

  73. chmod a+-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文件的打包,从而省却了拷贝文件的过程。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值