From b3f292a9881f19b465f2a20306e6a9d062432176 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Tue, 14 Aug 2018 13:49:08 +0200 Subject: [PATCH] Improve picosoc demo firmware, picosoc firmware build fixes Signed-off-by: Clifford Wolf --- picosoc/Makefile | 4 ++-- picosoc/firmware.c | 22 ++++++++------------ picosoc/start.s | 52 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/picosoc/Makefile b/picosoc/Makefile index 3eacbcc..0faf167 100644 --- a/picosoc/Makefile +++ b/picosoc/Makefile @@ -39,10 +39,10 @@ firmware.elf: sections.lds start.s firmware.c riscv32-unknown-elf-gcc -march=rv32imc -Wl,-Bstatic,-T,sections.lds,--strip-debug -ffreestanding -nostdlib -o firmware.elf start.s firmware.c firmware.hex: firmware.elf - riscv32-unknown-elf-objcopy -O verilog firmware.elf > firmware.hex + riscv32-unknown-elf-objcopy -O verilog firmware.elf firmware.hex firmware.bin: firmware.elf - riscv32-unknown-elf-objcopy -O binary firmware.elf > firmware.bin + riscv32-unknown-elf-objcopy -O binary firmware.elf firmware.bin # ---- Testbench for SPI Flash Model ---- diff --git a/picosoc/firmware.c b/picosoc/firmware.c index 7e60932..6ff4d26 100644 --- a/picosoc/firmware.c +++ b/picosoc/firmware.c @@ -108,10 +108,11 @@ char getchar_prompt(char *prompt) uint32_t cycles_begin, cycles_now, cycles; __asm__ volatile ("rdcycle %0" : "=r"(cycles_begin)); + reg_leds = ~0; + if (prompt) print(prompt); - reg_leds = ~0; while (c == -1) { __asm__ volatile ("rdcycle %0" : "=r"(cycles_now)); cycles = cycles_now - cycles_begin; @@ -123,6 +124,7 @@ char getchar_prompt(char *prompt) } c = reg_uart_data; } + reg_leds = 0; return c; } @@ -340,22 +342,16 @@ void cmd_benchmark_all() // -------------------------------------------------------- -extern uint32_t _sidata, _sdata, _edata, _sbss, _ebss; - void main() -{ - // copy data section - for (uint32_t *src = &_sidata, *dest = &_sdata; dest < &_edata;) { - *dest++ = *src++; - } - // zero out .bss section - for (uint32_t *dest = &_sbss; dest < &_ebss;) { - *dest++ = 0; - } - +{ + reg_leds = 31; reg_uart_clkdiv = 104; + print("Booting..\n"); + + reg_leds = 63; set_flash_qspi_flag(); + reg_leds = 127; while (getchar_prompt("Press ENTER to continue..\n") != '\r') { /* wait */ } print("\n"); diff --git a/picosoc/start.s b/picosoc/start.s index 5e43feb..74c5635 100644 --- a/picosoc/start.s +++ b/picosoc/start.s @@ -35,11 +35,55 @@ addi x29, zero, 0 addi x30, zero, 0 addi x31, zero, 0 -# zero initialize scratchpad memory +# Update LEDs +li a0, 0x03000000 +li a1, 1 +sw a1, 0(a0) + +# zero initialize entire scratchpad memory +li a0, 0x00000000 setmemloop: -sw zero, 0(x1) -addi x1, x1, 4 -blt x1, sp, setmemloop +sw a0, 0(a0) +addi a0, a0, 4 +blt a0, sp, setmemloop + +# Update LEDs +li a0, 0x03000000 +li a1, 3 +sw a1, 0(a0) + +# copy data section +la a0, _sidata +la a1, _sdata +la a2, _edata +bge a1, a2, end_init_data +loop_init_data: +lw a3, 0(a0) +sw a3, 0(a1) +addi a0, a0, 4 +addi a1, a1, 4 +blt a1, a2, loop_init_data +end_init_data: + +# Update LEDs +li a0, 0x03000000 +li a1, 7 +sw a1, 0(a0) + +# zero-init bss section +la a0, _sbss +la a1, _ebss +bge a0, a1, end_init_bss +loop_init_bss: +sw zero, 0(a0) +addi a0, a0, 4 +blt a0, a1, loop_init_bss +end_init_bss: + +# Update LEDs +li a0, 0x03000000 +li a1, 15 +sw a1, 0(a0) # call main call main