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.

[参考译文] TDA4VM:MCU1_0向 A72发送数据失败、IPC

Guru**** 2535750 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1239952/tda4vm-mcu1_0-send-data-to-a72-failed-by-ipc

器件型号:TDA4VM

您好、TI

   我们的 SDK 是 TDA4 8.0.2、MCU 1-0和 A72通过 IPC 交换数据。 从 A72侧成功接收数据后、MCU 1-0将数据发送到 A72、但传输开始失败。 故障将持续一段时间、一段时间后、传输成功。 从失败到成功,我什么也没做。

  故障原因为 msg 为 NULL, 长度为0

令牌= Virtio_getAvailBuf (VQ、(void **)&msg、&length);
pOsalPrms->UnLockHIsrGate (module.gateSwi、key);

if (!msg)
{
printf ("RPMessage_rawSend ... NULL MsgHdr\n");
状态= IPC_EFAIL;

if (length < bufSize)
{
printf ("RPMessage_rawSend……长度%d、reqrd %d\n"、长度、bufSize);
状态= IPC_EFAIL;

 如何调试该问题? 谢谢

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

    您好、TI

      我发现此 问题的原因是  VQ->LAST_AVAI_IDX == VQ->VRING.AVAIL->IDX。  这对您的分析是否有帮助?

    int16_t Virtio_getAvailBuf (Virtio_Handle Vq、void ** buf、int32_t *长度)
    {
    uint16_t 头;
    int16_t RetVal;

    /*没有可用的信息? */
    if (vq->last_ave_idx == vq->vring.ave->idx)
    {
    /*我们需要了解已添加的缓冲区*/
    vq->vring.used->flags &=(uint16_t)~VRING_USED_F_NO_NOTI通知;
    RetVal =-1;
    否则

    *……

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

    您好!

    这看起来很奇怪。通常意味着没有可用于 VRING 的缓冲区。我们已经对其进行了测试、并具有 A72和 MCU1_0之间通信的现有示例。您能否尝试运行该示例、看看您正面临类似的问题?

    并确保 mcu1_0和 A72之间的存储器映射在资源表中正确无误 、并且在 A72和 R5f 之间的共享存储器中、PDK 需要动态地址

    pdk/packages/ti/drv/ipc/examples/linux/ipc_echo_test.c

    此致

    M·塔伦

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

    你好, Tarun

      感谢您的答复。 如何运行该示例?

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

    您好!

    SDK 提供了一个  ti-rpmsg-char  库、该库提供基本用户空间接口、允许 Linux 应用程序与远程处理器进行通信。   J721E Linux IPC  文档中简要介绍了这一点。

    本节正在等待更新以添加更多详细信息、但 Linux Remoteproc 和 rpmsg 基础设施在所有受支持的 TI K3 Jacinto 和 Sitara 器件之间是相同的。 请参阅等效的 AM64x Linux IPC  文档、其中提供了更多详细信息、特别是 3.6.9 RPMsg 示例 部分。

    唯一的区别是 firmwares 的名称和 Remoteproc 驱动程序使用的默认符号软链接固件名称。 通过在  已安装 rootfs 的/lib/firmware 文件夹中查找或通过在 Linux 内核控制台上运行以下命令,可以看到默认名称。

    $ head /sys/class/remoteproc/remoteproc */固件  

    ‘:内核中使用的 Remoteproc id 是完全动态的、而 rpmsg_char_simple 可执行文件中使用的"s-r"参数是固定的、
    和反映了库中 rproc_id.h 文件中指定的 ID。


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

    您好  

    并确保 mcu1_0和 A72之间的存储器映射在资源表中正确无误 、并且在 A72和 R5f 之间的共享存储器中、PDK 需要动态地址

        如何 确认这些信息? 我没有改变这一点。

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

    你好, Tarun

      我已按如下所示更改了配置文件

    diff --git a/board-support/linux/arch/arm64/configs/tisdk_j7-evm_defconfig b/board-support/linux/arch/arm64/configs/tisdk_j7-evm_defconfig
    索引24b172caf..08c6f31ed 100755
    -- a/board-support/linux/arch/arm64/configs/tisdk_j7-evm_defconfig
    ++ b/board-support/linux/arch/arm64/configs/tisdk_j7-evm_defconfig
    @@-7511、7 +7511、7 @@ CONFIG_SAMPLE=y
    # CONFIG_SAMPLE_KOBJECT 未设置
    # config_sample_hw_breakpointment 未设置
    # CONFIG_SAMPLE_KFIFO 未设置
    未设置-# CONFIG_SAMPLE_RPMSG_CLIENT
    +CONFIG_SAMPLE_RPMSG_CLIENT=y
    # CONFIG_SAMPLE_CONFIGFIGFS 未设置
    # CONFIG_SAMPLE_VFIO_MDEV_MDPY_FB 未设置
    # CONFIG_SAMPLE_WATCHDOG 未设置

    从 MCU 日志中可以看到、似乎与在处理

    root@J7-EVM:/# CD /opt/vision_apps
    root@J7-EVM:/opt/vision_apps source ./vision_apps_init.sh

    附录四.

    [MCU1_0] 10.124475 s:586 Virtio_getAvailBuf null:last_buf=22 ave-buf=22
    [MCU1_0] 10.309883 s:586 Virtio_getAvailBuf null:last_buf=23 avel-buf=23
    [MCU1_0] 10.383789 s:586 Virtio_getAvailBuf null:last_buf=24 available-buf=24
    [MCU1_0] 10.457787 s:586 Virtio_getAvailBuf null:last_buf=25 ave-buf=25
    [MCU1_0] 10.533639 s:586 Virtio_getAvailBuf null:last_buf=26 ave-buf=26
    [MCU1_0] 10.619524 s:586 Virtio_getAvailBuf null:last_buf=27 ave-buf=27
    [MCU1_0] 10.619739 s:586 Virtio_getAvailBuf null:last_buf=28 ave-buf=28
    [MCU1_0] 10.621600 s:586 Virtio_getAvailBuf null:last_buf=29 ave-buf=29
    [MCU1_0] 10.621775s:586 Virtio_getAvailBuf null:last_buf=30 ave-buf=30
    [MCU1_0] 10.621942 s:586 Virtio_getAvailBuf null:last_buf=31 avel-buf=31
    [MCU1_0] 10.622104 s:586 Virtio_getAvailBuf null:last_buf=32 ave-buf=32
    [MCU1_0] 10.622255 s:586 Virtio_getAvailBuf null:last_buf=33 ave-buf=33
    [MCU1_0] 10.622475s:586 Virtio_getAvailBuf null:last_buf=34 avel-buf=34
    [MCU1_0] 10.622642 s:586 Virtio_getAvailBuf null:last_buf=35 avel-buf=35
    [MCU1_0] 10.622813 s:586 Virtio_getAvailBuf null:last_buf=36 avel-buf=36
    [MCU1_0] 10.622969 s:586 Virtio_getAvailBuf null:last_buf=37 avel-buf=37
    [MCU1_0] 10.623112 s:586 Virtio_getAvailBuf null:last_buf=38 avel-buf=38
    [MCU1_0] 10.623264 s:586 Virtio_getAvailBuf null:last_buf=39 ave-buf=39

    四、决定草案.

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

    你好, Tarun

      上述信息是否表明原始 SDK 存在问题? 可以 在原始 SDK 中运行 IPC 测试吗? 非常感谢。

      (我运行 IPC_ECHO_TEST 失败。

     )

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

    您好!

    用法:rpmsg_char_simple [-r ][-n ][-d <rpmsg_dev_name][-p <remote_Endpt] 

    您是否可以尝试以这种方式从 root 用户运行?

    Rproc id 将基于 RTOS SDK 的 rproc_id.h 文件中的哪个内核?


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

    你好, Tarun

    rpmsg_dev_name & remote_Endpt 如何设置? 

       

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

    这不是必需的、如果不是具体的、

    示例:rpmsg_char_simple -r 2 -n 10

    此致

    M·塔伦

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

    你好, Tarun

       我在哪个路径中运行此命令?

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

    您能浏览我与您分享的文档链接吗,它解释了您一直在问的任何问题

    用法:rpmsg_char_simple [-r ][-n ][-d <rpmsg_dev_name][-p <remote_Endpt]
    默认值:rproc_id:0 num_msgs:100 rpmsg_dev_name:null remote_Endpt
    
    :14 root~ j721e-evm:@# rpmsg_char_simple -r 2 -n 10
    created Endpt device
    pong msg-char-2-1027,fd = 3 port = 1025与 rpmsg device ti.ipc4.ping-ping-pin-pin rpsg device 2交换10条消息...
    
    发送消息#0:你好,那里0!
    正在接收消息#0:您好!
    发送消息#1:你好!
    接收消息#1:在那里你好!
    发送消息#2:您好!
    接收消息#2:您好!
    发送邮件#3:你好,那里3!
    收到消息#3:你好,那里3!
    发送消息#4:你好,那里4!
    接收消息#4:你好那里4!
    发送消息#5:你好,那里5!
    收到消息#5:你好!
    发送消息#6:你好那里6!
    接收消息#6:你好那里6!
    发送消息#7:你好,那里7!
    接收消息#7:你好那里7!
    发送消息#8:你好,那里8!
    接收消息#8:你好那里8!
    发送消息#9:你好,那里9!
    收到消息#9:你好,那里9!
    
    在 rpmsg-char-2-1027上成功通信10条消息 




    如前所述、proc id 将基于您与 rproc_id.h 文件中的 A72进行通信的内核。

    enum rproc_id
    R5F_MCU0_0 = 0
    R5F_MCU0_1
    R5F_MAIN0_0
    R5F_MAIN0_1
    R5F_MAIN1_0
    R5F_MAIN1_1
    DSP_C66_0
    DSP_C66_1
    DSP_C71_0
    M4F_MCU0_0
    DSP_C71_1
    R5F_MAIN2_0
    R5F_MAIN2_1
    DSP_C71_2
    DSP_C71_3
    R5F_WKUP0_0
    RPROC_ID_MAX
    };
     
    此致
    M·塔伦
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好, Tarun

      通过更多的日志,我认为根本原因是,目标内核没有从 vring 缓冲区读出数据。我的其他同事正在考虑这个问题。

      我 发现 mcu1_0向 vring 缓冲区添加数据、最大缓冲区编号是258? 在哪里设置该值?  

     非常感谢!

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

    您好!

    缓冲区的最大值为256

    #define IPC_VRING_BUF_CNT   (256)

    pdk/packages/ti/drv/ipc/src/ipc_virtiio.c

    此致

    M·塔伦

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

    你好, Tarun

       在 A72内核侧、在系统引导时将 TX 数据发送到 mcu1_0后、创建 rpmsg Rx 处理程序、在选定功能时阻塞数百毫秒、无法读取 vring 的数据、Vring 缓冲区已满、IPC 传输失败、 几百毫秒后、不再阻止通信、IPC 通信正常。
    并且不会每次都发生该问题。 并且仅在系统引导时发生。
    解决此问题是因为出现问题时 IPC 驱动器的某些内容未初始化? 如何确认这一点?

    void *appIpcRpmsgRxTaskMain (void *arg)
    {
    APP_IPC_obj_t * obj =&g_app_ipc_obj;
    uint32_t 有效载荷;
    uint32_t maxfd;
    uint32_t NFD;
    int32_t 状态;
    FD_SET RFDS;
    uint32_t i;
    uint32_t 完成;

    DONE = 0;
    while (!done)
    {
    maxfd = 0;
    STATUS = 0;

    fd_zero (&RFDS);

    /*初始化 Rx FDS 以等待消息*/
    对于(I = 0;i< APP_IPC_CPU_MAX;I++)
    {
    if (appIpcIsCpuEnabled (i)&& i!= appIpcGetSelfCpuId ())
    {
    /*用于 RX 和 TX 的相同文件句柄*/
    maxfd = max (maxfd、obj->TX_FDS[i]);
    fd_set (obj->TX_FDS[i]、&RFDS);

    /*添加 FD 以取消阻止选择并在退出时从循环中断*/
    fd_set(obj->unblockfd、&RFDS);

    /*将一个添加到上次创建的 FD 中,这是通过 SELECT ()*/
    NFDS = MAX (maxfd、obj->unblockfd)+ 1;

    状态=选择(NFD、&RFDS、NULL、NULL、NULL); //当问题发生时在这里屏蔽数百毫秒

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

    这个数字是否可以变为更大? 剂量每个 内核都有自己的 num ?,或者每个内核的 vring 缓冲区的数量是相同的?

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

    您好!

    不是一样的。

    请参阅以下常见问题解答和文档。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1205711/faq-tda4vm-explain-why-vring_base_address-0xaa000000-and-ipc_vring_buffer_size-0x1c00000u

    此致

    M·塔伦

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

    你好, Tarun

      感谢您的答复。 但我认为更改 vring 缓冲区的数字不能解决问题。

       MCU1_0将数据发布到振铃缓冲区、但 A72似乎对此一无所知。 也许它没有在目的 CPU 上触发一个中断。下一步如何调试?

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

    您好!

    您能否告诉我、从 A72向 MCU1_0发送消息时遵循的过程是什么?  

    您可以 启用时间戳 在您正在使用的 minicom/终端中、将完整的日志(即、 完整启动日志、从 A72发送到 MCU1_0的应用程序的日志以及"source ./vision_apps_init.sh"的完整日志 )

    这可以让我们对这个问题有更深入的了解。

    此致、

    尼基尔