summaryrefslogtreecommitdiff
path: root/c/rrxing
diff options
context:
space:
mode:
Diffstat (limited to 'c/rrxing')
-rw-r--r--c/rrxing/Makefile20
-rw-r--r--c/rrxing/rrxing.c86
-rwxr-xr-xc/rrxing/rrxing.elfbin0 -> 7292 bytes
-rw-r--r--c/rrxing/rrxing.hex70
-rw-r--r--c/rrxing/rrxing.obin0 -> 7340 bytes
-rw-r--r--c/rrxing/rvcontroller.ld45
6 files changed, 221 insertions, 0 deletions
diff --git a/c/rrxing/Makefile b/c/rrxing/Makefile
new file mode 100644
index 0000000..1087a53
--- /dev/null
+++ b/c/rrxing/Makefile
@@ -0,0 +1,20 @@
+all: rrxing.hex
+
+rrxing.o: rrxing.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 rrxing.o rrxing.c
+
+rrxing.elf: ../rvcontroller-libraries/rvcontroller-init.o ../rvcontroller-libraries/rvcontroller-ecalls.o rrxing.o
+ riscv32-none-elf-ld -T rvcontroller.ld --no-warn-rwx-segments -o rrxing.elf ../rvcontroller-libraries/rvcontroller-init.o rrxing.o ../rvcontroller-libraries/rvcontroller-ecalls.o
+
+dump: rrxing.elf
+ riscv32-none-elf-objdump -d rrxing.elf
+
+rrxing.hex: rrxing.elf
+ riscv32-none-elf-objcopy -O ihex rrxing.elf rrxing.hex
+
+load: rrxing.hex
+ bash -c "wl-copy < rrxing.hex"
+
+clean:
+ rm -f rrxing.bin rrxing.elf rrxing.o init.o
+
diff --git a/c/rrxing/rrxing.c b/c/rrxing/rrxing.c
new file mode 100644
index 0000000..e867e8a
--- /dev/null
+++ b/c/rrxing/rrxing.c
@@ -0,0 +1,86 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include "rvcontroller-ecalls.h"
+
+bool streq(char *a, char *b) {
+ for (int i=0;a[i] != 0 || b[i] != 0;i++) {
+ if (a[i] != b[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void sleep(uint32_t delay) {
+ //This will start having problems after about 130 years
+ //of uptime, but that's probably acceptable
+ uint32_t endtime = rdtime() + delay;
+ while (rdtime() < endtime) {}
+ return;
+}
+
+bool checkdetector(void) {
+ char channelbuf[16];
+ char msgbuf[16];
+ while (digiline_bufferlevel() > 0) {
+ lightweight_mode(0);
+ digiline_receive(channelbuf,16,msgbuf,16);
+ if (streq(channelbuf,"detect")) {
+ return true;
+ }
+ }
+ lightweight_mode(1);
+ return false;
+}
+
+void main() {
+ printstr("Railroad Crossing\nfor RVController\nInitializing HW\n");
+ digiline_send("light","OFF");
+ digiline_send("bell","off");
+ digiline_send("gate","up");
+ digiline_clearbuffer();
+ while (true) {
+ printstr("Idle\n");
+ lightweight_mode(1);
+ printstr("Lightweight: On\n");
+ while (!checkdetector()) {}
+ printstr("Train detected\nLightweight: Off\n");
+ lightweight_mode(0);
+ digiline_send("light","YELLOW");
+ printstr("Light: Yellow\n");
+ sleep(2);
+ digiline_send("bell","on");
+ printstr("Bell: On\n");
+ sleep(2);
+ digiline_send("light","RED");
+ printstr("Light: Red\n");
+ sleep(3);
+ digiline_send("gate","down");
+ printstr("Gate: Down\n");
+ sleep(4);
+ digiline_send("bell","off");
+ printstr("Bell: Off\n");
+
+ digiline_clearbuffer();
+ for (uint8_t time = 15;time > 0;time--) {
+ printstr("Timeout in ");
+ printint(time);
+ printstr("s\n");
+ sleep(1);
+ bool train = checkdetector();
+ lightweight_mode(0); //checkdetector() turns this on
+ if (train) {
+ digiline_clearbuffer();
+ time = 25;
+ printstr("Time reset by train\n");
+ }
+ }
+ printstr("Timed out\n");
+
+ digiline_send("gate","up");
+ printstr("Gate: Up\n");
+ sleep(2);
+ digiline_send("light","OFF");
+ printstr("Light: Off\n");
+ }
+}
diff --git a/c/rrxing/rrxing.elf b/c/rrxing/rrxing.elf
new file mode 100755
index 0000000..fd70937
--- /dev/null
+++ b/c/rrxing/rrxing.elf
Binary files differ
diff --git a/c/rrxing/rrxing.hex b/c/rrxing/rrxing.hex
new file mode 100644
index 0000000..a6ac7d8
--- /dev/null
+++ b/c/rrxing/rrxing.hex
@@ -0,0 +1,70 @@
+:10000000370101006520A948730000008280148137
+:10001000988133E6E60009C685050505E389E6FE15
+:1000200013351600828052B82A84452C2A947524F0
+:10003000E36F85FE52BE4EB822F44AF0692435C102
+:100040001309400693045006130440079309300631
+:1000500019A0952C39C50145612C0808C1450A86AF
+:10006000C146BD2403450101E31525FF03451101E8
+:10007000E31195FE03452101E31D85FC0345310194
+:10008000E31995FC03454101E31535FD0345510195
+:10009000E31185FC034561014DFD0545227402799C
+:1000A0004EBE0545B124227402794EBC4EB80111F2
+:1000B000A2E4CAE052FC5AF862F46AF01305203355
+:1000C000F522130460369305C0362285C52A9309AC
+:1000D0000037930550374E85D52213059037930589
+:1000E000E037E92A0924930B4006130C5006930DC0
+:1000F000400713093006930C8040130D4041930ACA
+:100100007041130510385D220545DD221305703856
+:10011000712A552A21C50145E12A0808C1450A86E8
+:10012000C1467D2203450101E31575FF0345110119
+:10013000E31185FF03452101E31DB5FD03453101B1
+:10014000E31985FD03454101E31525FD03455101F3
+:10015000E311B5FD034561014DFD21A00545492A87
+:100160004DBF1305803999220145592222859305F7
+:10017000903BA9221305003C152A852293042500F3
+:10018000A92AE36F95FE4E859305F03C052A1305D9
+:10019000203D292A9922930425008122E36F95FEB0
+:1001A00022859305C03D192A1305003E0122352200
+:1001B000930435001D22E36F95FE130590379305D8
+:1001C000C03EED281305103FD520012A93044500B9
+:1001D0002922E36F95FE4E8A4E8593055037F92804
+:1001E0001305D03FE1200122BD4909A80545092298
+:1001F0000145FD28FD1913F5F90F3DC913FBF90F52
+:1002000066856D205A8579286A854D20F9209304EA
+:100210001500E120E36F95FE7D2069D90145C928CD
+:100220000808C1450A86C146652003450101E3155A
+:1002300075FF03451101E31185FF03452101E31D0E
+:10024000B5FD03453101E31985FD03454101E31582
+:1002500025FD03455101E311B5FD034561014DFD48
+:100260004128512056859920E14913F5F90F59F598
+:100270001305C0422528130590379305E0373D2824
+:10028000130570432520912893042500B920E36FBE
+:1002900095FE22859305C03615201305104439209C
+:1002A000D28985B58548730000008280914873002B
+:1002B00000008280AD48730000008280930810081F
+:1002C0007300000082809308500873000000828051
+:1002D00093087008730000008280732510C082802C
+:1002E000732500C08280930860087300000082803C
+:1002F0000589F322008093920248B3E2A200739032
+:100300000280828095487300000082809308000874
+:10031000730000008280A14873000000828093086F
+:1003200030087300000082809308400873000000CA
+:1003300082805261696C726F61642043726F737363
+:10034000696E670A666F72205256436F6E74726FE1
+:100350006C6C65720A496E697469616C697A696E60
+:10036000672048570A006C69676874004F4646006A
+:1003700062656C6C006F666600676174650075701D
+:100380000049646C650A004C696768747765696741
+:1003900068743A204F6E0A00547261696E20646579
+:1003A0007465637465640A4C696768747765696726
+:1003B00068743A204F66660A0059454C4C4F570006
+:1003C0004C696768743A2059656C6C6F770A006FE6
+:1003D0006E0042656C6C3A204F6E0A005245440034
+:1003E0004C696768743A205265640A00646F776EDE
+:1003F00000476174653A20446F776E0A0042656C6D
+:100400006C3A204F66660A0054696D656F757420FA
+:10041000696E2000730A0054696D6520726573650A
+:100420007420627920747261696E0A0054696D6586
+:1004300064206F75740A00476174653A2055700A2C
+:0D044000004C696768743A204F66660A0038
+:00000001FF
diff --git a/c/rrxing/rrxing.o b/c/rrxing/rrxing.o
new file mode 100644
index 0000000..3d0bd00
--- /dev/null
+++ b/c/rrxing/rrxing.o
Binary files differ
diff --git a/c/rrxing/rvcontroller.ld b/c/rrxing/rvcontroller.ld
new file mode 100644
index 0000000..985892b
--- /dev/null
+++ b/c/rrxing/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
+ }