总纲
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 处理器已经处理完数据了。M4 给A7发送数据步骤也是一样的,M4 负责拷贝数据到 vring0 中,A7从 vring0 读取数据。
1 STM32CubeIDE M4异核通讯设置(生成RPMsg_CM4.elf)
- IPCC、OPENAMP 和 USART3(用作 M4 的串口打印),
1.1 IPCC设置
1.2 OPENAMP设置
1.3 USART设置
2 AMP通讯框架API
- 以M4为中心
3 代码开发
3.1 M4核实现数据收发
- M4发送数据:
M4->A701 - M4接收数据:received rpmsg=
A7->M4: A7 have receiverd M4 message, Everything Ok, Please continue!
3.2 A7核实现数据收发
- A7发送数据:
A7->M4: A7 have receiverd M4 message, Everything Ok, Please continue! - A7接收数据: A7 received M4 message is =
M4->A701rx_count= 1
4 实验验证
4.1 设备树开发
- arch/arm/boot/dts/
stm32mp157d-atk.dtsi 出厂的设备树里开启了 m4_rproc 和 ipcc。 关闭 A7 核的 usart3。只要把 status 改为“disabled”。m4_system_resourcec 是控制 M4 的资源,只要把 status 改为“disabled”。把 usart3 资源分配给 M4,给 m4_usart3 节点追加 status 属性为“okay”,此节点定义在 stm32mp157-m4-srm.dtsi 文件里定义了。
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/目录下,拷贝结果如下
- 在 M4 里已经使用了 USART3 所以要在 A7 核里做相关的配置,去设置 A7 的 usart3 为关闭状态,
新建一个 stm32mp157d-atk-m4.dts设置如下所示 stm32mp157d-atk-m4.dts- 把编译好的
RPMsg_CM4.elf、设备树和 rpmsg_client_sample.ko文件拷贝到对应的目录下。创建一个 m4.sh 的脚本,方便以后调试 M4。
#!/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