From 0f42c6e0d72fb31fd28d1226305a901b94376fa0 Mon Sep 17 00:00:00 2001 From: Polprzewodnikowy Date: Sun, 18 Sep 2022 20:48:10 +0200 Subject: [PATCH] bootloader improvements --- sw/bootloader/Makefile | 2 +- sw/bootloader/N64.ld | 22 +++++++++++------ sw/bootloader/assets/assets.S | 1 + sw/bootloader/assets/assets.h | 2 +- sw/bootloader/assets/exception_background.png | Bin 6760 -> 0 bytes .../assets/sc64_logo_640_240_dimmed.png | Bin 0 -> 42691 bytes sw/bootloader/src/boot.c | 9 ++----- sw/bootloader/src/display.c | 20 +++++++-------- sw/bootloader/src/exception.c | 23 +++++++++--------- sw/bootloader/src/sc64.c | 4 +-- sw/bootloader/src/sc64.h | 2 +- 11 files changed, 42 insertions(+), 43 deletions(-) delete mode 100644 sw/bootloader/assets/exception_background.png create mode 100644 sw/bootloader/assets/sc64_logo_640_240_dimmed.png diff --git a/sw/bootloader/Makefile b/sw/bootloader/Makefile index ef6c45a..53c761f 100644 --- a/sw/bootloader/Makefile +++ b/sw/bootloader/Makefile @@ -40,7 +40,7 @@ SRC_FILES = \ fatfs/ffunicode.c ASSET_FILES = \ - exception_background.png + sc64_logo_640_240_dimmed.png SRCS = $(SRC_FILES) $(ASSET_FILES) SRC_OBJS = $(patsubst %,%.o,$(SRC_FILES)) diff --git a/sw/bootloader/N64.ld b/sw/bootloader/N64.ld index ecf6f26..1707375 100644 --- a/sw/bootloader/N64.ld +++ b/sw/bootloader/N64.ld @@ -1,6 +1,7 @@ MEMORY { - rdram (rwx) : org = 0x80300000, len = 1M - flash (r) : org = 0xB0000000, len = 1028k + framebuffer (rw) : org = 0x8026A000, len = 600k + ram (rwx) : org = 0x80300000, len = 1M + rom (r) : org = 0xB0000000, len = 1028k } ENTRY(entry_handler) @@ -9,23 +10,28 @@ __exception_stack_size = 8k; __stack_size = 16k; SECTIONS { - .flash : { + .boot : { KEEP(*(.text.rom_header)); KEEP(*(.text.ipl3)); - } > flash + } > rom + + .framebuffer (NOLOAD) : SUBALIGN(64) { + *(.framebuffer .framebuffer.*) + } > framebuffer .text : SUBALIGN(4) { *(.text.entry_handler) *(.text .text.* .gnu.linkonce.t.*) + *(.assets .assets.*) *(.rodata .rodata.* .gnu.linkonce.r.*) *(.data .data.* .gnu.linkonce.d.*) _gp = . + 0x8000; *(.sdata .sdata.* .gnu.linkonce.s.*) *(.lit8 .lit4) - . = ALIGN(8); - } > rdram AT > flash + } > ram AT > rom .bss : { + . = ALIGN(8); _sbss = .; *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon .scommon.*) @@ -33,10 +39,10 @@ SECTIONS { *(COMMON) . = ALIGN(8); _ebss = .; - } > rdram + } > ram _sheap = .; - . = ORIGIN(rdram) + LENGTH(rdram) - __exception_stack_size - __stack_size; + . = ORIGIN(ram) + LENGTH(ram) - __exception_stack_size - __stack_size; _eheap = .; . += __exception_stack_size; diff --git a/sw/bootloader/assets/assets.S b/sw/bootloader/assets/assets.S index cb79f3b..8c43d78 100644 --- a/sw/bootloader/assets/assets.S +++ b/sw/bootloader/assets/assets.S @@ -1,3 +1,4 @@ +.section .assets.@sym@ .global assets_@sym@ assets_@sym@: .incbin "@file@" diff --git a/sw/bootloader/assets/assets.h b/sw/bootloader/assets/assets.h index 60952a6..3022de8 100644 --- a/sw/bootloader/assets/assets.h +++ b/sw/bootloader/assets/assets.h @@ -5,7 +5,7 @@ #include -extern const uint32_t assets_exception_background; +extern const uint32_t assets_sc64_logo_640_240_dimmed; #endif diff --git a/sw/bootloader/assets/exception_background.png b/sw/bootloader/assets/exception_background.png deleted file mode 100644 index 5d72cf9354f638e92f4eac6b529ca4562a1c4e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6760 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 EA2}ex!~g&Q literal 0 HcmV?d00001 diff --git a/sw/bootloader/src/boot.c b/sw/bootloader/src/boot.c index 30d33b2..1e7b0bb 100644 --- a/sw/bootloader/src/boot.c +++ b/sw/bootloader/src/boot.c @@ -66,14 +66,9 @@ bool boot_get_tv_type (boot_info_t *info) { bool boot_get_cic_seed_version (boot_info_t *info) { io32_t *base = boot_get_device_base(info); - uint32_t ipl3[1008]; + uint32_t ipl3[1008] __attribute__((aligned(8))); - io32_t *ipl3_src = &base[16]; - uint32_t *ipl3_dst = ipl3; - - for (int i = 0; i < sizeof(ipl3); i += sizeof(uint32_t)) { - *ipl3_dst++ = pi_io_read(ipl3_src++); - } + pi_dma_read(&base[16], ipl3, sizeof(ipl3)); uint32_t crc32 = crc32_calculate(ipl3, sizeof(ipl3)); diff --git a/sw/bootloader/src/display.c b/sw/bootloader/src/display.c index 7d1be8d..2288d58 100644 --- a/sw/bootloader/src/display.c +++ b/sw/bootloader/src/display.c @@ -6,15 +6,15 @@ #define SCREEN_WIDTH (640) #define SCREEN_HEIGHT (240) -#define BORDER_WIDTH (32) -#define BORDER_HEIGHT (16) +#define BORDER_WIDTH (64) +#define BORDER_HEIGHT (24) #define BACKGROUND_COLOR (0x00000000UL) #define TEXT_COLOR (0xFFFFFFFFUL) -#define LINE_HEIGHT (10) +#define LINE_SPACING (2) -static io32_t display_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(64))); +static io32_t display_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((section(".framebuffer"))); static int char_x; static int char_y; static const vi_regs_t vi_config[] = {{ @@ -63,13 +63,13 @@ static const vi_regs_t vi_config[] = {{ static void display_draw_character (char c) { if (c == '\n') { char_x = BORDER_WIDTH; - char_y += LINE_HEIGHT; + char_y += FONT_HEIGHT + LINE_SPACING; return; } if ((char_x + FONT_WIDTH) > (SCREEN_WIDTH - BORDER_WIDTH)) { char_x = BORDER_WIDTH; - char_y += LINE_HEIGHT; + char_y += FONT_HEIGHT + LINE_SPACING; } if ((c < ' ') || (c > '~')) { @@ -107,14 +107,12 @@ void display_init (uint32_t *background) { char_y = BORDER_HEIGHT; if (background == NULL) { - for (int i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i += 1) { + for (int i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i++) { io_write(&display_framebuffer[i], BACKGROUND_COLOR); } } else { - for (int i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i += 2) { - io_write(&display_framebuffer[i], *background); - io_write(&display_framebuffer[i + 1], *background); - background++; + for (int i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i++) { + io_write(&display_framebuffer[i], *background++); } } diff --git a/sw/bootloader/src/exception.c b/sw/bootloader/src/exception.c index ba9a03e..9c967ee 100644 --- a/sw/bootloader/src/exception.c +++ b/sw/bootloader/src/exception.c @@ -45,23 +45,22 @@ void exception_fatal_handler (uint32_t exception_code, uint32_t interrupt_mask, version_t *version = version_get(); uint32_t *instruction_address = (((uint32_t *) (e->epc.u32)) + ((e->cr & C0_CR_BD) ? 1 : 0)); - display_init((uint32_t *) (&assets_exception_background)); + display_init((uint32_t *) (&assets_sc64_logo_640_240_dimmed)); display_printf("branch: %s | tag: %s\n", version->git_branch, version->git_tag); display_printf("sha: %s\n", version->git_sha); display_printf("%s\n\n", version->git_message); - display_printf("%s\n\n", exception_get_description(exception_code)); - - display_printf("pc: 0x%08lX sr: 0x%08lX cr: 0x%08lX va: 0x%08lX\n", e->epc.u32, e->sr, e->cr, e->badvaddr.u32); - display_printf("zr: 0x%08lX at: 0x%08lX v0: 0x%08lX v1: 0x%08lX\n", e->zr.u32, e->at.u32, e->v0.u32, e->v1.u32); - display_printf("a0: 0x%08lX a1: 0x%08lX a2: 0x%08lX a3: 0x%08lX\n", e->a0.u32, e->a1.u32, e->a2.u32, e->a3.u32); - display_printf("t0: 0x%08lX t1: 0x%08lX t2: 0x%08lX t3: 0x%08lX\n", e->t0.u32, e->t1.u32, e->t2.u32, e->t3.u32); - display_printf("t4: 0x%08lX t5: 0x%08lX t6: 0x%08lX t7: 0x%08lX\n", e->t4.u32, e->t5.u32, e->t6.u32, e->t7.u32); - display_printf("s0: 0x%08lX s1: 0x%08lX s2: 0x%08lX s3: 0x%08lX\n", e->s0.u32, e->s1.u32, e->s2.u32, e->s3.u32); - display_printf("s4: 0x%08lX s5: 0x%08lX s6: 0x%08lX s7: 0x%08lX\n", e->s4.u32, e->s5.u32, e->s6.u32, e->s7.u32); - display_printf("t8: 0x%08lX t9: 0x%08lX k0: 0x%08lX k1: 0x%08lX\n", e->t8.u32, e->t9.u32, e->k0.u32, e->k1.u32); - display_printf("gp: 0x%08lX sp: 0x%08lX s8: 0x%08lX ra: 0x%08lX\n\n", e->gp.u32, e->sp.u32, e->s8.u32, e->ra.u32); + display_printf("%s\n", exception_get_description(exception_code)); + display_printf(" pc: 0x%08lX sr: 0x%08lX cr: 0x%08lX va: 0x%08lX\n", e->epc.u32, e->sr, e->cr, e->badvaddr.u32); + display_printf(" zr: 0x%08lX at: 0x%08lX v0: 0x%08lX v1: 0x%08lX\n", e->zr.u32, e->at.u32, e->v0.u32, e->v1.u32); + display_printf(" a0: 0x%08lX a1: 0x%08lX a2: 0x%08lX a3: 0x%08lX\n", e->a0.u32, e->a1.u32, e->a2.u32, e->a3.u32); + display_printf(" t0: 0x%08lX t1: 0x%08lX t2: 0x%08lX t3: 0x%08lX\n", e->t0.u32, e->t1.u32, e->t2.u32, e->t3.u32); + display_printf(" t4: 0x%08lX t5: 0x%08lX t6: 0x%08lX t7: 0x%08lX\n", e->t4.u32, e->t5.u32, e->t6.u32, e->t7.u32); + display_printf(" s0: 0x%08lX s1: 0x%08lX s2: 0x%08lX s3: 0x%08lX\n", e->s0.u32, e->s1.u32, e->s2.u32, e->s3.u32); + display_printf(" s4: 0x%08lX s5: 0x%08lX s6: 0x%08lX s7: 0x%08lX\n", e->s4.u32, e->s5.u32, e->s6.u32, e->s7.u32); + display_printf(" t8: 0x%08lX t9: 0x%08lX k0: 0x%08lX k1: 0x%08lX\n", e->t8.u32, e->t9.u32, e->k0.u32, e->k1.u32); + display_printf(" gp: 0x%08lX sp: 0x%08lX s8: 0x%08lX ra: 0x%08lX\n\n", e->gp.u32, e->sp.u32, e->s8.u32, e->ra.u32); if (exception_code == EXCEPTION_INTERRUPT) { if (interrupt_mask & INTERRUPT_MASK_TIMER) { diff --git a/sw/bootloader/src/sc64.c b/sw/bootloader/src/sc64.c index 3203c27..94bf232 100644 --- a/sw/bootloader/src/sc64.c +++ b/sw/bootloader/src/sc64.c @@ -201,8 +201,8 @@ bool sc64_sd_read_sectors (uint32_t *address, uint32_t sector, uint32_t count) { return sc64_execute_cmd(SC64_CMD_SD_READ, read_args, NULL); } -bool sc64_dd_set_sd_disk_info (uint32_t *address, uint32_t count) { - uint32_t args[2] = { (uint32_t) (address), count }; +bool sc64_dd_set_sd_disk_info (uint32_t *address, uint32_t length) { + uint32_t args[2] = { (uint32_t) (address), length }; if (sc64_execute_cmd(SC64_CMD_DD_SD_DISK_INFO, args, NULL)) { return true; } diff --git a/sw/bootloader/src/sc64.h b/sw/bootloader/src/sc64.h index 92c16e7..34b9971 100644 --- a/sw/bootloader/src/sc64.h +++ b/sw/bootloader/src/sc64.h @@ -111,7 +111,7 @@ bool sc64_sd_card_get_status (void); bool sc64_sd_card_get_info (uint32_t *address); bool sc64_sd_write_sectors (uint32_t *address, uint32_t sector, uint32_t count); bool sc64_sd_read_sectors (uint32_t *address, uint32_t sector, uint32_t count); -bool sc64_dd_set_sd_disk_info (uint32_t *address, uint32_t count); +bool sc64_dd_set_sd_disk_info (uint32_t *address, uint32_t length); #endif