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.

[参考译文] AM3359:Linux/PROCESSOR-SDK-AM335x:DMTimer 随机停止

Guru**** 2935310 points

Other Parts Discussed in Thread: AM3359

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/668484/am3359-linux-processor-sdk-am335x-dmtimer-random-stalls

器件型号:AM3359

大家好

我们有一个使用 AM3359 SoC 和在该硬件上运行的 Linux 的定制板。

在该系统中、我们遇到了 DMTimer 2问题。 问题不经常发生,有时需要数天、数周甚至数月才能重现,但会定期发生。 我们的系统应该全天候运行、因此我们正因为这个问题而失去客户。

在对不同的补丁进行长时间的调查和测试后、我们认为现在我们已详细了解发生的情况、它看起来像是 AM3359 SoC 内部的芯片内部同步问题。

定时器以单次触发模式运行。 为了启动一个单次触发周期、软件首先向 TCRR 寄存器写入一个变量值、然后置位 TCLR 寄存器中的 ST 位来启动定时器。 当定时器溢出时、它会生成一个中断并自行停止。 之后、单次循环再次开始。

我们引入了一个补丁(详细信息见下文)、在软件写入 ST 位后立即回读 TCLR 寄存器、当我们的问题发生时、该位不会置位!! 由于计时器未启动、因此不会有中断且计时器完全停止。 我们可以通过手动设置 TCLR 寄存器中的 ST 位从这种错误情况中恢复。

在这种错误情况下、我们能够捕获寄存器值:

0x0    TIDR           标识寄存器                :1342116609
0x10   TIOCP_CFG      定时器 OCP 配置                :12.
0x20   IRQ_EOI        定时器 IRQ 中断结束             :0
0x24   IRQSTATUS_RAW  定时器状态原始                       值:0
0x28   IRQSTATUS      定时器状态                           :0
0x2C   IRQENABLE_SET  定时器中断使能集             :2.
0x30   IRQENABLE_CLR  定时器中断使能清除           :2.
0x34   IRQWAKEEN      定时器 IRQ 唤醒使能                :2.
0x38   TCLR           定时器控制                          :0
0x3C   TCRR           定时器计数                          器:4294852622
0x40   TLDR           定时器装载                             :4294727296
0x44   TTGR           定时器触发                          器:4294967295
0x48   TWPS           定时器写过帐位               :0
0x4C   TMAR           计时器匹配                            :0
0x50   TCAR1          定时器捕捉                          :0
0x54   TSICR          定时器同步接口控制    :4.
0x58   TCAR2          定时器捕捉                          :0

TRM 和勘误表中有几条关于 DMTimer 和 OCP 接口之间同步问题的注释、但没有一条注释说明我们观察到的情况。

由于我们正在使用布置的同步模式、软件在对定时器寄存器进行写入或读取访问之前确实会检查 TWPS 寄存器位。

这是我们用于调试的补丁:

主题:[PATCH]在写入后读回计时器启动标志

--

 arch/arm/plat-omap/include/plat/dmtimer.h | 5 ++++

 1个文件已更改、5个插入(+)

diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h

索引 dd79f30.b021558 100644

--- a/arch/arm/plat-omap/include/plat/dmtimer.h

++ b/arch/arm/plat-omap/include/plat/dmtimer.h

@@-392、8 +392、13 @@静态内联 void __omap_dm_timer_load_start (struct omap_dm_timer *计时器,

                                                                       u32 ctrl、unsigned int load、

                                                                       内部已过帐)

 {

+u32         ctrl_reg =0;

           _omap_dm_timer_write (timer、omap_timer_counter_REG、load、布置);

           _omap_dm_timer_write (timer、omap_timer_CTRL_REG、Ctrl、布置);

+

+         CTRL_reg =__omap_dm_timer_read (timer、omap_timer_CTRL_REG、已发布);

+         WARN ((!(Ctrl_reg & OMAP_TIMER_CTRL_ST))&&(Ctrl & OMAP_TIMER_CTRL_ST)&&(timer->id == 2)、

+         "_omap_dm_timer_load_start():计时器2未启动!!!\nload=0x%x;ctrl=0x%x;ctrl_reg=0x%x、发布=0x%x\n"、加载、 ctrl、ctrl_reg、布置);

 }

 静态内联 void __omap_dm_timer_int_enable (struct omap_dm_timer *计时器,

--

 当错误发生时、该补丁会生成以下输出:

[361249.217197]警告:CPU:0 PID:4411、位于/Jenkins_data/wim-build-release/skyocto_build/tm/jork-shared/skyboard-evB/kernel-source/arch/arm/plat-omap/include/plat/dmtimer.h:OMAP2_gp_timer_0x403_next 0x4cb_event_set_event_event_set

[361249.217205]_omap_dm_timer_load_start ():计时器2未启动!!

[361249.217205] load=0xffffff400e;ctrl=0x1;ctrl_reg=0x0、布置=0x1

[361249.217209]链接的模块:skyboard_asyncevent (O) skyboard_FPGA (O) uio jiffies (O) ti_am335x_adc kfifo_buf industrialio spidev rtc_ds1307 ti_am335x_tscadc

[361249.217253] CPU:0 PID:4411 Comm:Pidof 被污染:G       W O   4.10.17-Yocto 标准#1

[361249.217257]硬件名称:通用 AM33XX (平展器件树)

[361249.217289][ ](展开回扫)从[ ](show_stack+0x20/0x24)

[361249.217305][ ](show_stack)从[ ](dump_stack+0x20/0x28)

[361249.217323][ ](dump_stack)从[ ](_WARN+0xe0/0x10c)

[361249.217337] ](__warn)从[ ](WARN_RASPH_FMt+0x48/0x50)

[361249.217349][ ](warn_slowpath_fmt)、来自[ ](OMAP2_gp_timer_set_next _event+b0xcc)

[361249.217371][ ](OMAP2_gp_timer_set_next 事件)、来自[ ](clockevents_program_event+0x12c/0x160)

[361249.217387] ](clockevents_program_event)从[ ](tick_program_event+0x88/0x94)

[361249.217406][ ](tick_program_event)从[ ](hrtimer_interrupt+0xa4/0x188)

[361249.217420][ ](hrtimer_interrupt)、来自[ ](OMAP2_gp_timer_interrupt+0x30/0x40)

[361249.217434][ ](OMAP2_gp_timer_interrupt)、来自[ ](__Handle_IRQ_EVENT_perpu + 0x88/0x1b4)

[361249.217446][ ](_handle_irq_event_perpu)、来自[ ](handle_irq_event_perpu + 0x2C/0x68)

[361249.217457][ ](handle_irq_event_perpu)、来自[ ](handle_IRQ_EVENT_+0x38/0x4c)

[361249.217472][ ](handle_irq_event)从[ ](handle_level_IRQ+0xd0/0x104)

[361249.217496][ ](handle_level_IRQ)、来自[ ](generic_handle_IRQ+0x28/0x38)

[361249.217512][ ](generic_handle_IRQ)、来自[ ](_handle_domain_IRQ+0x90/0xb0)

[361249.217527][ ](_handle_domain_IRQ)、来自[ ](OMAP-INTC_Handle_IRQ+0x88/0xa0)

[361249.217545][ ](OMAP-INTC_Handle_IRQ)、来自[ ](_IRQ_Svc+0x6c/0x90)

[361249.217552]异常堆栈(0xcdf29ed0至0xcdf29f18)

[361249.217561] 9ec0:                                    ccaaf840 00000000 ccaaf840 c023f3a0

[361249.217573] 9ee0:ccaaf840 cd50e890 cddd91190 cd501b28 c01080e8 cdf28000 00000000 cdf29f5c

[361249.217583] 9f00:cdf29f60 cdf29f20 c023f194 c0684554 a0030013 ffff

[361249.217608][ ](_IRQ_Svc)从[ ](_COND_RESPGE+0x0/0x50)

[361249.217626][ ](_COND_RESched)从[ ](___fput + 0x18/0x1c)

[361249.217646][ ](___fput)、来自[ ](Task_Work_run+0x88/0x9C)

[361249.217671][ ](task_work 运行)从[ ](do_work 挂起+b4 /0xd0)

[361249.217684][ ](Do_Work_Pending)、来自[ ](SLOW_work 挂起+ 0xc/0x20)

[361249.217692]--[结束线迹9a96982c011d5553]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    工厂团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们认为、我们在这段时间内已经找到了导致此问题的原因:在我们的定制板上、我们的 VSS_OSC 网络上有噪声、并且由于24MHz 参考时钟上的这个时钟干扰。 在执行  勘误表的建议1.0.30后 、问题似乎消失了。

    此致
    重做