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.

[参考译文] TDA4AL-Q1:MAX96789 I2C4读取/写入在 vision_apps_init.sh 期间失败

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1429274/tda4al-q1-max96789-i2c4-read-write-failed-during-vision_apps_init-sh

器件型号:TDA4AL-Q1

工具与软件:

尊敬的 TI 专家:

我们正在开发基于 J721S2的定制电路板。
J721S2 EVM 的输出是 eDP、但 我们的电路板想通过 DSI 发送显示输出。
连接图如下所示。
TDA4AL -- MAX96897 -- MAX96772 -- DP 显示
      DSI0         GMSL2        Dp
那么、在${psdk_rtos_path}/vision_apps/platform/j721s2/rtos/common/app_cfg_mcu2_0.h 文件中、
我们使用了 enable_dss_single 和 enable_dss_DSI。
在${PSDK_RTOS_PATH}/vision_apps/utils/dss/Dss/app_dss_soc.c src 文件中、
我按如下方式向 I2C4添加了 MAX96897初始化代码、
但是、在执行/ti_fs/vision_apps/vision_apps_init.sh 时、I2C4读取操作失败。

if (FVID2_SOK == status)
{
status = appDssDsiInitI2c();
}

if (FVID2_SOK == status)
{
    clientAddr = (0x80>>1);
    uint16_t regAddr = 0x000D;
    uint8_t regValue = 0xFF;
    
    status = Board_i2c16BitRegRd(gI2cHandle, clientAddr, regAddr, &regValue, 1U, 0U, BOARD_I2C_TRANSACTION_TIMEOUT);
    appLogWaitMsecs(5U);
    if (0 != status) {
        appLogPrintf("DSS-MAX96789: Read Failed for ClientAddr 0x%x RegAddr 0x%x Value 0x%x !\n", clientAddr, regAddr, regValue);
    }
    else {
        appLogPrintf("DSS-MAX96789: Success, ClientAddr 0x%x RegAddr 0x%x Value 0x%x !\n", clientAddr, regAddr, regValue);
    }
}

当然、我确认了 I2C4的读取/写入正常工作、方法是在单片应用中使用相同的代码打开 R5[MCU2_0]内核上的 I2C4。
对这个问题进行总结、
我想知道为什么 vision_apps_init.sh 中 I2C4的读取/写入失败。
非常感谢任何意见。

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

    I2C4多路复用器配置如下所示、

    J721S2-ICMU@QNX:/ti_fs/vision_apps# k3conf 读取0x0011c010
    **□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□F |
    | VERSION INFO |
    **□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□F |
    | K3CONF | QNX (版本0.1-nogit 构建日期:10月23日上午11:39:05 KST 2024)|
    | SoC | J721S2 SR1.0|
    | SYSFW | ABI:3.1 (固件版本0x0009 '9.2.4--v09.02.04 (Kool Koala))')|
    **□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□F |

    地址0x11c010 = 0x40008处的值

    J721S2-ICMU@QNX:/ti_fs/vision_apps# k3conf 读取0x0011c014
    **□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□F |
    | VERSION INFO |
    **□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□F |
    | K3CONF | QNX (版本0.1-nogit 构建日期:10月23日上午11:39:05 KST 2024)|
    | SoC | J721S2 SR1.0|
    | SYSFW | ABI:3.1 (固件版本0x0009 '9.2.4--v09.02.04 (Kool Koala))')|
    **□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□F |

    地址0x11c014 = 0x40008处的值

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

    您好!

    [报价 userid="606153" url="~/support/processors-group/processors/f/processors-forum/1429274/tda4al-q1-max96789-i2c4-read-write-failed-during-vision_apps_init-sh ]]我确认 I2C4的读/写工作正常、方法是使用相同的代码在 singlecam 应用程序中打开 R5[MCU2_0]内核上的 I2C4。

    您能告诉我您如何在 R5内核上检查这个吗?在哪里检查?

    此致、

    Nikhil

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

    尊敬的 Nikhil Dasan:

    我已在${PSDK_RTOS_PATH}/imaging/I2C/iss_sensors.c 文件中实现了 src 测试代码。
    它能如我所料正常工作。
    代码如下

    static int32_t setupI2CInst_DSI(uint8_t i2cInst)
    {
        int32_t status = -1;
    
        I2C_Params i2cParams;
    
        /* Initializes the I2C Parameters */
        I2C_Params_init(&i2cParams);
        i2cParams.bitRate = I2C_400kHz;
    
        /* Configures the I2C instance with the passed parameters*/
        if(NULL == gISS_Sensor_I2cHandle_DSI)
        {
            issLogPrintf("I2C4 Open i2cInst = %d ------------------!\n",i2cInst);
           gISS_Sensor_I2cHandle_DSI = I2C_open(i2cInst, &i2cParams);
        }
    
        if(gISS_Sensor_I2cHandle_DSI == NULL)
        {
            printf(" I2C: ERROR: I2C Open Failed for instance %d !!!\n", i2cInst);
            status = -1;
        }
        else
        {
            status = 0;
        }
    
        return status;
    }
    
    static int32_t MAX96789_TestRead(ICMU_I2cParams *script)
    {
        uint16_t regAddr;
        uint8_t  regValue;
        int32_t status = 0;
        uint8_t  I2cAddr;
        uint16_t delayMilliSec;
    
        issLogPrintf("************************************************************* \n");
        issLogPrintf("[I2C4 init start]..............\n");
        issLogPrintf("************************************************************* \n");
    
        if(NULL != script)
        {
            /* Serializer test code*/
            I2cAddr = (0x80>>1);
            regAddr = 0x000D;
            regValue = 0xff;
    
            status |= Board_i2c16BitRegRd(gISS_Sensor_I2cHandle_DSI, I2cAddr, regAddr, &regValue, 1U, 0U/*byteOrder*/, SENSOR_I2C_TIMEOUT);
            if (0 == status)
            {
                issLogPrintf(" MAX96789 Reg READ Sucess for 0x%x, regAddr 0x%x  regValue 0x%x \n", I2cAddr, regAddr, regValue);
            } else {
                issLogPrintf(" MAX96789 Reg READ FAILED for 0x%x, regAddr 0x%x  regValue 0x%x \n", I2cAddr, regAddr, regValue);
            }     
    
    
            int cnt = 0;
            I2cAddr  = script[0].nI2cAddr;
            while (I2cAddr != 0xFF)
            {
                /* Convert Registers address and value into 8bit array */
                I2cAddr = (script[cnt].nI2cAddr >> 1);
                regAddr  = script[cnt].nRegAddr;
                regValue = script[cnt].nRegValue;
                delayMilliSec = script[cnt].nDelay;
                if (I2cAddr == 0x7F)
                {
                    break;
                }
    
                issLogPrintf("MAX96789 0x%x, regAddr 0x%x  regValue 0x%x delay 0x%x cnt %d \n", I2cAddr, regAddr, regValue, delayMilliSec, cnt);
                status |= Board_i2c16BitRegWr(gISS_Sensor_I2cHandle_DSI, I2cAddr, regAddr, &regValue, 1U, 0U/*byteOrder*/, SENSOR_I2C_TIMEOUT);
                if (0 != status) {
                    issLogPrintf("[I2C] Error =: Reg Write Failed for 0x%x, regAddr 0x%x  regValue 0x%x delay 0x%x cnt [%d] \n", I2cAddr, regAddr, regValue, delayMilliSec, cnt);
                } 
                else {
                    issLogPrintf("[I2C] Reg Write Sucess for 0x%x, regAddr 0x%x  regValue 0x%x delay 0x%x cnt [%d]\n", I2cAddr, regAddr, regValue, delayMilliSec, cnt);
                }
    
                if (delayMilliSec > 0) {
                    TaskP_sleepInMsecs(delayMilliSec);
                }
                cnt++;
            }
    
            delayMilliSec = 0x1a;
            TaskP_sleepInMsecs(delayMilliSec);
        }
    
        issLogPrintf("------------------------------------------------------------------------------------\n");
        return (status);
    }
    
    i2cInstId = 4;
    status = setupI2CInst_DSI(i2cInstId);
    status = MAX96789_TestRead(MAX96789SerCfg_Common);
    
    


    结果如下所示、
    [MCU2_0]     99.884133 s: F=MAX96789_TestRead,L=2484  MAX96789 Reg READ Sucess for 0x40, regAddr 0xd  regValue 0x80 
    [MCU2_0]     99.884168 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x308  regValue 0x5e delay 0x0 cnt 0 
    [MCU2_0]     99.884354 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x308  regValue 0x5e delay 0x0 cnt [0]
    [MCU2_0]     99.884394 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x311  regValue 0x1 delay 0x0 cnt 1 
    [MCU2_0]     99.884577 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x311  regValue 0x1 delay 0x0 cnt [1]
    [MCU2_0]     99.884615 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x332  regValue 0x4e delay 0x0 cnt 2 
    [MCU2_0]     99.884797 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x332  regValue 0x4e delay 0x0 cnt [2]
    [MCU2_0]     99.884835 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x333  regValue 0xe4 delay 0x0 cnt 3 
    [MCU2_0]     99.885018 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x333  regValue 0xe4 delay 0x0 cnt [3]
    [MCU2_0]     99.885056 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x4  regValue 0x50 delay 0x0 cnt 4 
    [MCU2_0]     99.885238 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x4  regValue 0x50 delay 0x0 cnt [4]
    [MCU2_0]     99.885277 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x331  regValue 0x3 delay 0x0 cnt 5 
    [MCU2_0]     99.885459 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x331  regValue 0x3 delay 0x0 cnt [5]
    [MCU2_0]     99.885497 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x330  regValue 0x4 delay 0x0 cnt 6 
    [MCU2_0]     99.885680 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x330  regValue 0x4 delay 0x0 cnt [6]
    [MCU2_0]     99.885717 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x31c  regValue 0x98 delay 0x0 cnt 7 
    [MCU2_0]     99.885902 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x31c  regValue 0x98 delay 0x0 cnt [7]
    [MCU2_0]     99.885940 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x321  regValue 0x24 delay 0x0 cnt 8 
    [MCU2_0]     99.886123 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x321  regValue 0x24 delay 0x0 cnt [8]
    [MCU2_0]     99.886161 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x31d  regValue 0x98 delay 0x0 cnt 9 
    [MCU2_0]     99.886344 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x31d  regValue 0x98 delay 0x0 cnt [9]
    [MCU2_0]     99.886382 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x322  regValue 0x24 delay 0x0 cnt 10 
    [MCU2_0]     99.886565 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x322  regValue 0x24 delay 0x0 cnt [10]
    [MCU2_0]     99.886604 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x326  regValue 0xe4 delay 0x0 cnt 11 
    [MCU2_0]     99.886786 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x326  regValue 0xe4 delay 0x0 cnt [11]
    [MCU2_0]     99.886824 s: F=MAX96789_TestRead,L=2504 MAX96789 0x40, regAddr 0x2  regValue 0x73 delay 0x0 cnt 12 
    [MCU2_0]     99.887007 s: F=MAX96789_TestRead,L=2510 [I2C] Reg Write Sucess for 0x40, regAddr 0x2  regValue 0x73 delay 0x0 cnt [12]
    

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

    您好!

    审核后、

    在 工作条件下、您是否在 IssSensorInit ()中调用以下 API?  

    i2cInstId = 4;
    状态= setupI2CInst_DSI (i2cInstId);
    状态= MAX96789_TestRead (MAX96789PRU Cfg_Common);

    如果是、则在 appDssDefaultInit ()之后仅调用2个 API。  

    此外、您能否检查 MAX96789的通电位置?

    此致、

    Nikhil

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

    尊敬的 Nikhil:

    我在 iss_sensors.c 中为 Sensor_Remote LaunchHandler 函数添加了测试代码并对其进行了测试。

    这是我运行 run_app_single_cam.sh 时的情况、而不是 vision_apps_init.sh。

    这仅是测试代码、无论 I2C4是否正常工作。

    据我所知、appDssDefaultInit 函数将在运行 vision_apps_init.sh 时完成。

    我的目标是在运行 vision_apps_init.sh 时让 I2C4正常工作。

    关于 MAX96789电源、我在 QNX IPL 期间插入了 GPIO_19 (V27)。

    #define ICMU_SER_PWDN_EN_PIN_NUM     (19U)
        // pinmux for I2C4
        out32(J721S2_CTRLMMR_PADCONFIG + 0x014, PIN_INPUT_ENABLE | PIN_MODE(8)); /* (AD25) I2C4_SCL */
        out32(J721S2_CTRLMMR_PADCONFIG + 0x010, PIN_INPUT_ENABLE | PIN_MODE(8)); /* (AF28) I2C4_SDA */
        // PWDN : GPIO_19
        out32(J721S2_CTRLMMR_PADCONFIG + 0x04C, PIN_INPUT_ENABLE | PIN_MODE(7)); /* (V27) SER_PWDN */
    
        // V27 -> GPIO Output
        out32(J721S2_GPIO0_BASE + J721S2_GPIO_DIR(ICMU_SER_PWDN_EN_PIN_NUM),
            in32(J721S2_GPIO0_BASE + J721S2_GPIO_DIR(ICMU_SER_PWDN_EN_PIN_NUM)) & ~(J721S2_GPIO_BIT(ICMU_SER_PWDN_EN_PIN_NUM)));
    
        out32(J721S2_GPIO0_BASE + J721S2_GPIO_SET_DATA(ICMU_SER_PWDN_EN_PIN_NUM), J721S2_GPIO_BIT(ICMU_SER_PWDN_EN_PIN_NUM));

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

    您好!

    据我所知、运行 vision_apps_init.sh 时将完成 appDssDefaultInit 函数。

    vision_apps_init.sh 仅打印远程内核的日志。 在由 u-boot 或 SBL 加载时、DSS 函数调用已经作为 R5 VISION_Apps 固件的一部分执行。  

    关于 MAX96789电源、我在 QNX IPL 期间插入了 GPIO_19 (V27)。

    我可以知道这会在什么时候执行吗? 在整个 QNX 出现之后、单个 cam 应用程序无论如何都会运行、但 DSS init 函数则不是如此。

    您能否帮我理解在哪些引导日志中执行了上述操作? 即 QNX IPL 中的内容?  
    在 Linux 中、我们通常在 RTOS 上执行该引脚复用并在 Linux 设备树上禁用 i2c4节点。

    此致、

    Nikhil

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

    尊敬的 Nikhil Dasan:

    我已经解决了这个问题。

    感谢您发送编修。

    QNX IPL 是指初始程序加载器、 据我所知、它与 Linux 内核相似。

    我所做的是、在 I2C_open 之后读取 I2C4运行并小幅睡眠。  

    我将结束该问题。