From 0d3b04307d8afd961138ca6f9c80f6bf9eff4a1c Mon Sep 17 00:00:00 2001 From: Sean Cross Date: Mon, 21 Jul 2014 18:25:49 +0800 Subject: [PATCH] fernly: Move to new offset --- Makefile | 4 +-- fernvale.ld | 2 +- include/utils.h | 1 - main.c | 93 ++++++++++++++++++++++--------------------------- start.S | 2 +- utils.c | 8 +++++ vectors.c | 18 +++++----- 7 files changed, 61 insertions(+), 67 deletions(-) diff --git a/Makefile b/Makefile index 5ecf5f1..a270978 100644 --- a/Makefile +++ b/Makefile @@ -11,9 +11,7 @@ SRC_C = \ main.c \ vectors.c \ serial.c \ - utils.c \ - bionic.c \ - vsprintf.c + utils.c SRC_S = \ start.S diff --git a/fernvale.ld b/fernvale.ld index 9cbe0c5..4e19e77 100644 --- a/fernvale.ld +++ b/fernvale.ld @@ -39,7 +39,7 @@ SECTIONS { /* The OS entry point is here */ - . = 0x20000; /* bootloader will copy data to this address */ + . = 0x00002000; /* bootloader will copy data to this address */ .text : { _stext = ABSOLUTE(.); KEEP(*(vectors)) diff --git a/include/utils.h b/include/utils.h index 6d574a4..dd4a244 100644 --- a/include/utils.h +++ b/include/utils.h @@ -3,6 +3,5 @@ #include uint32_t _udiv64(uint64_t n, uint32_t d); -int printf(const char *fmt, ...); #endif /* __UTILS_H__ */ diff --git a/main.c b/main.c index a15a0a0..6fec951 100644 --- a/main.c +++ b/main.c @@ -51,102 +51,97 @@ static int list_registers(void) { int var; - printf("Registers:\n"); + serial_puts("Registers:\n"); - printf("CPSR: "); + serial_puts("CPSR: "); asm volatile ("mrs %0, cpsr":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("SPSR: "); + serial_puts("SPSR: "); asm volatile ("mrs %0, spsr":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R0: "); + serial_puts("R0: "); asm volatile ("mov %0, r0":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R1: "); + serial_puts("R1: "); asm volatile ("mov %0, r1":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R2: "); + serial_puts("R2: "); asm volatile ("mov %0, r2":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R3: "); + serial_puts("R3: "); asm volatile ("mov %0, r3":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R4: "); + serial_puts("R4: "); asm volatile ("mov %0, r4":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R5: "); + serial_puts("R5: "); asm volatile ("mov %0, r5":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R6: "); + serial_puts("R6: "); asm volatile ("mov %0, r6":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R7: "); + serial_puts("R7: "); asm volatile ("mov %0, r7":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R8: "); + serial_puts("R8: "); asm volatile ("mov %0, r8":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R9: "); + serial_puts("R9: "); asm volatile ("mov %0, r9":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R10: "); + serial_puts("R10: "); asm volatile ("mov %0, r10":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("FP: "); + serial_puts("FP: "); asm volatile ("mov %0, r11":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("IP: "); + serial_puts("IP: "); asm volatile ("mov %0, r12":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("SP: "); + serial_puts("SP: "); asm volatile ("mov %0, r13":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R14: "); + serial_puts("LR: "); asm volatile ("mov %0, r14":"=r" (var)); serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); - printf("R15: "); + serial_puts("PC: "); asm volatile ("mov %0, r15":"=r" (var)); serial_puth(var, 8); - printf("\n"); - - printf("LR: "); - asm volatile ("mov %0, lr":"=r" (var)); - serial_puth(var, 8); - printf("\n"); + serial_puts("\n"); return 0; } @@ -156,11 +151,11 @@ static int enable_irq(void) register int var; asm volatile ("mrs %0, cpsr":"=r" (var)); if (!(var & 0x80)) { - printf("Interrupts already enabled\n"); + serial_puts("Interrupts already enabled\n"); return -1; } -// printf("Interrupts were disabled. Re-enabling...\n"); +// serial_puts("Interrupts were disabled. Re-enabling...\n"); var &= ~0x80; var &= ~0x1f; var |= 0x10; @@ -174,11 +169,11 @@ static int enable_fiq(void) register int var; asm volatile ("mrs %0, cpsr":"=r" (var)); if (!(var & 0x40)) { - printf("FIQ already enabled\n"); + serial_puts("FIQ already enabled\n"); return -1; } -// printf("FIQ was disabled. Re-enabling...\n"); +// serial_puts("FIQ was disabled. Re-enabling...\n"); var &= ~0x40; asm volatile ("msr cpsr, %0":"=r" (var)); @@ -199,13 +194,9 @@ static int do_init(void) /* Disable WDT */ writel(0x2200, 0xa0030000); - printf("\n\nFernly shell\n"); + serial_puts("\n\nFernly shell\n"); /* Copy exception vectors to address 0 */ - printf("Copying vectors"); - printf(" Src: %p", rv_start); - printf(" Src end: %p", rv_end); - printf(" Size: %d\n", rv_end - rv_start); _memcpy((void *)0, rv_start, rv_end - rv_start); enable_irq(); enable_fiq(); diff --git a/start.S b/start.S index ad34384..c980e8a 100644 --- a/start.S +++ b/start.S @@ -23,7 +23,7 @@ clear_stack: # Copy 0x10000 bytes from =spi_offset to psram at 0x20000 copy_code_to_ram: - mov r0, #0x20000 + ldr r0, =0x00002000 // Source offset ldr r1, =0x10003460 // spi_offset mov r2, r1 mov r3, #0x10000 diff --git a/utils.c b/utils.c index 07d387b..09c089d 100644 --- a/utils.c +++ b/utils.c @@ -66,3 +66,11 @@ uint32_t _udiv64(uint64_t n, uint32_t d) { return __udiv64(n >> 32, n, d); } + +void _memcpy(void *dst0, void *_src, int length) +{ + uint8_t *ptr = dst0; + uint8_t *src = _src; + while(length--) + *ptr++ = *src++; +} diff --git a/vectors.c b/vectors.c index 5b1ac2c..356c2f6 100644 --- a/vectors.c +++ b/vectors.c @@ -3,44 +3,42 @@ void reset_handler(void) { extern int main(int argc, char **argv); - serial_putc('<'); - printf("Reset exception\n"); - serial_putc('>'); + serial_puts("Reset exception\n"); main(1, 0); return; } void undef_handler(void) { - printf("Undefined instruction exception\n"); + serial_puts("Undefined instruction exception\n"); return; } void swi_handler(void) { - printf("SWI exception\n"); + serial_puts("SWI exception\n"); return; } void prefetch_abort_handler(void) { - printf("Prefetch abort exception\n"); + serial_puts("Prefetch abort exception\n"); return; } void data_abort_handler(void) { - printf("Data abort exception\n"); + serial_puts("Data abort exception\n"); return; } void reserved_handler(void) { - printf("Handled some IRQ that shouldn't exist\n"); + serial_puts("Handled some IRQ that shouldn't exist\n"); return; } void irq_handler(void) { - printf("Handled IRQ\n"); + serial_puts("Handled IRQ\n"); return; } void fiq_handler(void) { - printf("Handled FIQ\n"); + serial_puts("Handled FIQ\n"); return; }