aboutsummaryrefslogtreecommitdiff
path: root/VexRiscv/src/main/c/murax/xipBootloader
diff options
context:
space:
mode:
Diffstat (limited to 'VexRiscv/src/main/c/murax/xipBootloader')
-rw-r--r--VexRiscv/src/main/c/murax/xipBootloader/.gitignore5
-rw-r--r--VexRiscv/src/main/c/murax/xipBootloader/crt.S74
-rw-r--r--VexRiscv/src/main/c/murax/xipBootloader/demo.S27
-rw-r--r--VexRiscv/src/main/c/murax/xipBootloader/makefile37
-rw-r--r--VexRiscv/src/main/c/murax/xipBootloader/mapping.ld96
-rw-r--r--VexRiscv/src/main/c/murax/xipBootloader/mapping_rom.ld96
-rw-r--r--VexRiscv/src/main/c/murax/xipBootloader/mapping_xip.ld96
7 files changed, 431 insertions, 0 deletions
diff --git a/VexRiscv/src/main/c/murax/xipBootloader/.gitignore b/VexRiscv/src/main/c/murax/xipBootloader/.gitignore
new file mode 100644
index 0000000..2b33f1e
--- /dev/null
+++ b/VexRiscv/src/main/c/murax/xipBootloader/.gitignore
@@ -0,0 +1,5 @@
+*.elf
+*.map
+*.d
+*.asm
+*.o \ No newline at end of file
diff --git a/VexRiscv/src/main/c/murax/xipBootloader/crt.S b/VexRiscv/src/main/c/murax/xipBootloader/crt.S
new file mode 100644
index 0000000..5268767
--- /dev/null
+++ b/VexRiscv/src/main/c/murax/xipBootloader/crt.S
@@ -0,0 +1,74 @@
+#define CTRL_BASE 0xF001F000
+#define XIP_BASE 0xE0040000
+#define CTRL_DATA 0x00
+#define CTRL_STATUS 0x04
+#define CTRL_MODE 0x08
+#define CTRL_RATE 0x20
+#define CTRL_SS_SETUP 0x24
+#define CTRL_SS_HOLD 0x28
+#define CTRL_SS_DISABLE 0x2C
+
+#define CTRL_XIP_CONFIG 0x40
+#define CTRL_XIP_MODE 0x44
+
+.global crtStart
+.global main
+
+#define CTRL x31
+
+crtStart:
+ li x31, CTRL_BASE
+ sw x0, CTRL_MODE(CTRL)
+ li t0, 2
+ sw t0, CTRL_RATE(CTRL)
+ li t0, 4
+ sw t0, CTRL_SS_SETUP(CTRL)
+ sw t0, CTRL_SS_HOLD(CTRL)
+ sw t0, CTRL_SS_DISABLE(CTRL)
+
+
+ li a0, 0x880
+ call spiWrite
+ li a0, 0x181
+ call spiWrite
+ li a0, 0x183
+ call spiWrite
+ li a0, 0x800
+ call spiWrite
+
+
+ li t0, 0x00FF010B
+ sw t0, CTRL_XIP_MODE(CTRL)
+ li t0, 0x1
+ sw t0, CTRL_XIP_CONFIG(CTRL)
+ li t0, XIP_BASE
+ lw t1, (t0)
+ li t2, 0xFFFFFFFF
+ xor t3,t1,t2
+ beqz t3,retry
+ //if we are here we have read a value from flash which is not all ones
+ lw t2, (t0)
+ xor t3,t1,t2
+ bnez t3,retry
+ lw t2, (t0)
+ xor t3,t1,t2
+ bnez t3,retry
+ //if we are here we have read the same value 3 times, so flash seems good, lets's jump
+ jr t0
+
+retry:
+ li a0, 0x800
+ call spiWrite
+ li t1,100000
+loop:
+ addi t1,t1,-1
+ bnez t1, loop
+ j crtStart
+
+spiWrite:
+ sw a0,CTRL_DATA(CTRL)
+spiWrite_wait:
+ lw t0,CTRL_STATUS(CTRL)
+ slli t0,t0,0x10
+ beqz t0,spiWrite_wait
+ ret
diff --git a/VexRiscv/src/main/c/murax/xipBootloader/demo.S b/VexRiscv/src/main/c/murax/xipBootloader/demo.S
new file mode 100644
index 0000000..064db6f
--- /dev/null
+++ b/VexRiscv/src/main/c/murax/xipBootloader/demo.S
@@ -0,0 +1,27 @@
+#define GPIO_BASE 0xF0000000
+#define GPIO_OUTPUT 4
+#define GPIO_OUTPUT_ENABLE 8
+
+
+.global crtStart
+
+crtStart:
+
+ li x31, 0x12340000 // magic word expected by bootloader
+
+ li x31, GPIO_BASE
+ li t0, 0x000000FF
+ sw t0, GPIO_OUTPUT_ENABLE(x31)
+
+ li t0,1
+redo:
+ sw t0, GPIO_OUTPUT(x31)
+ li t1,10000
+ slli t0,t0,1
+ andi t0,t0,0xFF
+ bnez t0, loop
+ li t0,1
+loop:
+ addi t1,t1,-1
+ bnez t1, loop
+ j redo
diff --git a/VexRiscv/src/main/c/murax/xipBootloader/makefile b/VexRiscv/src/main/c/murax/xipBootloader/makefile
new file mode 100644
index 0000000..e08c17b
--- /dev/null
+++ b/VexRiscv/src/main/c/murax/xipBootloader/makefile
@@ -0,0 +1,37 @@
+CFLAGS= -march=rv32i -mabi=ilp32 -g -O3 -MD
+LFLAGS= -nostdlib -mcmodel=medany -nostartfiles -ffreestanding -fPIC -fPIE
+
+
+all: crt.S demo.S
+ riscv64-unknown-elf-gcc -c $(CFLAGS) -o crt.o crt.S
+ riscv64-unknown-elf-gcc $(CFLAGS) -o crt.elf crt.o $(LFLAGS) -Wl,-Bstatic,-T,mapping_rom.ld,-Map,crt.map,--print-memory-usage
+ riscv64-unknown-elf-objdump -S -d crt.elf > crt.asm
+ riscv64-unknown-elf-objcopy -O binary crt.elf crt.bin
+
+ riscv64-unknown-elf-gcc $(CFLAGS) -o crt_ram.elf crt.o $(LFLAGS) -Wl,-Bstatic,-T,mapping.ld,-Map,crt_ram.map,--print-memory-usage
+ riscv64-unknown-elf-objdump -S -d crt_ram.elf > crt_ram.asm
+ riscv64-unknown-elf-objcopy -O binary crt_ram.elf crt_ram.bin
+
+ riscv64-unknown-elf-gcc -c $(CFLAGS) -o demo.o demo.S
+ riscv64-unknown-elf-gcc $(CFLAGS) -o demo.elf demo.o $(LFLAGS) -Wl,-Bstatic,-T,mapping.ld,-Map,demo.map,--print-memory-usage
+ riscv64-unknown-elf-objdump -S -d demo.elf > demo.asm
+ riscv64-unknown-elf-objcopy -O binary demo.elf demo.bin
+
+ riscv64-unknown-elf-gcc $(CFLAGS) -o demo_rom.elf demo.o $(LFLAGS) -Wl,-Bstatic,-T,mapping_rom.ld,-Map,demo_rom.map,--print-memory-usage
+ riscv64-unknown-elf-objdump -S -d demo_rom.elf > demo_rom.asm
+ riscv64-unknown-elf-objcopy -O binary demo_rom.elf demo_rom.bin
+
+ riscv64-unknown-elf-gcc $(CFLAGS) -o demo_xip.elf demo.o $(LFLAGS) -Wl,-Bstatic,-T,mapping_xip.ld,-Map,demo_xip.map,--print-memory-usage
+ riscv64-unknown-elf-objdump -S -d demo_xip.elf > demo_xip.asm
+ riscv64-unknown-elf-objcopy -O binary demo_xip.elf demo_xip.bin
+
+clean-for-commit:
+ rm -f *.o
+ rm -f *.elf
+ rm -f *.asm
+ rm -f *.map
+ rm -f *.d
+ rm demo_rom.bin demo.bin crt_ram.bin
+
+clean: clean-for-commit
+ rm -f *.bin
diff --git a/VexRiscv/src/main/c/murax/xipBootloader/mapping.ld b/VexRiscv/src/main/c/murax/xipBootloader/mapping.ld
new file mode 100644
index 0000000..cc1b070
--- /dev/null
+++ b/VexRiscv/src/main/c/murax/xipBootloader/mapping.ld
@@ -0,0 +1,96 @@
+/*
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+*/
+OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
+OUTPUT_ARCH(riscv)
+ENTRY(crtStart)
+
+MEMORY {
+ mem : ORIGIN = 0x80000000, LENGTH = 0x00000400
+}
+
+_stack_size = DEFINED(_stack_size) ? _stack_size : 0;
+
+SECTIONS {
+
+ .vector : {
+ *crt.o(.text);
+ } > mem
+
+ .memory : {
+ *(.text);
+ end = .;
+ } > mem
+
+ .rodata :
+ {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ } > mem
+
+ .ctors :
+ {
+ . = ALIGN(4);
+ _ctors_start = .;
+ KEEP(*(.init_array*))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ . = ALIGN(4);
+ _ctors_end = .;
+ } > mem
+
+ .data :
+ {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ . = ALIGN(8);
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.*)
+ *(.gnu.linkonce.s.*)
+ . = ALIGN(8);
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ } > mem
+
+ .bss (NOLOAD) : {
+ . = ALIGN(4);
+ /* This is used by the startup in order to initialize the .bss secion */
+ _bss_start = .;
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _bss_end = .;
+ } > mem
+
+ .noinit (NOLOAD) : {
+ . = ALIGN(4);
+ *(.noinit .noinit.*)
+ . = ALIGN(4);
+ } > mem
+
+ ._stack (NOLOAD):
+ {
+ . = ALIGN(16);
+ PROVIDE (_stack_end = .);
+ . = . + _stack_size;
+ . = ALIGN(16);
+ PROVIDE (_stack_start = .);
+ } > mem
+
+}
+
diff --git a/VexRiscv/src/main/c/murax/xipBootloader/mapping_rom.ld b/VexRiscv/src/main/c/murax/xipBootloader/mapping_rom.ld
new file mode 100644
index 0000000..aaa0c3c
--- /dev/null
+++ b/VexRiscv/src/main/c/murax/xipBootloader/mapping_rom.ld
@@ -0,0 +1,96 @@
+/*
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+*/
+OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
+OUTPUT_ARCH(riscv)
+ENTRY(crtStart)
+
+MEMORY {
+ mem : ORIGIN = 0x80000000, LENGTH = 0x00000400
+ rom : ORIGIN = 0xF001E000, LENGTH = 0x00000400
+}
+
+_stack_size = DEFINED(_stack_size) ? _stack_size : 0;
+
+SECTIONS {
+
+ .vector : {
+ *crt.o(.text);
+ } > rom
+
+ .memory : {
+ *(.text);
+ end = .;
+ } > rom
+
+ .rodata :
+ {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ } > rom
+
+ .ctors :
+ {
+ . = ALIGN(4);
+ _ctors_start = .;
+ KEEP(*(.init_array*))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ . = ALIGN(4);
+ _ctors_end = .;
+ } > rom
+
+ .data :
+ {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ . = ALIGN(8);
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.*)
+ *(.gnu.linkonce.s.*)
+ . = ALIGN(8);
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ } > rom
+
+ .bss (NOLOAD) : {
+ . = ALIGN(4);
+ /* This is used by the startup in order to initialize the .bss secion */
+ _bss_start = .;
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _bss_end = .;
+ } > mem
+
+ .noinit (NOLOAD) : {
+ . = ALIGN(4);
+ *(.noinit .noinit.*)
+ . = ALIGN(4);
+ } > mem
+
+ ._stack (NOLOAD):
+ {
+ . = ALIGN(16);
+ PROVIDE (_stack_end = .);
+ . = . + _stack_size;
+ . = ALIGN(16);
+ PROVIDE (_stack_start = .);
+ } > mem
+
+}
diff --git a/VexRiscv/src/main/c/murax/xipBootloader/mapping_xip.ld b/VexRiscv/src/main/c/murax/xipBootloader/mapping_xip.ld
new file mode 100644
index 0000000..ed56400
--- /dev/null
+++ b/VexRiscv/src/main/c/murax/xipBootloader/mapping_xip.ld
@@ -0,0 +1,96 @@
+/*
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+*/
+OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
+OUTPUT_ARCH(riscv)
+ENTRY(crtStart)
+
+MEMORY {
+ mem : ORIGIN = 0x80000000, LENGTH = 0x00000400
+ xip : ORIGIN = 0xE0040000, LENGTH = 0x00000400
+}
+
+_stack_size = DEFINED(_stack_size) ? _stack_size : 0;
+
+SECTIONS {
+
+ .vector : {
+ *crt.o(.text);
+ } > xip
+
+ .memory : {
+ *(.text);
+ end = .;
+ } > xip
+
+ .rodata :
+ {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ } > xip
+
+ .ctors :
+ {
+ . = ALIGN(4);
+ _ctors_start = .;
+ KEEP(*(.init_array*))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ . = ALIGN(4);
+ _ctors_end = .;
+ } > xip
+
+ .data :
+ {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ . = ALIGN(8);
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.*)
+ *(.gnu.linkonce.s.*)
+ . = ALIGN(8);
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ } > xip
+
+ .bss (NOLOAD) : {
+ . = ALIGN(4);
+ /* This is used by the startup in order to initialize the .bss secion */
+ _bss_start = .;
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ . = ALIGN(4);
+ _bss_end = .;
+ } > mem
+
+ .noinit (NOLOAD) : {
+ . = ALIGN(4);
+ *(.noinit .noinit.*)
+ . = ALIGN(4);
+ } > mem
+
+ ._stack (NOLOAD):
+ {
+ . = ALIGN(16);
+ PROVIDE (_stack_end = .);
+ . = . + _stack_size;
+ . = ALIGN(16);
+ PROVIDE (_stack_start = .);
+ } > mem
+
+}