编译 Linux 固件 获取 SDK 首先准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以"~/proj"为 例 注意: 1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到 板子上 2. 编译环境请使用 Ubuntu18.04(真机或 docker 容器),如果使用其他版本 可能导致编译出错 3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK 4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除 非需要 apt 安装软件) 安装工具 获取 SDK 需要先安装: sudo apt update sudo apt install -y repo git python 初始化仓库 方法一(推荐国内用户使用) SDK 源码放置于压缩包内 下载完成后先验证一下 MD5 码: lvsx@tchip16:~ $ md5sum T36X.7z a0aba53273aedef9ca085266bdad8806 T36X.7z 确认无误后,就可以解压: 7x x T36X.7z Linux IPC SDK 配置介绍 SDK 目录结构说明 注:media 和 sysdrv 可以独立 SDK 编译。 Sysdrv 目录说明 sysdrv 可以独立于 SDK 进行编译,包含 U-Boot、kernel、rootfs 以及一些镜 像打包工具。 编译命令: # 默认全部编译 make all # 编译 U-Boot make uboot_clean make uboot # 编译内核 make kernel_clean make kernel # 编译 rootfs make rootfs_clean make rootfs # 清除编译 make clean # 清除编译并删掉out目录 make distclean # 查看编译配置,比如uboot、kernel详细的编译命令 make info 配置文件介绍 在 "project/cfg/BoardConfig_IPC/" 目录下,有不同板型的配置文件 (xxxx.mk),用于管理 SDK 每个环节的编译配置,相关配置介绍: 分区表说明 SDK 使用 env 分区设置分区表,分区表信息配置在 "/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NOR-NONE- T36_V10-IPC.mk" 里的 RK_PARTITION_CMD_IN_ENV 参数中。 export RK_PARTITION_CMD_IN_ENV="64K(env),128K@64K(idblock),128K(uboot),3M(boot),3M(rootfs),7M(oem),2M(userdata),-(media)" 分区表以字符串的形式保存在配置中,以下是各存储介质的分区表例子。 每个分区的格式为:"[@](part-name)",其中,分区大小和分区 名是必须的,偏移量则因情况而定(见以下注意事项第三点)。在配置分区表时 有以下几点注意事项: 分区之间用英文逗号","隔开。 分区大小的单位有:K/M/G/T/P/E,不区分大小写,无单位则默认为byte;"-"表 示该分区大小为剩余容量。 第一个分区若从 0x0 地址开始时,不加偏移量,反之,则必须添加偏移量。后 续分区任意选择是否添加偏移量。 idblock 分区的偏移和大小是固定的,请勿修改。 不建议修改 env 分区名。(如果要修改 env 地址和大小,需要修改对应 U-Boot 的 defconfig 配置CONFIG_ENV_OFFSET 和 CONFIG_ENV_SIZE,重新生成 固件,擦除板端 0 地址的 env 数据,再烧录新的固件) 编译 RKIPC 固件 本章介绍 RKIPC 固件的编译流程,推荐在 Ubuntu 18.04 系统环境下进行开发 ,若使用其它系统版本,可能需要对编译环境做相应调整。 准备工作 搭建编译环境 sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \ expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \ qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \ unzip \ device-tree-compiler ncurses-dev \ 编译 SDK CT36L 编译前配置 在 "project/cfg/BoardConfig_IPC/" 目录下,有不同板型的配置文件,选择配 置文件 14 : ./build.sh lunch ... # 此处省略其他版型的配置文件 ... ---------------------------------------------------------------- 14. BoardConfig_IPC/BoardConfig-SPI_NOR-NONE-RV1106_T36_V10-IPC.mk boot medium(启动介质): SPI_NOR power solution(电源方案): NONE hardware version(硬件版本): RV1106_T36_V10 application(应用场景): IPC ---------------------------------------------------------------- Which would you like? [0]: 14 [build.sh:info] switching to board: /home/lvsx/project/rv1106/test/T36X/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NOR-NONE-RV1106_T36_V10-IPC.mk [build.sh:info] Running build_select_board succeeded. CT36B 编译前配置 在 "project/cfg/BoardConfig_IPC/" 目录下,有不同板型的配置文件,选择配 置文件 4 : ./build.sh lunch ... # 此处省略其他版型的配置文件 ... ---------------------------------------------------------------- 4. BoardConfig_IPC/BoardConfig-EMMC-NONE-RV1106_T36B_V10-IPC.mk boot medium(启动介质): EMMC power solution(电源方案): NONE hardware version(硬件版本): RV1106_T36B_V10 application(应用场景): IPC ---------------------------------------------------------------- Which would you like? [0]: 4 [build.sh:info] switching to board: /home/lvsx/project/rv1106/test/T36X/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-NONE-RV1106_T36B_V10-IPC.mk [build.sh:info] Running build_select_board succeeded. 编译 全自动编译 全自动编译会执行上述编译、打包操作,生成 RKIPC 固件。 ./build.sh 打包固件,生成的完整固件会保存到 "output/image/" 目录。 部分编译 编译 u-boot ./build.sh clean uboot ./build.sh uboot # ./build.sh info 可以查看uboot详细的编译命令格式 生成镜像文件:output/image/download.bin、output/image/idblock.img 和 output/image/uboot.img 编译 kernel ./build.sh clean kernel ./build.sh kernel # ./build.sh info 可以查看kernel详细的编译命令格式 生成镜像文件:output/image/boot.img 编译 rootfs ./build.sh clean rootfs ./build.sh rootfs 编译后使用 ./build.sh firmware 命令打包成 rootfs.img 生成镜像文件: output/image/rootfs.img 编译 media ./build.sh clean media ./build.sh media 生成文件的存放目录:output/out/media_out 编译参考应用 ./build.sh clean app ./build.sh app 生成文件的存放目录:output/out/app_out 注:app 依赖 media 编译内核驱动 ./build.sh clean driver ./build.sh driver 生成文件的存放目录:output/out/sysdrv_out/kernel_drv_ko/ 打包 env.img ./build.sh env env.img是用uboot的mkenvimage工具进行打包。 env.img打包命令格式: mkenvimage -s $env_partition_size -p 0x0 -o env.img env.txt 注意:不同的存储介质,$env_partition_size 不一样,具体查看分区表说明 查看env.img内容: strings env.img # 例如eMMC的env.txt内容 blkdevparts=mmcblk0:32K(env),512K@32K(idblock),256K(uboot),32M(boot),2G(rootfs),1 G(oem),2G(userdata),-(media) sys_bootargs=root=/dev/mmcblk0p5 rk_dma_heap_cma=64M rootfstype=ext4 注意:不同的存储介质,env.img内容会不一样,可以用 strings env.img 查看 。 blkdevparts和sys_bootargs会被uboot传递给内核,并覆盖内核对应 bootargs的参数。 打包固件 ./build.sh firmware 生成文件的存放目录: output/image