This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VH-Q1:如何使用 A72启动和放大;停止 MCAL IPC

Guru**** 2484615 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1442934/tda4vh-q1-how-to-use-a72-to-start-stop-mcal-ipc

器件型号:TDA4VH-Q1
主题中讨论的其他器件:TDA4VH

工具与软件:

尊敬的 TI 专家:

客户在 SDK9.2上使用 SOP TDA4VH、现在在 MCU1-1和 MCU4-0上实施了两个安全通道。 由于没有太多的物理动态(全部在 R5f 上)、认证机构需要添加更多的软件动态来提高认证的安全分数。

客户尝试实现的一项功能是使用 A72来启动和停止 MCAL IPC。 背景是、客户成功使用 A72启动和停止 PDK IPC 以前、 它们 处理邮箱消息 IPC_RP_MBOX_SHUTDOWN 在回调函数(.. rpMboxMsgFxn )。 当终止安全机制时、它们通过确认关断 IPC_RP_MBOX_SHUTDOWN_ACK .

但是、客户不知道如何使用类似的方法启动和停止 MCAL IPC cdipc 在 A72、您能帮助为客户推荐一种尝试的方法吗?

非常感谢、

Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    分配到此票证的专家将在下周中旬之前不会有空。 敬请期待一个星期的答复。

    Unknown 说:
    但是、客户不知道如何使用类似的方法启动和停止 MCAL IPC cdipc 在 A72、您能帮助建议客户尝试的方法吗?

    如果客户已在 PDK IPC 中实施此功能、则他们也可以将其扩展到 CDD IPC。 PDK IPC 和 CDD IPC 的底层 IPC 层非常相似。 他们必须拥有此功能、而这超出了 TI 支持的范围。

    此致

    Suman

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这就是完全停止 MCU R5F 内核吗?   

    --是的。

     实现此目的的总体动机是什么?

    --主要用于系统引导阶段,如重新配置。

    如果客户已在 PDK IPC 中实施此功能、则他们也可以将其扩展到 CDD IPC。 PDK IPC 和 CDD IPC 的底层 IPC 层非常相似。 他们必须拥有此功能、而这超出了 TI 支持的范围。

    ---(1)相关代码 不同 , 其有证书的 CDD IPC。

    < void Ipc_mailboxInternalCallback(uintptr_t arg)
    ---
    > static void Ipc_mailboxInternalCallback(uintptr_t arg)
    359,362c440,447
    <     uint32              n;
    <     Ipc_MailboxData      *mbox;
    <     uint32              msg[4];
    <     Ipc_MailboxFifo      *fifo;
    ---
    >     uint32_t          n, i;
    >     Ipc_MailboxData  *mbox;
    >     volatile uint32_t msg[4] = {0, 0, 0, 0};
    >     volatile uint32_t parsedMsg[4] = {0, 0, 0, 0};
    >     volatile uint32_t rpMboxMsgRecv = 0, rpMboxMsg = 0;
    >     volatile uint32_t numMessages;
    >     Ipc_MailboxFifo  *fifo;
    >     uint32_t shutdownMsg = IPC_RP_MBOX_SHUTDOWN;
    373c458
    <             if(0U != MailboxGetRawNewMsgStatus(mbox->baseAddr, mbox->userId, fifo->queueId))
    ---
    >             if(0U != Mailbox_getRawNewMsgStatus(mbox->baseAddr, mbox->userId, fifo->queueId))
    375c460,461
    <                 if( MailboxGetMessageCount(mbox->baseAddr, fifo->queueId) > 0U)
    ---
    >                 numMessages = Mailbox_getMessageCount(mbox->baseAddr, fifo->queueId);
    >                 if(numMessages > 0U)
    378c464
    <                     MailboxGetMessage(mbox->baseAddr, fifo->queueId, msg);
    ---
    >                     Mailbox_getMessage(mbox->baseAddr, fifo->queueId, (uint32_t *)msg);
    381,382c467,468
    <                     MailboxClrNewMsgStatus(mbox->baseAddr, mbox->userId,
    <                             fifo->queueId);
    ---
    >                     Mailbox_clrNewMsgStatus(mbox->baseAddr, mbox->userId,
    >                                                fifo->queueId);
    384,385c470,494
    <                     /* Call the function with arg */
    <                     (mbox->fifoTable[n].func)(msg, fifo->arg);
    ---
    >                     /* Process till we get the special RP Mbox message */
    >                     for(i=0; i<numMessages; i++)
    >                     {
    >                         if(msg[i] != shutdownMsg)
    >                         {
    >                             parsedMsg[i] = msg[i];
    >                         }
    >                         else
    >                         {
    >                             rpMboxMsgRecv = 1;
    >                             rpMboxMsg = msg[i];
    >                             break;
    >                         }
    >                     }
    > 
    >                     if((0U == rpMboxMsgRecv) || ((1U == rpMboxMsgRecv) && (numMessages > 1U)))
    >                     {
    >                         /* Call the function with arg */
    >                         (mbox->fifoTable[n].func)((uint32_t *)parsedMsg, fifo->arg);
    >                     }
    > 
    >                     if((1U == rpMboxMsgRecv) && (NULL != gIpcObject.initPrms.rpMboxMsgFxn))
    >                     {
    >                         gIpcObject.initPrms.rpMboxMsgFxn(fifo->arg, rpMboxMsg);
    >                     }
    389d497
    <                 /*CDD_IPC_CoverageGap_34: There is only one msg in the queue always so it does not excute the else part. */
    391c499
    <                     MailboxClrNewMsgStatus(mbox->baseAddr, mbox->userId, fifo->queueId);
    ---
    >                     Mailbox_clrNewMsgStatus(mbox->baseAddr, mbox->userId, fifo->queueId);

     

    --(2) CDD IPC 调用  IPC_mailboxInternalCallback 不像 PDK IPC 那样, CDD IPC 必须匹配远程 ID ,如果不匹配,则不能调用  IPC_mailboxInternalCallback。   

    /** \brief Low Level Mailbox ISR for a given remote processor */
    void Ipc_mailboxIsr(uint32 remoteProcId)
    {
        uintptr_t mBoxData = 0U;
    
        if (IPC_MAX_PROCS > remoteProcId)
        {
            mBoxData = gIpcRProcIdToMBoxDataMap[remoteProcId];
            if (0U != mBoxData)
            {
                Ipc_mailboxInternalCallback(mBoxData);
            }
            else
            {
              /* Do Nothing */
            }
        }
        else
        {
          /* Do Nothing */
        }
    
        return;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该功能 是由 TI 提供的

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Suman、Tarun、

    客户描述了他们可能需要您的支持来启动和停止 CDD IPC 的原因、例如远程 ID、客户需要您的帮助来指导他们如何匹配远程 ID 来 调用  IPC_mailboxInternalCallback、

    感谢您的帮助!

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如上所述、这违反了安全标准、不能单独复位 MCU R5F 内核、而不能复位整个系统。 可能存在无法解决的 sciserver 调用。

    您需要重置整个系统。

    此致

    Tarun Mukesh