diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2022-12-09 15:20:40 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2022-12-09 15:20:40 -0700 |
commit | ac25063e15d7aa645f7567b9bdb0726e5c332fd6 (patch) | |
tree | 1a18f6d80cbcc25ce50ebb23c3a81f2d802130e9 /src | |
parent | 2aaf2180aa352c71c43efd548893fffe506397e5 (diff) | |
download | stm32l4-broken_linker.tar.gz stm32l4-broken_linker.tar.bz2 stm32l4-broken_linker.zip |
Refactor the linker script to make more sense.broken_linker
Specifically this moves the inits into the .text section.
This also move the data and bss segments into sram2 to give the heap and
stack more space to work with in sram1.
Diffstat (limited to 'src')
-rw-r--r-- | src/kern/init.c | 97 | ||||
-rw-r--r-- | src/kern/main.c | 105 |
2 files changed, 105 insertions, 97 deletions
diff --git a/src/kern/init.c b/src/kern/init.c index 550fea0..0267b7b 100644 --- a/src/kern/init.c +++ b/src/kern/init.c @@ -18,16 +18,15 @@ int main(); /* These are defined in the linker script. */ #ifdef ARCH_STM32L4 -extern uint32_t INIT_DATA_VALUES; + +extern uint32_t DATA_VALUES_IN_FLASH; extern uint32_t DATA_SEGMENT_START; extern uint32_t DATA_SEGMENT_STOP; -extern uint32_t TEXT_START; -extern uint32_t TEXT_STOP; extern uint32_t BSS_START; extern uint32_t BSS_END; -extern void (*INIT_ROUTINES_FLASH_START)(); -extern void (*INIT_ROUTINES_FLASH_STOP)(); +extern void (*INITS_START)(); +extern void (*INITS_END)(); extern uint32_t INIT_0_END; extern uint32_t INIT_1_END; @@ -38,19 +37,27 @@ extern uint32_t INIT_5_END; extern uint32_t INIT_6_END; extern uint32_t INIT_7_END; -extern uint32_t WAT; - -#define MAGIC_COOKIE 0xDEADBEEF -/* Test that data segment is properly set. */ -static uint32_t magic_cookie = MAGIC_COOKIE; +extern uint32_t INIT_0_START; +extern uint32_t INIT_1_START; +extern uint32_t INIT_2_START; +extern uint32_t INIT_3_START; +extern uint32_t INIT_4_START; +extern uint32_t INIT_5_START; +extern uint32_t INIT_6_START; +extern uint32_t INIT_7_START; + +extern uint32_t VECTORS_START; +extern uint32_t VECTORS_END; +extern uint32_t TEXT_START; +extern uint32_t TEXT_END; -void panic(const char*); +extern uint32_t FLASH_STOP; init2() { volatile uint32_t bss_start_ptr = (uint32_t)&BSS_START; volatile uint32_t bss_end_ptr = (uint32_t)&BSS_END; - volatile uint32_t init_data_values_ptr = (uint32_t)&INIT_DATA_VALUES; + volatile uint32_t init_data_values_ptr = (uint32_t)&DATA_VALUES_IN_FLASH; volatile uint32_t data_segment_start_ptr = (uint32_t)&DATA_SEGMENT_START; volatile uint32_t data_segment_stop_ptr = (uint32_t)&DATA_SEGMENT_STOP; @@ -58,7 +65,7 @@ init2() klogf(" .data ...\n"); klogf(" set (%p - %p)\n", &DATA_SEGMENT_START, &DATA_SEGMENT_STOP); - klogf(" from (%p)\n", &INIT_DATA_VALUES); + klogf(" from (%p)\n", &DATA_VALUES_IN_FLASH); if ((data_segment_start_ptr | data_segment_start_ptr) & 3) { panic(".data segment not aligned with sizeof(uint32_t)!\n"); @@ -72,7 +79,7 @@ init2() uint32_t* src; uint32_t* dest; - src = &INIT_DATA_VALUES; + src = &DATA_VALUES_IN_FLASH; dest = &DATA_SEGMENT_START; /* Copy the values from flash into the data segment. */ @@ -94,11 +101,6 @@ init2() *(dest++) = 0; } - if (magic_cookie != MAGIC_COOKIE) { - panic("Data Segment Initialization Failed!"); - } - - klogf("Magic Cookie Matches!\n"); klogf("Done!\n"); } @@ -106,11 +108,23 @@ init3() { /* Set the vector offset table to be at the start * of FLASH memory. */ - SCB.vto_r = 0x08000000; + SCB.vto_r = (uint32_t) &VECTORS_START; + + klogf("Vector offset table set to %p\n", &VECTORS_START); } void run_init_routines() { + void* init_starts[] = { + &INIT_0_START, + &INIT_1_START, + &INIT_2_START, + &INIT_3_START, + &INIT_4_START, + &INIT_5_START, + &INIT_6_START, + &INIT_7_START, + }; void* init_boundaries[] = { &INIT_0_END, &INIT_1_END, @@ -124,55 +138,40 @@ void run_init_routines() void (**initfn)(); - klogf("WAT: %p\n", &WAT); + klogf(".vectors:\n at (%p - %p)\n", &VECTORS_START, &VECTORS_END); + klogf(".text:\n at (%p - %p)\n", &TEXT_START, &TEXT_END); - klogf( - "Init routines at (%p - %p)\n", - &INIT_ROUTINES_FLASH_START, - &INIT_ROUTINES_FLASH_STOP); + klogf("inits: (%p - %p)\n", &INITS_START, &INIT_7_END); + + for (size_t i = 0; i < 8; ++i) { + klogf(".init%d\n at (%p - %p)\n", i, init_starts[i], init_boundaries[i]); + } klogf( - "Data segment at (%p - %p) from (%p)\n", + ".data:\n at (%p - %p)\n from (%p)\n", &DATA_SEGMENT_START, &DATA_SEGMENT_STOP, - &INIT_DATA_VALUES); + &DATA_VALUES_IN_FLASH); klogf( - "Bss segment at (%p - %p)\n", - &BSS_START, - &BSS_END); - - klogf( - "Heap at (%p - %p)\n", + ".heap:\n at (%p - %p) size %d bytes\n", &HEAP_START, - &HEAP_STOP); - - klogf( - "Text at (%p - %p)\n", - &TEXT_START, - &TEXT_STOP); - - klogf( "Init Boundary 0: %p\n", &INIT_0_END); - klogf( "Init Boundary 1: %p\n", &INIT_1_END); - klogf( "Init Boundary 2: %p\n", &INIT_2_END); + &HEAP_STOP, + (uint32_t)(&HEAP_STOP - &HEAP_START)); - // for (size_t i = 0; i < sizeof(init_boundaries) / sizeof(void*); ++ i) { - // klogf("Init Boundary %d at %p\n", i, init_boundaries[i]); - // } + klogf(".bss:\n at (%p - %p)\n", &BSS_START, &BSS_END); /* Enable a higher clock speed. This is the first thing we do * beacuse it will boost the boot up time. */ set_system_clock_MHz(80); klogf("[Init Level 0]\n"); - for (initfn = &INIT_ROUTINES_FLASH_START; initfn < &INIT_ROUTINES_FLASH_STOP; - ++initfn) { + for (initfn = &INITS_START; initfn < &INITS_END; ++initfn) { while (initfn >= init_boundaries[initlevel] && initlevel < INIT_LEVEL_7) { ++initlevel; klogf("[Init Level %d]\n", initlevel); } - klogf("Calling (%p)\n", initfn); (*initfn)(); } } diff --git a/src/kern/main.c b/src/kern/main.c index 61e60c9..7c0b65d 100644 --- a/src/kern/main.c +++ b/src/kern/main.c @@ -35,7 +35,7 @@ volatile struct { signed int timetick; ws2812b_t* drv; uint8_t brightness; - uint8_t n_leds; + uint16_t n_leds; uint8_t off; uint8_t n_snow; uint8_t n_red; @@ -201,7 +201,8 @@ static void reset_state() memset((void*)&state, 0, sizeof(state)); state.drv = tmp; state.brightness = 255; - state.n_leds = 250; + state.n_leds = 300; + state.n_red = 100; state.off = 8; state.timetick = 10; state.power = 1; @@ -211,52 +212,60 @@ static void reset_state() /* Main function. This gets executed from the interrupt vector defined above. */ int main() { - klogf("Entering Main (%p).\n", main); - - // systick_add_callback(on_systick, NULL); - // enable_systick(10000); - // configure_gpio(); - - // ir_begin_listen(); - // enable_ir_control(); - - // add_ir_code_callback(RC_HIGH, printit, "RC_HIGH"); - // add_ir_code_callback(RC_TEMP_UP, timetick_up, NULL); - // add_ir_code_callback(RC_DRY, set_red, NULL); - // add_ir_code_callback(RC_LOW, printit, "RC_LOW"); - // add_ir_code_callback(RC_TEMP_DOWN, timetick_down, NULL); - // add_ir_code_callback(RC_COOL, toggle_cool, NULL); - // add_ir_code_callback(RC_CONTINUOUS, set_snow, "RC_CONTINUOUS"); - // add_ir_code_callback(RC_FAN, toggle_brightness, NULL); - // add_ir_code_callback(RC_SLEEP, toggle_sleep, NULL); - // add_ir_code_callback(RC_UNITS, printit, "RC_UNITS"); - // add_ir_code_callback(RC_TIMER, reset_state, NULL); - // add_ir_code_callback(RC_POWER, toggle_power, NULL); - - // int ec; - // state.drv = ws2812b_new(SPI_SELECT_SPI1, &ec); - - // if (ec || !state.drv) { - // panic("Unable to create WS2812b driver :( (%d)\n", ec); - // } - - // reset_state(); - - // for (int i = 0; i < state.n_leds; ++i) { - // /* Clear the LED strip. */ - // disable_all_interrupts(); - // ws2812b_write_rgb_sync(state.drv, 0, 0, 0); - // enable_all_interrupts(); - // } - // ws2812b_latch(state.drv); - - // for (;;) { - // // while (!do_redraw) - // // ; - // // do_redraw = 0; - // if (!state.sleep) redraw(); - // } - for (;;); + klogf("Entering Main\n"); + + gpio_reserved_pin_t pin3 = get_sysled(); + + systick_add_callback(on_systick, NULL); + enable_systick(10000); + configure_gpio(); + + ir_begin_listen(); + enable_ir_control(); + + add_ir_code_callback(RC_HIGH, printit, "RC_HIGH"); + add_ir_code_callback(RC_TEMP_UP, timetick_up, NULL); + add_ir_code_callback(RC_DRY, set_red, NULL); + add_ir_code_callback(RC_LOW, printit, "RC_LOW"); + add_ir_code_callback(RC_TEMP_DOWN, timetick_down, NULL); + add_ir_code_callback(RC_COOL, toggle_cool, NULL); + add_ir_code_callback(RC_CONTINUOUS, set_snow, "RC_CONTINUOUS"); + add_ir_code_callback(RC_FAN, toggle_brightness, NULL); + add_ir_code_callback(RC_SLEEP, toggle_sleep, NULL); + add_ir_code_callback(RC_UNITS, printit, "RC_UNITS"); + add_ir_code_callback(RC_TIMER, reset_state, NULL); + add_ir_code_callback(RC_POWER, toggle_power, NULL); + + int ec; + state.drv = ws2812b_new(SPI_SELECT_SPI1, &ec); + + if (ec || !state.drv) { + panic("Unable to create WS2812b driver :( (%d)\n", ec); + } + + reset_state(); + + for (int i = 0; i < state.n_leds; ++i) { + /* Clear the LED strip. */ + disable_all_interrupts(); + ws2812b_write_rgb_sync(state.drv, 0, 0, 0); + enable_all_interrupts(); + } + ws2812b_latch(state.drv); + + for (int i = 0; ; ++ i) { + if (i % 64 == 0) { + set_gpio_pin_high(pin3); + } + // while (!do_redraw) + // ; + // do_redraw = 0; + if (!state.sleep) redraw(); + + if (i % 64 == 0) { + set_gpio_pin_low(pin3); + } + } } #endif |