chenjie · 12月1日 · 广东

RK3568内置MCU开发介绍之一

本文介绍RK3568内置的MCU的开发流程,首先介绍MCU程序的构建方法,然后介绍MCU核心与ARM CORTEX A55 AP核心之间的mailbox通信。

RK3568内置有4*cortex A55(下文简称AP)和1个RISCV(下文简称MCU)。

image.png

硬件准备

首先介绍一下硬件。主板为风火轮科技的YY3568开发板,主控RK3568。此开发板的相关介绍可以参考

https://wiki.youyeetoo.cn/zh/YY3568

RK3568的MCU核心需要使用串口调试,笔者这里使用的是UART4,这里也可以选择其他的,不要跟AP核心的调试串口UART2冲突就行。 UART4的位置如下

image.png

RK3568内置MCU介绍

RK3568内置的MCU核心特性如下:

image.png

可以看出这是一个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系统实现快速响应和控制。软件支持如下所示

image.png

RK3568新版的SDK目录如下

image.png

相比旧版本的SDK,这里增加了rtos目录,是用于存放RTT源码的,此外external目录下有个hal目录,用于存放bare-metal,也就是裸机的源码。本文重点介绍bare-metal部分,后面的文章会介绍RTT的。

打开hal目录,内容如下

image.png

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下面,注意目录不要搞错,不然后面的构建脚本会找不到工具链

image.png

2.在工程根目录下打开external/hal/project/common/GCC/riscv.mk文件,进行如下修改,指定工具链位置
image.png
 

3. 在工程根目录下打开external/hal/project/rk3568-mcu目录。此为rk3568-mcu工程

image.png

源码在src目录下,这里添加MCU的打印信息。打开src目录里面的main.c,取消
TEST\_USE\_UART4M1的注释,这样MCU可以使用UART4进行打印。

image.png
 

4.rk3568-mcu的GCC目录有构建脚本。打开GCC目录,在此目录下面执行make。编译结果如下

image.png

编译之后在此目录下可以看到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分区

image.png

package-file打包文件中增加amp分区映像

image.png

uboot端打开rk-amp.config,使能uboot阶段加载MCU固件到指定DDR地址的操作。可以在device/rockchip/.chips/rk3566\_rk3568的配置文件增加此配置项

image.png

kernel端修改设备树,增加amp预留内存。在使用的设备树文件增加#include "rk3568-amp.dtsi"

image.png
 

8.将步骤5生成的amp.img,复制到步骤6所述的firmware目录中

然后再次构建整个固件,如果操作无误,则可以生成一个update.img文件。这里明确会将amp.img添加到烧录包里面

image.png
 

9.将生成的固件烧录到板上,串口4上面配置为1500000波特率,可以看到如下所示的log

image.png
 

MCUAPmailbox通信

RK3568硬件上面有一组mailbox,用于实现MCU与AP通信

1.AP端做如下修改

在kernel的defconfig中增加

CONFIG\_ROCKCHIP\_MBOX\_DEMO=m

打开mailbox的demo

在kernel的rk3568-amp.dtsi中关闭rpmsg对mailbox的占用

image.png

在板级dts文件中增加mailbox-demo配置

image.png

这里使用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

image.png

再打开src/test\_demo.c,打开mbox配置

image.png

修改之后,重新构建amp.img

 

然后用rk的烧录工具,单独烧录boot分区和amp分区,然后重启,将rockchip-mbox-demo.ko通过adb或者其他方式,放到板上

 

执行insmod操作之后,AP端的内核日志中有如下信息
image.png

MCU端的串口有如下信息

image.png

这里通过源码简单介绍一下这个测试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发送一条数据出去

image.png

image.png

然后在rk\_mbox\_rx\_callback函数内容如下
image.png

这里是在不超过MSG\_LIMIT的情况下,收到mbox一条数据,就通过mbox发送一条数据出去。发送的数据内容为 0x524D5347U

 

MCU端的逻辑如下

image.png

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进行通信,速度更快,可靠性更高。

推荐阅读
关注数
0
文章数
8
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息