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.

[FAQ] DRA821U: 如何使用 DDR BIST 引擎来填充模式。

Part Number: DRA821U

问题 1

尊敬的支持部门:

预加载 DDR ECC 时,我们使用 BIST 引擎进行 SDRAM 初始化,但会失败,以下是配置的寄存器。

可以帮助我检查配置是否正确吗?

我想初始化 0x9000 0000 ~ 0x9000 03FF(1KB)

/* BIST start address 0.*/
Tst_DDR_CTL->DENALI_CTL_196 = 0x90000000;
/* BIST start address 1.*/
Tst_DDR_CTL->DENALI_CTL_197 = 0x00000000;
/* BIST test mode.*/
/*4 - memory initialization.*/
Tst_DDR_CTL->DENALI_CTL_200 = 0x4;
/* BIST data pattern 0.*/
Tst_DDR_CTL->DENALI_CTL_201 = 0x55AA55AA;
/* BIST data pattern 1.*/
Tst_DDR_CTL->DENALI_CTL_202 = 0x55AA55AA;
/* BIST data pattern 2.*/
Tst_DDR_CTL->DENALI_CTL_203 = 0x55AA55AA;
/* BIST data pattern 3.*/
Tst_DDR_CTL->DENALI_CTL_204 = 0x55AA55AA;

/* bit0 -BIST GO */
/* bit18 -21, the number of address bits during BIST operation.*/
/* 9 - represent 1KB .*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0x90001;

 

1

很抱歉这么晚才回复。这段代码看起来没有问题。它是否能正常运行?使用 BIST 模块来初始化 DDR 是否有任何具体原因?您还可以使用 DMA 来初始化 DDR。

我们使用过 DMA 来初始化/填充 DDR。您可以在 ti-processor-sdk-rtos-j721e-evm-08_01_00_11/pdk_jacinto_08_01_00_33/packages/ti/board/src/j721e_evm/board_ddr_prime_dma.c 文件中找到此代码。 

 

问题 2

不能正常运行,地址 0x9000 0000 ~ 0x9000 03FF 没有填充预期值 (0x55AA55AA)。

BIST 引擎有相应的演示代码吗?

使用 DMA 初始化 DDR 比 BIST 引擎更快吗?

 

2

您能说明一下只填充 1024 字节的原因吗? 

很遗憾,SDK 中没有关于使用 BIST 来填充存储器的演示代码。我之前使用 gel 文件进行过这方面的尝试,是没有问题的。 

根据用例来看,使用 DMA 引擎可能会更好。

 

问题 3

我想使用 BIST 引擎在启用内联 ECC 的情况下进行 DDR 预加载。至于 1024 字节,只是一个为了验证 BIST 引擎是否正常工作的演示而已。

3

是的,我们可以使用 BIST 引擎,但模式必须为 0x0。我们不能写入任何其他模式。此外,速度将与 DMA 可以写入的速度类似。这就是我建议使用 DMA 的原因。我不知道为什么没有使用 DMA 来填充模式。您能说明一下原因吗? 

问题 4

中国的 TI 支持部门建议我们可以使用 BIST 引擎进行 DDR 预加载。

我将尝试使用零模式,然后我再回复是否可行。

还有一个关于 BIST 引擎的问题:

如何知道 BIST 引擎是否成功完成 DDR 预加载?通过 DDRSS_CTL_194 位 8(数据检查状态)?我是否需要将位 8 作为 1 进行轮询?

在填充模式为 0x55AA55AA 的演示配置中,DDRSS_CTL_194 位 8 为 1。

 

4

您可以使用 DDRSS_CTL_293 寄存器中的位 11 来等待完成。 

5

请使用以下代码通过 BIST 函数在 DDR 中填充模式。请使用 0x0 填充模式使 ECC 正常工作。 

/***********************macro define************************/
#define DDR_START_ADDR 0x80000000
#define DDR_SIZE 32
#define DDR_DATA 0x11111111
#define DDR_DATA1 0xAAAAAAAA
#define DDR_DATA2 0x55555555
#define DDR_DATA3 0xFFFFFFFF

#define J7ES_DDR_SS_BASE_MCUStart 0x02990000U
#define DDRSS_CTL_194__SFR_OFFS 0x308
#define DDRSS_CTL_195__SFR_OFFS 0x30c
#define DDRSS_CTL_196__SFR_OFFS 0x310
#define DDRSS_CTL_200__SFR_OFFS 0x320
#define DDRSS_CTL_201__SFR_OFFS 0x324
#define DDRSS_CTL_202__SFR_OFFS 0x328
#define DDRSS_CTL_203__SFR_OFFS 0x32c
#define DDRSS_CTL_204__SFR_OFFS 0x330
#define DDRSS_CTL_293__SFR_OFFS 0x494
#define DDRSS_CTL_295__SFR_OFFS 0x49c

Board_STATUS fillTestPattern()
{
Board_STATUS status = BOARD_SOK;


BOARD_DEBUG_LOG("Start DDR pattern test!\r\n");
// Define start address
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_196__SFR_OFFS, (DDR_START_ADDR - 0x80000000));
// Define memory size
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_194__SFR_OFFS, 63 << 16, 16, DDR_SIZE);
// Enable data check
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_194__SFR_OFFS, 1 << 24, 24, 1);
// Disable addr check
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_195__SFR_OFFS, 1, 0, 0);
// Set BIST Mode to Mem Init
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_200__SFR_OFFS, 7, 0, 4);
// Set Data Patterns
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_201__SFR_OFFS, DDR_DATA);
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_202__SFR_OFFS, DDR_DATA1);
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_203__SFR_OFFS, DDR_DATA2);
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_204__SFR_OFFS, DDR_DATA3);
// Clear Interrupt
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_295__SFR_OFFS, 1 << 11, 11, 1);
// Trigger Write
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_194__SFR_OFFS, 1, 0, 1);
// Wait for Finish
while(HW_RD_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_293__SFR_OFFS, 1 << 11, 11) !=1) BOARD_DEBUG_LOG("keep waiting finish!\r\n");

// Clear Interrupt

HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_295__SFR_OFFS, 1 << 11, 11, 1);

}

 

问题 6

我尝试了上面的代码,好像可以成功将指定的存储器空间初始化为 0。但是,DDRSS_CTL_293 中的位 11 未设置,然后程序将卡在 while 循环中。

Memlay_MemSet64((uint64*)0x90000000, 0x01uLL, 0x400uLL);

/* BIST start address 0.*/
Tst_DDR_CTL->DENALI_CTL_196 = 0x90000000 - 0x80000000;
/* BIST initialization size, 1K.*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0xA0000;
/* BIST enable data check.*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0x1000000;
/* BIST disable address check.*/
Tst_DDR_CTL->DENALI_CTL_195 |= 0x1;
/* BIST start address 1.*/
Tst_DDR_CTL->DENALI_CTL_197 = 0x00000000;
/* BIST test mode.*/
/*4 - memory initialization.*/
Tst_DDR_CTL->DENALI_CTL_200 = 0x4;
/* BIST data pattern 0.*/
Tst_DDR_CTL->DENALI_CTL_201 = 0x00;
/* BIST data pattern 1.*/
Tst_DDR_CTL->DENALI_CTL_202 = 0x00;
/* BIST data pattern 2.*/
Tst_DDR_CTL->DENALI_CTL_203 = 0x00;
/* BIST data pattern 3.*/
Tst_DDR_CTL->DENALI_CTL_204 = 0x00;
/* BIST clear interrupt.*/
Tst_DDR_CTL->DENALI_CTL_295 = 0x800;

/* bit0 -BIST GO */
/* bit18 -21, the number of address bits during BIST operation.*/
/* 9 - represent 1KB .*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0x1;

while(((Tst_DDR_CTL->DENALI_CTL_293) & 0x800) != 0x800)

/* BIST clear interrupt.*/
Tst_DDR_CTL->DENALI_CTL_295 = 0x800;

6

我是在 TDA4xVM 上使用的这段代码,对于 DRA821 可能需要进行一些更改。您看是否可以轮询控制器中的任何其他位来完成 BIST?

 

问题 7

我比较了 DRA821 和 TDA4XVM 之间的 DDRSS_CTL_293 寄存器,它们的描述是相同的。

我阅读了 DRA821 TRM,发现不能轮询任何位来完成 BIST。

TDA4:

DRA821: