aboutsummaryrefslogtreecommitdiff
path: root/VexRiscvSocSoftware/projects/murax/demo/src
diff options
context:
space:
mode:
Diffstat (limited to 'VexRiscvSocSoftware/projects/murax/demo/src')
-rwxr-xr-xVexRiscvSocSoftware/projects/murax/demo/src/crt.S97
-rwxr-xr-xVexRiscvSocSoftware/projects/murax/demo/src/main.c54
2 files changed, 151 insertions, 0 deletions
diff --git a/VexRiscvSocSoftware/projects/murax/demo/src/crt.S b/VexRiscvSocSoftware/projects/murax/demo/src/crt.S
new file mode 100755
index 0000000..0a98a6e
--- /dev/null
+++ b/VexRiscvSocSoftware/projects/murax/demo/src/crt.S
@@ -0,0 +1,97 @@
+.global crtStart
+.global main
+.global irqCallback
+
+crtStart:
+ j crtInit
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+
+.global trap_entry
+trap_entry:
+ sw x1, - 1*4(sp)
+ sw x5, - 2*4(sp)
+ sw x6, - 3*4(sp)
+ sw x7, - 4*4(sp)
+ sw x10, - 5*4(sp)
+ sw x11, - 6*4(sp)
+ sw x12, - 7*4(sp)
+ sw x13, - 8*4(sp)
+ sw x14, - 9*4(sp)
+ sw x15, -10*4(sp)
+ sw x16, -11*4(sp)
+ sw x17, -12*4(sp)
+ sw x28, -13*4(sp)
+ sw x29, -14*4(sp)
+ sw x30, -15*4(sp)
+ sw x31, -16*4(sp)
+ addi sp,sp,-16*4
+ call irqCallback
+ lw x1 , 15*4(sp)
+ lw x5, 14*4(sp)
+ lw x6, 13*4(sp)
+ lw x7, 12*4(sp)
+ lw x10, 11*4(sp)
+ lw x11, 10*4(sp)
+ lw x12, 9*4(sp)
+ lw x13, 8*4(sp)
+ lw x14, 7*4(sp)
+ lw x15, 6*4(sp)
+ lw x16, 5*4(sp)
+ lw x17, 4*4(sp)
+ lw x28, 3*4(sp)
+ lw x29, 2*4(sp)
+ lw x30, 1*4(sp)
+ lw x31, 0*4(sp)
+ addi sp,sp,16*4
+ mret
+ .text
+
+
+crtInit:
+ .option push
+ .option norelax
+ la gp, __global_pointer$
+ .option pop
+ la sp, _stack_start
+
+bss_init:
+ la a0, _bss_start
+ la a1, _bss_end
+bss_loop:
+ beq a0,a1,bss_done
+ sw zero,0(a0)
+ add a0,a0,4
+ j bss_loop
+bss_done:
+
+ctors_init:
+ la a0, _ctors_start
+ addi sp,sp,-4
+ctors_loop:
+ la a1, _ctors_end
+ beq a0,a1,ctors_done
+ lw a3,0(a0)
+ add a0,a0,4
+ sw a0,0(sp)
+ jalr a3
+ lw a0,0(sp)
+ j ctors_loop
+ctors_done:
+ addi sp,sp,4
+
+
+ li a0, 0x880 //880 enable timer + external interrupts
+ csrw mie,a0
+ li a0, 0x1808 //1808 enable interrupts
+ csrw mstatus,a0
+
+ call main
+infinitLoop:
+ j infinitLoop
+
diff --git a/VexRiscvSocSoftware/projects/murax/demo/src/main.c b/VexRiscvSocSoftware/projects/murax/demo/src/main.c
new file mode 100755
index 0000000..9f62ab3
--- /dev/null
+++ b/VexRiscvSocSoftware/projects/murax/demo/src/main.c
@@ -0,0 +1,54 @@
+#include <stdint.h>
+
+#include <murax.h>
+
+
+void main() {
+ volatile uint32_t a = 1, b = 2, c = 3;
+ uint32_t result = 0;
+ char msg[] = "Lieber Franz! Wir wünschen Dir eine gute Zeit!";
+ uint32_t msgidx = 0;
+
+ interruptCtrl_init(TIMER_INTERRUPT);
+ prescaler_init(TIMER_PRESCALER);
+ timer_init(TIMER_A);
+
+ TIMER_PRESCALER->LIMIT = 50000-1; //1 ms rate
+
+ TIMER_A->LIMIT = 1000-1; //1 second rate
+ TIMER_A->CLEARS_TICKS = 0x00010002;
+
+ TIMER_INTERRUPT->PENDINGS = 0xF;
+ TIMER_INTERRUPT->MASKS = 0x1;
+
+ GPIO_A->OUTPUT_ENABLE = 0x000000FF;
+ GPIO_A->OUTPUT = 0x00000000;
+
+ UART->STATUS = 2; //Enable RX interrupts
+ UART->DATA = 'A';
+
+ while(1){
+ result += a;
+ result += b + c;
+ for(uint32_t idx = 0;idx < 200000;idx++) asm volatile("");
+ if (msgidx == sizeof(msg)-1)
+ msgidx = 0;
+ else
+ msgidx++;
+ UART->DATA = msg[msgidx];
+ GPIO_A->OUTPUT = (GPIO_A->OUTPUT & ~0x3F) | ((GPIO_A->OUTPUT + 1) & 0x3F); //Counter on LED[5:0]
+ }
+}
+
+void irqCallback(){
+ if(TIMER_INTERRUPT->PENDINGS & 1){ //Timer A interrupt
+ GPIO_A->OUTPUT ^= 0x80; //Toogle led 7
+ TIMER_INTERRUPT->PENDINGS = 1;
+ }
+ while(UART->STATUS & (1 << 9)){ //UART RX interrupt
+ UART->DATA = (UART->DATA) & 0xFF;
+ }
+}
+
+
+