RK3568 MCU开发之一

B站影视 2024-12-10 12:18 2

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

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

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

硬件准备

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

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

来源:小盒科技观察

相关推荐