【RK1126】SDK编译

目录介绍

  • buildroot:定制根文件系统。
  • app:存放上层应用程序。
  • external:相关库,包括音频、视频等。
  • kernel:kernel代码。
  • device/rockchip:存放每个平台的一些编译和打包固件的脚本和预备文件。
  • docs:存放开发指导文件、平台支持列表、工具使用文档、Linux 开发指南等。
  • prebuilts:存放交叉编译工具链。
  • rkbin:存放固件和工具。
  • rockdev:存放编译输出固件。
  • tools:存放一些常用工具。
  • u-boot:U-Boot代码。

一、第一次编译

  • 在工程的根目录下执行命令source envsetup.sh会出现很多选项,选择rockchip_rv1126_rv1109_spi_nand(SDK2.2是选项 99)。
  • 在工程的根目录下执行./build.sh lunch,这时会出现很多选项,选择BoardConfig-38x38-spinand.mk(SDK2.2是选项 3)。
  • 单独编译U-Boot在工程根目录下执行命令./build.sh uboot
  • 单独编译Linux Kernel在工程根目录下执行命令./build.sh kernel
  • 单独编译Buildroot文件系统在工程根目录下执行命令./build.sh buildroot
  • 单独编译Recovery文件在系统在工程根目录下执行命令./build.sh recovery
  • 生成固件文件文件在系统在工程根目录下执行命令./build.sh firmware
  • 打包更新文件文件在系统在工程根目录下执行命令./build.sh updateimg
    • 生成的update.img文件在工程根目录/rockdev文件夹内
  • 清除所有配置和生成文件在工程根目录下执行命令./build.sh cleanall

方式1:进行全自动编译(包括U-BOOT、Kernal、Buildroot、Recovery编译)

sudo ./build.sh all

注:第一次编译会花费很多时间,尽可能保持网络畅通

方式2:分别进行编译

sudo ./build.sh uboot  # U-BOOT编译
sudo ./build.sh kernel   # Kernal编译
sudo ./build.sh buildroot   # Buildroot编译
sudo ./build.sh recovery   # Recovery编译
  • 查看编译帮助信息:./build.sh -h
liefyuan@ubuntu:~/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512$ ./build.sh -h
Usage: build.sh [OPTIONS]
Available options:
BoardConfig*.mk    -switch to specified board config
lunch              -list current SDK boards and switch to specified board config
uboot              -build uboot
spl                -build spl
loader             -build loader
kernel             -build kernel
modules            -build kernel modules
toolchain          -build toolchain
rootfs             -build default rootfs, currently build buildroot as default
buildroot          -build buildroot rootfs
ramboot            -build ramboot image
multi-npu_boot     -build boot image for multi-npu board
yocto              -build yocto rootfs
debian             -build debian10 buster/x11 rootfs
distro             -build debian10 buster/wayland rootfs
pcba               -build pcba
recovery           -build recovery
all                -build uboot, kernel, rootfs, recovery image
cleanall           -clean uboot, kernel, rootfs, recovery
firmware           -pack all the image we need to boot up system
updateimg          -pack update image
otapackage         -pack ab update otapackage image (update_ota.img)
sdpackage          -pack update sdcard package image (update_sdcard.img)
save               -save images, patches, commands used to debug
allsave            -build all & firmware & updateimg & save
check              -check the environment of building
info               -see the current board building information
app/<pkg>          -build packages in the dir of app/*
external/<pkg>     -build packages in the dir of external/*

Default option is 'allsave'.

二、配置uboot

(1) u-boot 配置说明

使用 menuconfig 配置 U-Boot,选择需要的模块,最后保存退出。
rv1126_defconfig 文件在目录 u-boot/configs
命令格式:make “RK_UBOOT_DEFCONFIG”_defconfig
RK_UBOOT_DEFCONFIG 定义在./build.sh 选择的 BoardConfig*.mk

先进入压缩包目录然后按照以下命令

  • cd u-boot
  • make rv1126_defconfig
  • make menuconfig

保存配置到对应的文件 rv1126_defconfig

make savedefconfig
cp defconfig configs/rv1126_defconfig

(2)U-Boot 编译

进入到压缩包根目录执行./build.sh uboot

三、配置Kernel

  • (1)Kernel 配置说明
    执行以下命令前先保证处在工程根目录下

例如 device/rockchip/rv1126_rv1109/BoardConfig-38x38-spi-nand.mk
./build.sh device/rockchip/rv1126_rv1109/BoardConfig-38x38-spi-nand.mk
cd kernel
命 令 格 式 : make ARCH=arm “RK_KERNEL_DEFCONFIG”
“RK_KERNEL_DEFCONFIG_FRAGMENT” ### RK_KERNEL_DEFCONFIG 和 RK_KERNEL_DEFCONFIG_FRAGMENT 都定义在./build.sh 选择的 BoardConfig*.mk
RK_KERNEL_DEFCONFIG_FRAGMENT 是可选项,具体看 BoardConfig*.mk
配置。

进入kernel目录

  • cd kernel
  • make ARCH=arm rv1126_defconfig
  • make ARCH=arm menuconfig

保存修改后的配置

  • make ARCH=arm savedefconfig
  • cp defconfig arch/arm/configs/rv1126_defconfig

退出到SDK根目录进行Kernel 编译
执行下面命令之前要保证在工程根目录下

cd ../
./build.sh kernel

在这里插入图片描述

以上 Running build_kernel succeeded.表示编译内核成功。

四、配置buildroot文件系统

(1)目录 app 和 external 里的工程编译方法以及 Rootfs 配置说明

  1. 先 SDK 根目录查看 Board Config 对应的 rootfs 是哪个配置
    ./build.sh -h rootfs
$ ./build.sh -h rootfs
###Current SDK Default [ rootfs ] Build Command###
source envsetup.sh rockchip_rv1126_rv1109_spi_nand
make

2.根据第一步的信息运行一下 source buildroot 对 应 的 defconfig
source envsetup.sh rockchip_rv1126_rv1109_spi_nand

Top of tree: /home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512
===========================================

#TARGET_BOARD=rv1126
#OUTPUT_DIR=output/rockchip_rv1126_rv1109_spi_nand
#CONFIG=rockchip_rv1126_rv1109_spi_nand_defconfig

===========================================
make: Entering directory '/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot'
  GEN     /home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/Makefile
/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/build/defconfig_hook.py -m /home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/configs/rockchip_rv1126_rv1109_spi_nand_defconfig /home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/.rockchipconfig
BR2_DEFCONFIG='' KCONFIG_AUTOCONFIG=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/build/buildroot-config/auto.conf KCONFIG_AUTOHEADER=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/build/buildroot-config/autoconf.h KCONFIG_TRISTATE=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/build/buildroot-config/tristate.config BR2_CONFIG=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/.config HOST_GCC_VERSION="7" BUILD_DIR=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/build SKIP_LEGACY= BR2_DEFCONFIG=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/configs/rockchip_rv1126_rv1109_spi_nand_defconfig /home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/build/buildroot-config/conf --defconfig=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/.rockchipconfig Config.in
/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/.rockchipconfig:116:warning: override: reassigning to symbol BR2_PACKAGE_RKSCRIPT
#
# configuration written to /home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot/output/rockchip_rv1126_rv1109_spi_nand/.config
#
make: Leaving directory '/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/buildroot'

  1. 使用 menuconfig 配置文件系统,选择需要的模块,最后保存退出。

在工程根目录下:make menuconfig # 进入 menuconfig 后,按“/"进入查找模式,输入 BR2_PACKAGE_IPC_DAEMON

    1. 保存到 rootfs 配置文件

在工程根目录下:make savedefconfig

然后再编译文件系统。

五、编译应用程序

  • 配置交叉编译器(使用SDK自带的)当前终端配置:export PATH=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH
  • 测试交叉编译器版本:
$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/liefyuan/rv1126/RV1126_RV1109_LINUX_SDK_V2.1.0_20210512/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/8.3.0/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/src/gcc/configure --target=arm-linux-gnueabihf --prefix= --with-sysroot=/arm-linux-gnueabihf/libc --with-build-sysroot=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/install//arm-linux-gnueabihf/libc --with-bugurl=https://bugs.linaro.org/ --enable-gnu-indirect-function --enable-shared --disable-libssp --disable-libmudflap --enable-checking=release --enable-languages=c,c++,fortran --with-gmp=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpfr=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-mpc=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-isl=/tmp/dgboter/bbs/rhev-vm8--rhe6x86_64/buildbot/rhe6x86_64--arm-linux-gnueabihf/build/build-arm-linux-gnueabihf/host-tools --with-arch=armv7-a --with-fpu=neon --with-float=hard --with-arch=armv7-a --with-pkgversion='GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)'
Thread model: posix
gcc version 8.3.0 (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 
  • 编译应用程序:$ arm-linux-gnueabihf-gcc evtest.c -o evtest

六、编译测试应用程序 rkmedia

6.1 编译自带的rkmedia例程

位置在SDK的/external/rkmedia/example

  • 在工程根目录下执行:./build.sh external/rkmedia

源码文件地址:SDK根目录/external/rkmedia/examples
要想编译这些例程,需要以下步骤:

  • 重新配置板子配置文件:在工程的根目录下执行命令“source envsetup.sh”选择配置文件“rockchip_rv1126_rv1109”SDK1.8是78选项就输入78回车。
  • 重新配置编译文件:在工程的根目录下执行 “./build.sh lunch”选择配置文件“BoardConfigaybering.mk”SDK1.8是选项4。
  • 最后就是编译:./build.sh external/rkmedia

编译完成之后,可执行文件和源码都会被拷贝到目录:/SDK根目录/buildroot/Output/rockchip_rv1126_rv1109/build/rkmedia/examples目录下,如果对该目录下的源码有修改,只需要在本目录make一下就可以重新编译了。

6.2 添加自己的代码然后编译

自己参考rkmedia的例程源码玩玩,将代码放到目录/external/rkmedia/example下,然后再目录/external/rkmedia/example下的CMakeLists.txt文件中添加(假设rkmedia_vi_venc_local_file_test就是你的代码文件的名字):

#--------------------------
# rkmedia_vi_venc_local_file_test
#--------------------------
add_executable(rkmedia_vi_venc_local_file_test rkmedia_vi_venc_local_file_test.c ${COMMON_SRC})
add_dependencies(rkmedia_vi_venc_local_file_test easymedia)
target_link_libraries(rkmedia_vi_venc_local_file_test easymedia)
target_include_directories(rkmedia_vi_venc_local_file_test PRIVATE ${CMAKE_SOURCE_DIR}/include)
install(TARGETS rkmedia_vi_venc_local_file_test RUNTIME DESTINATION "bin")

添加以后需要
重复编译这些例程,需要以下步骤:

  • 重新配置板子配置文件:在工程的根目录下执行命令“source envsetup.sh”选择配置文件“rockchip_rv1126_rv1109”SDK1.8是78选项就输入78回车。
  • 重新配置编译文件:在工程的根目录下执行 “./build.sh lunch”选择配置文件“BoardConfig-aybering.mk”SDK1.8是选项4。
  • 最后就是编译:./build.sh

七、Qt

要运行需要添加:
进入rv1126命令行,执行以下命令:

export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90

八、LVGL

九、自己构建工程环境

参考:简单导出rv1126工程环境

如上面,在/external/rkmedia目录下有很多例程,自己想做点东西可以参考里面的例程综合起来就可以了,但是自己的代码编译起来很麻烦,如果自己想建一个工程不太容易编译出来。

自己编写应用程序,可以在buildroot/output/rockchip_rv1126_rv1109/build/rkmedia 这个目录下开发。

先看下这个目录下的CMakeLists.txt文件内容

# rkmedia_vi_venc_rtsp_test
#--------------------------
link_directories(${PROJECT_SOURCE_DIR}/librtsp/)
add_executable(rkmedia_vi_venc_rtsp_test rkmedia_vi_venc_rtsp_test.c ${COMMON_SRC})
add_dependencies(rkmedia_vi_venc_rtsp_test easymedia)
target_link_libraries(rkmedia_vi_venc_rtsp_test easymedia rtsp)
target_include_directories(rkmedia_vi_venc_rtsp_test PRIVATE ${CMAKE_SOURCE_DIR}/include)
install(TARGETS rkmedia_vi_venc_rtsp_test RUNTIME DESTINATION "bin")
.

cmake已经帮我们做好了,指定需要的库和头文件,我们只需要照葫芦画瓢就行,

在后面添加想要编译程序

# your_app_rk_test\
....
link_directories(${PROJECT_SOURCE_DIR}/librtsp/)
add_executable(your_app_rk_test your_app_rk_test.c ${COMMON_SRC})
add_dependencies(your_app_rk_test easymedia)
target_link_libraries(your_app_rk_test easymedia rtsp)
target_include_directories(your_app_rk_test PRIVATE ${CMAKE_SOURCE_DIR}/include)
install(TARGETS your_app_rk_test RUNTIME DESTINATION "bin")
.....

“cmake .” 生成Makefile文件。

"make " 编译即可得到可执行文件。

接下来,介绍怎么建立自己工程环境。

9.1 建立自己的工程环境

突破口:

cmake编译以后,可以看到CMakeFiles目录生成一些中间文件,着重看flags.make、build.make和link.txt, 这几个文件是重要的突破口。

找到rkmedia\examples\CMakeFiles\rkmedia_vi_vo_test.dir,有对rkmedia_vi_vo_test…c文件编译的依赖描述,编译命令等。

  • flags.make:主要添加头文件路径,以及预编译选项C_FLAGS
  • build.make:添加要一起编译的.c文件
  • link.txt:里面是编译生成可执行文件的命令。

flags.make 经过整理

# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.10

# compile C with kk/bin/arm-linux-gnueabihf-gcc
C_FLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os -DUSE_UPDATEENGINE=ON -DSUCCESSFUL_BOOT=ON  -DNDEBUG   -Wall -Wextra -Wshadow -ffast-math -fPIC -Werror -g -O0 -ggdb -gdwarf -funwind-tables -rdynamic

C_DEFINES = -DAUDIO_ALGORITHM_ENABLE -DLIBDRM -DRKAIQ

C_INCLUDES = -I/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/build/rkmedia/. 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/a3dlut 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/ablc 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/accm 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/acp 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/adebayer 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/adehaze 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/adpcc 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/ae 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/af 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/agamma 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/ahdr 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/aie 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/alsc 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/anr 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/aorb 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/asd 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/asharp 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos/awb 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/common 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/iq_parser 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/uAPI 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/xcore 
-Ikk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/libdrm 
-I/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/build/rkmedia/include/easymedia 
-I/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/build/rkmedia/include/rkmedia 
-I/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/build/rkmedia/include
 -isystem kk/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq 

只需知道需要用到哪些头文件以及头文件路径。

build.make:

...
examples/rkmedia_vi_vo_test: examples/CMakeFiles/rkmedia_vi_vo_test.dir/rkmedia_vi_vo_test.c.o
examples/rkmedia_vi_vo_test: examples/CMakeFiles/rkmedia_vi_vo_test.dir/common/sample_common_isp.c.o
examples/rkmedia_vi_vo_test: examples/CMakeFiles/rkmedia_vi_vo_test.dir/common/sample_fake_isp.c.o
examples/rkmedia_vi_vo_test: examples/CMakeFiles/rkmedia_vi_vo_test.dir/build.make
examples/rkmedia_vi_vo_test: src/libeasymedia.so.1.0.1
examples/rkmedia_vi_vo_test: /home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/libliveMedia.so
examples/rkmedia_vi_vo_test: /home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/libgroupsock.so
examples/rkmedia_vi_vo_test: /home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/libBasicUsageEnvironment.so
examples/rkmedia_vi_vo_test: /home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/libUsageEnvironment.so
examples/rkmedia_vi_vo_test: /home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/librkaiq.so
....

link.txt,经过整理

/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/bin/arm-linux-gnueabihf-gcc 
--sysroot=/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot 
-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os -DUSE_UPDATEENGINE=ON -DSUCCESSFUL_BOOT=ON  -DNDEBUG  -rdynamic 
CMakeFiles/rkmedia_vi_vo_test.dir/rkmedia_vi_vo_test.c.o 

CMakeFiles/rkmedia_vi_vo_test.dir/common/sample_common_isp.c.o 
CMakeFiles/rkmedia_vi_vo_test.dir/common/sample_fake_isp.c.o  -o rkmedia_vi_vo_test  


-L/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/build/rkmedia/examples/librtsp 
-Wl,-rpath,/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/build/rkmedia/examples/librtsp:
/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/build/rkmedia/src: 
../src/libeasymedia.so.1.0.1 -ldrm -lrockchip_mpp -lliveMedia -lgroupsock -lBasicUsageEnvironment -lUsageEnvironment -lpthread -lasound -lRKAP_3A -lRKAP_ANR -lRKAP_Common -lv4l2 -lrga -lRKAP_3A -lRKAP_ANR -lRKAP_Common -lv4l2 -lrga -lrknn_runtime -lrknn_api -lrockface -lsqlite3 -lmd_share -lod_share -lrockx 
/home/zhao-debug/1126rv/0.2.20_SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/librkaiq.so 

这里需要有一个注意就是 --sysroot= ,加入这个选项,编译器会在这个目录的./usr/lib 和 ./usr/include 找对应的库和头文件。

整理,我们大概知道需要用到哪些库以及头文件。

库路径:

sysroot/usr/lib
rkmedia/src

需要的库:

libeasymedia.so.1.0.1
-lUsageEnvironment -lpthread -lasound -lRKAP_3A -lRKAP_ANR 
-lRKAP_Common -lv4l2 -lrga -lRKAP_3A -lRKAP_ANR -lRKAP_Common 
-lv4l2 -lrga -lrknn_runtime -lrknn_api -lrockface -lsqlite3 -lmd_share 
-lod_share -lrockx 
/usr/lib/librkaiq.so

额外目标文件:

sample_common_isp.c.o    sample_fake_isp.c.o

头文件路径:

sysroot/usr/include
sysroot/usr/include/rkaiq/common 
sysroot/usr/include/rkaiq/iq_parser 
sysroot/usr/include/rkaiq/uAPI 
sysroot/usr/include/rkaiq/xcore 
sysroot/usr/include/libdrm 

rkmedia/include/easymedia
include/rkmedia
rkmedia/include

编译器路径是

buildroot/output/rockchip_rv1126_rv1109/host/bin/arm-linux-gnueabihf-gcc 

大部分库路径和头文件在下面目录的lib和库

SDK/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot

简单粗暴点,直接打包压缩SDK/buildroot/output/rockchip_rv1126_rv1109/host目录

tar zcvf host.tar.gz host

将压缩包放在虚拟机系统的/opt目录

sudo mv host.tar.gz /opt

//解压

tar zxvf host.tar.gz

Makefile内容:

hide := @
ECHO := echo

G++ := /opt/host/bin/arm-linux-gnueabihf-g++
#/opt/rv1126_gcc/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
#/opt/host/bin/arm-linux-gnueabihf-g++ 

#/opt/host/bin/arm-linux-gnueabihf-g++ 
#--sysroot=/opt/host/arm-buildroot-linux-gnueabihf/sysroot
SYSROOT := --sysroot=/opt/host/arm-buildroot-linux-gnueabihf/sysroot

SOURCEAPP := rkmedia_vi_venc_test.cpp

LINKAPP := sample_common_isp.c 

TARGETAPP := rkmedia_vi_venc_test

CFLAGS :=   -I./include/rkmedia \
            -I./common   \
            -I/opt/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/easymedia   \
            -I/opt/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/common \
            -I/opt/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/xcore \
            -I/opt/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/uAPI \
            -I/opt/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/algos \
            -I/opt/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/rkaiq/iq_parser \

      
LIB_FILES := 


LD_FLAGS := -leasymedia  -ldrm -lrockchip_mpp  -lpthread -lasound \
      -lRKAP_3A -lRKAP_ANR -lRKAP_Common -lv4l2  \
      -lv4lconvert -lrga  -lrknn_api   -lrockface  \
      -lsqlite3 -lmd_share -lod_share -lrockx -lrkaiq  \
      
DCFLAGS += -DRKAIQ

all:
  $(G++)  $(SYSROOT) $(DCFLAGS) $(SOURCEAPP) $(LINKAPP) -o $(TARGETAPP) $(CFLAGS) $(LIB_FILES) $(LD_FLAGS)
  @echo $(ADD_CO)
  $(hide)$(ECHO) "Build Done ..."

可以通过交叉编译器来查看可执行文件依赖哪些文件?

使用工具查看可执行文件 依赖哪些库文件,因为这里编译的可执行文件是arm,所以要选择交叉编译工具,prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-readelf

十、单独烧录Linux和dtb

在编译输出文件夹内:sdk/rockdev/,有一个同步生成的parameter.txt文件,里面有各个分区的描述。

Rockchip android系统平台使用parameter文件来配置一些系统参数,比如固件版本,存储器分区信息等。
Parameter文件是非常重要的系统配置文件,最好在能了解清楚各个配置功能时再做修改,避免出现parameter文件配置异常造成系统不能正常工作的问题。
Parameter文件大小有限制,最大不能超过64KB。

在这里插入图片描述
如下:

Parameter文件主要用于定义分区表,可以支持两种分区格式:一个是GPT格式,另一个是传统CMDLINE分区。不同的项目,不同的平台,parameter文件的内容会有一些差异。

在这里插入图片描述

分区定义说明:
1、为了兼容性,目前所有 AP 都是用 rk29xxnand 做标识。
2、单个分区说明:例如: 0x00002000@0x00008000(boot),@符号之前的数值是分区大小,@符号之后的数值是分区的起始位置,括号里面的字符是分区的名字。所有数值的单位是 sector ,1个 sector 为512Bytes.上例中,boot分区起始位置为0x8000 sectors位置,大小为0x2000 sectors(4MB).
3、为了性能,每个分区起始地址需要32KB(64 sectors)对齐,大小也需要32KB的整数倍。
4、如果使用 sparse 格式的镜像,升级时会擦除数据,为了兼容性更好,对应的分区最好按4MB对齐,大小也按4MB整数倍配置。
5、使用GPT分区时,parameter 里面定义的地址,都是真实的逻辑地址(LBA),例如 uboot 定义在0x4000,那么烧录到 EMMC 和 NAND 里面时,逻辑地址也是0x4000.
最后一个分区需要指定 grow 参数,工具会把剩余的空间都分配给最后一个分区。
6、使用传统 cmdline 分区时,如果是EMMC颗粒,0-4MB的空间是保留存放loader的,parameter 里面定义的分区都需要加上4MB,例如 uboot 定义在0x2000,实际烧录到 EMMC 里面时,和使用 GPT 分区时烧录的逻辑地址是一样的,也是0x4000。如果是NAND颗粒,为了和原来产品兼容,所有地址都是真实逻辑地址,例如uboot定义在0x2000,实际烧录到NAND里面是,逻辑地址也是0x2000,和使用GPT时不一样。

照着文件里面的描述在windos下填参数,比较麻烦,但是没有其他办法。

在这里插入图片描述点击右键,选择导出配置,然后下次只需要加载配置就可以了!

boot.img文件是包含了Linux kernel和设备树dtb文件的,这是个链接文件
在这里插入图片描述

rockdev$ ll
total 603396
drwxrwxr-x  2 liefyuan liefyuan      4096 Mar 24 21:19 ./
drwxrwxr-x 15 liefyuan liefyuan      4096 Mar 24 20:26 ../
lrwxrwxrwx  1 liefyuan liefyuan        19 Mar 24 21:19 boot.img -> ../kernel/zboot.img
lrwxrwxrwx  1 liefyuan liefyuan        41 Mar 24 21:19 MiniLoaderAll.bin -> ../u-boot/rv1126_spl_loader_v1.07.106.bin
lrwxrwxrwx  1 liefyuan liefyuan        41 Mar 24 21:19 misc.img -> ../device/rockchip/rockimg/blank-misc.img*
-rw-r--r--  1 liefyuan liefyuan 157286400 Nov 10  2021 oem.img
lrwxrwxrwx  1 liefyuan liefyuan        60 Mar 24 21:19 parameter.txt -> ../device/rockchip/rv1126_rv1109/parameter-fit-nand-256M.txt
lrwxrwxrwx  1 liefyuan liefyuan        80 Mar 24 21:19 recovery.img -> ../buildroot/output/rockchip_rv1126_rv1109_spi_nand_recovery/images/recovery.img
-rw-r--r--  1 liefyuan liefyuan 107347968 Mar 24 20:27 rootfs_2KB_128KB_149MB.ubi
-rw-r--r--  1 liefyuan liefyuan 106430464 Mar 24 20:27 rootfs_2KB_256KB_149MB.ubi
-rw-r--r--  1 liefyuan liefyuan 108003328 Mar 24 20:28 rootfs_4KB_256KB_149MB.ubi
lrwxrwxrwx  1 liefyuan liefyuan        61 Nov 10  2021 rootfs.ext4 -> ../buildroot/output/rockchip_rv1126_rv1109/images/rootfs.ext2
lrwxrwxrwx  1 liefyuan liefyuan        26 Mar 24 21:19 rootfs.img -> rootfs_2KB_128KB_149MB.ubi
lrwxrwxrwx  1 liefyuan liefyuan        26 Mar 24 20:28 rootfs.ubi -> rootfs_2KB_128KB_149MB.ubi
lrwxrwxrwx  1 liefyuan liefyuan        19 Mar 24 21:19 uboot.img -> ../u-boot/uboot.img
-rw-rw-r--  1 liefyuan liefyuan 133536216 Mar 24 20:29 update.img
-rw-rw-r--  1 liefyuan liefyuan   5242880 Nov 10  2021 userdata.img

如上,真正的文件地址在sdk/kernel/zboot.img
在这里插入图片描述

Parameter文件预览

Parameter文件主要用于定义分区表,可以支持两种分区格式:
 一个是GPT格式,另一个是传统CMDLINE分区。不同的项目,不同的平台,parameter文件的内容会有一些差异。
以RK3326平台的parameter文件进行举例说明。

RK3326 GPT分区格式parameter定义:

FIRMWARE_VER:9.0
MACHINE_MODEL:RK3326
MACHINE_ID:007
MANUFACTURER: RK3326
MAGIC: 0x5041524
BATAG: 0x00200800
MACHINE: 3326
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE:GPT
CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtb),0x00002000@0x0000c000(dtbo),0x00000800@0x0000e000(vbmeta),0x00010000@0x0000e800(boot),0x00030000@0x0001e800(recovery),0x00028000@0x0004e800(backup),0x00002000@0x00076800(security),0x00070000@0x00078800(cache),0x002d0000@0x000e8800(system),0x00008000@0x003b8800(metadata),0x00070000@0x003c0800(vendor),0x00020000@0x00430800(oem),0x00000400@0x00450800(frp),-@0x00450c00(userdata:grow)uuid:system=af01642c-9b84-11e8-9b2a-234eb5e198a0

RK3326 传统分区格式(CMDLINE)parameter定义:

FIRMWARE_VER:9.0
MACHINE_MODEL:RK3326
MACHINE_ID:007
MANUFACTURER: RK3326
MAGIC: 0x5041524
BATAG: 0x00200800
MACHINE: 3326
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
CMDLINE:console=ttyFIQ0 androidboot.console=ttyFIQ0
initrd=0x62000000,0x00800000
mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00002000@0x0000a000(dtb),0x00002000@0x0000c000(dtbo),0x00000800@0x0000e000(vbmeta),0x00010000@0x0000e800(boot),0x00030000@0x0001e800(recovery),0x00028000@0x0004e800(backup),0x00002000@0x00076800(security),0x00070000@0x00078800(cache),0x002d0000@0x000e8800(system),0x00008000@0x003b8800(metadata),0x00070000@0x003c0800(vendor),0x00020000@0x00430800(oem),0x00000400@0x00450800(frp),-@0x00450c00(userdata)

GPT分区相对传统分区,parameter文件主要差异:

  • 定义TYPE: GPT
  • 最后一个分区增加grow标识,如:userdata:grow
  • 指定system或者rootfs的uuid,如:uuid:system=af01642c-9b84-11e8-9b2a-234eb5e198a0
  • parameter文件不会烧录到NVM(EMMC,NAND等)里面,会使用到的信息只有mtdparts的分区定义和UUID,其他信息只是为了兼容升级工具而定义。

分区定义规范:

  1. 凡是 bootrom,pre-loader,uboot,trust 有写到的分区都放在 recovery 分区之前;
  2. 凡是客户新加的分区,在 pre-loader,uboot,trust 有被写到,都应该放在 recovery 分区之前;
  3. 目前 rockchip 前级固件有操作到的分区有 misc,vbmeta,security,这些都应该放 recovery 之前。

解包

boot.img解包

使用unpack_bootimg 工具进行解包

unpack_bootimg --boot_img boot.img --out ./rockdev/

解包后的文件

ls rockdev/
dtb  kernel  ramdisk  second 

从DTB中还原出dts文件

使用工具dtc

dtc -I dtb -O dts dtb > boot.dts

从机器中导出dts的方法

adb pull sys/firmware/fdt ./
dtc -I dtb -O dts -o fdt.dts ./fdt
  • fdt是机器里面的dtb文件
  • fdt.dts为解析出来的dts文件

分区修改

RV1126调试(4)-升级镜像img打包分区修改

各个分区描述

  • uboot 分区:供 uboot 编译出来的 uboot.img 。
  • misc 分区:供 misc.img ,给 recovery 使用。
  • boot 分区:供 kernel 编译出来的 boot.img 。
  • recovery 分区:供 recovery 编译出的 recovery.img 。
  • backup 分区:预留,暂时没有用,后续跟 Android 一样作为 recovery 的 backup 使用。
  • rootfs 分区:供 buildroot 、 debian 或 yocto 编出来的 rootfs.img 。
  • oem 分区:给厂家使用,存放厂家的 APP 或数据。挂载在 /oem 目录。
  • sconf分区:配置分区–增加分区
  • userdata分区:数据分区-增加分区
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在RK3588平台上进行Android SDK编译,你可以按照以下步骤进行操作: 1. 首先,获取RK3588的Android源代码。你可以从Rockchip官方的开发者网站或者其他可靠的来源获取到源代码。 2. 安装所需的编译工具链。RK3588平台使用ARM架构,因此你需要安装相应的ARM交叉编译工具链。你可以从ARM官方网站下载并安装适用于你的操作系统的工具链。 3. 设置环境变量。将编译工具链的路径添加到系统的环境变量中,以便能够在终端中直接使用交叉编译工具。 4. 进入Android源代码目录,并运行以下命令初始化编译环境: ``` source build/envsetup.sh ``` 5. 选择要编译的目标设备。RK3588平台有多个设备配置文件可供选择,你可以使用以下命令选择其中一个: ``` lunch ``` 6. 配置编译选项。你可以通过运行以下命令来配置编译选项: ``` make menuconfig ``` 在这个菜单中,你可以选择要编译的模块、启用或禁用特定功能等。 7. 开始编译。运行以下命令开始编译Android SDK: ``` make -j4 ``` 这里的`-j4`表示使用4个线程进行编译,你可以根据你的系统配置进行调整。 8. 等待编译完成。编译过程可能需要一些时间,具体时间取决于你的系统性能和编译选项。 9. 编译完成后,在输出目录中可以找到生成的Android SDK镜像文件。你可以把这个镜像烧录到RK3588设备上进行测试和使用。 请注意,以上步骤仅提供了一个大致的编译流程,具体步骤可能因为不同的Android源代码版本和开发环境而有所差异。在实际操作中,你可能需要参考更详细的文档或向相关的开发者社区寻求帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值