总纲
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
)
本实验是使用 Linux 自带的驱动,此驱动代码在:drivers/rpmsg/rpmsg_tty.c
。此驱动也是
很简单的,在rpmsg_client_sample
驱动下添加了一个UART框架,UART框架把异核通讯封装
了一层,用户层就可以通过调用UART进行异核通讯。实验目的,通过UART发送数据进行控制蜂鸣器。
1 STM32CubeIDE M4异核通讯设置(生成RPMsg_CM4.elf
)
1.1 参考《# ST MP157 IPCC 基于RPMsg异核间共享内存框架开发-AMP通讯综合》
1.2 设置GPIO
1.2 M4 AMP通讯框架API
1.3 M4 代码开发
- A7发送数据:
beep_on
- A7发送数据:
beep_off
- M4核接收回调函数,即:接收到A7核发送过来的数据:
beep_on/beep_off
,就设置VirtUart0RxMsg=SET - 判断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
2 A7核开发驱动模块
串口通信内核日志暂时打印不出来
3 技术验证
- 把RPMsg_UART_CM4.elf拷贝到/lib/firmware/目录
- 网络NFS根文件系统启动
- 把编译好的
RPMsg_UART_CM4.elf
、设备树文件拷贝到对应的目录下。创建一个 m4.sh 的脚本,方便以后调试 M4 - 启动测试
./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 控制的蜂鸣器
- 效果展示
3.1 A7 接收打印
3.2 M4接收打印