ST MP157 IPCC 基于RPMsg共享内存框架的异核通讯-AMP综合

1,402 阅读3分钟

总纲

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

  • IPCC、OPENAMP 和 USART3(用作 M4 的串口打印)

1.1 IPCC设置

image.png

1.2 OPENAMP设置

image.png

1.3 USART设置

image.png image.png

2 AMP通讯框架API

  • 以M4为中心 image.png image.png image.png

3 代码开发

3.1 M4核实现数据收发

  • M4发送数据:M4->A7 01
  • M4接收数据:received rpmsg= A7->M4: A7 have receiverd M4 message, Everything Ok, Please continue! image.png image.png image.png image.png image.png

3.2 A7核实现数据收发

  • A7发送数据:A7->M4: A7 have receiverd M4 message, Everything Ok, Please continue!
  • A7接收数据: A7 received M4 message is = M4->A7 01 rx_count= 1 image.png

4 实验验证

4.1 设备树开发

image.png

  • arch/arm/boot/dts/stm32mp157d-atk.dtsi 出厂的设备树里开启了 m4_rproc 和 ipccimage.png image.png
  • 关闭 A7 核的 usart3。只要把 status 改为“disabled”。m4_system_resourcec 是控制 M4 的资源,只要把 status 改为“disabled”。把 usart3 资源分配给 M4,给 m4_usart3 节点追加 status 属性为“okay”,此节点定义在 stm32mp157-m4-srm.dtsi 文件里定义了。 image.png

4.2 技术验证

cp /home/qinkaixin/tools/atk_install/alientek_linux/arch/arm/boot/dts/stm32mp157d-atk-m4.dtb /home/qinkaixin/linux/tftpboot/

1:IP设置
setenv ipaddr 192.168.0.105
setenv ethaddr b8:ae:1d:01:01:01
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.120
saveenv

2:nfs调试
nfs C2000000 192.168.0.120:/home/qinkaixin/linux/nfs/rootfs/test


3:设置nfs根文件系统
setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.0.120:/home/qinkaixin/linux/nfs/rootfs,proto=tcp rw ip=192.168.0.105:192.168.0.120:192.168.0.1:255.255.255.0::eth0:off'
saveenv

4:tftp网络调试
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk-m4.dtb;bootm c2000000 - c4000000'
setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk2p3 rootwait rw'
saveenv
boot
  • 把编译好的LED_CM4.elf文件,拷贝到文件系统/lib/firmware/目录下,拷贝结果如下 image.png
  • 在 M4 里已经使用了 USART3 所以要在 A7 核里做相关的配置,去设置 A7 的 usart3 为关闭状态,新建一个 stm32mp157d-atk-m4.dts 设置如下所示
  • stm32mp157d-atk-m4.dts image.png
  • 把编译好的 RPMsg_CM4.elf、设备树和 rpmsg_client_sample.ko 文件拷贝到对应的目录下。创建一个 m4.sh 的脚本,方便以后调试 M4。 image.png
#!/bin/sh

rproc_class_dir="/sys/class/remoteproc/remoteproc0"
fmw_dir="/lib/firmware"

cd /sys/class/remoteproc/remoteproc0

if [ $1 == "start" ]
then
     /bin/echo -n $2 > $rproc_class_dir/firmware
     /bin/echo -n start > $rproc_class_dir/state
fi

if [ $1 == "stop" ]
then
     /bin/echo -n stop > $rproc_class_dir/state
 fi

image.png