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.

[参考译文] AM5708:AM57xx:从 CPU 端进行 I2C 通信时出现问题-重新初始化不起作用n´t

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1250637/am5708-am57xx-issues-with-i2c-communication-from-cpu-side---reinitialization-doesn-t-work

器件型号:AM5708
主题中讨论的其他器件: TPS62360

你(们)好!

目前、我们的基于 TI AM5708的 CPU 板和 I2C 通信正面临一种奇怪的情况。

我们使用连接到一个 SoC 内部 I2C 端口的触摸显示屏、从硬件的角度来看、它看起来很好。 但我们经常遇到这样的情况:作为总线主控的 CPU 突然停止来驱动时钟(保持逻辑高电平)并且还将 SDA 和中断线路保持在逻辑低电平。 我们使用逻辑分析器确认了这一点。

我们将使用 Linux 内核4.4.41、并看到 i2c-OMAP 驱动程序在函数"omap_i2c_xfer_msg"中运行到以下超时:

/*
*再次访问:我们应该中止信号传输,但总线会运行
*进入仲裁,我们目前无法从它恢复。
*/
TIMEOUT = WAIT_FOR_COMPENSATION_TIMEOUT (&OMAP->cmd_COMPLETE,
OMAP_I2C_TIMEOUT);
如果(timeout == 0){
dev_err (omap->dev、"controller timed out\n");
OMAP_i2c_reset (OMAP);
_OMAP_i2c_init (OMAP);
返回-ETIMEDOUT;

在这种情况下、应该使用函数"omap_i2c_reset"重新初始化、然后重新初始化以下内容。

我可以确认、正在调用 OMAP_i2c_reset 函数并完全执行、没有任何错误、但总线仍然停留在提到的行为中。

此行为是否是已知问题? 我们能做些什么呢?  

只有重新启动才能帮助我们从目前的这种情况中恢复、但对于我们的客户来说、这不是一种选择、因为这种问题经常发生。

此致、

弗洛里安

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

    您好、Florian:

    您可以共享日志吗?这种情况发生的频率有多高?

    是否容易重现?

    此致、

    基尔西  

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

    Keerthy、您好!

    请查看随附的有关我们的逻辑分析仪的视频。

    前三个通道是数字信号、在下面您还可以看到模拟信号。

    通道5是 SDA、通道6是 SCL、而通道7是中断线。

    在 dmessages 中、我们看到以下消息:

    [14528.634732] omap_i2c 48072000.i2c:控制器超时
    [14528.654133] Atmel_mxt_ts 1-004A:_mxt_read_reg:I2C 传输失败(-110)
    [14528.654147] Atmel_mxt_ts 1-004A:读取 T44和 T5 (-110)失败
    [14529.674092] omap_i2c 48072000.i2c:控制器超时
    [14529.694147] Atmel_mxt_ts 1-004A:_mxt_read_reg:I2C 传输失败(-110)
    [14529.694160] Atmel_mxt_ts 1-004A:读取 T44和 T5 (-110)失败

    我们尝试在触摸驱动程序的中断服务例程中读取触摸控制器的 i2c 消息。  
    如果发生错误、我们会看到"控制器超时"打印、然后我们无法恢复。  

    此致、

    弗洛里安

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

    弗洛里安

    感谢您发送编修。 那么、当这失败甚至写入失败时、这始终是 i2c 读取失败?

    此致、

    基尔西

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

    Keerthy、您好!
    我不能n´t 确切地说、如果我们遇到这种情况、我们将无法写入或读取相应 i2c 总线上的任何内容。

    此致、

    弗洛里安

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

    Keerthy、您好!

    我曾尝试对 OMAP-i2c 驱动器进行一些快速修改、以便于从用户空间触发重置、然后执行 init 函数、如下所示:

    OMAP_i2c_reset (OMAP);
    _OMAP_i2c_init (OMAP);

    如果我们遇到此问题、即使我在循环中重试此 RESET 和 INIT 函数、也无法从这种情况中恢复。
    如果运行此循环、则会在重试几次后看到以下堆栈跟踪:

    [ 265.065573]未处理故障:0x00000000处的不精确外部中止(0x1406 )
    [ 265.072962] PGD = c4658000
    [ 265.075792][00000000]*PgD=00000000
    [ 265.079543]内部错误: 1406[#1]抢占臂
    [265.084649]模块链接如下:rsp_sl(O) rs_dev(O) 8723bu (O) bc_example (O) rotic_enc (O) sd8xxx (O) mlan (O) viruss_rpmsg_bus us_enable (O) power_module (O) pru_rti PWM_battery_level (O) mlan (O) virus_rpmsg_rtipc_remoti_proc (vertio_remoti_rtio_proc_remoti_proc )
    [265.112001] CPU: 0 PID: 466 Comm: resettest.sh Doyed: G W O 4.4.41 #1
    [ 265.119931]硬件名称:通用 DRA74X (平展设备树)
    [ 265.126316]任务:c34f3080 ti:c46b2000 task.ti:c46b2000
    [ 265.131971] PC 位于 omap_i2c_reset.part.0+0x90/0xe8
    [ 265.137171] LR 处于 SCHEDULE+0x54/0xac
    [265.141188] PC :[ ] lr :[ ] PSR: 60000013
    [ 265.141188] sp : c46b3ea8 ip : 00000003 fp : 00000001
    [ 265.153214] R10:c6efe1cc R9:c46b3f80 R8:c5470300
    [265.158693] r7 : 0000021d r6 : fff2bc r5 : c0fb7dc0 r4 : df3b3c10
    [265.165529] R3 : 00000000 R2 : fa07a000 r1 : 00000000 r0 : c0aee670
    [ 265.172368] Flags:nZCv IRQ on FIQ on Mode SVC_32 ISA ARM segment 无
    [ 265.179842]控制:10c5387d 表:84658059 DAC:00000051
    [ 265.185857] Process resettest.sh (pid: 466, stack limit = 0xc46b2210)
    [ 265.192605] Stack:(0xc46b3ea8至0xc46b4000)
    [ 265.197170] 3ea0:c18a2f30 00000002 00000000 00000000 c5470300 c0722f10
    [ 265.205741] 3ec0:00000002 c6efe1c0 00000000 c01cc208 00000000 00000000 00000002 c01cc14c
    [ 265.214307] 3ee0:7f6de5c0 c46b3f80 ced84540 00000002 00000020 c0157110 00000000 c008520c
    [ 265.222875] 3f00:daba3a34 c00856a4 daba3a34 00000001 c006c6a0 daba3a34 00000001
    [ 265.231436] 3f20:00000000 c006c72c 00000001 00000000 c015a4e4 c006e368 dd05c000 00000001
    [ 265.240004] 3f40:ced84540 00000002 ced84540 7f6de5c0 c46b3f80 ced84540 00000002 c01579a4
    [265.248575] 3f60:0f697af6 c00c7940 ced84540 7f6de5c0 00000000 00000000 ced84540 c01581d8
    [ 265.257153] 3f80:00000000 00000002 00000002 7f6de5c0 b6f943a0 00000004 c000f7a4
    [ 265.265727] 3fa0:c46b2000 c000f768 00000002 7f6de5c0 00000001 7f6de5c0 00000002 00000000
    [ 265.274298] 3fc0:00000002 7f6de5c0 b6f943a0 00000004 b6f1e58c b6e4a77c b6f1e6dc 000001
    [ 265.282870] 3fe0:00000020 befc2678 b6e4a79c b6ea45f0 60000010 00000001 e02cc002 e02ee009
    [265.291443][ ](omap_i2c_reset.part.0)从 ](sysfs_store+0x74/0xc0)
    [265.300112][ ](sysfs_store)来自[ ](kernfs_fop_write+0xbc/0x1b4)
    [265.308404][ ](kernfs_fop_write),来自[ ](__vfs_write+0x1c/0xdc)
    [265.316612][ ](_ vfs_write)来自[ ](vfs_WRITE+0x90/0x168)
    [265.324272] ](vfs_write)来自[ ](sys_WRITE+0x3c/0x90)
    [265.331659][ ](sys_write)自[ ](_ sys_trace_return+0x0/0x10)
    [ 265.339776]代码:e0823113 e1d330b0 e3130001 1a00000a (e5953000)
    [265.346165]--[末端迹线2080f8cbe62a5787]---

    供您参考:我正在从用户空间运行一个名为"resettest.sh"的脚本、这个脚本只会触发一个 sysfs 节点、然后该节点会同时调用复位和初始化模块。  

    此致、

    弗洛里安

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

    弗洛里安

    是否定义了在 TI 电路板上重现此示例的步骤? 另外、对于捕获的波形、您是否看到时钟或数据线有任何问题?

    此致、

    基尔西