TDA4 IPC 原理

TI TDA4的IPC驱动利用MailBox和共享内存的方式实现核间通讯,核间交互数据存放在位于DDR共享内存中建立起来的Ring Buffer中,通过MailBox来通知消息状态。

VRing模块

设计VRing时,要求传入Ring Buffer的起始地址和大小,初始化过程中调用 Ipc_initVirtIO() 来完成地址初始化,对于每个核之间的地址共享分配是通过 Ipc_updateVirtIOInfo() 完成的。
以基础地质0xAA000000为起始地址,以Core编号为0的mpu1_0 (A72)和Core编号为1的mcu1_0 (mcu-r5f0_0)为例,最终的效果如下:

master core: 0, remote core 1 tx alloc addr = 0xaa000000 
master core: 0, remote core 1 rx alloc addr = 0xaa040000 
master core: 0, remote core 1 pr alloc addr = 0xaa020000
master core: 1, remote core 0 tx alloc addr = 0xaa040000 
master core: 1, remote core 0 rx alloc addr = 0xaa000000 
master core: 1, remote core 0 pr alloc addr = 0xaa060000

可以发现Core0发送给Core1的共享地址与Core1接收Core0的地址相同,在此地址基础上建立Ring Buffer来进行管理,每个发送或接收地址内默认建立256个buffer用于数据缓存,要注意这些缓存由多核操作,要注意处理数据一致性问题(比如关闭DCache)。
操作这些buffer用到的基础Api如下:

int16_t Virtio_getAvailBuf(Virtio_Handle vq, void **buf, int32_t *len)void Virtio_addAvailBuf(Virtio_Handle vq, void *buf, uint16_t head)void *Virtio_getUsedBuf(Virtio_Handle vq, uint16_t *token)int32_t Virtio_addUsedBuf(Virtio_Handle vq, int16_t head, int32_t len)

操作过程如图:
在这里插入图片描述
发送:Rpmsg_send时,会调用Virtio_getAvailBuf获取共享内存中可以被发送者使用的buffer,再调用Virtio_addUsedBuf标记该buffer已经填充数据;触发MailBox产生中断,通知对向核心。
接收:Rpmsg_recv由MailBox中断或轮询函数触发,调用Virtio_getUsedBuf查询是否有有效数据可以接受,如果有则Copy数据,调用Virtio_addAvailBuf标记该buffer重新可以被发送者使用。

MailBox的使用

MailBox作为消息通知的基础组件,IPC模块事先对使用到的MailBox进行分配,发送者和接收者触发和监听对应MailBox的事件来触发数据流。
分配位于ipc_soc.c中,该文件参与ipc库的编译。

 /* Host Processor - A72-vm0	*/
    {
        { { 0xFFU, 0xFFU,  0U}, { 0xFFU, 0xFFU, 0xFFU} },  /* Self - A72-vm0 */
        { {    0U,    0U,  0U}, {    0U,    0U,    1U} },  /* mcu-r5f0 */
        { {    0U,    0U,  2U}, {    0U,    0U,    3U} },  /* mcu-r5f1 */
        { {    1U,    0U,  0U}, {    1U,    0U,    1U} },  /* main-r5f0 */
        { {    1U,    0U,  2U}, {    1U,    0U,    3U} },  /* main-r5f1 */
#if defined (SOC_J721E)
        { {    2U,    0U,  0U}, {    2U,    0U,    1U} },  /* main-r5f2 */
        { {    2U,    0U,  2U}, {    2U,    0U,    3U} },  /* main-r5f3 */
        { {    3U,    0U,  0U}, {    3U,    0U,    1U} },  /* C66x-0 */
        { {    3U,    0U,  2U}, {    3U,    0U,    3U} },  /* C66x-1 */
        { {    4U,    0U,  0U}, {    4U,    0U,    1U} },  /* C7x-1 */
#endif
        { {    0U,    0U, 10U}, {    0U,    0U,   11U} }   /* A72-vm1 */
    },
    /* Host Processor - mcu1_0 	*/
    {
        { {    0U,    1U,  1U }, {    0U,    1U,  0U} },  /* A72-vm0 */
        { { 0xFFU, 0xFFU,  0U }, { 0xFFU, 0xFFU,  0U} },  /* Self - mcu-r5f0 */

可以看到,A72给MCU1_0发送消息使用的是0,0,1(Cluster,User,Fifo )编号的MailBox Fifo;MCU1_0接收A72消息配置的编号为0,1,1,其中Cluster和Fifo是一一对应的。

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值