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:通过远程服务使用 eMMC 驱动程序读取 eMMC 的内容的问题。

Guru**** 2554920 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1310232/tda4vh-q1-the-problem-of-using-the-emmc-driver-to-read-the-content-of-emmc-through-the-remote-service

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

您好、ti

我正在使用 SDK 8.6并尝试通过远程服务在 MCU2_0上读取 eMMC 数据。 但是、当使用 MMCSD_READ 函数时、串行端口上没有响应、并且会卡在那里。 您是否知道导致此问题的原因?

下面是我的测试案例代码:

A72端的代码:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <utils/remote_service/include/app_mmcsd.h>
#include <utils/remote_service/include/app_remote_service.h>
#include <utils/ipc/include/app_ipc.h>

#define APP_REMOTE_SERVICE_CSP_EMMC_NAME "csp_emmc_remote_service"

static int CheckRcoreState()
{
    char *value = NULL;
    // memset(value, 0, sizeof(value));
    appRemoteServiceRun(APP_IPC_CPU_MCU2_0, APP_REMOTE_SERVICE_CSP_EMMC_NAME, 0, (void *)value, 258, 0);
    for (uint8_t i = 0; i < 20; i++)
    {
        printf("%02x", value[i]);
    }
    printf("\n");
    // printf("%s\n", (char *)value);
    // memset(value, 0, sizeof(value));
    return 0;
}

int csp_emmc_main(int argc, char *argv[])
{
    CheckRcoreState();
    return 0;
}

MCU2_0端上的代码:

#include <stdio.h>
#include <string.h>
#include <utils/console_io/include/app_log.h>
#include <utils/remote_service/include/app_remote_service.h>
#include <utils/mem/include/app_mem.h>
#include <utils/ipc/include/app_ipc.h>
#include <utils/remote_service/include/app_mmcsd.h>
#include <utils/perf_stats/include/app_perf_stats.h>
#include <utils/misc/include/app_misc.h>
#include <ti/osal/TaskP.h>
#include <ti/osal/SemaphoreP.h>
#include <ti/drv/mmcsd/MMCSD.h>
#include <ti/drv/mmcsd/MMCSDver.h>

/* #define APP_REMOTE_SERVICE_TEST_DEBUG */

#define APP_REMOTE_SERVICE_CSP_EMMC_NAME "csp_emmc_remote_service"

MMCSD_Params params;

int32_t appCspEmmcHandler(char *service_name, uint32_t cmd, void *prm, uint32_t prm_size, uint32_t flags)
{
    uint8_t buffer[SECTORSIZE];
    appLogPrintf("REMOTE_SERVICE_EMMC: %s service received 0x%08x command and parameters of size %d bytes with %08x flags\n",
                 service_name,
                 cmd,
                 prm_size,
                 flags);

    if (prm == NULL)
    {
        appLogPrintf("REMOTE_SERVICE_EMMC:The pointer passed in is NULL!!!\n");
        return -1;
    }
    appLogPrintf("REMOTE_SERVICE_EMMC:The a72 request:%s\n", (char *)prm);

    appLogPrintf("MMCSD: 1 Init ... !!!\n");
    uint32_t index = MMCSD_INSTANCE_EMMC;
    MMCSD_Error ret;
    MMCSD_Handle handle;
    uint8_t i;
    // uint8_t buffer[SECTORSIZE];
    appLogPrintf("MMCSD: MMCSD_INSTANCE_EMMC is  %d\n", MMCSD_INSTANCE_EMMC);
    ret = MMCSD_init();
    appLogPrintf("MMCSD: 2 Init ... !!!\n");
    ret = MMCSD_Params_init(&params);
    appLogPrintf("MMCSD: 3 Init ... !!!\n");
    ret = MMCSD_open(index, params, &handle);
    appLogPrintf("MMCSD: 4 Init ... !!!\n");
    if (ret != 0)
    {
        appLogPrintf("MMCSD: ERROR Open Mmc %d wrong!!!\n", index);
    }
    appLogPrintf("MMCSD: 5 Init ... !!!\n");
    ret = MMCSD_read(handle, buffer, 38, READBLKNUM);
    appLogPrintf("MMCSD: 6 Init ... !!!\n");
    // for (i = 0; i < 20; i++)
    // {
    //     appLogPrintf("%02x", buffer[i]);
    // }
    appLogPrintf("MMCSD: 7 Init ... !!!\n");
    appLogPrintf("\n");
    appLogPrintf("MMCSD: 8 Init ... !!!\n");
    MMCSD_close(params);
    appLogPrintf("MMCSD: 9 Init ... !!!\n");
    appLogPrintf("MMCSD: Init ... Done !!!\n");

    appLogPrintf("REMOTE_SERVICE_EMMC:The a72 request:%s\n", (char *)prm);
    // memcpy(prm, buffer, SECTORSIZE);

    return 0;
}

int32_t appRemoteServiceCspEmmcInit()
{
    int32_t status = 0;

    status = appRemoteServiceRegister(APP_REMOTE_SERVICE_CSP_EMMC_NAME, appCspEmmcHandler);
    if (status != 0)
    {
        appLogPrintf("REMOTE_SERVICE_EMMC: ERROR: Unable to register remote service csp handler\n");
    }
    appLogPrintf("REMOTE_SERVICE_EMMC: SUCCESS: Able to register remote service csp handler\n");
    return status;
}

int32_t appRemoteServiceCspEmmcDeInit()
{
    int32_t status = 0;

    status = appRemoteServiceUnRegister(APP_REMOTE_SERVICE_CSP_EMMC_NAME);
    if (status != 0)
    {
        appLogPrintf("REMOTE_SERVICE_EMMC: ERROR: Unable to register remote service csp handler\n");
    }
    return status;
}

打印日志:

root@j784s4-evm:~# ./csp_emmc.out
APP: Init ... !!!
MEM: Init ... !!!
MEM: Initialized DMA HEAP (fd=4) !!!
MEM: Init ... Done !!!
IPC: Init ... !!!
IPC: Init ... Done !!!
REMOTE_SERVICE: Init ... !!!
REMOTE_SERVICE: Init ... Done !!!
    56.137266 s: GTC Frequency = 200 MHz
APP: Init ... Done !!!
    56.142564 s:  VX_ZONE_INIT:Enabled
    56.142576 s:  VX_ZONE_ERROR:Enabled
    56.142582 s:  VX_ZONE_WARNING:Enabled
    56.143383 s:  VX_ZONE_INIT:[tivxInitLocal:130] Initialization Done !!!
    56.144813 s:  VX_ZONE_INIT:[tivxHostInitLocal:93] Initialization Done for HOST !!!
[MCU2_0]     56.144916 s: REMOTE_SERVICE_EMMC: csp_emmc_remote_service service received 0x00000000 command and parameters of size 0 bytes with 00000000
flags
[MCU2_0]     56.144984 s: REMOTE_SERVICE_EMMC:The a72 request:
[MCU2_0]     56.145010 s: MMCSD: 1 Init ... !!!
[MCU2_0]     56.145030 s: MMCSD: MMCSD_INSTANCE_EMMC is  0
[MCU2_0]     56.145069 s: MMCSD: 2 Init ... !!!
[MCU2_0]     56.145091 s: MMCSD: 3 Init ... !!!
[MCU2_0]     60.711597 s: MMCSD: 4 Init ... !!!
[MCU2_0]     60.711631 s: MMCSD: 5 Init ... !!!

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

    您好!

    您使用的是哪种引导模式? 是否也从 eMMC 引导?

    此致、
    帕尔特

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

    您好!

    引导模式为 spl、从 SD 卡引导。

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

    您好!

    最后、我需要尝试一下。 请允许我花点时间就此问题与您联系。

    此致、
    帕尔特

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

    您好、Jas、

    您是否曾尝试在独立环境(即不在 A72上运行 Linux)中运行 MCU2_0应用程序? 这对您来说行得通吗?

    此致、
    帕尔特

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

    您好!

    我没有在独立环境中运行 MCU2_0应用程序。 但我已经尝试在 MCU2_0上的应用中单独使用 eMMC 驱动器。 使用 vision_apps_init.sh 脚本后、能够成功地从 eMMC 打印出数据。 但是、当我添加远程服务以获取 eMMC 数据时、该服务不起作用。

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

    通过 SD 卡启动测试。 也支持启动模式。

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

    您好!

    但我尝试在 MCU2_0上的应用程序中独立使用 eMMC 驱动程序。

    这对您来说行得通吗?

    但是,当我添加远程服务以获取 eMMC 数据时,它不起作用。

    您能否附加 CCS 并检查在 MMCSD_READ 内部发生故障/挂起的具体操作。 您应该在调试模式下重新构建 MCU2_0固件、从而正确地遍历代码。

    此致、
    帕尔特

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

    是的、工作正常。

    您能否连接 CCS 并检查 MMCSD_read 内部的确切操作是否发生故障/挂起。 您应该在调试模式下正确遍历代码重新编译 MCU2_0固件。

    我已经确定了问题。 它与 A72侧用于 eMMC 的 HS-400驱动器相关。 需要在 A72侧启用该驱动器。

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

    您好!

    我们在 TDA4VH 的 Linux 中不支持 HS-400。  
    是否有必须从 Linux 和 RTOS 访问 eMMC 的用例? 如果需要、则需要使用 HS-200模式、否则、我建议您从 Linux 禁用 eMMC、以便只有 RTOS 进行配置。  

    此致、
    帕尔特

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

    您好,

    我实际上需要在 Linux 和 RTOS 中访问 eMMC。 但是、如果我使用 HS-200模式、RTOS 侧的程序将在读取操作期间卡滞、无法检索任何数据。

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

    您好!

    好的。 在这种情况下、您可以使用 A72从 eMMC 读取数据并将其放入 DDR、然后通过 IPC 将地址传递到 MCU2_0。 通常不建议从 RTOS 和 Linux 访问任何外设。

    此致、
    帕尔特

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

    您好,

    这就是说、不建议 MCU2_0直接运行 eMMC。 相反、数据应由 A72读取并传输到 MCU2_0、正确吗?

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

    也就是说、不建议使用 A72和 MCU2_0中的 eMMC。 最好是只有一个 RTOS/HLOS 拥有 eMMC 的所有权

    此致、
    帕尔特

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

    正常,THX