ST MP157 IPCC 虚拟串口的异核通讯-AMP综合

721 阅读2分钟

总纲

IPCC 是 STM32MP157 硬件层的异核通讯接口Mailbox 就是软件层的异核通讯框架RP Msg 是异核间共享内存的框架

那么它们三者有啥关系?

在 STM32MP157 里通讯只有一种就是共享内存,RPMsg 给内存提供好数据后,调用 mailbox 去设置 IPCC 相关寄存器,对应的处理器就会去内存里读取数据。

`A7 给 M4 发送数据步骤如下:`

1. 从 vring1 里分配一个 Buff(空 Buff)。
2. 用户把数据拷贝到此 Buff 里。
3. 把(1)的 Buff 移动到有数据的 BUFF 队列中。
4. A7 Host 去调用 Mailbox(A7),Mailbox(A7)就去设置 IPCC 相关的寄存器。
5. Mailbox(M4)中发现来自 A7 Host 的信号,M4 处理器被告知有新数据可读。
6. 从 vring1 中读取数据。
7. 把数据转移到自己的 DATA 中。
8. 把空的 Buff 放回到 vring1 中的没有数据队列中。
9. 使用 Mailbox(M4)去控制 IPCC 寄存器,告诉 A7 处理器已经处理完数据了。M4A7发送数据步骤也是一样的,M4 负责拷贝数据到 vring0 中,A7从 vring0 读取数据。

image.png

1 STM32CubeIDE M4异核通讯设置(生成RPMsg_CM4.elf

本实验是使用 Linux 自带的驱动,此驱动代码在:drivers/rpmsg/rpmsg_tty.c。此驱动也是 很简单的,在rpmsg_client_sample驱动下添加了一个UART框架,UART框架把异核通讯封装 了一层,用户层就可以通过调用UART进行异核通讯。实验目的,通过UART发送数据进行控制蜂鸣器。 image.png

1 STM32CubeIDE M4异核通讯设置(生成RPMsg_CM4.elf

1.1 参考《# ST MP157 IPCC 基于RPMsg异核间共享内存框架开发-AMP通讯综合》

1.2 设置GPIO

image.png image.png

1.2 M4 AMP通讯框架API

image.png image.png image.png image.png

1.3 M4 代码开发

image.png image.png

  • A7发送数据:beep_on
  • A7发送数据:beep_off
  • M4核接收回调函数,即:接收到A7核发送过来的数据:beep_on/beep_off,就设置VirtUart0RxMsg=SET image.png
  • 判断VirtUart0RxMsg是否为真,若为真,则M4发送数据到A7:M4 have received A7 Msg :-> beep off
  • M4发送数据:M4 have received A7 Msg :-> beep off
  • M4发送数据:M4 have received A7 Msg :-> beep on image.png

2 A7核开发驱动模块

image.png

  • 串口通信内核日志暂时打印不出来

3 技术验证

  • 把RPMsg_UART_CM4.elf拷贝到/lib/firmware/目录 image.png
  • 网络NFS根文件系统启动 image.png
  • 把编译好的RPMsg_UART_CM4.elf、设备树文件拷贝到对应的目录下。创建一个 m4.sh 的脚本,方便以后调试 M4 image.png
  • 启动测试
./m4.sh start RPMsg_UART_CM4.elf //开启 M4 核
cat /dev/ttyRPMSG0 & //接收 M4 发过来的数据
echo 'beep_on' >/dev/ttyRPMSG0 //通过 ttyRPMSG0 来发送数据,启动 M4 控制的蜂鸣器
echo 'beep_off' >/dev/ttyRPMSG0 //关闭 M4 控制的蜂鸣器
  • 效果展示 image.png

3.1 A7 接收打印

image.png

3.2 M4接收打印

image.png image.png