1. 程式人生 > >RK3128系統&驅動開發分享——(二)、編譯及燒錄

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

[email protected]

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.    //3.system.img的生成過程

  30. if [ -d $OUT/system ]
  31. then
  32.     echo -"create system.img... "
  33.     if [ "$FSTYPE" = "cramfs" ]
  34.     then
  35.         chmod -R 777 $OUT/system
  36.         $FAKEROOT mkfs.cramfs $OUT/system rockdev/Image/system.img
  37.     elif [ "$FSTYPE" = "squashfs" ]
  38.     then
  39.         chmod -R 777 $OUT/system
  40.         mksquashfs $OUT/system rockdev/Image/system.img -all-root >/dev/null
  41.     elif [ "$FSTYPE" = "ext3" ] || [ "$FSTYPE" = "ext4" ]
  42.     then                                                      //ext3或ext4的生成過程
  43.         delta=5120
  44.         num_blocks=`du -sk $OUT/system | tail -n1 | awk '{print $1;}'`
  45.         num_blocks=$(($num_blocks + $delta))
  46.         num_inodes=`find $OUT/system | wc -l`
  47.         num_inodes=$(($num_inodes + 500))
  48.         ok=0
  49.         while [ "$ok" = "0" ]; do
  50.             genext2fs --d $OUT/system -b $num_blocks -N $num_inodes -m 0 rockdev/Image/system.img >/dev/null 2>&&& \
  51.             tune2fs --L system ---i 0 rockdev/Image/system.img >/dev/null 2>&&& \
  52.             ok=|| num_blocks=$(($num_blocks + $delta))
  53.         done
  54.         e2fsck -fy rockdev/Image/system.img >/dev/null 2>&|| true
  55.         delta=1024
  56.         num_blocks=`resize2fs -P rockdev/Image/system.img 2>&| tail -n1 | awk '{print $7;}'`
  57.         rm -f rockdev/Image/system.img
  58.         ok=0
  59.         while [ "$ok" = "0" ]; do
  60.             genext2fs --d $OUT/system -b $num_blocks -N $num_inodes -m 0 rockdev/Image/system.img >/dev/null 2>&&& \
  61.             tune2fs -O dir_index,filetype,sparse_super --L system ---i 0 rockdev/Image/system.img >/dev/null 2>&&& \
  62.             ok=|| num_blocks=$(($num_blocks + $delta))
  63.         done
  64.         e2fsck -fyD rockdev/Image/system.img >/dev/null 2>&|| true
  65.     else
  66.         mkdir -p rockdev/Image/2k rockdev/Image/4k
  67.         mkyaffs2image -c 2032 -s 16 -f $OUT/system rockdev/Image/2k/system.img
  68.         mkyaffs2image -c 4080 -s 16 -f $OUT/system rockdev/Image/4k/system.img
  69.     fi
  70.     echo "done."
  71. fi
  72. 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:[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檔案的打包,從而省卻了拷貝檔案的過程。