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:TDA4VM:如何更改 VISION_APP 中的 CSI 摄像头 i2c 实例?(I2C0- I2C2)

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1245536/tda4vm-tda4vm-how-to-change-csi-camera-i2c-instance-in-vision_app-i2c0--i2c2

器件型号:TDA4VM

您好、TI 团队、

我们使用 客户电路板开发摄像头功能。

TDA4EVB 使用 I2C_6总线进行 CSI0/CSI1摄像头设置。

但我们修改电路板时使用 I2C_2 (CSI0)/I2C_0 (CSI1)实现摄像头初始化、  

我按照此帖子中的说明进行操作、但不起作用: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/986493/tda4vm-how-to-change-csi-camera-i2c-instance-in-vision_app

我不能通过 i2c_0和 i2c_2读取/写入 i2c。

我更改的内容 如下、您能帮我们更正吗?

谢谢你。

1.在器件树 "k3-j721e-common-proc-board.dts"中禁用 I2C0和 I2C2

&main_i2c0 {
	pinctrl-names = "default";
	pinctrl-0 = <&main_i2c0_pins_default>;
	clock-frequency = <400000>;
	status = "disabled";
	exp1: gpio@20 {
		compatible = "ti,tca6416";
		status = "disabled";
		reg = <0x20>;
		gpio-controller;
		#gpio-cells = <2>;
	};

	exp2: gpio@22 {
		compatible = "ti,tca6424";
		status = "disabled";
		reg = <0x22>;
		gpio-controller;
		#gpio-cells = <2>;

		p08-hog {
			/* P10 - PM_I2C_CTRL_OE */
			gpio-hog;
			status = "disabled";
			gpios = <8 GPIO_ACTIVE_HIGH>;
			output-high;
			line-name = "CTRL_PM_I2C_OE";
		};

		p09-hog {
			/* P11 - MCASP/TRACE_MUX_S0 */
			gpio-hog;
			status = "disabled";
			gpios = <9 GPIO_ACTIVE_HIGH>;
			output-low;
			line-name = "MCASP/TRACE_MUX_S0";
		};

		p10-hog {
			/* P12 - MCASP/TRACE_MUX_S1 */
			gpio-hog;
			status = "disabled";
			gpios = <10 GPIO_ACTIVE_HIGH>;
			output-high;
			line-name = "MCASP/TRACE_MUX_S1";
		};
	};
};

&main_i2c0{
	status = "disabled";
}

2. 在设备树"k3-j721e-vision-apps.dts"中禁用 I2C0和 I2C2

#include "k3-j721e-rtos-memory-map.dtsi"

&main_i2c6 {
	status = "disabled";
};

&serdes_wiz4 {
	status = "disabled";
};

&mhdp {
	status = "disabled";
};

&dss {
	status = "disabled";
};

&main_i2c0 {
	status = "disabled";
};

&main_i2c2 {
	status = "disabled";
};

&ti_csi2rx0 {
	status = "disabled";
};

&ti_csi2rx1 {
	status = "disabled";
};

3. 在函数 int32_t appCsi2TxInit (void)和 int32_t appCsi2RxInit (void)中调用 API SET_DEVICE_STATE_ON (TISCI_DEV_I2C0)

int32_t appCsi2TxInit(void)
{
    int32_t status = FVID2_SOK;

    uint32_t regVal = 0U, unlocked = 0U;
    Csitx_InitParams initPrmsCsitx;

    appLogPrintf("CSI2TX: Init ... !!!\n");

    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_PSILSS0);
    #if defined(SOC_J721S2) || defined(SOC_J784S4)
    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_TX_IF_V2_0);
    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_TX_IF_V2_1);
    #else
    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_TX_IF0);
    #endif
    SET_DEVICE_STATE_ON(TISCI_DEV_DPHY_TX0);

    SET_DEVICE_STATE_ON(TISCI_DEV_I2C0);
    SET_DEVICE_STATE_ON(TISCI_DEV_I2C2);
    appLogPrintf("[Danh TD] SET_DEVICE_STATE_ON I2C0/I2C2 (totoal:0-6)\n");

    regVal = CSL_REG32_RD(CSL_CTRL_MMR0_CFG0_BASE +
                          CSL_MAIN_CTRL_MMR_CFG0_LOCK1_KICK0);
    if ((regVal & 0x1) == 0U)
    {
        /* Unlock MMR */
        unlocked = 1U;
        CSL_REG32_WR(CSL_CTRL_MMR0_CFG0_BASE +
                     CSL_MAIN_CTRL_MMR_CFG0_LOCK1_KICK0,
                     0x68EF3490U);
        CSL_REG32_WR(CSL_CTRL_MMR0_CFG0_BASE +
                     CSL_MAIN_CTRL_MMR_CFG0_LOCK1_KICK1,
                     0xD172BC5AU);
        appLogPrintf("Unlocked MMR to program CSITX DPHY register ... !!!\n");
    }

    /* Select CSITX0 as the source for DPHYTX0 */
    CSL_REG32_WR(CSL_CTRL_MMR0_CFG0_BASE +
                    CSL_MAIN_CTRL_MMR_CFG0_DPHY_TX0_CTRL,
                    0x1);
    /* Lock MMR back if unlocked here */
    if (unlocked == 1U)
    {
        CSL_REG32_WR(CSL_CTRL_MMR0_CFG0_BASE +
                     CSL_MAIN_CTRL_MMR_CFG0_LOCK1_KICK0,
                     0U);
        appLogPrintf("Locked MMR after programming CSITX DPHY register ... !!!\n");
    }

    Csitx_initParamsInit(&initPrmsCsitx);
    initPrmsCsitx.drvHandle = appUdmaCsirxCsitxGetObj();
    status = Csitx_init(&initPrmsCsitx);
    if(status!=FVID2_SOK)
    {
        appLogPrintf("CSI2TX: ERROR: Csitx_init failed !!!\n");
    }
    appLogPrintf("CSI2TX: Init ... Done !!!\n");

    return (status);
}
int32_t appCsi2RxInit(void)
{
    int32_t status = FVID2_SOK;

    Csirx_InitParams initPrmsCsirx;

    appLogPrintf("CSI2RX: Init ... !!!\n");

    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_PSILSS0);
    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_RX_IF0);
    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_RX_IF1);
    #if defined(SOC_J784S4)
    SET_DEVICE_STATE_ON(TISCI_DEV_CSI_RX_IF2);
    #endif
    SET_DEVICE_STATE_ON(TISCI_DEV_DPHY_RX0);
    SET_DEVICE_STATE_ON(TISCI_DEV_DPHY_RX1);
    #if defined(SOC_J784S4)
    SET_DEVICE_STATE_ON(TISCI_DEV_DPHY_RX2);
    #endif
    SET_DEVICE_STATE_ON(TISCI_DEV_I2C0);
    SET_DEVICE_STATE_ON(TISCI_DEV_I2C2);
    appLogPrintf("[Danh RX] SET_DEVICE_STATE_ON I2C0/I2C2 (totoal:0-6)\n");

    Csirx_initParamsInit(&initPrmsCsirx);
    initPrmsCsirx.drvHandle = appUdmaCsirxCsitxGetObj();
    status = Csirx_init(&initPrmsCsirx);
    if(status!=FVID2_SOK)
    {
        appLogPrintf("CSI2RX: ERROR: Csirx_init failed !!!\n");
    }
    appLogPrintf("CSI2RX: Init ... Done !!!\n");

    return (status);
}

4.检查"J721E_pinmux_data.c"

static pinmuxPerCfg_t gI2c0PinCfg[] =

{

    /* MyI2C0 -> I2C0_SCL -> AC5 */

    {

        PIN_I2C0_SCL, PIN_MODE(0) | \

        ((PIN_PULL_DIRECTION | PIN_INPUT_ENABLE) & (~PIN_PULL_DISABLE))

    },

    /* MyI2C0 -> I2C0_SDA -> AA5 */

    {

        PIN_I2C0_SDA, PIN_MODE(0) | \

        ((PIN_PULL_DIRECTION | PIN_INPUT_ENABLE) & (~PIN_PULL_DISABLE))

    },

    {PINMUX_END}

};



static pinmuxPerCfg_t gI2c2PinCfg[] =

{

    /* FPD_LINK CL1 -> I2C2_SCL -> AA1 */

    {

        PIN_SPI0_CLK, PIN_MODE(2) | \

        ((PIN_PULL_DIRECTION | PIN_INPUT_ENABLE) & (~PIN_PULL_DISABLE))

    },

    /* FPD_LINK CL1 -> I2C2_SDA -> AB5 */

    {

        PIN_SPI0_D0, PIN_MODE(2) | \

        ((PIN_PULL_DIRECTION | PIN_INPUT_ENABLE) & (~PIN_PULL_DISABLE))

    },

    {PINMUX_END}

};
static pinmuxModuleCfg_t gI2cPinCfg[] =

{

    {0, TRUE, gI2c0PinCfg},

    {1, TRUE, gI2c1PinCfg},

    {2, TRUE, gI2c2PinCfg},

    {3, TRUE, gI2c3PinCfg},

    {6, TRUE, gI2c6PinCfg},

    {PINMUX_END}

};
pinmuxBoardCfg_t gJ721E_MainPinmuxData[] =

{

    {0, gDebugssPinCfg},

    {1, gGpioPinCfg},

    {2, gI2cPinCfg},

    {3, gMcanPinCfg},

    {4, gMdioPinCfg},

    {5, gMlbPinCfg},

    {6, gMmcsdPinCfg},

    {7, gSystemPinCfg},

    {8, gUartPinCfg},

    {9, gUsbPinCfg},

    {10, gMcaspPinCfg},

    {PINMUX_END}

};

5.更改函数"Board_fpdU954GetI2CAddr"中的 I2C 总线和地址

void Board_fpdU954GetI2CAddr(uint8_t *chNum,
                             uint8_t *i2cAddr,
                             uint32_t csiInst)
{
    //J7_TODO: Need to update to make it generic across the devices and platforms
    if (csiInst == BOARD_CSI_INST_0)
    {
        *chNum = 2U;
        // *i2cAddr = 0x3DU;   /* 7-bits mode address */
        *i2cAddr = 0x7AU;   /* 8-bits mode address */
    }
    else if (csiInst == BOARD_CSI_INST_1)
    {
        *chNum = 0U;
        // *i2cAddr = 0x30U;   /* 7-bits mode address */
        *i2cAddr = 0x60U;   /* 8-bits mode address */
    }
    else
    {
        *chNum = 0U;
        *i2cAddr = 0U;
    }
}

我们的董事会使用的地址如下:

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

    当我们在器件树中仅启用 I2C_0/I2C_2时*。DTS。

    在这之后、检查 i2c_0/i2c_2是否可以工作?

    1.我们可以在 BUS_2上获得 I2C_0、在 BUS_4上获得 I2C_2、如下所示。


    2.检查检测 I2C0和 I2C2。

    => I2C0和 I2C2没有任何信息
    您能否更正上述步骤? 如果您有任何疑问、请查看 I2C0 & I2C2。

    谢谢!

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

    您好!

    您能否确认您是否已从 vision_apps dtsi 和 k3-j721e-common-proc-board.dts 中删除了"status = disabled"

    此致、

    尼基尔

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

    是的、我已经做到了。 您能给我们介绍一下如何检查硬件是否工作正常吗?

    // SPDX-License-Identifier: GPL-2.0
    /*
     * vision-apps: device-tree overlay
     *
     * Copyright (C) 2019 - 2021 Texas Instruments Incorporated - http://www.ti.com/
     */
    
    #include "k3-j721e-rtos-memory-map.dtsi"
    
    &main_i2c6 {
    	status = "disabled";
    };
    
    &main_i2c0 {
    	status = "disabled";
    };
    
    &main_i2c2 {
    	status = "disabled";
    };
    
    &serdes_wiz4 {
    	status = "disabled";
    };
    
    &mhdp {
    	status = "disabled";
    };
    
    &dss {
    	status = "disabled";
    };
    
    &main_i2c1 {
    	status = "disabled";
    };
    
    &ti_csi2rx0 {
    	status = "disabled";
    };
    
    &ti_csi2rx1 {
    	status = "disabled";
    };
    

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

    您好!

    在随附的 dtsi 文件中、您仍然有

    &main_i2c0{
       状态="已禁用";
    };

    &main_i2c2{
       状态="已禁用";
    };

    您能否删除此内容、以便在 i2cdetect 期间反映此内容。

    此致、

    尼基尔

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

    您好

    w 已在"k3-j721e-vision-apps.dts"中删除、并在 Linux (A72内核)中检查、如下所示:

    1.我们可以在 BUS_2上获得 I2C_0、在 BUS_4上获得 I2C_2、如下所示。


    2.检查检测 I2C0和 I2C2。

    您可以看到如上所述的结果、它是否在工作?  

    您能给我们一些解决方案吗?

    谢谢

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

    您好!

    请在您的定制电路板上检查引脚多路复用器中的 I2C_CLK 和 I2C_DATA 焊球。 请在尝试 i2cdetect 前正确设置它。

    -基尔西

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

    您好!

    目前、我可以与 I2C0和 I2C2进行通信。
    主要原因是在设置 SOC 的 I2C 时基址错误、代码更改如下:

    我有一些问题:现在我更改"CSL_MCU_I2C0_CFG_BASe"=>"CSL_I2C0_CFG_BASe"、然后 I2C 可以正常工作。

    我不知道字段"CSLR_MCU_R5FSS0_CORE0_INTR_MCU_I2C0_POINTRPEND_0"是什么意思?

    问题1:我可以改变这一点吗?

    对于 I2C2、字段"CSLR_MCU_R5FSS0_CORE0_INTR_MCU_I2C2_POINTRPEND_0"

    问题2:=>我没有看到 I2C2的任何定义。 您能纠正吗?  

    我们的项目使用 Arm Cortex R5F、如下所示:

    Before:
    #if defined (BUILD_MCU)
            /*
             * default configuration for I2C instances and R5 cores on MCU domain
             * I2C_socInit() is called during initialization to change the default
             * configurations to use Main Domain's I2C instances if R5 is running
             * on Main domain
             */
            (uint32_t)CSL_MCU_I2C0_CFG_BASE,    /* baseAddr */
            CSLR_MCU_R5FSS0_CORE0_INTR_MCU_I2C0_POINTRPEND_0,
            0,      
    #endif
    After:
    #if defined (BUILD_MCU)
            /*
             * default configuration for I2C instances and R5 cores on MCU domain
             * I2C_socInit() is called during initialization to change the default
             * configurations to use Main Domain's I2C instances if R5 is running
             * on Main domain
             */
            (uint32_t)CSL_I2C0_CFG_BASE,    /* baseAddr */
            CSLR_MCU_R5FSS0_CORE0_INTR_MCU_I2C0_POINTRPEND_0,
            0,                                  /* eventId */
    #endif
    

    谢谢。

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

    您好!

    问题2:=>我没有看到 I2C2的任何定义。 您能纠正吗?  

    [/报价]

    您是否正在检查主域 I2C2?

    我有一些问题:现在我更改"CSL_MCU_I2C0_CFG_BASe"=>"CSL_I2C0_CFG_BASe"、然后 I2C 可以正常工作。

    [/报价]

    如果您要配置 MAIN_I2C、则应使用 I2C0_CFG_BASE、如果配置 MCU_I2C0、则应使用 MCU_I2C0_CFG_BASE。

    这两者 分别是2个域下的2个不同实例-主域和 MCU 域。

    CSLR_MCU_R5FSS0_CORE0_INTR_MCU_I2C2_POINTRPEND_0
    [/quote]

    您是否在使用 I2C 中断?

    -基尔西

    [/quote][/quote]