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.

[参考译文] TDA2SX:如何在 Linux 和 RTOS 中使用 I2C

Guru**** 2796425 points

Other Parts Discussed in Thread: TDA2SX

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/877527/tda2sx-how-to-use-i2c-both-in-linux-and-rtos

器件型号:TDA2Sx

您好!

     我开发的芯片是 TDA2SX、我使用的 VSDK 版本是 processor_sdk_vision_03_06_00_00;

       在开发过程中、我遇到了以下问题:我们将电源芯片和 ISP (GW4200)连接到 I2C1总线、并将其他三个 ISP 芯片分别连接到 i2c2~4。 在 Linux 启动过程中、我们需要配置电源芯片、启动后、我需要使用 RTOS 下的 i2c 端口来诊断摄像头。 硬件如下所示:



在内核器件树中、I2C 的描述如下:
 

&i2c1{
status ="好的";
时钟频率=<400000>;

tps659038:tps659038@58{
compatible ="ti、tps659038";
reg =<0x58>;
ti、Palmas 覆盖电源保持;
ti、system-power-controller;

tps659038_psmic
={sms-ma-regulators/sm123-timers/tps100>








;tpsmv-time-regulators=<p500123-ma-timers/ps= tps1600*;tps1660123-ma-ma-ma-ma-ulators/smv-ulators/smv-ulators/smv/ps= tps=pms-ulators/smv-ulators/smv/ps=<p500123-timers/ps=pms


smps45_reg:smps45{
/* VDD_DSPEVE */
电脑控制器名称="smps45";
电脑控制器最小值微伏=< 850000>;
电脑控制器最大值微伏=<1250000>;
电脑控制器始终开启;
电脑控制器启动;
};

smps6_reg:smps6{
/* VDD_GPU - over VDD_SMPS6 */
reguler-name ="smps6";
reguler-min-microvolt =<850000>;
reguler-max-microvolt =<1250000>;
reguler-always-on;
reguler-boot-on;
};

smps7_reg:smps7{
/* core_VDD */
reguler-name ="smps7";
reguler-min-microvolt =<850000>;
reguler-max-microvolt =<1150000>;
reguler-always-on;
reguler-boot-on;
};

smps8_reg:smps8{
/* VDD_IVAHD */
reguler-name ="smps8";
reguler-min-microvolt =< 850000>;
reguler-max-microvolt =<1250000>;
reguler-always-on;
reguler-boot-on;
};

smps9_reg:smps9{
/* VDDS1V8 */
regulator-name ="smps9";
regulator-min-microvolt =<1800000>;
regulator-max-microvolt =<1800000>;
regulator-always-on;
regulator-boot-on;
};

ldo1_reg:ldo1{
/* LDO1_out ->SDIO */
reguler-name ="ldo1";
reguler-min-microvolt =<1800000>;
reguler-max-microvolt =<3300000>;
reguler-always 开启;
reguler-boot-on;
};

ldo2_reg:ldo2{
/* VDD_RTCIO */
/* LDO2 -> VDDSHV5、LDO2也会转至 CAN_PHY_3V3 */
电脑控制器名称="ldo2";
电脑控制器最小微伏=<3300000>;
电脑控制器最大微伏=<3300000>;
电脑控制器始终
开启;电脑控制器启动
};

ldo3_reg:ldo3{
//* VDDA_1v8_PHY */
reguler-name ="ldo3";
reguler-min-microvolt =<1800000>;
reguler-max-microvolt =<1800000>;
reguler-always 开启;
reguler-boot-on;
};

ldo9_reg:ldo9{
/* VDD_RTC */
reguler-name ="ldo9";
reguler-min-microvolt =<1050000>;
reguler-max-microvolt =<1050000>;
reguler-always-on;
reguler-boot-on;
reguler-allow-bypass;
};

ldoln_reg:ldoln{
/* VDDA_1V8_PLL */
reguler-name ="ldoln";
reguler-min-microvolt =<1800000>;
reguler-max-microvolt =<1800000>;
regul稳 压器始终开启;
reguler-boot-on;
};

ldousb_reg:ldousb{
// VDDA_3V_USB:VDDA_USBHS33 */
电脑控制器名称="ldousb";
电脑控制器最小值微伏=<3300000>;
电脑控制器最大值微伏=<3300000>;
电脑控制器启动;
};

/* REGEN1未使用*/

regen2:regen2{
/* PMIC 内部资源所需*/
reguler-name ="regen2";
reguler-boot-on;
reguler-always-on;
};

/* REGEN3未使用*/

sysen1:sysen1{
/* PMIC_Regen_3V3 */ regulator =


sysen-on
;

}sysen2



常开
;sysenregulator = sysen2;sysen-regulator = sysen-on;
};
};
};

pcf_LCD:GPIO@20{
Status ="disabled";
compatible ="NXP、pcf8575";
reg =<0x20>;
GPIO 控制器;
#GPIO-cells =<2>;
interrupt-parent =<&GPIO6>;
interrupts =<11 IRQ_TYPE_ EDGE_FALLING >;
interrupt-controller;
#interrupt-cells =<2>;
};

pcf_GPIO_21:GPIO@21{
status ="禁用";
compatible ="ti、pcf8575";
reg =<0x21>;
线路初始状态=<0x1408>;
GPIO 控制器;
<#GPIO-cells =<2>;
interrupt-parent =<&GPIO6>;
interrupts =<11 IRQ_TYPE_ EDGE_FALLINGLE>;
中断控制器;
#interrupt-cells =<2>;
};

tlv320aic3106:tlv320aic3106@19{
#sound-di-cells =<0>;
compatible ="ti、"v3di-bias
=<v3mcrims"
;<v3deg";<v3dich>=<v3deg";<v3deg-reg>;<v3d
/* 2.0V */
状态="禁用";

/*稳压器*/
AVDD-SUPPLY =<&EVM_3V3_SW>;
IOVDD-SUPPLY =<&EVM_3V3_SW>;
DRVDD-SUPPLY =<&EVM_3V3_SW>;
DVDD>;
}
};

&i2c2{
status ="禁用";
ti、no-reset-on-init;
ti、no-idle-on-init;
}

;&i2c3{
status ="禁用";
ti、no-reset-on-init;
ti、no-idle-on-init;
};

&i2c4{
status ="禁用";
ti、no-init-on

、ti-reset-on;} 


诊断摄像头时、i2c 的配置如下:

静态空 SetupI2C (uint32 port_id)
{
vps_printf ("setupi2c 第1步");
/*执行软件复位*/
I2CSoftReset (SOC_I2C1_base);

VPS_printf ("setupi2c 第2步");
/*启用 i2c 模块*/
I2CMasterEnable (SOC_I2C1_base);

VPS_printf (" while (!I2CSystemStatusGet (SOC_I2C1_base))");
while (!I2CSystemStatusGet (SOC_I2C1_base));

VPS_printf ("I2CMasterDisable");
/*将 i2c 置于复位/禁用状态*/
I2CMasterDisable (SOC_I2C1_base);

/*将 i2c 总线速度配置为100kHz */
#if defined (SOC_AM574x)|| defined (SOC_AM572x)|| defined (SOC_AM571x)
I2CMasterInitExpClk (SOC_I2C1_base、96000000、
4000000U、100000);
#else
I2CMasterInitExpClk (SOC_I2C1_base、24000000、
8000000、100000);
#endif

I2COwnAddressSet (SOC_I2C1_base、0、
I2C_ALLOW_ADDR_0);

I2CSyscInit (SOC_I2C1_base、0x08);

/*设置 Rx 和 Tx FIFO 阈值并重置 FIFO */
I2CFIFOThresholdConfig (SOC_I2C1_base、0、I2C_TX_MODE);

I2CFIFOThresholdConfig (SOC_I2C1_base、0、I2C_RX_MODE);

/*设置 i2c 从器件地址*/
I2CMasterSlaveAddrSet (SOC_I2C1_base、HSI2C_SLAVE_ADDR);

/*使 i2c 退出复位*/
I2CMasterEnable (SOC_I2C1_base);

/*启用自由运行模式*/
I2CMasterEnableFreeRun (SOC_I2C1_base);
} 


当我配置 I2C2/3/4时、可以正常配置它们、但当我配置 i2c1时、会发生以下错误:

[主机][IPU2] 33.164277 s:平台解锁 MMR
[host][IPU2] 33.164338 s:setupi2c 步骤1
[host][IPU2] 33.164399 s:
[host][IPU2 ] 33.164460 s:### XDC 断言-错误回调开始###
[host][IPU2 ] 33.164521 s:
[host][IPU2 ] 33.164673 s:E_hardFault:Forced
[host][IPU2] 33.164734 s:
[host][IPU2 ] 33.164765 s:### XDC 断言-错误回调结束###
[host][IPU2 ] 33.164826 s:
[host][IPU2 ] 33.165039 s:
[host][IPU2 ] 33.165100 s:### XDC 断言-错误回调开始###
[host][IPU2 ] 33.165161 s:
[host][IPU2 ] 33.165283 s:e_busFault:PRECISERR:立即总线故障、确切地址:48070010
[host][IPU2 ] 33.165375 s:
[host][IPU2] 33.165405 s:### XDC 断言-错误回调结束### 



因此、我认为在 Linux 器件树中使用 i2c1、这使得在 RTOS 中无法访问 i2c1的器件地址。 但是,当我在 DTS 文件中将 i2c1节点禁用时,内核无法启动;

由于 Linux 在启动时只需配置一次即可配置电源芯片、因此是否可以在 Linux 和 RTOS 下访问 i2c1?

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

    大家好、

    通常、只能由一个驱动器控制器件。 不建议使用多个驱动程序(Linux 和 RTOS)来控制 i2c1实例。

    最佳解决方案是设计电路板、使 Linux 和 RTOS 控制的器件位于不同的 i2c 总线上。

    但是、更改电路板设计可能并非总是可行的、因此我建议您 解决以下问题:

    确保使用 i2c 完成 Linux、一旦使用完成、它将使 i2c 进入睡眠状态。

    当 RTOS 想要使用 i2c 时、请确保打开电源和时钟、然后 RTOS 软件可以访问它。

    请注意、这种方法可能会导致竞态条件。

    此致、

    Nikhil D

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

    您好、Nikhil、

    感谢您的回复。

    您的建议对我非常有用。

    如何实现 i2c 睡眠?

    此致!

    Kepei

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

    您好!

    Linux 已自动将 i2c 置于睡眠模式。 您不必执行任何操作。

    此致、

    Nikhil D