Compare commits
2 Commits
e753504ae3
...
6e89c0e098
Author | SHA1 | Date | |
---|---|---|---|
6e89c0e098 | |||
fdb1c6e893 |
@ -21,6 +21,7 @@ struct safety_memory_header {
|
|||||||
uint32_t boot_status_offset; /**< @brief Offset of the safety_memory_boot_status struct (in 32 bit words)*/
|
uint32_t boot_status_offset; /**< @brief Offset of the safety_memory_boot_status struct (in 32 bit words)*/
|
||||||
uint32_t config_overrides_offset; /**< @brief Offset address of override entries */
|
uint32_t config_overrides_offset; /**< @brief Offset address of override entries */
|
||||||
uint32_t config_overrides_len; /**< @brief Length of override entries in words */
|
uint32_t config_overrides_len; /**< @brief Length of override entries in words */
|
||||||
|
uint32_t firmware_update_filename; /**< @brief Filename of the firmware update. This string is at maximum 256 bytes long including the 0 terminator */
|
||||||
uint32_t err_memory_offset; /**< @brief Offset of the error memory */
|
uint32_t err_memory_offset; /**< @brief Offset of the error memory */
|
||||||
uint32_t err_memory_end; /**< @brief End of the error memory. This points to the word after the error memory, containing the CRC of the whole backup RAM. */
|
uint32_t err_memory_end; /**< @brief End of the error memory. This points to the word after the error memory, containing the CRC of the whole backup RAM. */
|
||||||
uint32_t crc; /**< @brief CRC of the header */
|
uint32_t crc; /**< @brief CRC of the header */
|
||||||
|
@ -214,16 +214,21 @@ static void show_error_memory(GtkTreeView *tree_view, const unsigned char *memor
|
|||||||
valid = true;
|
valid = true;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
|
header.firmware_update_filename = dat;
|
||||||
|
interpret = new_string_printf("Offset of FW update filename: %u", dat);
|
||||||
|
valid = true;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
header.err_memory_offset = dat;
|
header.err_memory_offset = dat;
|
||||||
interpret = new_string_printf("Error memory offset addr: %u", dat);
|
interpret = new_string_printf("Error memory offset addr: %u", dat);
|
||||||
valid = true;
|
valid = true;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 6:
|
||||||
header.err_memory_end = dat;
|
header.err_memory_end = dat;
|
||||||
interpret = new_string_printf("Error memory end ptr: %u", dat);
|
interpret = new_string_printf("Error memory end ptr: %u", dat);
|
||||||
valid = true;
|
valid = true;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 7:
|
||||||
header.crc = dat;
|
header.crc = dat;
|
||||||
valid = check_err_mem_header(&header, &expected_value);
|
valid = check_err_mem_header(&header, &expected_value);
|
||||||
if (valid) {
|
if (valid) {
|
||||||
@ -235,7 +240,7 @@ static void show_error_memory(GtkTreeView *tree_view, const unsigned char *memor
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i <= 6) {
|
if (i <= 7) {
|
||||||
state = ENTRY_STATE_INVALID;
|
state = ENTRY_STATE_INVALID;
|
||||||
goto print;
|
goto print;
|
||||||
}
|
}
|
||||||
|
@ -321,20 +321,54 @@ void __attribute__((noreturn)) Reset_Handler(void) {
|
|||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move the Stack pointer to CCMRAM
|
/* Move the stack and the stack pointer to CCMRAM
|
||||||
* This allows us to perform a RAM test on the main RAM.
|
* This allows us to perform a RAM test on the main RAM.
|
||||||
* Note: sp is not required to be inside the clobber list!
|
|
||||||
*/
|
*/
|
||||||
__asm__ __volatile__ ("mov sp, %0\n\t" :: "r"(0x10000000UL + (64U * 1024UL)) :);
|
/* R2 holds the amount of bytes / words on the stack. */
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"mov r2, sp\n" /* Move stack pointer to register 2 */
|
||||||
|
"sub r2, %[stacktop], r2\n" /* Subtract stackpointer from top of ram => byte usage */
|
||||||
|
"mov r3, sp\n" /* Init r3 with first word address to copy (stack pointer) */
|
||||||
|
"sub r4, %[ccmtop], r2\n" /* Init r4 with first address to copy to! This will be the new stack pointer! */
|
||||||
|
"mov r5, r4\n" /* R5 will be the new stackpointer after we are finished copying */
|
||||||
|
"copyloop:\n"
|
||||||
|
"cmp r3, %[stacktop]\n" /* Check if we still have word to copy. If not => finish */
|
||||||
|
"beq finish\n"
|
||||||
|
"ldr.w r6, [r3, #0]\n" /* Load word from [r3] and store into [r4] */
|
||||||
|
"str.w r6, [r4, #0]\n"
|
||||||
|
"add r3, #4\n" /* Increment pointers */
|
||||||
|
"add r4, #4\n"
|
||||||
|
"b copyloop\n" /* go back to loop head */
|
||||||
|
"finish:\n"
|
||||||
|
"mov sp, r5\n" /* Set the new stack pointer to the beginning of the copied area */
|
||||||
|
:
|
||||||
|
: [stacktop]"r"(&__ld_top_of_stack), [ccmtop]"r"(0x10000000UL + (64U * 1024UL))
|
||||||
|
: "memory", "r2", "r3", "r4", "r5", "r6");
|
||||||
|
|
||||||
if (startup_test_perform_system_ram_check()) {
|
if (startup_test_perform_system_ram_check()) {
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move the stack pointer back. Note: This only works if this function does not use the stack for variables.
|
/* Move the stack back to system ram */
|
||||||
* Otherwise everything will be broken.
|
__asm__ __volatile__ (
|
||||||
*/
|
"mov r2, sp\n" /* Move stack pointer to register 2 */
|
||||||
__asm__ __volatile__ ("mov sp, %0\n\t" :: "r"(&__ld_top_of_stack) :);
|
"sub r2, %[ccmtop], r2\n" /* Subtract stackpointer from top of ccmram => byte usage */
|
||||||
|
"mov r3, sp\n" /* Init r3 with first word address to copy (stack pointer) */
|
||||||
|
"sub r4, %[stacktop], r2\n" /* Init r4 with first address to copy to! This will be the new stack pointer! */
|
||||||
|
"mov r5, r4\n" /* R5 will be the new stackpointer after we are finished copying */
|
||||||
|
"copyloop_2:\n"
|
||||||
|
"cmp r3, %[ccmtop]\n" /* Check if we still have word to copy. If not => finish */
|
||||||
|
"beq finish_2\n"
|
||||||
|
"ldr.w r6, [r3, #0]\n" /* Load word from [r3] and store into [r4] */
|
||||||
|
"str.w r6, [r4, #0]\n"
|
||||||
|
"add r3, #4\n" /* Increment pointers */
|
||||||
|
"add r4, #4\n"
|
||||||
|
"b copyloop_2\n" /* go back to loop head */
|
||||||
|
"finish_2:\n"
|
||||||
|
"mov sp, r5\n" /* Set the new stack pointer to the beginning of the copied area */
|
||||||
|
:
|
||||||
|
: [stacktop]"r"(&__ld_top_of_stack), [ccmtop]"r"(0x10000000UL + (64U * 1024UL))
|
||||||
|
: "memory", "r2", "r3", "r4", "r5", "r6");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RAM tests destroyed our values. So we have to copy them again...
|
* RAM tests destroyed our values. So we have to copy them again...
|
||||||
|
Loading…
x
Reference in New Issue
Block a user