diff --git a/sept/sept-primary/Makefile b/sept/sept-primary/Makefile index 107b32f..96a0264 100644 --- a/sept/sept-primary/Makefile +++ b/sept/sept-primary/Makefile @@ -39,7 +39,7 @@ CFLAGS := \ -g \ - -O2 \ + -Os \ -fomit-frame-pointer \ -ffunction-sections \ -fdata-sections \ @@ -76,15 +76,14 @@ export TOPDIR := $(CURDIR) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ - $(AMS)/exosphere/rebootstub + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/$(BUILD) CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) rebootstub.bin +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C @@ -111,13 +110,10 @@ export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) -.PHONY: $(BUILD) clean all check_rebootstub +.PHONY: $(BUILD) clean all #--------------------------------------------------------------------------------- -all: check_rebootstub $(BUILD) - -check_rebootstub: - @$(MAKE) -C $(AMS)/exosphere/rebootstub all +all: $(BUILD) $(BUILD): @[ -d $@ ] || mkdir -p $@ @@ -126,7 +122,6 @@ #--------------------------------------------------------------------------------- clean: @echo clean ... - @$(MAKE) -C $(AMS)/exosphere/rebootstub clean @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf diff --git a/sept/sept-primary/linker.ld b/sept/sept-primary/linker.ld index 7d13516..56e9f66 100644 --- a/sept/sept-primary/linker.ld +++ b/sept/sept-primary/linker.ld @@ -12,7 +12,7 @@ MEMORY { NULL : ORIGIN = 0x00000000, LENGTH = 0x1000 - main : ORIGIN = 0x40010040, LENGTH = 0x1000 + main : ORIGIN = 0x40010000, LENGTH = 0x1000 high_iram : ORIGIN = 0x4003F000, LENGTH = 0x1000 low_iram : ORIGIN = 0x40003000, LENGTH = 0x8000 } @@ -20,7 +20,7 @@ SECTIONS { PROVIDE(__crt0_start__ = 0x4003F000); - PROVIDE(__main_start__ = 0x40010040); + PROVIDE(__main_start__ = 0x40010000); PROVIDE(__stack_top__ = 0x40010000); PROVIDE(__stack_bottom__ = 0x4000C000); PROVIDE(__heap_start__ = 0); diff --git a/sept/sept-primary/src/main.c b/sept/sept-primary/src/main.c index 5a55f44..62a5c15 100644 --- a/sept/sept-primary/src/main.c +++ b/sept/sept-primary/src/main.c @@ -190,7 +190,7 @@ int main(void) { /* Setup vectors */ setup_exception_vectors(); - + volatile tegra_pmc_t *pmc = pmc_get_regs(); volatile tegra_car_t *car = car_get_regs(); diff --git a/sept/sept-primary/src/start.s b/sept/sept-primary/src/start.s index 1c33568..cd0c9d8 100644 --- a/sept/sept-primary/src/start.s +++ b/sept/sept-primary/src/start.s @@ -93,6 +93,10 @@ .global jump_to_main .type jump_to_main, %function jump_to_main: + /* Insert 0x40 of NOPs, for version compatibility. */ +.rept 16 + nop +.endr /* Just jump to main */ ldr sp, =__stack_top__ b main diff --git a/sept/sept-primary/src/utils.c b/sept/sept-primary/src/utils.c index 04df56a..be59a2b 100644 --- a/sept/sept-primary/src/utils.c +++ b/sept/sept-primary/src/utils.c @@ -27,12 +27,6 @@ #include -#define u8 uint8_t -#define u32 uint32_t -#include "rebootstub_bin.h" -#undef u8 -#undef u32 - void wait(uint32_t microseconds) { uint32_t old_time = TIMERUS_CNTR_1US_0; while (TIMERUS_CNTR_1US_0 - old_time <= microseconds) { @@ -63,29 +57,12 @@ } } -__attribute__((noreturn)) void reboot_to_self(void) { - /* Patch SDRAM init to perform an SVC immediately after second write */ - APBDEV_PMC_SCRATCH45_0 = 0x2E38DFFF; - APBDEV_PMC_SCRATCH46_0 = 0x6001DC28; - /* Set SVC handler to jump to reboot stub in IRAM. */ - APBDEV_PMC_SCRATCH33_0 = 0x4003F000; - APBDEV_PMC_SCRATCH40_0 = 0x6000F208; - - /* Copy reboot stub into IRAM high. */ - for (size_t i = 0; i < rebootstub_bin_size; i += sizeof(uint32_t)) { - write32le((void *)0x4003F000, i, read32le(rebootstub_bin, i)); - } - - /* Trigger warm reboot. */ - pmc_reboot(1 << 0); -} - __attribute__((noreturn)) void wait_for_button_and_reboot(void) { uint32_t button; while (true) { button = btn_read(); if (button & BTN_POWER) { - reboot_to_self(); + pmc_reboot(2); } } } diff --git a/sept/sept-primary/src/utils.h b/sept/sept-primary/src/utils.h index 90133d3..4456376 100644 --- a/sept/sept-primary/src/utils.h +++ b/sept/sept-primary/src/utils.h @@ -121,7 +121,6 @@ __attribute__((noreturn)) void watchdog_reboot(void); __attribute__((noreturn)) void pmc_reboot(uint32_t scratch0); -__attribute__((noreturn)) void reboot_to_self(void); __attribute__((noreturn)) void wait_for_button_and_reboot(void); __attribute__((noreturn)) void generic_panic(void);