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.

[参考译文] AM4378:Linux 在启动时随机挂起、DDR 无法通过内存测试

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1134630/am4378-linux-randomly-hanging-at-start-up-and-ddr-fails-memorytester

器件型号:AM4378
主题中讨论的其他器件:AM3358TPS65218D0TPS65218

您好!  

我们有一个带有 AM4378处理器的定制板和一个用作 DDR 的 AS4C256M16D3LB-12BIN。 我们使用不带 VTT 终端的单个 DDR。 我们已经使用 EMIF 工具进行了所有 EMIF 配置。 我们在电路板上运行自己的 Linux 映像、该映像已在使用 TI AM3358的其他设计中进行了测试。 我们修改了新电路板的器件树和内核设置、并使用 AM4378EVM 作为参考。 您可以找到我们的 DDR 原理图和 EMIF 设置。  

我们看到的问题是 Linux 内核正在启动,但由于启动时在不同的位置(主要是在尝试从 rootfs 复制时)内核出现紧急情况而随机挂起或停止。 它有时会经过并到达命令行。 但是、50%的时间内核挂起或停止时会出现内核恐慌。  

我们在 u-boot 上完成了 memtest、没有发现任何问题、但是、在我们可以到达命令行时、我们运行 memytester、它会显示 Stuck Address 错误;失败:地址行可能错误、偏移 XXXXX。 (XXX 地址每次都会更改)。 内存测试仪的所有其它测试都可以...当我们在较小的部分(如256K 或512K)中运行内存测试仪时、通常不会看到任何错误、但当我们在大于1MB 的情况下运行时、始终会出现卡地址错误。

我们需要您在这个问题上的专业知识。 您是否认为这是内存硬件问题(即内存已损坏)、或者它与我们的 EMIF 或内核设置有什么关系?

您建议我们做些什么来找出问题所在?  

此外、请注意、在 EMIF 工具中、我们输入了字节2和字节3布线长度为零、因为我们使用的是单个 DDR。 您能确认我们的设置是否有此设置和剩余的 EMIF 设置?  

这一项目的关键在于时间、因此非常感谢您迅速做出响应。 谢谢!

 e2e.ti.com/.../1108.DDR_5F00_Schematic.pdf e2e.ti.com/.../8171.SPRAC70A_5F00_AM437x_5F00_EMIF_5F00_Configuration_5F00_Tool_5F00_V21.xlsx

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

    您好、Berkay、  

    我检查了您的配置、其中一个不正确的地方是 CAS 延迟设置、根据下面的内容、该设置应为6。  您能使用该设置尝试一下

    如果仍然看到问题、您能否回答以下问题:

    -您是否在多个电路板上看到类似的问题?   

    问题是否在较低频率(例如303MHz)发生

    您是否可以转储 EMIF 寄存器以确保电子表格中的值与写入寄存器的值相匹配

    此致、

    James

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

    尊敬的 James:  

    感谢您的回答。 我们只制作了少数这些原型、但我们在所有这些原型中都看到了它们。 但是、我们一开始还遇到了一些 PMIC 电压问题(也在此处询问:https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1134646/am4378-vdd_mpu_mon-not-working-as-pmic-feedback) 、尽管 DDR 电压从未出错、但我们仍然怀疑这些电压问题在一开始是否对硬件造成了任何损坏。  

    我们已根据您的建议将 CAS 延迟更改为6、并尝试了303mhz。 结果是相同的、在启动期间的大部分时间内都会发生内核恐慌。 我们会得到“无法处理虚拟地址..........处的内核 NULL 指针解除引用” "错误。  

    我们已检查 EMIF 寄存器、它们看起来是正确的。 我已将其复制到下面。 我们注意     到的唯一一点是、在0x4C000318和0x4C00031C 处 EMIF4D_EXT_PHY_CTRL_36和 SHADOW 的值被读取为00000177而不是00000077、但这可能是一个状态分配、仍然需要向您指出。  

    => MD 0x4c000000 C8
    4c000000:50440500 40000004 61a05332 00000000 ..dp...@2S.a....
    4c000010:00000c30 00000c30 eaaad4db eaaad4db 0...0 ..........
    4c000020:266b7fda 266b7fda 5f7f867f 5f7f867f ...k&.....
    4c000030:00000000 00000000 000000a0 000000a0 ........
    4c000040:00000000 00000000 00000000 00000000…
    4c000050:00000000 07770000 9000190a 000427...... W… ""。。。
    4c000060:00002011 00000000 00000000 00000000。 一
    4c000070:00000000 00000000 00000000 00000000…
    4c000080:004186ff 000307dd 00010000 00000000 .A.
    4c000090:00c7576e 00000000 00090000 00090000 nW…
    4c0000a0:00000000 00000000 00000000 00000000…
    4c0000b0:00000000 00000000 00000000 00000000…
    4c0000c0:00000000 00000000 50074894 00000000… H.P....
    4c0000d0:00000000 00000000 8000000000 00000000…
    4c0000e0:00000000 00048009 00048009 00000000…
    4c0000f0:00000000 00000000 00000000…
    4c000100:8000000001 80000094 00000000 00000000…
    4c000110:00000000 00000000 00000000 00000000…
    4c000120:80000405 000fff 00000000 00000000…
    4c000130:00000000 00000000 00000000 00000000…
    4c000140:00000000 000931f3 00012a93 00000000… 1...*
    4c000150:00020000 00000099 00000924 00000042… $...B...
    4c000160:00000044 00000000 00000000 00000000 D...........
    4c000170:070000a0 0700009f 07000700 07000700 ........
    4c000180:00000000 007c00c4 00b800c7 02df030f...... |..........
    4c000190:03e1030f 00000000 003c0084 00780087… <...x
    4c0001a0:02df030f 03e1030f 00000000 10300021 !.0。
    4c0001b0:00000000 00000000 00000000…
    4c0001c0:00000000 00000000 00000000…
    4c0001d0:00000000 00000000 00000000…
    4c0001e0:00000000 00000000 00000000…
    4c0001f0:00000000 00000000 00000000…
    4c000200:00040100 00040100 00000000 00000000…
    4c000210:00000000 00000000 00000000 00000000…
    4c000220:00000000 00000000 00000000 00000000…
    4c000230:00400040 00400040 00400040 00400040 @。@。@。@。@。@。@。@。。。。
    4c000240:00400040 00400040 00400040 00400040 @。@。@。@。@。@。@。@。。。。
    4c000250:00400040 00400040 00400040 00400040 @。@。@。@。@。@。@。@。。。。
    4c000260:00400040 00400040 00400040 00400040 @。@。@。@。@。@。@。@。。。。
    4c000270:00400040 00400040 00400040 00400040 @。@。@。@。@。@。@。@。。。。
    4c000280:00000000 00000000 00000000 00000000…
    4c000290:00000000 00000000 00000000 00000000…
    4c0002a0:00000000 00000000 00000000…
    4c0002b0:00600020 40010080 40010080。`。 `……@………@………………
    4c0002c0:08102040 08102040 00200020 00200020 @……@……… 。 。 。 。
    4c0002d0:00200020 00200020 00200020 00200020。 。 。 。 。 。 。 。
    4c0002e0:00200020 00200020 00200020 00200020。 。 。 。 。 。 。 。
    4c0002f0:00000000 00000000 00000000…
    4c000300:00000000 00000000 00000000 00000000…
    4c000310:00000000 00000177 00000177… 宽...宽...

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

    好的、您的配置看起来不错。

    您能否监控 VDDS_DDR 和 VDD_CORE、尤其是在高活动期间(例如、在 rootfs 复制期间)?  这些电源上的压降或其他噪声

    您是如何获得电子表格第一页上的 IO 设置的?  您是否在电路板上执行了信号完整性检查、还是只使用了默认设置?  是否可以尝试降低 Addr/Ctrl/Clk 的输出驱动器阻抗?

    u-boot 中的 memtest 是否始终通过、即使您在较大的存储器区域中进行测试(如在内核中失败时所做的那样)

    您是否具有电路板的 JTAG 访问权限?

    是否遵循了数据表中的所有 DDR 布局指南?  特别是 addr/Ctrl 信号的布线长度和偏差匹配。

    很难说问题是否源于您以前的电源问题。  我会说、如果您在所有电路板上看到相同的行为、那么可能不会。   

    此致、

    James

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

    尊敬的 James:  

    您能否监控 VDDS_DDR 和 VDD_CORE、尤其是在高活动期间(例如、在 rootfs 复制期间)?  这些电源上的压降或其他噪声

    我们将对此进行研究。  

    您是如何获得电子表格第一页上的 IO 设置的?  您是否在电路板上执行了信号完整性检查、还是只使用了默认设置?   

    我们使用了默认值、但没有执行任何信号完整性 silms。  

    是否可以尝试降低 Addr/Ctrl/Clk 的输出驱动器阻抗?

    您是要调整 EMIF 工具上1E-25行的值吗? 如果是、那么我们应该尝试使用33、36和40欧姆吗? ( 我们从建议值中选择的任何值都变为红色。)  

    u-boot 中的 memtest 是否始终通过、即使您在较大的存储器区域中进行测试(如在内核中失败时所做的那样)

    是的。 我们的 RAM 为512M、我们可以在0-480M (0x8000000000 - 0x9d000000)之间进行测试。 之后、memtest 无法继续、这可能是由于 uboot 本身位于该区域。  

    您是否具有电路板的 JTAG 访问权限?

    是的、我们确实有 XDS110探针、但我们没有使用 JTAG 的经验、因此我们还无法在那里运行任何脚本。   

    是否遵循了数据表中的所有 DDR 布局指南?  特别是 addr/Ctrl 信号的布线长度和偏差匹配。

    是的、所有拇指规则都适用。 这是一个8层电路板。 下图显示了布线层(隐藏了 GND/PWR 层)  

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

    关于 PLL 参数、我想问的另一个问题是、 对于 get_DPLL_DDR_params 函数、我们为电路板使用了 gp_evm_DPLL_DDR 参数、如下所示:

    const 结构 DPLL_params DPLL_PER[NUM_CRYSTICL_FREQ]={
    {400、7、5、-1、-1、 -1、-1}、/* 19.2 MHz */
    {400、9、5、-1、-1、 -1、-1}、/* 24 MHz */
    {384、9、5、-1、-1、 -1、-1}、/* 25 MHz */
    {480、12、5、-1、-1、 -1、-1}/* 26 MHz */
    };

    const 结构 DPLL_params epos_evm_DPLL_DDR[NUM_crystal_FREQ]={
    {665、47、1、-1、4、 -1,-1},/* 19.2*/
    {133、11、1、-1、4、 -1、-1}、/* 24 MHz */
    {266、24、1、-1、4、 -1、-1}、/* 25 MHz */
    {133、12、1、-1、4、 -1、-1}/* 26 MHz */
    };

    const struct DPLL_params gp_evm_DPLL_DDR ={
    50、2、1、-1、2、 -1、-1};

    根据我们的设置(24MHz 主时钟、400MHz DDR 时钟等)、我们是否使用了正确的参数?  

    再次感谢您的帮助。  

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

    对于 addr 驱动器阻抗、是的、即使电子表格变为红色、也请选择其中的每一个、并注意行为的任何变化

    对于 PLL、是的、您应该使用 DPLL_params_gp_evm_DPLL_DDR。  这将为您提供(24MHz * 50)/(2+1)= 400MHz。  您可能需要探测 DDR 时钟以确保输出400MHz。   

    执行每次测试时、您是在电路板上执行全功率循环、还是只是复位处理器?  您能否尝试其中一种方法并注意行为的任何变化。

    如果您使用的是 PMIC、您是否能够调节 VDD_CORE 电压?

    此致、

    James

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

    尊敬的 James:  

    我们使用的是 TPS65218D0 PMIC、但我们只能通过 I2C 调节 VDD_CORE 电压。 VDD_CORE 和 VDD_MPU 的当前内核电压为建议的1.1V。 但是、在开始时、由于 VDD_MPU_MON 不能正常工作、我们看到 VDD_MPU 处的电压峰值为3V。 因此、我们正在尝试了解这是否会对 MPU 造成任何损坏、但如果它造成了损坏、我们是否仍然能够在某些情况下一直引导?  

    我们在更改 Addr/Ctrl/Clk 的阻抗后完成了引导测试。  您可以找到我们的引导尝试和导致的错误的表。 我们尝试进行至少10次 PMIC 复位尝试。 我们尝试了电路板的全断电、但由于我们的超级电容器备份设置、耗时太长、因此我们没有针对所有尝试执行此操作。 我们所做的时间、没有相关性、PMIC 复位也会执行全功率周期、因此我认为这无关紧要。

    我还附上了我们的 PMIC 和电源原理图以供参考。 我之前已经分享了我们的 DDR 原理图。  

    您能否查看引导结果和原理图并告诉我们您的看法? 谢谢你。  

    e2e.ti.com/.../AM437x_5F00_power_5F00_sch.pdf   

     e2e.ti.com/.../AM437x-Linux-Bootup-Trials.xlsx 

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

    Berkay、很难判断高电压是否损坏了任何东西。  我认为、由于您取得了一些成功、因此应该可以、但如果可能、可能需要考虑在电路板上获取新器件。

    如果您可以通过 i2c 调整 VDD_CORE、则一个实验是将 VDD_CORE 调整到更接近其最大电压(1.1V +5%)的位置。  这将有助于确定您是否在该电源轨上受到任何压降或噪声对电源的其他影响。   

    您发送的结果没有什么真正的跳出来。  仍然不确定为什么只有在引导内核时才会看到这种情况。  您的引导介质是什么?  内核复制到 DDR 后、您是否正在执行任何验证来验证 DDR 中映像的内容?

    您说过您没有 JTAG 的经验、但能否连接到 A9内核并在存储器窗口中查看 DDR 存储器?

    此致、

    James   

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

    尊敬的 James:  

    我们使用 SD 卡(mmc0)进行引导。 我们已连接 JTAG 连接器并验证 uImage 是否已正确复制。 我们还看到 DDR 存储器窗口中的 EMIF 寄存器是正确的。  

    我们还无法更改 VDD_CORE。 我们是否可以在启动时执行此操作? 通过这种方式、我们在引导期间监控了 VDDS_DDR 和 VDD_CORE、但未注意 到任何意外情况。

    问题:我们已经复制了 AM4378EVM SDK 并从工具中修改了 EMIF 设置。 这是否足以正确设置我们的 DDR? 我们使用的是单 DDR 器件与 EVM 的双 DDR 器件、是否有任何定义?  

    使用 JTAG 设置、我们是否可以做任何事情来进一步深入了解我们的存储器、并了解我们为什么会不断遇到不同的存储器错误?  

    谢谢。  

     

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

    尊敬的 James:  

    我们今天还做了一件事。 我们已从 https://git.ti.com/cgit/sitara-dss-files/am43xx-dss-files/下载 DSS 文件 并使用 Code Composer Studio 运行 am43xx-DDR-analysis.dss。 您可以在下面找到输出文件。

    您能在 这里看到任何错误吗?

    e2e.ti.com/.../am43xx_2D00_ddr_2D00_analysis_5F00_2022_2D00_09_2D00_20_5F00_220128.txt

    e2e.ti.com/.../am43xx_2D00_ddr_2D00_config_5F00_2022_2D00_09_2D00_20_5F00_220128.csv

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

    Berkay、您可以在 uboot 中使用 I2C 命令来更改 VDD_CORE 电压。  下面是更改 TPS65218上的 DCDC3的示例

    => i2c dev 0 #将总线设置为0

    => I2C MW 0x24 0x10 0x65 #set 密码保护寄存器、带 addr XOR 0x7d = 0x65

    => I2C MW 0x24 0x18 0x08 #set DCDC3 to desired voltage (表中的[5:0]位)。  0x08为1.1V

    => i2c MW 0x24 0x1a 0x46 #set the Go Disable bit (GODSBL)(设置 GO 禁用位(GODSBL))

    您可以使用 i2c MD 0x24 0x18进行回读、以确保更改记忆棒

    您可能希望从1.1V 上升到该值。  我会尝试尝试通过先将这些命令调低电压来输出这些命令、以确保您具有正确的顺序。   

    EVM 上的2个器件只允许 AM43x 器件使用完整的32位数据总线。  通过在工具中选择 x16、控制器将设置为"窄"模式(即16位数据总线)。  如果这种情况不正确、您会遇到更严重的问题、因为您丢失了一半的数据总线。

    DSS 脚本转储不会显示任何异常。  您的配置似乎非常典型。

    CCS 中可以执行的操作是在发生故障后连接(确保没有自动运行 GEL 文件)、在 DDR 区域(0x80000000及更高版本)中打开存储器窗口、并查看是否可以成功地查看/插入值。  您还可以将其置于连续刷新模式以检查稳定性、您还可以尝试菜单中的内存填充功能。  所有这些都是在缓慢的传输速度下进行的、因此如果这只是高带宽下的问题、您可能不会看到故障。  这主要是检查配置在引导后是否损坏。

    您还可以在每次引导后进行 EMIF 的寄存器转储。  我想了解成功启动后的寄存器转储与失败启动之间的比较。  我们可能能够检测到培训结果中的一些差异、或者检测到寄存器是否损坏。

    内核启动期间是否有任何可能导致高噪声环境的问题?  在内核中启用了什么(而不是在 uboot 中启用)?  一个实验可能是开始剥离在内核引导期间初始化的驱动程序或模块。  尝试使引导尽可能简单、可能是电路板上的某个外设或其他器件导致 DDR 地址/数据总线出现问题。

    您是否为24MHz 输入使用晶体?  是否可以暂时将其更改为 LVCMOS 振荡器?  多年来、我曾看到过几个噪声耦合到晶体电路中并导致随机问题的实例、如您所描述的那样。  外部方波将消除这种情况的影响。

    此致、

    James