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: [email protected]")
$(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=
- 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:[email protected](uboot),[email protected](misc),[email protected](resource),[email protected](kernel),[email protected](boot),[email protected](recovery),[email protected](backup),[email protected](cache),[email protected](userdata),[email protected](metadata),[email protected](kpanic),[email protected](system),[email protected](radical_update),[email protected](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檔案的打包,從而省卻了拷貝檔案的過程。