文章目录
目录介绍
- 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 配置说明
- 先 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'
- 使用 menuconfig 配置文件系统,选择需要的模块,最后保存退出。
在工程根目录下:make menuconfig # 进入 menuconfig 后,按“/"进入查找模式,输入 BR2_PACKAGE_IPC_DAEMON
-
- 保存到 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
九、自己构建工程环境
如上面,在/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,其他信息只是为了兼容升级工具而定义。
分区定义规范:
- 凡是 bootrom,pre-loader,uboot,trust 有写到的分区都放在 recovery 分区之前;
- 凡是客户新加的分区,在 pre-loader,uboot,trust 有被写到,都应该放在 recovery 分区之前;
- 目前 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文件
分区修改
各个分区描述
- 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分区:数据分区-增加分区