summaryrefslogtreecommitdiff
path: root/c/inline
diff options
context:
space:
mode:
Diffstat (limited to 'c/inline')
-rw-r--r--c/inline/Makefile20
-rw-r--r--c/inline/inline.c25
-rw-r--r--c/inline/rvcontroller.ld45
3 files changed, 90 insertions, 0 deletions
diff --git a/c/inline/Makefile b/c/inline/Makefile
new file mode 100644
index 0000000..4a1fb6e
--- /dev/null
+++ b/c/inline/Makefile
@@ -0,0 +1,20 @@
+all: inline.hex
+
+inline.o: inline.c
+ clang -target riscv32-none-elf -I../rvcontroller-libraries -march=rv32imacb_zicntr_zicond_zicsr_zifencei_zihintpause_zilsd_zclsd_zabha_zacas_zbkb_zbkx_zcb_zcmp_zcmt -ffreestanding -O3 -c -o inline.o inline.c
+
+inline.elf: ../rvcontroller-libraries/rvcontroller-init.o ../rvcontroller-libraries/rvcontroller-ecalls.o inline.o
+ clang -target riscv32-none-elf -T rvcontroller.ld -nostdlib -nostartfiles -Xlinker --no-warn-rwx-segments -o inline.elf ../rvcontroller-libraries/rvcontroller-init.o inline.o ../rvcontroller-libraries/rvcontroller-ecalls.o
+
+dump: inline.elf
+ riscv32-none-elf-objdump -d inline.elf
+
+inline.hex: inline.elf
+ riscv32-none-elf-objcopy -O ihex inline.elf inline.hex
+
+load: inline.hex
+ bash -c "wl-copy < inline.hex"
+
+clean:
+ rm -f inline.hex inline.elf inline.o init.o
+
diff --git a/c/inline/inline.c b/c/inline/inline.c
new file mode 100644
index 0000000..c8db8e3
--- /dev/null
+++ b/c/inline/inline.c
@@ -0,0 +1,25 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include "rvcontroller-ecalls.h"
+
+volatile char thischar;
+
+volatile uint32_t nonblocking_read() {
+ volatile uint32_t ret;
+ asm(
+ "li a7,132 \n\
+ ecall \n\
+ mv %0,a0 \n"
+ : "=r" (ret)
+ :
+ : "a0"
+ );
+ return ret;
+}
+
+void main() {
+ while (true) {
+ thischar = nonblocking_read();
+ //printint(thischar);
+ }
+}
diff --git a/c/inline/rvcontroller.ld b/c/inline/rvcontroller.ld
new file mode 100644
index 0000000..985892b
--- /dev/null
+++ b/c/inline/rvcontroller.ld
@@ -0,0 +1,45 @@
+/* Thanks https://github.com/darklife/darkriscv */
+ __heap_size = 0x200; /* required amount of heap */
+ __stack_size = 0x800; /* required amount of stack */
+ ENTRY(_start);
+ MEMORY
+ {
+ RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 0x10000
+ }
+ SECTIONS
+ {
+ .text :
+ {
+ *(.text.startup)
+ *(.text)
+ *(.text)
+ *(.rodata*)
+ } > RAM
+ .data :
+ {
+ *(.sbss)
+ *(.data)
+ *(.bss)
+ *(.rela*)
+ *(COMMON)
+ } > RAM
+
+ .heap :
+ {
+ . = ALIGN(4);
+ PROVIDE ( end = . );
+ _sheap = .;
+ . = . + __heap_size;
+ . = ALIGN(4);
+ _eheap = .;
+ } >RAM
+
+ .stack :
+ {
+ . = ALIGN(4);
+ _estack = .;
+ . = . + __stack_size;
+ . = ALIGN(4);
+ _sstack = .;
+ } >RAM
+ }