概括
我们正在尝试开发基于 NXP LS1046A SoC 的定制板。我们目前正在努力解决 BL2 (ATF) 中的 DDR 初始化错误。在对 DDR 控制器设置进行试验后,我们看到以下三种结果之一:
- DDR 初始化和训练失败,错误代码(debug[1] 值)0x3002。我们无法找到有关错误位含义的任何文档。
- DDR 初始化和训练超时(D_INIT 未释放)。
- DDR 初始化和训练似乎成功,但 BL3 加载失败,错误消息指示内存故障:
- 错误:mmap_add_region_check() 失败。错误-22
- 错误:SD 读取错误 - DMA 错误 = 10000000
- 错误:读取错误 = fffffffb
- 警告:无法获取对图像 id=3 (-2) 的引用
- 错误:BL2:无法加载图像 (-2)
- 验证失败
硬件概述
- SoC部分:LS1046AXE8P1A。
- 分立 SDRAM 部分:2x MT40A1G16RC-062E IT:B,单芯片选择,32 位数据宽度(每个组件 16 位)。
- 引导源:micro-SD卡。
- 时钟输入:DIFF_SYSCLK 是来自 LMK05318B PLL 的 100 MHz AC-LVDS 信号。它符合 LS1046A 数据表第 3.7.6 节的要求。SYSCLK 和 DDRCLK 未使用并连接到 GND。
- SoC 捆扎:
- CFG_DRAM = 0 = DDR4
- CFG_ENG_USE0 = 0 = DIFF_SYSCLK
- CFG_ENG_USE1 = 1 = 使用内部 LVDS 终端
- CFG_RCW_SRC[8..0] = 0_0100_0000 = 从 SD/MMC 引导
- RCW 设置:
- 400 MHz 平台时钟 (SYS_PLL_RAT=4)
- 1600 MHz DDR 时钟 (MEM_PLL_RAT=16)
- 1200 MHz PLL1(CPU)(CGA_PLL1_RAT=12)
- 来自 PLL1 /1 (C1_PLL_SEL=0) 的 1200 MHz CPU 内核时钟
- 未使用 DDRCLK (DDR_REFCLK_SEL=1)
- DDR_FDBK_MULT=2
- DRAM_LAT=1
- PBI_src=6
- SB_EN=0
我们检查过/尝试过的
硬件
- 所有 SoC 输入电压、时钟和复位均已根据 LS1046A 数据表的电平和时序规范进行检查。
- 存在 800 MHz DDR 总线时钟(由 SoC 生成)并且 DDR 控制信号上存在活动。
固件
- QCVS DDR 配置设置已根据 MT40A1G16RC-062E IT:B 数据表进行检查。
- 已在 ATF 中检查所有相关的 CCSR 寄存器,以确保正确的 strapping 和 RCW 值。
- 来自 qoriq-components Git 存储库的 ATF 固件的几个最新版本已经过测试。
- 打印在控制台上的 DDR 配置寄存器值已根据 QCVS 生成代码的预期设置进行检查,并且全部匹配。
- 我们确认已应用勘误表 A008511、A009803、A009942 和 A010165 的解决方法代码。
- 我们尝试了几种平台时钟频率和 DDR 控制器频率的变化。
- 我们尝试了几种 CLK 到 DQS 偏斜值的变体。(下面 QCVS 屏幕截图中显示的值是 Altium 的实际电路板值。)
参考资料
RCW 源文件
#include <ls1046a.rcwi>
/* 计时 */
SYSCLK_FREQ=600 /* SYSCLK 输入 = 600 * 166.667 kHz = 100 MHz */
SYS_PLL_RAT=4 /* 平台时钟 = 4 * SYSCLK = 400 MHz */
MEM_PLL_RAT=16 /* DDR 时钟 = 16 * SYSCLK = 1600 MHz */
CGA_PLL1_RAT=12 /* PLL1 (CPU) = 12 * SYSCLK = 1200 MHz */
CGA_PLL2_RAT=12 /* PLL2 (FMan, eSDHC, QSPI) = 12 * SYSCLK = 1200 MHz */
C1_PLL_SEL=0 /* CPU 内核时钟 = PLL1 /1 = 1200 MHz */
HWA_CGA_M1_CLK_SEL=6 /* FMan 时钟 = PLL2 /2 = 600 MHz */
HWA_CGA_M2_CLK_SEL=1 /* eSDHC*6, QSPI*64 时钟 = PLL2 /1 = 1200 MHz */
DDR_REFCLK_SEL=1 /* 为 DDR PLL 使用差分 SYSCLK,而不是 DDRCLK */
/* I/O 组电压 */
TVDD_VSEL=1 /* TVDD I/O 域:2.5 V */
DVDD_VSEL=2 /* DVDD I/O 域:3.3 V */
EVDD_VSEL=2 /* EVDD I/O 域:3.3 V */
/* SerDes 1 设置 */
SRDS_PRTCL_S1=4403 /* 0x1133: 0=XFI.9, 1=XFI.10, 2=SGMII.5, 3=SGMII.6 */
SRDS_REFCLK_SEL_S1=0 /* 为 PLL1 和 PLL2 使用单独的参考时钟 */
SRDS_PLL_PD_S1=2 /* 关闭 PLL1 */
SRDS_PLL_REF_CLK_SEL_S1=3 /* PLL1 @ N/A,PLL2 @ 156.25 MHz */
/* SerDes 2 设置 */
SRDS_PRTCL_S2=21879 /* 0x5577: 0=PCIe.1 x1, 1=PCIe.2 x1, 2/3=PCIe.3 x2 */
SRDS_REFCLK_SEL_S2=0 /* 为 PLL1 和 PLL2 使用单独的参考时钟 */
SRDS_PLL_REF_CLK_SEL_S2=3 /* PLL1 @ 100 MHz, PLL2 @ 100 MHz */
SRDS_DIV_PEX_S2=0 /* PCIe 可以训练高达 8 Gb/s */
/* 内存设置 */
DDR_FDBK_MULT=2 /*(保留)DDR PLL 反馈路径选择和倍频使能器 */
DRAM_LAT=1 /* 8-8-8 或更高延迟的 DRAM */
/* 启动设置 */
PBI_src=6 /* 从 SD/MMC 获取预启动初始化数据 */
SB_EN=0 /* 未启用安全启动 */
/* 引脚复用 */
IFC_GRP_A_EXT=1 /* 使用 QSPI A 信号,而不是 FTM5、GPIO 或 IFC */
IFC_GRP_D_EXT=1 /* 使用 QSPI B 信号,而不是 FTM6、GPIO 或 IFC */
IFC_GRP_E1_BASE=1 /* 使用 GPIO2 信号,而不是 FTM7、IFC 或 QSPI B DATA3 */
IFC_GRP_F_EXT=1 /* 使用 QSPI A 信号,而不是 IFC */
IIC2_EXT=1 /* 使用 SDHC_CD_B 和 SDHC_WP,而不是 IIC2/GPIO/FTM */
IRQ_OUT=1 /*(保留)*/
IRQ_BASE=1 /* 使用 GPIO,不使用 IRQ */
UART_BASE=4 /* 使用 UART1 SOUT/SIN/RTS/CTS 和 GPIO1_[16:22]*/
USB_DRVVBUS=1 /* 使用 GPIO4[29],而不是 USB_DRVVBUS */
USB_PWRFAULT=1 /* 使用 GPIO4[30],而不是 USB_PWRFAULT */
EC1=5 /* 使用 FTM1 */
EC2=5 /* 使用 FTM1 */
EM1=1 /* 使用 GPIO_3 */
EM2=1 /* 使用 GPIO_4 */
/* 预引导初始化 (PBI)。此 PBI 代码主要派生
* 来自 LS1046A RDB 示例 (rcw_1800_emmcboot.rcw)。*/
.pbi
// SCFG_SCRATCHRW[1:2]: 64 位引导指针
// 0x10000000 是 64 KiB 片上 RAM (OCRAM1);PBL在这里加载BL2
写入 0x570600、0x00000000
写入 0x570604、0x10000000
。结尾
#include <cci_barrier_disable.rcw> // CCI:所有主接口终止障碍(为什么?)
#include <usb_phy_freq.rcw> // 使 USB1、USB2 和 USB3 PHY 脱离复位状态
#include <pex_gen3_link.rcw> // PCIe 勘误表 A-010477、A-008851(关于:第 3 代)
#include <a009531.rcw> // PCIe 勘误表 A-009531(关于 ID0 位)
|
ATF 中的 DDR 初始化代码
DDR 初始化代码由在 Windows PC 上的 CodeWarrior 11.5.0 中运行的最新版本的 QCVS 生成。
常量结构 ddr_cfg_regs static_1600 = {
.cs[0].bnds = 0xFF,
.cs[1].bnds = 0x0100013F,
.cs[0].config = 0x80010512,
.cs[1].config = 0x0202,
.cs[2].bnds = 0x0140017F,
.cs[3].bnds = 0x018001BF,
.cs[2].config = 0x0202,
.cs[3].config = 0x0202,
.cs[0].config_2 = 0x00,
.cs[1].config_2 = 0x00,
.cs[2].config_2 = 0x00,
.cs[3].config_2 = 0x00,
.sdram_cfg[0] = 0xC52C0000,
.sdram_cfg[1] = 0x00401030,
.timing_cfg[0] = 0xFF550018,
.timing_cfg[1] = 0xBAB40C52,
.timing_cfg[2] = 0x0048D11C,
.timing_cfg[3] = 0x01161000,
.timing_cfg[4] = 0xD501,
.timing_cfg[5] = 0x03401400,
.timing_cfg[7] = 0x23340000,
.timing_cfg[8] = 0x02116600,
.dq_map[0] = 0x32C57554,
.dq_map[1] = 0xD4BB0BD4,
.dq_map[2] = 0x2EC2F554,
.dq_map[3] = 0xD8000000,
.sdram_mode[0] = 0x01010210,
.sdram_mode[1] = 0x00,
.sdram_mode[2] = 0x00,
.sdram_mode[3] = 0x00,
.sdram_mode[4] = 0x00,
.sdram_mode[5] = 0x00,
.sdram_mode[6] = 0x00,
.sdram_mode[7] = 0x00,
.sdram_mode[8] = 0x0701,
.sdram_mode[9] = 0x04800000,
.sdram_mode[10] = 0x00,
.sdram_mode[11] = 0x00,
.sdram_mode[12] = 0x00,
.sdram_mode[13] = 0x00,
.sdram_mode[14] = 0x00,
.sdram_mode[15] = 0x00,
.md_cntl = 0x00,
.interval = 0x18600618,
.data_init = 0xDEADBEEF,
.clk_cntl = 0x02800000,
.init_addr = 0x00,
.ddr_sr_cntr = 0x0,
.init_ext_addr = 0x00,
.zq_cntl = 0x8A090705,
.wrlvl_cntl[0] = 0x86750606,
.wrlvl_cntl[1] = 0x0606060B,
.wrlvl_cntl[2] = 0x0B0C0C00,
.cdr[0] = 0x80040000,
.cdr[1] = 0x81,
};
|
控制台输出
信息:RCW BOOT SRC 是 SD/EMMC
信息:RCW BOOT SRC 是 SD/EMMC
信息:esdhc_emmc_init
信息:成功检测到卡
信息:初始化完成:
信息:平台时钟 400000000
信息:DDR PLL1 1600000000
信息:DDR PLL2 0
注意:使用静态 DDR 设置
注意:POSRR1:207f7fff
注意:POSRR2:cf000000
注意:CLKCCSR:0
注意:CL1KCGHWACSR:30000000
注意:CL2KCGHWACSR:8000000
注意:PLLC1GSR:18
注意:PLLC2GSR:18
注意:CLKPCSR:0
注意:PLLPGSR:8
注意:PLLDGSR:80020
信息:编程控制器前的时间 30 毫秒
信息:程序控制器寄存器
警告:警告:未设置最佳 CPO 值。
信息:总大小 4 GB
信息:最多需要等待 2680 毫秒
信息:将调试 [9] 读取为 0x10101010
信息:将调试 [10] 读取为 0x10101010
信息:cpo_min 0x10
信息:cpo_max 0x10
信息:调试 [28] 0x70006f
警告:警告:A009942 需要将 cpo_sample 设置为 0x37
错误:发现训练错误:0x3002
信息:*0x1080000 = 0xff
信息:*0x1080008 = 0x100013f
信息:*0x1080010 = 0x140017f
信息:*0x1080018 = 0x18001bf
信息:*0x1080080 = 0x80010512
信息:*0x1080084 = 0x202
信息:*0x1080088 = 0x202
信息:*0x108008c = 0x202
信息:*0x1080100 = 0x1161000
信息:*0x1080104 = 0xff550018
信息:*0x1080108 = 0xbab40c52
信息:*0x108010c = 0x48d11c
信息:*0x1080110 = 0xc52c0000
信息:*0x1080114 = 0x401020
信息:*0x1080118 = 0x1010210
信息:*0x1080120 = 0x600041f
信息:*0x1080124 = 0x18600618
信息:*0x1080128 = 0xdeadbeef
信息:*0x1080130 = 0x2800000
信息:*0x1080160 = 0xd501
信息:*0x1080164 = 0x3401400
信息:*0x108016c = 0x23340000
信息:*0x1080170 = 0x8a090705
信息:*0x1080174 = 0xc6750606
信息:*0x1080190 = 0x606060b
信息:*0x1080194 = 0xb0c0c00
信息:*0x1080220 = 0x701
信息:*0x1080224 = 0x4800000
信息:*0x1080250 = 0x2116600
信息:*0x1080270 = 0xffff
信息:*0x1080280 = 0xffffff77
信息:*0x1080284 = 0xffffff77
信息:*0x1080288 = 0x88888800
信息:*0x108028c = 0xffffffff
信息:*0x1080290 = 0x1
信息:*0x10802a0 = 0x1
信息:*0x1080400 = 0x32c57554
信息:*0x1080404 = 0xd4bb0bd4
信息:*0x1080408 = 0x2ec2f554
信息:*0x108040c = 0xd8000000
信息:*0x1080b20 = 0x8080
信息:*0x1080b24 = 0x80000000
信息:*0x1080b28 = 0x80040000
信息:*0x1080b2c = 0x81
信息:*0x1080bf8 = 0x20502
信息:*0x1080bfc = 0x100
信息:*0x1080e40 = 0x80
信息:*0x1080f04 = 0x3002
信息:*0x1080f08 = 0xe
信息:*0x1080f0c = 0x14000c20
信息:*0x1080f24 = 0x10101010
信息:*0x1080f28 = 0x10101010
信息:*0x1080f2c = 0x10101010
信息:*0x1080f30 = 0x10101010
信息:*0x1080f34 = 0x10103000
信息:*0x1080f48 = 0x1
信息:*0x1080f4c = 0x94000000
信息:*0x1080f50 = 0xd000c00
信息:*0x1080f54 = 0xb000b00
信息:*0x1080f58 = 0x16001600
信息:*0x1080f5c = 0x18001800
信息:*0x1080f60 = 0xc000000
信息:*0x1080f64 = 0x9000
信息:*0x1080f68 = 0x20
信息:*0x1080f70 = 0x70006f
信息:*0x1080f94 = 0x80000000
信息:*0x1080fb0 = 0x3
信息:*0x1080fb4 = 0x1f1f1f1f
信息:*0x1080fb8 = 0x1f1f1f1f
信息:*0x1080fbc = 0x1f1f1f1f
信息:*0x1080fc0 = 0x1f1f1f1f
信息:*0x1080fc4 = 0x1f1f1f1f
信息:*0x1080fc8 = 0x1f1f1f1f
信息:*0x1080fcc = 0x1f1f1f1f
信息:*0x1080fd0 = 0x1f1f1f1f
信息:*0x1080fd4 = 0x1f1f1f1f
信息:*0x1080fd8 = 0x1f1f1f1f
信息:*0x1080fdc = 0x1f1f1f1f
信息:*0x1080fe0 = 0x1f1f1f1f
信息:*0x1080fe4 = 0x1f1f1f1f
信息:*0x1080fe8 = 0x1f1f1f1f
信息:*0x1080fec = 0x1f1f1f1f
信息:*0x1080ff0 = 0x1f1f1f1f
信息:*0x1080ff4 = 0x1f1f1f1f
信息:*0x1080ff8 = 0x1f1f1f1f
信息:*0x1080ffc = 0x1f001f18
错误:写入 DDR 寄存器失败
错误:编程 DDRC 错误
错误:DDR 初始化失败。
注意:不正确的 DRAM0 大小在 platfor_def.h 中定义
错误:mmap_add_region_check() 失败。错误-22
错误:mmap_add_region_check() 失败。错误-22
注意:BL2:v1.5(调试):LSDK-19.09-update-311219-dirty
注意:BL2:建成时间:2021 年 7 月 27 日 13:08:45
信息:配置 TrustZone 控制器
信息:区域基数 = 7fdffffb
信息:区域基础的价值 = 7ffffffb
信息:区域基数 = fbdffffb
信息:BL2:进行平台设置
信息:BL2:加载图像 ID 3
错误:SD 读取错误 - DMA 错误 = 10000000
错误:读取错误 = fffffffb
警告:无法获取对图像 id=3 (-2) 的引用
错误:BL2:无法加载图像 (-2)
验证失败
|
0
|
|
|
|