本文介绍RK3568内置的MCU的开发流程,首先介绍MCU程序的构建方法,然后介绍MCU核心与ARM CORTEX A55 AP核心之间的mailbox通信。
RK3568内置有4*cortex A55(下文简称AP)和1个RISCV(下文简称MCU)。
硬件准备
首先介绍一下硬件。主板为风火轮科技的YY3568开发板,主控RK3568。此开发板的相关介绍可以参考
https://wiki.youyeetoo.cn/zh/YY3568
RK3568的MCU核心需要使用串口调试,笔者这里使用的是UART4,这里也可以选择其他的,不要跟AP核心的调试串口UART2冲突就行。 UART4的位置如下
RK3568内置MCU介绍
RK3568内置的MCU核心特性如下:
可以看出这是一个RV32I架构的核心,此核心具体型号不明,主频200MHz
另外从介绍上面看,这个核心没有独立的RAM和flash,所以需要从RK3568的EMMC和DDR上面划分出flash和RAM来支持其运行。
软件介绍
目前RK新版本的Linux SDK已经支持了AMP功能。AMP(Asymmetric Multi-Processing)系统是一种非对称多核异构系统,即在同一芯片内,通过分组CPU,并在不同组的CPU内运行不同的系统。在RK3568上,将Cortex-A55 * 4 作为主要核心,运行Linux系统; RISC-V * 1\`作为辅助核心跑裸核系统,辅助Linux系统实现快速响应和控制。软件支持如下所示
RK3568新版的SDK目录如下
相比旧版本的SDK,这里增加了rtos目录,是用于存放RTT源码的,此外external目录下有个hal目录,用于存放bare-metal,也就是裸机的源码。本文重点介绍bare-metal部分,后面的文章会介绍RTT的。
打开hal目录,内容如下
application里面是一些应用示例,board里面的内容没用,可以忽略
doc是开发文档
lib里面是cmsis以及外设库的源码,类似于STM32工程的Drivers目录
middleware里面是中间件的源码,包括rpmsg
openamp等
project包含了目前RK所有平台(ap+mcu)的启动文件,main.c,以及编译,打包脚本
test和tools目录也可以忽略
MCU bare-metal程序的构建方法与打包
1.下载RISC-V的交叉工具链,这里使用的是xpack-riscv-none-embed-gcc-10.2.0-1.2-linux-x64,这个交叉工具链可以从https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases处下载
下载之后将这个交叉工具链解压到工程根目录的prebuilts/gcc/linux-x86/riscv64下面,注意目录不要搞错,不然后面的构建脚本会找不到工具链
2.在工程根目录下打开external/hal/project/common/GCC/riscv.mk文件,进行如下修改,指定工具链位置
3. 在工程根目录下打开external/hal/project/rk3568-mcu目录。此为rk3568-mcu工程
源码在src目录下,这里添加MCU的打印信息。打开src目录里面的main.c,取消
TEST\_USE\_UART4M1的注释,这样MCU可以使用UART4进行打印。
4.rk3568-mcu的GCC目录有构建脚本。打开GCC目录,在此目录下面执行make。编译结果如下
编译之后在此目录下可以看到TestDemo.bin文件,即为可执行程序
5. rk3568-mcu目录下的mkimage.sh,可以将TestDemo.bin转换为分区映像,执行此脚本,会在Image下生成amp.img,此分区映像需要烧写到EMMC一个分区上面。
6.按照RK的默认配置构建整个Linux工程。这个构建工程可以参考RK
SDK下面的Rockchip\_Developer\_Guide\_Linux\_Software\_CN.pdf文档,这里不赘述。构建之后可以在SDK的output目录下可以得到firmware目录,这个为当前打包使用的各个分区映像的软链接。
7.对AP端的部分内容做修改。
分区表增加amp分区
package-file打包文件中增加amp分区映像
uboot端打开rk-amp.config,使能uboot阶段加载MCU固件到指定DDR地址的操作。可以在device/rockchip/.chips/rk3566\_rk3568的配置文件增加此配置项
kernel端修改设备树,增加amp预留内存。在使用的设备树文件增加#include "rk3568-amp.dtsi"
8.将步骤5生成的amp.img,复制到步骤6所述的firmware目录中
然后再次构建整个固件,如果操作无误,则可以生成一个update.img文件。这里明确会将amp.img添加到烧录包里面
9.将生成的固件烧录到板上,串口4上面配置为1500000波特率,可以看到如下所示的log
MCU与AP的mailbox通信
RK3568硬件上面有一组mailbox,用于实现MCU与AP通信
1.AP端做如下修改
在kernel的defconfig中增加
CONFIG\_ROCKCHIP\_MBOX\_DEMO=m
打开mailbox的demo
在kernel的rk3568-amp.dtsi中关闭rpmsg对mailbox的占用
在板级dts文件中增加mailbox-demo配置
这里使用mailbox的通道0作为rx,通道3作为tx
修改之后,单独构建kernel镜像,在kernel目录下得到boot.img,另外在kernel/drivers/mailbox下得到rockchip-mbox-demo.ko
2.MCU端做如下修改
打开external/hal/project/rk3568-mcu,打开src/main.c,打开TEST\_DEMO
再打开src/test\_demo.c,打开mbox配置
修改之后,重新构建amp.img
然后用rk的烧录工具,单独烧录boot分区和amp分区,然后重启,将rockchip-mbox-demo.ko通过adb或者其他方式,放到板上
执行insmod操作之后,AP端的内核日志中有如下信息
MCU端的串口有如下信息
这里通过源码简单介绍一下这个测试demo。首先是AP端的,在kernel/drivers/mailbox/rockchip-mbox-demo.c的probe函数中,先通过
mbox\_request\_channel\_byname
申请了名为test-rx test-tx的两个mailbox通道,这个名称是设备树指定的。并且注册了名为rk\_mbox\_rx\_callback的回调函数。申请到通道之后,先用mbox\_send\_message发送一条数据出去
然后在rk\_mbox\_rx\_callback函数内容如下
这里是在不超过MSG\_LIMIT的情况下,收到mbox一条数据,就通过mbox发送一条数据出去。发送的数据内容为 0x524D5347U
MCU端的逻辑如下
MCU端也是先注册了一个通道,然后注册名为mbox\_remote\_isr中断函数,然后中断函数中再调用mbox\_remote\_cb回调
这个回调函数中收到一条数据,即发一条数据。发送的数据内容为 0x98765432
因此就可以看到上面的现象,MCU先收到AP的一条数据,然后发给AP,AP再发给MCU,重复100次。
总结
本文介绍RK3568内置的MCU的开发流程,并介绍了AP和MCU之间通过mailbox进行通信。多数的产品应用中,RK3568都会搭配一个外置的MCU,来实现一些高实时的业务,而自带MCU是闲置的,如果能够利用此MCU,可以省去外部MCU,降低复杂度。同时,使用片上的mailbox进行通信,速度更快,可靠性更高。