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.

[参考译文] SK-AM64B:使用 SDK 09和10对 i2c 总线进行延迟探测

Guru**** 2468610 points
Other Parts Discussed in Thread: SK-AM64B, TMDS64EVM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1459509/sk-am64b-deferred-probe-of-i2c-bus-using-sdk-09-and-10

器件型号:SK-AM64B
主题中讨论的其他器件: TMDS64EVM

工具与软件:

我们已将 AM64x Linux SDK 8用于定制电路板和 am64b-skevm 电路板。  i2c 总线都可以从使用旧内核的 Linux 中找到。  我们正在尝试使用 sdk9或 sdk 10升级内核。  i2c-1总线是唯一由内核使用较新的 SDK 初始化的总线。

我们的 DTS 中有以下内容:

&main_pmx0 {
    .
    .
    .
    main_i2c0_pins_default: main-i2c0-default-pins {
		pinctrl-single,pins = <
			AM64X_IOPAD(0x0260, PIN_INPUT_PULLUP, 0) /* (A18) I2C0_SCL */
			AM64X_IOPAD(0x0264, PIN_INPUT_PULLUP, 0) /* (B18) I2C0_SDA */
		>;
	};
};

&main_i2c0 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&main_i2c0_pins_default>;
	clock-frequency = <400000>;

	eeprom@51 {
		compatible = "atmel,24c512";
		reg = <0x51>;
	};
};


内核为 i2c-0总线打印以下消息:

[   19.593992] platform 20000000.i2c: deferred probe pending

20000000.i2c 是 i2c-0总线。

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

    Dan、您好!

    要确认、Linux 未使用任何其他 I2C 端口? (I2C2、3或 MCU_I2C0和2)

    由于您没有列出特定的 SDK 版本、因此我来看一下 AM64x SDK 10.0。 看起来我们将完全相同的 EEPROM 连接到 AM64x SK 板的同一 I2C 接口:
    TI-linux-kernel-6.6.6.32+git-ti/arch/arm64/boot/dts/ti/k3-am642-sk.dts

    我看到的唯一区别是、EVM 的 Linux devicetree 文件会列出"bootph-all"

    看起来 EEPROM 也在 u-boot 中定义:
    TI-u-boot-2024.04+git/arch/arm/dts/k3-am642-sk.dts

    此致、

    Nick

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

    我们设计的电路板包含 i2c0、i2c1和 i2c2总线上的器件。  在 Linux (SDK 9或10)下运行的唯一 i2c 总线是 i2c1。  如果我们启动 SDK 9内核、则下的器件为 i2c0。  我们对 SK-am64b 板具有相同的结果。  i2c 器件可与 SDK 8搭配使用。

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

    我们在启动 SDK 10时在器件树中有"bootph-all"参数。  SDK 9下的所有器件都没有该参数、因此未添加该参数。

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

    是否有人试图解决这一问题?

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

    Dan、您好!

    对这里的延迟答复深表歉意。 我本来打算尝试对 SK-AM64B 进行测试、但它遇到了不同的引导问题。

    我能否让您在 SK-AM64B 上发布有问题的引导的完整引导日志? 作为单独的文本文件、或复制到如下所示的线程中:

    插入>代码

    您是否对 SK-AM64B 进行了任何修改?

    此致、

    Nick

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

    此外、为了再次进行检查、您使用的是 SK-AM64B、而不是旧版 SK-AM64、对吗? 评估板应包含具体的器件型号。

    此致、

    Nick

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

    我们使用的是 SK-AM64B

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

    TMDS64EVM 是否也有此问题?

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

    编辑于2025年1月30日

    Dan、您好!

    我能够复制您对 AM64B-SK 的观察结果、我看到类似(但不相同)的行为。  但是、EEPROM I2C 模块按预期在 AM64 EVM 上启动:

    AM64B-SK SDK 8.6 Linux

    [    0.804404] i2c /dev entries driver
    ...
    [    1.000169] omap_i2c 20000000.i2c: bus 0 rev0.12 at 100 kHz
    [    1.007671] pca953x 1-0070: supply vcc not found, using dummy regulator
    [    1.014679] pca953x 1-0070: using no AI
    [    1.043020] omap_i2c 20010000.i2c: bus 1 rev0.12 at 400 kHz
    [    1.050254] omap_i2c 20020000.i2c: bus 2 rev0.12 at 100 kHz
    

    AM64B-SK SDK 10.0 RT Linux

    [    1.128217] i2c_dev: i2c /dev entries driver
    ...
    [    1.365536] omap_i2c 20010000.i2c: bus 1 rev0.12 at 400 kHz
    ...
    [   21.990163] platform 20000000.i2c: deferred probe pending

    AM64 EVM SDK 8.6 Linux

    [    0.813562] i2c /dev entries driver
    ...
    [    1.010784] omap_i2c 20000000.i2c: bus 0 rev0.12 at 100 kHz
    [    1.126928] omap_i2c 20010000.i2c: bus 1 rev0.12 at 400 kHz
    [    1.134021] omap_i2c 20020000.i2c: bus 2 rev0.12 at 100 kHz
    [    1.141022] omap_i2c 20030000.i2c: bus 3 rev0.12 at 100 kHz
    

    AM64 EVM SDK 10.0 RT Linux

    [    1.144563] i2c_dev: i2c /dev entries driver
    ...
    [    1.383687] omap_i2c 20000000.i2c: bus 0 rev0.12 at 400 kHz
    [    1.399267] omap_i2c 20010000.i2c: bus 1 rev0.12 at 400 kHz
    

    在今天签核之前、我将花更多时间对此进行详细了解。

    此致、

    Nick

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

    大家好、

    观察结果

    我在上一次的答复中说得不对。 在通用 EVM 上没有看到这种行为。 Atmel EEPROM 驱动程序正在探测并按预期工作:

    AM64 EVM 10.0 RT Linux

    root@am64xx-evm:~# dmesg | grep i2c
    [    1.144563] i2c_dev: i2c /dev entries driver
    [    1.383687] omap_i2c 20000000.i2c: bus 0 rev0.12 at 400 kHz
    [    1.399267] omap_i2c 20010000.i2c: bus 1 rev0.12 at 400 kHz
    
    root@am64xx-evm:~# i2cdetect -l
    i2c-0   i2c             OMAP I2C adapter                        I2C adapter
    i2c-1   i2c             OMAP I2C adapter                        I2C adapter
    root@am64xx-evm:~# i2cdetect -y -r 0
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:                         -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: UU UU -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --
    
    root@am64xx-evm:~# lsmod
    Module                  Size  Used by
    ...
    at24                   16384  0
    
    root@am64xx-evm:/lib/modules/6.6.32-rt32-ti-rt-g04a9ad081f0f-dirty/kernel# find -name
     "*at24*"
    ./drivers/misc/eeprom/at24.ko
    root@am64xx-evm:/lib/modules/6.6.32-rt32-ti-rt-g04a9ad081f0f-dirty/kernel# dmesg | gr
    ep at24
    [    9.188128] at24 0-0050: supply vcc not found, using dummy regulator
    [    9.208369] at24 0-0050: 131072 byte 24c1024 EEPROM, writable, 1 bytes/write
    root@am64xx-evm:/lib/modules/6.6.32-rt32-ti-rt-g04a9ad081f0f-dirty/kernel# dmesg | gr
    ep pca
    [    1.371269] pca953x 0-0038: supply vcc not found, using dummy regulator
    [    1.371456] pca953x 0-0038: using no AI
    [    1.385959] pca953x 1-0022: supply vcc not found, using dummy regulator
    [    1.386159] pca953x 1-0022: using AI
    

    与10.0 RT Linux 上的 AM64B-SK 相比:

    root@am64xx-evm:~# dmesg | grep i2c
    [    1.136847] i2c_dev: i2c /dev entries driver
    [    1.372995] omap_i2c 20010000.i2c: bus 1 rev0.12 at 400 kHz
    [   21.990594] platform 20000000.i2c: deferred probe pending
    root@am64xx-evm:~# i2cdetect -l
    i2c-1   i2c             OMAP I2C adapter                        I2C adapter
    root@am64xx-evm:~# i2cdetect -y -r 0
    Error: Could not open file `/dev/i2c-0' or `/dev/i2c/0': No such file or directory
    root@am64xx-evm:~# i2cdetect -y -r 1
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:                         -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- 48 49 -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: UU -- -- -- -- -- -- --
    root@am64xx-evm:/lib/modules/6.6.32-rt32-ti-rt-g04a9ad081f0f-dirty# find -name "*at24*"
    ./kernel/drivers/misc/eeprom/at24.ko
    
    root@am64xx-evm:/lib/modules/6.6.32-rt32-ti-rt-g04a9ad081f0f-dirty# dmesg | grep at24
    root@am64xx-evm:/lib/modules/6.6.32-rt32-ti-rt-g04a9ad081f0f-dirty#
    

    两个开发板上都有内核模块、但未加载内核模块。

    devicetree 分析  

    由于 AM64x EVM 按预期运行、因此我会假设该行为是由 devicetree 文件的差异引起的(与之相反、内核配置应该对于两个电路板是相同的、因为我使用同一个 SD 卡来启动它们)。

    与 SDK 8.6版本的 AM64B-SK 板进行比较没有什么帮助、因为没有为 I2C0外设定义任何内容。 我怀疑 devicetre 文件的版本是为入门套件的前一版本(称为 AM64-SK)编写的。 我不太确定该版本的电路板是否连接了 EEPROM、旧版电路板的 TI.com 页面似乎已被删除、因此我可能不得不在内部四处走动以获取原理图(没有时间检查 AM64B-SK 原理图文件是否包含 AM64-SK 的旧版本)。

    SDK 10.0上的 k3-am642-evm.dts 定义了一个不同的 Atmel 兼容字符串、我假设1MB (?) 而不是512KB (?)以及不同的寄存器地址。 我看不到任何其他明显的差异。 没有时间查看 EEPROM devicetre 定义和电路板上的 EEPROM 之间是否存在不匹配。

    此致、

    Nick

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

    我针对 AM64B-SK 修改了 SDK 8.6 DTS、以在 i2c0上启用 EEPROM、并针对我们在 Raspberry PI 连接器上连接到 i2c2总线的 RTC 板。  我们也没有任何问题。  同样的片段也可以在我们的定制板上运行。

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

    是否可能有需要为该器件启用的稳压器?

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

    Dan、你好

    感谢您提供更多详细信息。 我们需要在周一或周二给您回复、因为 Nick 目前正在参与另一个调试工作、无法分配跟进时间。

    我们非常感谢您为 我们提供 EVM 上的可重现性、这有助于更有效地进行诊断  

    Mukul  

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

    Dan、您好。

    对于延迟、我们深表歉意。 内核似乎无法处理 i2c0 devicetre 节点中的"电源域"信息、从而导致了"延迟式探测器挂起"。

    以下内核设备更改(从 i2c0节点中删除电源域)将使 i2c0在 Linux 中工作。 同时、我会和我们的开发团队一起了解根本原因。

    diff --git a/arch/arm64/boot/dts/ti/k3-am64-main.dtsi b/arch/arm64/boot/dts/ti/k3-am64-main.dtsi
    index 305fca851118..52ff124b5ec6 100644
    --- a/arch/arm64/boot/dts/ti/k3-am64-main.dtsi
    +++ b/arch/arm64/boot/dts/ti/k3-am64-main.dtsi
    @@ -475,7 +475,7 @@ main_i2c0: i2c@20000000 {
                    interrupts = <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>;
                    #address-cells = <1>;
                    #size-cells = <0>;
    -               power-domains = <&k3_pds 102 TI_SCI_PD_EXCLUSIVE>;
    +               // power-domains = <&k3_pds 102 TI_SCI_PD_EXCLUSIVE>;
                    clocks = <&k3_clks 102 2>;
                    clock-names = "fck";
                    status = "disabled";

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

    Dan、您好。

    在尝试缩小问题范围时、我发现 i2c0探头延迟问题仅存在于 SDK10.0 (我没有测试 SDK10.1)中、而不存在于 SDK9.2.1.10中。 请告诉我、当您在 SDK9中发现问题时、您是否使用了 SDK10中的 U-Boot 二进制文件。 由于根本原因可能是 SYSFW、因此我希望在与 SDK10.0 U-Boot 二进制文件结合使用的任何内核版本中都能看到该问题。

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

    BIN -请检查 SDK v10.1中的此 i2c0探头延迟问题。 我知道 TI 没有10.2桌面、我还没有从 m-firth@ti.com 听说 SDK 11何时送达。

    谢谢

    吉姆

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

    Jim、您好!

    是的、我正在研究 i2c0探针延迟问题的根本原因、但上面的 devicetree 补丁可用作 SDK10.x 的权变措施

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

    对于两个内核、我都使用了来自 SDK 10的 U-boot。  我添加了一些修改、但不想将它们移植到 SDK 9。  我们一直在尝试将 SDK 从8更新到10。

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

    我将使用 SDK 10.0尝试它。  我们定制电路板的 DTS 必须针对10.1进行返工。  我基于 K3-am642-sk.dtb 创建了 DTS、并注意到有一些变化。  我们的原理图基于 SK-AM64B、

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

    Dan、您好。

    我对两个内核都使用了来自 SDK 10的 U-boot。

    好的、这会解释您在 SDK9和 SDK10中看到的探测问题、而我只在 SDK10中看到了该问题。 此问题似乎与 SDK10中的 SYSFW 有关。

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

    我是否应该应用 SYSFW 的更改?

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

    否 您只需应用上述内核 devicetre 更改(删除 i2c0节点中的电源域)、那么 i2c0应该可以在 Linux 中工作。

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

    更改解决了问题:

    [~]> uname -a
    Linux terastor-d7cfcc 6.6.32-g3115f296c2a2 #1 SMP PREEMPT Tue Feb  4 09:40:37 CST 2025 aarch64 GNU/Linux
    [ems@terastor-d7cfcc]-[Tue Feb 04 11:31 AM]
    [~]> dmesg | grep i2c
    [    0.824660] i2c_dev: i2c /dev entries driver
    [    1.161368] omap_i2c 20000000.i2c: bus 0 rev0.12 at 400 kHz
    [    1.194158] omap_i2c 20010000.i2c: bus 1 rev0.12 at 400 kHz
    

    我还能够从 EEPROM 中读取:

    [~]> sudo id-eeprom | jq .
    {
      "Name": "AM64B-SKEVM",
      "Label": "K50000011TI24370a6e",
      "Label_name": "K50000011",
      "Vendor_Initial": "K",
      "Assembly_Number": "50000011",
      "Assembly_Revision": "TI",
      "Year_Week": "2437",
      "Serial": "0a6e",
      "Customer_ID": 0,
      "Site_ID": 0,
      "TeraStor_ID": 0,
      "TeraStor_Min_P": -3600,
      "TeraStor_Max_P": 3600,
      "TeraStor_Min_Q": -3600,
      "TeraStor_Max_Q": 3600,
      "TeraStor_Min_S": -3600,
      "TeraStor_Max_S": 3600,
      "TeraStor_PCS_Count": 3,
      "TeraStor_PCS_Rating_P": 1200,
      "TeraStor_PCS_Rating_Q": 1200,
      "TeraStor_PCS_Rating_S": 1200,
      "TeraStor_Cell_Capacity": 280,
      "TeraStor_Cell_Chemistry": "LFP",
      "TeraStor_Cell_Vendor": "EVE",
      "TeraStor_Product_Name": "TS7000",
      "TeraStor_PCS_Type": "CAB1000",
      "Hostname": "terastor-0",
      "IP": [],
      "Mac": [
        "0e:09:29:d7:cf:cc",
        "06:c3:87:46:4d:36",
        "04:02:e7:65:0e:89"
      ]
    }
    

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

    Dan、您好。

    很高兴该问题现已通过解决方法得到解决。 感谢您的更新。

    根本原因似乎是在 R5 SPL 中启用了 i2c0以访问 EEPROM、但在执行转换到 A53 U-Boot/Linux 之前未释放 i2c0、这会导致 Linux 无法查询 i2c0的电源域。 提供的权变措施告诉 Linux 绕过 i2c0的电源域配置、因为这是由 R5 SPL 完成的。 我会将该问题报告给我们的开发团队、并将在下一个 SDK 中修复。

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

    bin:如果用户需要、TI git 存储树中的"补丁"是否可以提供给 SDK v12之前的客户? (某些项目将在具有 Linux 6.12基线的 SDK v12之前停留在 Linux 6.6基线上)。

    吉姆

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

    补丁可用后、我将要求开发团队将修复程序退回到6.6.6.y-cicd 分支。