2021-05-20 23:55:32 +02:00
|
|
|
#include "startup-tests.h"
|
|
|
|
|
|
|
|
uint32_t startup_test_perform_ccm_ram_check(void)
|
|
|
|
{
|
|
|
|
const void *ccmram_base = (void *)0x10000000UL;
|
|
|
|
const uint32_t ccmram_size = 64U * 1024UL;
|
|
|
|
volatile uint32_t *word_ptr;
|
|
|
|
uint32_t target_val;
|
|
|
|
uint32_t idx;
|
|
|
|
uint32_t ret = 0UL;
|
|
|
|
|
|
|
|
|
|
|
|
/* Perform inversion test with 0x55 and 0xAA, Part 1 */
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
|
|
|
word_ptr[idx] = idx & 1 ? 0x55AA55AAUL : 0xAA55AA55UL;
|
|
|
|
}
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
|
|
|
target_val = idx & 1 ? 0x55AA55AAUL : 0xAA55AA55UL;
|
|
|
|
if (target_val != word_ptr[idx]) {
|
|
|
|
ret = (uint32_t)&word_ptr[idx];
|
|
|
|
goto exit_ret_address;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Perform inversion test with 0x55 and 0xAA, Part 2 */
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
|
|
|
word_ptr[idx] = idx & 1 ? 0xAA55AA55UL : 0x55AA55AAUL;
|
|
|
|
}
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
2021-05-22 00:06:51 +02:00
|
|
|
target_val = idx & 1 ? 0xAA55AA55UL : 0x55AA55AAUL;
|
2021-05-20 23:55:32 +02:00
|
|
|
if (target_val != word_ptr[idx]) {
|
|
|
|
ret = (uint32_t)&word_ptr[idx];
|
|
|
|
goto exit_ret_address;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Perform static test with 0xFF */
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
|
|
|
word_ptr[idx] = 0xFFFFFFFFUL;
|
|
|
|
}
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
|
|
|
target_val = 0xFFFFFFFFUL;
|
|
|
|
if (target_val != word_ptr[idx]) {
|
|
|
|
ret = (uint32_t)&word_ptr[idx];
|
|
|
|
goto exit_ret_address;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Perform static test with 0x00 */
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
|
|
|
word_ptr[idx] = 0x0UL;
|
|
|
|
}
|
|
|
|
for (idx = 0, word_ptr = (volatile uint32_t *)ccmram_base; idx < ccmram_size / 4U; idx++) {
|
|
|
|
target_val = 0x0UL;
|
|
|
|
if (target_val != word_ptr[idx]) {
|
|
|
|
ret = (uint32_t)&word_ptr[idx];
|
|
|
|
goto exit_ret_address;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
exit_ret_address:
|
|
|
|
return ret;
|
|
|
|
}
|