aboutsummaryrefslogtreecommitdiffstats
path: root/picosoc
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-08-14 13:49:08 +0200
committerClifford Wolf <clifford@clifford.at>2018-08-14 13:49:08 +0200
commitb3f292a9881f19b465f2a20306e6a9d062432176 (patch)
treef4a602614322fb23eaa20a5c74003b1628dfb0d4 /picosoc
parentce9d92939a1ca8ce2bf5a05aa060c671b4726b71 (diff)
downloadpicorv32-b3f292a9881f19b465f2a20306e6a9d062432176.tar.gz
picorv32-b3f292a9881f19b465f2a20306e6a9d062432176.zip
Improve picosoc demo firmware, picosoc firmware build fixes
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'picosoc')
-rw-r--r--picosoc/Makefile4
-rw-r--r--picosoc/firmware.c22
-rw-r--r--picosoc/start.s52
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