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.

[参考译文] PROCESSOR-SDK-J721S2:将 I2C 驱动器 omap24xx_i2c.c 更改为 SR、而不是读取命令的 P-S

Guru**** 2455360 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1395238/processor-sdk-j721s2-change-i2c-driver-omap24xx_i2c-c-to-sr-instead-of-p-s-for-read-commands

器件型号:PROCESSOR-SDK-J721S2

工具与软件:

大家好!

我们如何在 U-Boot 中重写/重新配置 OMAP2 I2C 驱动程序 OMAP24xx_i2c.c、以便对 I2C 读取访问执行"重复启动"(SR)而不是"停止启动"(P-S)?

我知道源代码中有以下提示:

/*
 * i2c_read: Function now uses a single I2C read transaction with bulk transfer
 *           of the requested number of bytes (note that the 'i2c md' command
 *           limits this to 16 bytes anyway). If CONFIG_I2C_REPEATED_START is
 *           defined in the board config header, this transaction shall be with
 *           Repeated Start (Sr) between the address and data phases; otherwise
 *           Stop-Start (P-S) shall be used (some I2C chips do require a P-S).
 *           The address (reg offset) may be 0, 1 or 2 bytes long.
 *           Function now reads correctly from chips that return more than one
 *           byte of data per addressed register (like TI temperature sensors),
 *           or that do not need a register address at all (such as some clock
 *           distributors).
 */

但我尝试过它、但它不起作用。 还有一些其他更改我尝试不起作用。 I2C 驱动程序和硬件模块始终执行 P-S 而不是 Sr.

下图显示了我们希望的实现方式-绿色圆圈:

谢谢!

BR
Stefan

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

    Stefan、

    我想在这里更好地了解用例。 此处的默认读取是否存在任何问题? 您还希望它出现在 U-Boot 中、对吧?  

    此致、  

    基尔西  

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

    您好、Keerthy、

    是的、我们需要在 U-Boot 中初始化和测试2个 I2C 器件、使寄存器地址写入和数据读取之间的读取命令中的 P-S 不一样。

    同时、我发现"CONFIG_I2C_REPEATD_START"选项仅对传统的 I2C 驱动器模型有效。 遗憾的是、我们使用的是 DM 模式。 我仍然很难在 DM 模式下将驱动器从 P-S 更改为 SR。

    也许你能给我一个建议?

    谢谢!

    BR
    Stefan

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

    Stefan、

    我在内部选中了此功能、但 SDK 不支持该功能。 我将与开发团队核实这一点。 由于这是一项需要实施和验证的功能、因此需要一些时间。 获得反馈后、我将立即返回。

    此致、

    基尔西  

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

    您好、Stefan、

    我想您已经定义了 CONFIG_I2C_REPEATD_START。

    ___ omap24_i2c_read ()是一个可以查看的地方。 DM 和非 DM 变体都会调用此 func。

    f (alen) {
                    /* Must write reg offset first */
    #ifdef CONFIG_I2C_REPEATED_START
                    /* No stop bit, use Repeated Start (Sr) */
                    omap_i2c_write_reg(i2c_base, ip_rev, I2C_CON_EN | I2C_CON_MST |
                                       I2C_CON_STT | I2C_CON_TRX, OMAP_I2C_CON_REG);
    #else
                    /* Stop - Start (P-S) */
                    omap_i2c_write_reg(i2c_base, ip_rev, I2C_CON_EN | I2C_CON_MST |
                                       I2C_CON_STT | I2C_CON_STP | I2C_CON_TRX,
                                       OMAP_I2C_CON_REG);
    #endif 

    在示波器上是否看到  CONFIG_I2C_REPEATD_START 除颤器的任何内容?

    此致、
    基尔西

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

    Keerthy、您好!

    是、我设置  CONFIG_I2C_REPEATD_START。 但它没有效果,因为在 DM 模式中 ,总是使用 Alen=0调用_omap24_i2c_read()。

    #else /* CONFIG_DM_I2C */
    
    static int omap_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
    {
    	struct omap_i2c *priv = dev_get_priv(bus);
    	int ret;
    
    	debug("i2c_xfer: %d messages\n", nmsgs);
    	for (; nmsgs > 0; nmsgs--, msg++) {
    		debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, msg->len);
    		if (msg->flags & I2C_M_RD) {
    			ret = __omap24_i2c_read(priv->regs, priv->ip_rev,
    						priv->waitdelay,
    						msg->addr, 0, 0, msg->buf,
    						msg->len);
    		} else {
    			ret = __omap24_i2c_write(priv->regs, priv->ip_rev,
    						 priv->waitdelay,
    						 msg->addr, 0, 0, msg->buf,
    						 msg->len);
    		}
    		if (ret) {
    			debug("i2c_write: error sending\n");
    			return -EREMOTEIO;
    		}
    	}
    
    	return 0;
    }

    BR
    Stefan

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

    Keerthy、您好!

    我想到了一个想法:我们可以尝试使用 i2c-gpio 软 I2C 驱动程序、而不是 OMAP2 I2C IP。

    我试过这个,但它还不起作用。 看起来驱动器不控制 GPIO。

    这些是我的更改、是否有 th。缺失:

    ----------------------- arch/arm/dts/k3-j721s2-xxx.dts -----------------------
    index aee808f1..14371990 100644
    @@ -478,8 +478,8 @@
     	wkup_i2c0_pins_default: wkup-i2c0-pins-default {
     		bootph-pre-ram;
     		pinctrl-single,pins = <
    -			J721S2_WKUP_IOPAD(0x098, PIN_INPUT_PULLUP, 0, DRV_STR_NOM) /* (H24) WKUP_I2C0_SCL */
    -			J721S2_WKUP_IOPAD(0x09c, PIN_INPUT_PULLUP, 0, DRV_STR_NOM) /* (H27) WKUP_I2C0_SDA */
    +			J721S2_WKUP_IOPAD(0x098, PIN_INPUT_PULLUP, 7, DRV_STR_NOM) /* (H24) WKUP_I2C0_SCL */
    +			J721S2_WKUP_IOPAD(0x09c, PIN_INPUT_PULLUP, 7, DRV_STR_NOM) /* (H27) WKUP_I2C0_SDA */
     		>;
     	};
         
    @@ -574,7 +574,10 @@
     &wkup_i2c0 {
     	pinctrl-names = "default";
     	pinctrl-0 = <&wkup_i2c0_pins_default>;
    -	clock-frequency = <400000>;
    +	sda-gpios = <&wkup_gpio0 64 GPIO_ACTIVE_HIGH>;
    +	scl-gpios = <&wkup_gpio0 63 GPIO_ACTIVE_HIGH>;
    +	i2c-gpio,delay-us = <2>;	/* ~100 kHz */
    +
     };
     
     &mcu_i2c0 {
    
    -------------------- arch/arm/dts/k3-j721s2-mcu-wakeup.dtsi --------------------
    index 9e4aabd5..d80c84cd 100644
    @@ -162,15 +162,10 @@
     		clock-names = "gpio";
     	};
     
    -	wkup_i2c0: i2c@42120000 {
    -		compatible = "ti,j721e-i2c", "ti,omap4-i2c";
    -		reg = <0x00 0x42120000 0x00 0x100>;
    -		interrupts = <GIC_SPI 896 IRQ_TYPE_LEVEL_HIGH>;
    +	wkup_i2c0: i2c@0 {
    +		compatible = "i2c-gpio";
     		#address-cells = <1>;
     		#size-cells = <0>;
    -		clocks = <&k3_clks 223 1>;
    -		clock-names = "fck";
    -		power-domains = <&k3_pds 223 TI_SCI_PD_EXCLUSIVE>;
     	};
     
     	mcu_i2c0: i2c@40b00000 {
    
    --------------------- arch/arm/dts/k3-j721s2-r5-xxx.dts ---------------------
    index bed550b7..5cc064ea 100644
    @@ -128,8 +128,8 @@
     	wkup_i2c0_pins_default: wkup-i2c0-pins-default {
     		bootph-pre-ram;
     		pinctrl-single,pins = <
    -			J721S2_WKUP_IOPAD(0x098, PIN_INPUT, 0, DRV_STR_NOM) /* (H24) WKUP_I2C0_SCL */
    -			J721S2_WKUP_IOPAD(0x09c, PIN_INPUT, 0, DRV_STR_NOM) /* (H27) WKUP_I2C0_SDA */
    +			J721S2_WKUP_IOPAD(0x098, PIN_INPUT, 7, DRV_STR_NOM) /* (H24) WKUP_I2C0_SCL */
    +			J721S2_WKUP_IOPAD(0x09c, PIN_INPUT, 7, DRV_STR_NOM) /* (H27) WKUP_I2C0_SDA */
     		>;
     	};
     
    @@ -212,9 +212,11 @@
     
     &wkup_i2c0 {
     	bootph-pre-ram;
    +	sda-gpios = <&wkup_gpio0 64 GPIO_ACTIVE_HIGH>;
    +	scl-gpios = <&wkup_gpio0 63 GPIO_ACTIVE_HIGH>;
    +	i2c-gpio,delay-us = <2>;	/* ~100 kHz */
     	pinctrl-names = "default";
     	pinctrl-0 = <&wkup_i2c0_pins_default>;
    -	clock-frequency = <400000>;
     	
     	tps659413: tps659413@48 {
     		compatible = "ti,tps659413";
    
    ---------------------- configs/j721s2_xxx_a72_defconfig ----------------------
    index 414d2d93..b7aaea72 100644
    @@ -1264,7 +1264,8 @@ CONFIG_I2C=y
     CONFIG_DM_I2C=y
     CONFIG_SPL_DM_I2C=y
     # CONFIG_I2C_SET_DEFAULT_BUS_NUM is not set
    -# CONFIG_DM_I2C_GPIO is not set
    +CONFIG_DM_I2C_GPIO=y
    +CONFIG_SPL_DM_I2C_GPIO=y
     # CONFIG_SYS_I2C_IPROC is not set
     # CONFIG_SYS_I2C_FSL is not set
     # CONFIG_SYS_I2C_CADENCE is not set
    
    ---------------------- configs/j721s2_xxx_r5_defconfig ----------------------
    index 336811ee..4d5d9245 100644
    @@ -1231,7 +1231,8 @@ CONFIG_DM_I2C=y
     CONFIG_SPL_DM_I2C=y
     CONFIG_I2C_SET_DEFAULT_BUS_NUM=y
     CONFIG_I2C_DEFAULT_BUS_NUMBER=0x0
    -# CONFIG_DM_I2C_GPIO is not set
    +CONFIG_DM_I2C_GPIO=y
    +CONFIG_SPL_DM_I2C_GPIO=y
     # CONFIG_SYS_I2C_IPROC is not set
     # CONFIG_SYS_I2C_FSL is not set
     # CONFIG_SYS_I2C_CADENCE is not set

    BR
    Stefan

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

    Stefan、

    我们还没有尝试上述方法。 我将在评论前在内部进行检查。  

    此致、

    基尔西  

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

    Stefan、

    您是否可以对 __omap24_i2c_read 函数中的 CONFIG_I2C_REPEATD_START 宏下的块进行硬编码。  为 DM 和非 DM 都调用__omap24_i2c_read 函数。 您是否可以尝试删除 else 块、只是对 CONFIG_I2C_REPEATD_START 块进行硬编码、看看行上是否有任何内容?

    此致、

    基尔西  

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

    Keerthy、您好!

    我尝试了 s.STT.等效-摆弄如何使用 th 和 STP 位触发传输、但我没有成功。

    有没有更好地描述 OMAP2 I2C IP 的地方? 会比 TDA4VE TRM 更好?

    BR
    Stefan

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

    Stefan、

    这就是我们的文档。 我们将需要更多时间向内部人员核实并尝试这样做。 当我们收到内部团队的最新消息时、我会尽快答复您。 如果您在我们的最后尝试时取得成功、请随时与我保持联系  

    此致、

    基尔西  

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

    Keerthy、您好!

    是否有更新?

    BR
    Stefan

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

    没有 Stefan。 很遗憾、目前没有更新。  

    此致、

    基尔西  

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

    Stefan、您好!

    这仍然没有实施、也没有安排在下一个版本中进行。 请查看版本说明以了解更多更新。 正在关闭该主题帖。

    -基尔西

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

    Stefan、

    早期工作版本发布在上游: https://lore.kernel.org/u-boot/20250310103702.1464782-1-a-limaye@ti.com/

    正在审核。

    这将进入 SDK 11.1。

    我分享了上面的工作版本以取消阻止。 我将关闭此文件。

    -基尔西