跳到主要内容

[TOC]

编译烧写

前期准备

  • 下载rkbin

    这是一个工具包仓库,用于存放RK不开源的bin、脚本、打包工具。U-Boot 编译时会从该仓库索引相关文件,打包生成loader、trust、uboot固件。rkbin和U-Boot工程必须保持同级目录关系。

    仓库下载:请参考附录章节。

  • 下载GCC

    GCC编译器使用gcc-linaro-6.3.1,放置于prebuilts目录之内。prebuilts和U-Boot保持同级目录关系。如下:

    // 32位:
    prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf
    // 64位:
    prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/

    GCC 下载:请参考附录章节

  • 选择defconfig

    芯片defconfig支持kernel dtb说明
    rv1108evb-rv1108_defconfigN\
    rk1808rk1808_defconfigY\
    rk1806rk1806_defconfigY\
    rk3036rk3036_defconfigY\
    rk3128xrk3128x_defconfigY\
    rk3128evb-rk3128_defconfigN\
    rk3126rk3126_defconfigY\
    rk322xrk322x_defconfigY\
    rk3288rk3288_defconfigY\
    rk3368rk3368_defconfigY\
    rk3328rk3328_defconfigY\
    rk3399rk3399_defconfigY\
    rk3399prork3399pro_defconfigY\
    rk3399pro-npurknpu-lion_defconfigY\
    rk3308rk3308_defconfigY\
    rk3308-aarch32rk3308-aarch32_defconfigY\
    px30px30_defconfigY\
    rk3326rk3326_defconfigY\
    rk3326-aarch32rk3326-aarch32_defconfigY\
    rv1126rv1126_defconfigY通用版本
    rv1126rv1126-ab.configY通用版本+支持A/B
    rv1126rv1126-emmc-tb.config
    rv1126-lp3-emmc-tb.config
    rv1126-spi-nor-tb.config
    YeMMC+DDR3 快速开机
    eMMC+LP3 快速开机
    Spi Nor+DDR3 快速开机
    rv1126rv1126-spi-nor-tiny_defconfig
    rv1126-ramboot.config
    rv1126-usbplug.config
    YSpi Nor 小容量
    无存储器件(内存启动)
    usbplug功能
    rk3566rk3566.config
    rk3566-eink.config
    Y通用版本
    电子书版本
    rk3568rk3568_defconfig
    rk3568-dfu.config
    rk3568-nand.config
    rk3568-spl-spi-nand_defconfig
    rk3568-aarch32.config
    rk3568-usbplug.config
    Y通用版本
    支持dfu
    支持MLC/TLC/ eMMC
    SPI-nand专用SPL
    支持aarch32模式
    支持usbplug模式

    注意:如果表格和SDK发布的defconfig不同,请以SDK为准。

  • config fragment介绍

    由于单个平台上产品的差异化需求,一个defconfig已经无法满足。所以从RV1126开始支持config fragment,即对defconfig进行overlay。

    例如:rv1126-emmc-tb.config里指定了CONFIG_BASE_DEFCONFIG="rv1126_defconfig",当执行./make.sh rv1126-emmc-tb 命令时会先用rv1126_defconfig生成.config,然后再使用rv1126-emmc-tb.config里的配置对.config进行overlay。该命令可等效为:

    make rv1126_defconfig rv1126-emmc-tb.config && make

    如果要对config fragment文件进行更新,只需要借助./scripts/sync-fragment.sh。例如:

    ./scripts/sync-fragment.sh configs/rv1126-emmc-tb.config

    命令效果:把当前.config和rv1126_defconfig的配置差异项diff到rv1126-emmc-tb.config文件中。

固件编译

编译命令:

./make.sh [board]               // [board]:configs/[board]_defconfig文件。

首次编译:无论32位或64位平台,第一次或想重新指定defconfig,则编译命令必须指定[board]。例如:

./make.sh rk3399                // build for rk3399_defconfig
./make.sh evb-rk3399 // build for evb-rk3399_defconfig
./make.sh firefly-rk3288 // build for firefly-rk3288_defconfig

二次编译:无论32位或64位平台,如果要基于当前".config"二次编译,则编译命令不用指定[board]:

./make.sh

注意:如果编译时出现奇怪的问题导致编译失败,请尝试make distclean后重新编译。

固件生成:编译完成后会在U-Boot根目录下打包生成:trust、uboot、loader。如下是打包生成时的信息:

// 编译...
....

// uboot打包过程
load addr is 0x60000000!
pack input u-boot.bin
pack file size: 478737
crc = 0x840f163c
uboot version: v2017.12 Dec 11 2017
pack uboot.img success!
pack uboot okay! Input: u-boot.bin

// loader打包过程及引用的ini文件
out:rk3126_loader_v2.09.247.bin
fix opt:rk3126_loader_v2.09.247.bin
merge success(rk3126_loader_v2.09.247.bin)
pack loader okay! Input: /home/cjh/rkbin/RKBOOT/RK3126MINIALL.ini

// trust打包过程及引用的ini文件
load addr is 0x68400000!
pack file size: 602104
crc = 0x9c178803
trustos version: Trust os
pack ./trust.img success!
trust.img with ta is ready
pack trust okay! Input: /home/cjh/rkbin/RKTRUST/RK3126TOS.ini

// 提示编译成功。注意:即使上述的trust和loader打包失败也会提示这句话,说明至少生成了uboot.img
Platform RK3126 is build OK, with new .config(make rk3126_defconfig)

最终在根目录下生成可烧写的固件:

./uboot.img
./trust.img // 注意:如果是fit格式的固件,则没有trust.img。trust的二进制被打包在uboot.img里。
./rk3126_loader_v2.09.247.bin

固件打包工具:请参考工具章节。

固件烧写

烧写工具

Windows/Linux的固件烧写工具建议使用SDK发布的工具版本或最新版本。

烧写模式

RK平台一共有两种烧写模式:Maskrom模式、Loader模式(U-Boot)。

(1)进入Loader烧写模式的方法:

  • 开机时,机器长按音量+
  • 开机时,上位机长按ctrl+d组合键
  • U-Boot命令行输入:download 或者 rockusb 0 $devtype $devnum

(2)进入Maskrom烧写模式的方法:

  • 开机时,上位机长按ctrl+b组合键
  • U-Boot命令行输入:rbrom

注意事项:

  • 目前 U-Boot 支持两种分区表:RK parameter 分区表(旧)和 GPT 分区表(新)。如果想从当前的分区表替换成另外一种分区表类型,则 Nand 机器必须整套固件重新烧写;eMMC 机器可以支持单独替换分区表。

  • 如果机器上同时存在两种分区表,则优先识别GPT分区表。可通过开机信息确认:

    ...
    PartType: EFI // 当前为GPT分区表,否则打印"PartType: RKPARM"
    ...

固件大小

请参考章节:RK架构 => U-Boot固件。

特殊打包

./make.sh 除了编译代码,还集成了固件打包功能。提供了一些额外的独立打包命令供开发者使用。但是使用的前提是已经编译过一次 U-Boot。

非FIT格式:

./make.sh trust              // 打包trust
./make.sh loader // 打包loader
./make.sh trust <ini-file> // 打包trust时指定ini文件,否则使用默认ini文件
./make.sh loader <ini-file> // 打包loader时指定ini文件,否则使用默认ini文件

FIT格式:

// 旧脚本:
./make.sh spl // 用tpl+spl替换ddr和miniloader,打包成loader
./make.sh spl-s // 用spl替换miniloader,打包成loader

// 新脚本:
./make.sh --spl // 用spl替换miniloader,打包成loader
./make.sh --tpl // 用tpl替换ddr,打包成loader
./make.sh --tpl --spl // 用tpl、spl替换ddr、miniloader,打包成loader
./make.sh --spl-new // ./make.sh --spl 命令只打包但不编译,此命令会重新编译再打包。

如何鉴别新旧脚本?如果新命令生效,make.sh就是新脚本。