本文首先介绍了buildroot,然后介绍了tinkerboard2的Linux sdk的基本组成,buildroot包含在Linux sdk内,然后介绍了具体移植,配置,编译的步骤,最后展示运行效果。
Buildroot 是一个嵌入式 Linux 系统的框架,也可以视为是一个根文件系统,和debian\yocto类似。整个 Buildroot 是由.mk文件 (相当于Linux内核的各个子Makefile) 和 Config.in (相当于Linux内核的Kconfig) 配置文件构成的。与Linux内核类似,它的通过配置menuconfig 修改,编译出一个完整的rootf,并且可以支持将这个rootfs打包为不同文件系统类型(如ext4 ubifs ramdisk等)的镜像。将这个镜像烧录到板上,即可通过kernel 内核引导运行。
目前rk sdk包含三种文件系统,分别为buildroot,debian和yocto,debian是asus官方主推的系统,其优势在于可以和树莓派上面的部分应用兼容,同时本身带有桌面,如果想把tinkerboard2作为个人计算机的可以考虑。但是对于嵌入式设备来说,debian过于臃肿。目前在嵌入式设备上面用的比较多的仍然是buildroot+QT,buildroot的特点在于其可裁剪,可定制。
buildroot 位于 tinkerboard2的 Linux SDK 目录,下载地址为
下载之后解压,sdk的根目录部分内容介绍如下
├── app # 示例 app,比如qtlauncher
├── br.log
├── buildroot # 存放buildroot的目录
├── build.sh -> device/rockchip/tinker_board_2/build.sh # uboot kernel 和rootfs总的编译脚本
├── device # 存放具体每种板型的 uboot kernel 和rootfs配置目录
├── docs # rk官方文档
├── envsetup.sh -> buildroot/build/envsetup.sh #buildroot的环境变量
├── external #rk硬件相关的一些库,脚本等,比如mpp编解码库,rkupdate升级功能等
├── kernel #Linux内核源码
├── Makefile -> buildroot/build/Makefile #这个makefile指向buildroot的,因此在sdk执行make和在buildroot文件夹执行make效果一样
├── mkfirmware.sh -> device/rockchip/tinker_board_2/mkfirmware.sh #用于打包固件的脚本
├── prebuilts #交叉编译工具
├── rkbin #rk的bootloader optee等不开源固件
├── tools #rk的打包 烧录工具
├── u-boot # uboot源码
其buildroot文件夹内容如下
├── arch #cpu相关配置
├── board #板级相关配置
├── boot
├── build #编译相关的脚本存放于此目录
├── CHANGES
├── Config.in #总的config文件
├── Config.in.legacy
├── configs #具体的defconfig文件存放于此目录
├── COPYING
├── DEVELOPERS
├── dl #下载的app源代码压缩包存放于此
├── docs #buidroot的文档
├── fs #文件系统相关构建脚本存放于此
├── linux
├── Makefile #总的makefile
├── Makefile.legacy
├── output #编译的输出目录,rk sdk可以一个工程支持多种编译配置,每种编译配置都会在这里有个单独的输出目录
├── package # 每个app的构建、配置文件
├── README
├── support # 为 Bulidroot 提供功能支持的脚本、配置文件
├── system # 制作根文件系统的构建、配置文件
├── toolchain #制作交叉工具链的构建、配置文件
└── utils
rk的sdk把uboot kernel以及rootfs的构建放到同一个工程下面,并用repo管理整个sdk,此sdk和android类似,开发管理都比较方便。编译的时候,先在sdk根目录下的device目录指定一个mk文件,mk文件指定了uboot kernel 以及rootfs使用的具体config,然后使用sdk目录下的build.sh即可一键编译或者指定不同的参数选择编译uboot,kernel或者是rootfs
如果用户想自行构建buildroot的固件,可以看本章节的步骤,如果用户只是想体验,可以直接到最后,那里有固件下载链接
根据前文的描述,rk sdk使用device目录下的配置文件以及编译脚本(软链接到sdk顶层目录)来实现一键全部编译以及各个模块的单独编译,因此,这第一个步骤,就是修改device目录下的文件
1、编写.mk文件,并引用它
可以参考tinkerboard 2的debian编写一个
cp BoardConfig-rk3399-tinker_board_2-debian.mk BoardConfig-rk3399-tinker_board_2-buildroot.mk
然后把下面几个项目修改一下
修改
export RK_OEM_DIR=oem_normal
export RK_ROOTFS_SYSTEM=buildroot
export RK_CFG_BUILDROOT=rockchip_rk3399_tinkerboard2
删除
export RK_PACKAGE_FILE=tinker_board_2-package-file
修改之后保存,然后在sdk根目录执行
./build.sh device/rockchip/tinker_board_2/BoardConfig-rk3399-tinker_board_2-buildroot.mk
2、拷贝相关脚本
tinkerboard2的sdk中,华硕默认只提供了debian的编译脚本,因此这里要拷贝一个buildroot的编译脚本
cp device/rockchip/common/mk-buildroot.sh device/rockchip/tinker_board_2/mk-buildroot.sh
笔者这里直接提供了device/rockchip/tinker_board_2文件夹的压缩包供下载
在上个步骤中,指定了RK_CFG_BUILDROOT,下面要建立这个配置文件
进入buildroot/configs
cd buildroot/configs
然后复制一份官方rk3399的config
cp rockchip_rk3399_defconfig rockchip_rk3399_tinkerboard2_defconfig
然后直接修改rockchip_rk3399_tinkerboard2_defconfig,它这里include了很多其他的config文件,这些.config文件全部位于buildroot/configs/rockchip下,可以具体看它打开了哪些app的编译。
如果不要某个模块的功能,则直接删除掉就好,比如
如果不要音频相关的功能,可以把
#include "audio.config"
#include "audio_gst.config"
删掉
不要视频编解码功能,可以把
#include "video_mpp.config"
#include "video_gst.config"
#include "video_gst_rtsp.config"
去掉
不要摄像头相关功能,可以把
#include "camera.config"
#include "camera_gst.config"
去掉
buildroot有个特点,如果某个模块没有编译过,后面加上,可以使用增量编译,不需要clean之后整个重新编译,但是如果某个模块编译过,后面要删掉,就要clean掉了,所以第一次编译,建议把不需要的先删掉
在修改了defconfig文件之后,使用如下命令引用它
source envsetup.sh rockchip_rk3399_tinkerboard2
然后我们前文也介绍过,sdk根目录下面那个makefile是软链接到buildroot的makefile的,因此可以在sdk根目录下执行
make menuconfig
可以进入如下界面
这里的修改和kernel的类似,可以在配置界面添加或裁剪一些工具,按需求定制系统功能。可以输入 / 进入搜索界面,输入要查找的内容,按回车进行搜索。找到之后按下Y可以选中此选项,配置好之后选择通过键盘上面的左右按键移动到 save 处,然后按回车,此时会保存到 .config,这是个临时的文件,然后移动到 Exit 按回车退出
之后使用命令
make savedefconfig
将这个配置文件保存回rockchip_rk3399_tinkerboard2。
笔者这里提供一个示例的defconfig文件,可以直接把它拷贝到 buildroot/configs/rockchip_rk3399_tinkerboard2_defconfig 进行替换
完成上一个步骤之后,在sdk根目录下执行
unset LD_LIBRARY_PATH
source envsetup.sh rockchip_rk3399_tinkerboard2
make
即可开始进行编译
buildroot的编译过程要使用很多开源的软件,它要从各个开源软件包的git上面去下载源码包,如果网速不好的情况下,会下载失败,出现如下编译报错
解决方法:可以在Windows下,用 百度网盘或者迅雷 直接访问这个网站下载,将下载的文件放到虚拟机rk sdk的buildroot/dl目录下,然后重新编译
如果看到有如下提示信息,说明编译已经完成
编译出来的镜像在
buildroot/output/rockchip_rk3399_tinkerboard2/images/rootfs.ext4
这个rootfs.ext4仅仅是buildroot对应的根文件系统镜像,还需要把它和uboot kernel等打包为一个完整的固件,这个固件可以使用rk的烧录工具或其他的方法烧录到板上。在编译好buildroot的情况下,直接在sdk根目录下执行
./build.sh
执行这个命令会依次编译uboot kernel,因为之前已经编译过了buildroot,如果没有什么改动,则不会重新编译,最终会执行rk的打包脚本,把uboot kernel和rootfs打包。最后可在rockdev目录下得到update.img,这个镜像可以烧录到板上运行
烧录参考下面的章节,先使开发板进入maskrom模式
进入bootrom之后选择固件即可开始烧录,参考下图
此处笔者使用了7寸触摸屏来进行画面以及交互方面的演示,7寸触摸屏的适配方法参考下面文章,只需要修改kernel部分即可
下面的演示视频里面,开机启动脚本运行了QLauncher,这个是用QT写的一个桌面,支持启动若干个QT图形化应用。然后使用qfm,这是用QT写的一个文件浏览器,浏览U盘里面的文件,U盘里面有一个mp4视频,点击这个视频,即可调用qplayer,来播放视频
其中qplayer是支持rk的mpp编解码库加速视频编解码的,因此可以看出,播放的流畅度还是可以的
这里笔者会提供一个编译好的固件,可以用于测试,此固件默认支持7寸触摸屏