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.

[参考译文] TDA4VE-Q1:MCU2_0固件中 GPIO 扩展器2的 USER_LED1状态切换阻止

Guru**** 2466960 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1464372/tda4ve-q1-block-in-turnning-on-user_led1-of-gpio-expander2-in-mcu2_0-firmware

器件型号:TDA4VE-Q1

工具与软件:

尊敬的 TI 专家:

我使用 TDA4VE EVM (J721S2 SOM + CPB)、它在 Linux + RTOS 模式下使用 SDK 版本 R85运行。

我的目的是在显示端口0 (DP0_PWR_SW_EN)开启时打开 USER_LED1、该 LED 连接到 GPIO Expeder2端口2:PIN6 (P26)。

我在  vision_apps/utils/dss/app_dss_soc.c 中添加了以下代码 src

void appDssConfigureDP(void)
{
    Board_STATUS b_status;
    Board_IoExpCfg_t ioExpCfg;

    appLogPrintf("DSS: Turning on DP_PWR pin for eDP adapters ... !!!\n");

    #if defined (SOC_J721E)
    ioExpCfg.i2cInst     = 1U;
    #elif defined (SOC_J721S2) || defined (SOC_J784S4)
    ioExpCfg.i2cInst     = 4U;
    #endif
    ioExpCfg.socDomain   = BOARD_SOC_DOMAIN_MAIN;
    ioExpCfg.slaveAddr   = 0x20;
    ioExpCfg.enableIntr  = false;
    ioExpCfg.ioExpType   = ONE_PORT_IOEXP;
    ioExpCfg.portNum     = PORTNUM_0;
    ioExpCfg.pinNum      = PIN_NUM_0;
    ioExpCfg.signalLevel = GPIO_SIGNAL_LEVEL_HIGH;

    b_status = Board_control(BOARD_CTRL_CMD_SET_IO_EXP_PIN_OUT, (void *)(&ioExpCfg));

    #if defined (SOC_J721S2) || defined (SOC_J784S4)
    appLogWaitMsecs(500u);
    #endif

+   #if defined (SOC_J721S2)
+   appLogPrintf("DSS: Turning on USER_LED1 ... !!!\n");
+   ioExpCfg.i2cInst     = 0U;   // BOARD_I2C_IOEXP_DEVICE2_INSTANCE
+   ioExpCfg.socDomain   = BOARD_SOC_DOMAIN_MAIN;
+   ioExpCfg.slaveAddr   = 0x22U;   // BOARD_I2C_IOEXP_DEVICE2_ADDR
+   ioExpCfg.enableIntr  = false;
+   ioExpCfg.ioExpType   = THREE_PORT_IOEXP;
+   ioExpCfg.portNum     = PORTNUM_2;
+   ioExpCfg.pinNum      = PIN_NUM_6;
+   ioExpCfg.signalLevel = GPIO_SIGNAL_LEVEL_HIGH;
+   b_status = Board_control(BOARD_CTRL_CMD_SET_IO_EXP_PIN_OUT, (void *)(&ioExpCfg));
+   appLogWaitMsecs(500u);
+   #endif

    if (b_status == BOARD_SOK)
    {
        appLogPrintf("DSS: Turning on DP_PWR pin for eDP adapters ... Done!!!\n");
    }
...

但我发现、在控制 GPIO 扩展器2时、MCU2固件卡在 Board_CONTROL ()中。

我注意到、GPIO 扩展器2的某些引脚(例如 GPIO_uSD_PWR_EN)通过 A72 Linux 进行控制。

我想知道是否也可以在 MCU2 RTOS 固件中控制 GPIO 扩展器2引脚? 以及如何实现?

请建议、谢谢。

此致、

Christopher

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

    您好!

    我还在中添加了以下代码 vision_apps/utils/misc/src/app_pinmux_j721s2.c 并更新了 vx_app_rtos_linux_mcu2_0.out

    但是、它仍然无法正常工作、并 Board_control() 在控制 GPIO 扩展器2时卡住

    ...
    
    static pinmuxPerCfg_t gI2c0PinCfg[] =
    {
        /* MyI2C0 -> I2C0_SCL -> AH25 */
        {
            PIN_I2C0_SCL, PIN_MODE(0) | \
            ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
        },
        /* MyI2C0 -> I2C0_SDA -> AE24 */
        {
            PIN_I2C0_SDA, PIN_MODE(0) | \
            ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
        },
        {PINMUX_END}
    };
    
    static pinmuxModuleCfg_t gDispPinCfg[] =
    {
        {0, TRUE, gI2c4PinCfg},
        {1, TRUE, gI2c0PinCfg},
        {PINMUX_END}
    };
    
    ...
    
    void appSetPinmux(app_pinmux_cfg_t *cfg)
    {
        if (NULL != cfg)
        {
            if (TRUE == cfg->enable_i2c)
            {
                /* Enable Pinmux for I2C4 and I2C0 */
                gDispPinCfg[0].doPinConfig = TRUE;
            }
            else
            {
                /* Disable Pinmux for I2C4 and I2C0 */
                gDispPinCfg[0].doPinConfig = FALSE;
            }
        }
    
        Board_pinmuxUpdate(gBasicDemoPinmuxDataInfo,
                           BOARD_SOC_DOMAIN_MAIN);
    }
    
    

    此致、
    Christopher

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

    Christopher、您好!

    您是否在 R5F 中作为独立应用程序运行此 GPIO 示例? 在这种情况下、您也看到问题了吗?

    此致、

    Nikhil

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

    您好、Nikhil:

    否、我还没有尝试独立 GPIO 示例。 我将花时间去做。

    关于上述为打开用户 LED 所做的修改、我是否遗漏或出了问题?

    谢谢。

    此致、

    Christopher

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

    您好!

    以上内容看起来不错、但我建议先运行独立的 GPIO、以确保在与 vision_apps 集成之前、您在 R5内核上有工作代码。

    此致、

    Nikhil

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

    您好、Nikhil:

    我在 RTOS SDK 中使用了 MCASP_307.LED、并添加了以下代码来打开用户 Loopback_Test。

    修改 pdk_j721s2_08_05_00_36/packages/ti/drv/McASP/Example/j721s2/audio_evmInit.c 中的代码 src

    --- a/pdk_j721s2_08_05_00_36/packages/ti/drv/mcasp/example/j721s2/src/audio_evmInit.c
    +++ b/pdk_j721s2_08_05_00_36/packages/ti/drv/mcasp/example/j721s2/src/audio_evmInit.c
    @@ -98,6 +98,8 @@ uint32_t vaOffset = 0;
     void IoExpanderConfig(void);
     #endif
     
    +void IoExpanderConfig_forULED(void);
    +
     #include <stdlib.h>
     #include <ti/drv/gpio/GPIO.h>
     #include <ti/csl/soc.h>
    @@ -173,6 +175,9 @@ void configureAudio(void)
         IoExpanderConfig();
     #endif
         
    +    MCASP_log("Turn on the USER LED\n");
    +    IoExpanderConfig_forULED();
    +
         /* Configure AUDIO_REFCLK1 as output */
         HW_WR_REG32(0x01082E4, 0x8000);
         
    @@ -208,6 +213,28 @@ void McASP_Enable(void)
     
     extern I2C_Handle gIoExpI2cHandle;
     
    +void IoExpanderConfig_forULED(void)
    +{
    +    Board_IoExpCfg_t ioExpCfg;
    +
    +    /* Set USER LED to LOW */
    +    ioExpCfg.slaveAddr   = BOARD_I2C_IOEXP_DEVICE2_ADDR;
    +    ioExpCfg.i2cInst     = BOARD_I2C_IOEXP_DEVICE2_INSTANCE;
    +    ioExpCfg.socDomain   = BOARD_SOC_DOMAIN_MAIN;
    +    ioExpCfg.enableIntr  = false;
    +    ioExpCfg.ioExpType   = THREE_PORT_IOEXP;
    +    ioExpCfg.portNum     = PORTNUM_2;
    +    ioExpCfg.pinNum      = PIN_NUM_6;
    +    ioExpCfg.signalLevel = GPIO_SIGNAL_LEVEL_LOW;
    +    status = Board_control(BOARD_CTRL_CMD_SET_IO_EXP_PIN_OUT, (void *)&ioExpCfg);
    +    if(status != BOARD_SOK)
    +    {
    +        MCASP_log("\n Board setting data to 3 port IO expander failed\n");
    +    }else {
    +        MCASP_log("\n user led is turning on now\n");
    +    }
    +}
    +
     void IoExpanderConfig(void)
    

    固件构建方法: make -s -j build_profile=release board=j721s2_evm core=mcu2_0 mcasp_307freertos Loopback_Test

    然后在 u-boot 中加载独立固件:  

    LED 成功亮起。

    因此、我仍然不知道为什么它在与 vision_apps 集成后不起作用。

    谢谢。

    此致、

    Christopher

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

    Christopher、您好!

    您在 vision_apps 中使用的 I2C 是否与 Linux 一样被禁用?

    在 Linux SDK 中、覆盖了 k3-j721s2-vision-apps.dtso {PSDKLA}/board-support/ti-linux-kernel-xxx/arch/arm64/boot/dts/ti 获取文件

    在这里、您可以看到为 R5内核上使用的 I2C 禁用了 i2c。 您能否检查一下您是否在此处添加了 i2c 节点?

    重新生成 dtbo 并替换 SD 卡上 rootfs 分区中的相同命令、以使其生效。

    此致、

    Nikhil

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

    您好、Nikhil:

    用于 IOEXP2的 I2C0无法在 Linux 中禁用、因为它还控制 SD 卡电源使能引脚(GPIO_uSD_PWR_EN)。

    如果在 DTS 叠加中分解 I2C0、则 Linux 在引导时将卡住。

    那么、这是否意味着如果 I2C 总线在 Linux 中控制、那么它也无法在 RTOS 中控制?

    谢谢。

    此致、

    Christopher

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

    Christopher、您好!

    是的、正确、因为它是具有两个不同端口的同一扩展器引脚、所以不应在两端都进行配置、这可能导致重新配置。

    此致、

    Nikhil Dasan

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

    您好、Nikhil:

    感谢您的解释。

    我们将尝试控制 Linux 端的用户 LED。

    谢谢。此致、

    Christopher