目录
硬件平台介绍
这次体验的硬件平台是来自飞凌嵌入式的OK3588-C开发板,该开发板基于Rockchip新一代旗舰 RK3588处理器开发,采用核心板+底板的分体式设计,将FET3588-C核心板的全部功能引脚以最便利的方式引出,并针对不同的功能做了深度优化,方便用户二次开发的同时简化用户设计。
rk3588核心板
我所使用的FET3588-C核心板主要规格参数如下:
- 处理器:Rockchip RK3588
- CPU: RK3588 四核Cortex-A76@2.4GHz+四核CortexA55@1.8GHz
- NPU: 6TOPS,支持INT4/INT8/INT16/FP16混合操作
- GPU: Mali-G610 MP4 + OpenGLES 1.1, 2.0, 3.2、 OpenCL2.2、Vulkan1.2
- VPU:
- 硬解码: H.265、VP9(8K@60fps) + H.264(8K@30fps) + AV1(4K@60fps)
- 硬编码: H.265/HEVC、H.264/AVC(8K@30fps)
- RAM: 4GB/8GB LPDDR4
- ROM: 32GB/64GB eMMC
- 工作电压: DC 12V
- 工作温度: 0 ~ 80 摄氏度
- 操作系统支持:
- Android12.0
- Linux5.10.66
- Forlinx Desktop
OK3588开发板主要特性和外设
- 视频输入:
- MIPI DC PHY x2
- MIPI CSI DPHY x4
- DVP x1
- HDMI RX x1
- 显示输出:
- HDMI/eDP TX x2
- DP TX x2
- MIPI DSI x2
- BT.1120 x1
- 音频接口:
- I2S x4
- SPDIF x2
- PDM x2
- 网络接口: Ethernet x2
- 其他接口:
- USB3.1 x1
- USB2.0 Host x2
- PCIe 2.0 x3
- PCIe 3.0 x4
- SPI x5
- I2c x9
- UART x10
- CAN x3
- SATA x3
- PWM x16
- ADC x8
- SDIO x1
基于Linux系统的移植和开发
Linux系统的移植
本次开发选择的是Linux操作系统,rockchip公司提供了rk3588平台的Linux系统开发SDK,这个SDK包括了U-Boot开发,Kernel开发,Recovery开发,根文件系统开发(包括Buildroot或Yocoto构建组件)以及基于Linux应用开发的相关指导,具体可以参考Rockchip公司提供的《Rockchip_Developer_Guide_Linux_Software》开发文档。
同时飞凌电子针对OK3588开发板对Rockchip公司提供的SDK进行了相应的定制和优化,使购买开发板的用户能够更快的构建和移植Linux系统并在基于Linux系统进行应用开发。具体可以参考飞凌电子提供的《OK3588-C_Linux_用户编译手册》开发文档。
基于buildroot构建Linux根文件系统
由于飞凌电子已经做好了Linux系统相关的定制和移植,因此我们只需要在提供的官方SDK上根据自身的需要进行相关的应用开发即可。根据飞凌电子的开发文档,我们有两种方式可以进行Linux系统上的应用开发:
- 在PC平台上搭建好跨平台开发编译的环境,开发完应用工程后,进行跨平台编译,然后将编译好的可执行文件及相关支持库通过串口或网路等方式传输到开发板的系统中。
- 通过buildroot或者Yocoto等根文件构建工具,将应用工程直接纳入根文件系统的构建中,生成完整的系统镜像,烧录到开发板中。
显然对于个人项目或者应用开发调试阶段,使用第一种方式较为便捷快速,但如果是实际的批量产品开发则是第二种方式更合理。
这里主要介绍给予buildroot进行Linux根文件系统的制作过程。
Buildroot介绍
Buildroot 是 Linux 平台上一个构建嵌入式 Linux 系统的框架。整个 Buildroot 是由 Makefile 脚本和 Kconfig 配置文件构成的。你可以和编译 Linux 内核一样,通过 buildroot 配置,menuconfig 修改,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件 (包含 boot、kernel、rootfs 以及 rootfs 中的各种库和应用程序)。
在飞凌电子提供的开发SDK中已经包含了buildroot构建工具,我们可以直接到该目录下看一下buildroot构建工具的主要目录结构:
- package: 该目录下放置了各个应用软件的编译和配置脚本,每个应用软件有一个独立的文件夹,文件夹中主要包括一个Config.in和name.mk(Makefile)文件。其中Config.in可以定义相关的配置选项,mk文件则指定了该软件的下载,编译,安装等命令。
- output:是buildroot构建工具的输出,其中又包括:
- host:由源码编译出来的需要在主机上运行的一些工具,如arm-linux-gcc
- build: 所有源码解压存放和实际编译的文件夹
- staging: 软链接到host下的sysroot,也就是文件系统构建需要的系统库所在目录
- target:里面存放着Linux系统的基本目录结构和编译好的所有应用库以及可执行文件。
- fs: 存放各种文件系统的源代码
- linux: 存放linux内核的自动构建脚本
- configs:存放与硬件平台相关的一些配置参数
- dl: 存放构建时从网络下载的各个开源软件包,下载过一次后,下次再构建时就不需要重新下载了。
- arch: 存放与CPU架构相关的配置脚本
- board: 存放了很多开发板的默认配置脚本
- docs: 存放一些开发文档
1. build.sh 脚本选择板级配置。
build.sh是官方提供的一个自动构建的脚本,我们可以直接help看一下提供的相关命令如下图所示:
这里我们首先将构建环境切换到OK3588平台的buildroot构建,通过输入./build.sh lunch命令,会自动列出所有支持的板级配置,我们选择2即可。
2. 配置硬件平台对应的构建环境
继续在sdk目录下输入 source envsetup.sh命令,这时又会自动列出支持的各种环境配置,我们输入140选择OK3588环境。
3. 编写应用工程文件,和工程配置的文件
这里我用qt写了一个简单的"hello world"的demo程序, 我将这个工程源文件放在与buildroot同级的app目录下。然后我们需要在buildroot的package目录下添加我们的hello world demo工程的配置文件,在package目录新建hello_world_demo文件夹,并在其中添加两个文件:Config.in 和hello_wolrd_demo.mk.
Config.in:
config BR2_HELLO_WORLD_DEMO
bool "hello world"
depends on BR2_PACKAGE_QT5
help
hello world demo application based on QT
hello_world_demo.mk
HELLO_WORLD_DEMO_VERSION = 1.0
HELLO_WORLD_DEMO_SITE = $(TOPDIR)/../app/hello_world_demo
HELLO_WORLD_DEMO_SITE_METHOD= local
HELLO_WORLD_DEMO_LICENSE = none
HELLO_WORLD_DEMO_LICENSE_FILES = LICENSE
# TODO: Add install rules in .pro
define HELLO_WORLD_DEMO_INSTALL_TARGET_CMDS
mkdir -p $(TARGET_DIR)/usr/share/applications $(TARGET_DIR)/usr/share/icon
$(INSTALL) -D -m 0644 $(@D)/icon_player.png $(TARGET_DIR)/usr/share/icon/
$(INSTALL) -D -m 0755 $(@D)/hello_world_demo $(TARGET_DIR)/usr/bin/
$(INSTALL) -D -m 0755 $(@D)/hello_world.desktop $(TARGET_DIR)/usr/share/applications/
endef
$(eval $(qmake-package))
然后还要在package目录下的Config.in文件中包含我们刚刚编写的hello_world_demo的Config.in。我们可以打开package下的Config.in 文件,然后在合适的位置添加source “package/hello_world_demo/Config.in”
4. 配置应用软件
在buildroot目录下,输入命令make menuconfig 打开编译选项,找到刚刚添加的hello_world_demo 工程的编译配置选项,选择打开该选项,然后保存配置。
5. 构建整个根文件系统
在buildroot目录下输入make 命令开始整个根文件系统的构建。
make -j8
如果是第一次进行完整的文件系统编译,可能会等待较长时间,这里耐心等待即可。由于官方给的build.sh构建脚本是用的linuxfs文件夹下的文件系统镜像,所以将buildroot构建的根文件系统复制到linuxfs 文件夹下。
cp ./output/OK3588/images/rootfs.ext4 ../linuxfs/rootfs.img
6. 构建整个系统镜像
退回到buildroot的上层目录,运行sudo ./build.sh 命令
构建完成后会提示构建成功。
7. 烧写系统镜像
将系统镜像烧写到开发板中,我这里直接用的linux下的烧写工具,我在sdk的目录下创建的一个软链接
具体的烧写过程是,将板子的TypeC0口和PC的USB口连接,然后按住Recovery按键的同时,按下Reset按键,送开reset按键几秒后再松开Recovery按键,这样板子就进入了镜像烧写模式。这时在命令行输入如下命令:
sudo ./linux_upgrade_tool uf ./rockdev/update.img
就开始进行镜像的烧录,烧录完成后如下图所示,会出现Upgrade firmware ok提示,然后开发板会自动重启进入Linux系统。
8. 应用软件运行验证
由于没有写hello_world的桌面快捷方式配置,所以系统桌面上没有我们编写的hello_world软件的入口。我们打开系统的终端,直接通过命令行的方式运行我们写的hello_world_demo程序,如下图所示:
hello_world_demo应用程序运行成功后,就会出现一个简单的应用界面,如下图所示:
点击hello world按钮后会播放一段动画,应用程序工作正常。
总结
本文基于飞凌嵌入式的OK3588-C开发板,完成了Linux系统的配置,编译,并写了一个简单的demo应用程序,通过buildroot将该应用程序固化到系统镜像中。最后通过烧写系统镜像,验证了编写的应用程序在Linux系统下正常运行。
从整个过程我们可以发现,关于Linux系统的配置和移植厂家提供的sdk已经做了充分的定制和优化,我们需要做的不多,可能需要根据使用的外设做一定的配置即可。这样可以让我们专注于应用层的开发,而且将应用程序固化到系统镜像的过程也非常简单。考虑到RK3588非常不错的性能以及OK3588开发板上丰富的外设,在这套硬件平台上可以完成非常多的产品原型验证和设计工作。