#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++) { target_val = idx & 1 ? 0xAA55AA55UL : 0x55AA55AAUL; 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; } uint32_t startup_test_perform_system_ram_check() { const void *ram_base = (void *)0x20000000UL; const uint32_t ram_size = 128U * 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 *)ram_base; idx < ram_size / 4U; idx++) { word_ptr[idx] = idx & 1 ? 0x55AA55AAUL : 0xAA55AA55UL; } for (idx = 0, word_ptr = (volatile uint32_t *)ram_base; idx < ram_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 *)ram_base; idx < ram_size / 4U; idx++) { word_ptr[idx] = idx & 1 ? 0xAA55AA55UL : 0x55AA55AAUL; } for (idx = 0, word_ptr = (volatile uint32_t *)ram_base; idx < ram_size / 4U; idx++) { target_val = idx & 1 ? 0xAA55AA55UL : 0x55AA55AAUL; 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 *)ram_base; idx < ram_size / 4U; idx++) { word_ptr[idx] = 0xFFFFFFFFUL; } for (idx = 0, word_ptr = (volatile uint32_t *)ram_base; idx < ram_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 *)ram_base; idx < ram_size / 4U; idx++) { word_ptr[idx] = 0x0UL; } for (idx = 0, word_ptr = (volatile uint32_t *)ram_base; idx < ram_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; }