summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2026-05-25 14:01:06 -0500
committercheapie <no-email-for-you@example.com>2026-05-25 14:01:06 -0500
commit2ecf97e382b4aff25bb97ea730a0c36d08747998 (patch)
tree766ba234b73390a78cc3eae8ad3a2c09df7faead
parent6ecdb461c1a823f9c2ff007457ee9963d7e1f681 (diff)
downloadrvcontroller-2ecf97e382b4aff25bb97ea730a0c36d08747998.tar
rvcontroller-2ecf97e382b4aff25bb97ea730a0c36d08747998.tar.gz
rvcontroller-2ecf97e382b4aff25bb97ea730a0c36d08747998.tar.bz2
rvcontroller-2ecf97e382b4aff25bb97ea730a0c36d08747998.tar.xz
rvcontroller-2ecf97e382b4aff25bb97ea730a0c36d08747998.zip
Add big-endian railroad crossing sample and big-endian versions of libraries
-rw-r--r--c/rrxing-be/Makefile20
-rw-r--r--c/rrxing-be/rrxing.c86
-rwxr-xr-xc/rrxing-be/rrxing.elfbin0 -> 7304 bytes
-rw-r--r--c/rrxing-be/rrxing.hex71
-rw-r--r--c/rrxing-be/rrxing.obin0 -> 7340 bytes
-rw-r--r--c/rrxing-be/rvcontroller.ld45
-rw-r--r--c/rvcontroller-libraries/Makefile10
-rw-r--r--c/rvcontroller-libraries/rvcontroller-ecalls-be.obin0 -> 1292 bytes
-rw-r--r--c/rvcontroller-libraries/rvcontroller-init-be.S30
-rw-r--r--c/rvcontroller-libraries/rvcontroller-init-be.obin0 -> 928 bytes
-rwxr-xr-xcross-toolchain/activate-be.sh6
11 files changed, 266 insertions, 2 deletions
diff --git a/c/rrxing-be/Makefile b/c/rrxing-be/Makefile
new file mode 100644
index 0000000..f52b08f
--- /dev/null
+++ b/c/rrxing-be/Makefile
@@ -0,0 +1,20 @@
+all: rrxing.hex
+
+rrxing.o: rrxing.c
+ clang -target riscv32be-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-be.o ../rvcontroller-libraries/rvcontroller-ecalls-be.o rrxing.o
+ clang -target riscv32be-none-elf -T rvcontroller.ld -nostdlib -nostartfiles -Xlinker --no-warn-rwx-segments -o rrxing.elf ../rvcontroller-libraries/rvcontroller-init-be.o rrxing.o ../rvcontroller-libraries/rvcontroller-ecalls-be.o
+
+dump: rrxing.elf
+ riscv32be-none-elf-objdump -d rrxing.elf
+
+rrxing.hex: rrxing.elf
+ riscv32be-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-be/rrxing.c b/c/rrxing-be/rrxing.c
new file mode 100644
index 0000000..e867e8a
--- /dev/null
+++ b/c/rrxing-be/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-be/rrxing.elf b/c/rrxing-be/rrxing.elf
new file mode 100755
index 0000000..3accaa0
--- /dev/null
+++ b/c/rrxing-be/rrxing.elf
Binary files differ
diff --git a/c/rrxing-be/rrxing.hex b/c/rrxing-be/rrxing.hex
new file mode 100644
index 0000000..763551c
--- /dev/null
+++ b/c/rrxing-be/rrxing.hex
@@ -0,0 +1,71 @@
+:100000009302000273A00231370101006520A94864
+:100010007300000082801481988133E6E60009C6EF
+:1000200085050505E389E6FE13351600828052B882
+:100030002A84452C2A947524E36F85FE52BE4EB85F
+:1000400022F44AF0692435C113094006930450068E
+:10005000130440079309300619A0952C39C50145B2
+:10006000612C0808C1450A86C146BD24034501012B
+:10007000E31525FF03451101E31195FE0345210119
+:10008000E31D85FC03453101E31995FC034541015E
+:10009000E31535FD03455101E31185FC034561017D
+:1000A0004DFD0545227402794EBE0545B1242274EA
+:1000B00002794EBC4EB80111A2E4CAE052FC5AF8D3
+:1000C00062F46AF01305A033F5221304E0369305B9
+:1000D00040372285C52A930980379305D0374E854E
+:1000E000D5221305103893056038E92A0924930BAB
+:1000F0004006130C5006930D400713093006930C6D
+:100100000041130DC041930AF041130590385D2260
+:100110000545DD221305F038712A552A21C5014510
+:10012000E12A0808C1450A86C1467D22034501012E
+:10013000E31575FF03451101E31185FF0345210117
+:10014000E31DB5FD03453101E31985FD034541017B
+:10015000E31525FD03455101E311B5FD034561019B
+:100160004DFD21A00545492A4DBF1305003A9922AE
+:100170000145592222859305103CA9221305803C94
+:10018000152A852293042500A92AE36F95FE4E8542
+:100190009305703D052A1305A03D292A9922930451
+:1001A00025008122E36F95FE22859305403E192AA2
+:1001B0001305803E01223522930435001D22E36F92
+:1001C00095FE130510389305403FED281305903F29
+:1001D000D520012A930445002922E36F95FE4E8A1B
+:1001E0004E859305D037F92813055040E1200122B0
+:1001F000BD4909A8054509220145FD28FD1913F54A
+:10020000F90F3DC913FBF90F66856D205A857928D2
+:100210006A854D20F92093041500E120E36F95FED7
+:100220007D2069D90145C9280808C1450A86C1460B
+:10023000652003450101E31575FF03451101E31135
+:1002400085FF03452101E31DB5FD03453101E31998
+:1002500085FD03454101E31525FD03455101E311EA
+:10026000B5FD034561014DFD41285120568599207A
+:10027000E14913F5F90F59F51305404325281305F6
+:100280001038930560383D281305F0432520912848
+:1002900093042500B920E36F95FE2285930540372E
+:1002A0001520130590443920D28985B585487300FF
+:1002B000000082809148730000008280AD48730086
+:1002C0000000828093081008730000008280930869
+:1002D00050087300000082809308700873000000CB
+:1002E0008280732510C08280732500C082809308AD
+:1002F00060087300000082800589F32200809392D9
+:100300000248B3E2A2007390028082809548730095
+:100310000000828093080008730000008280A148DA
+:100320007300000082809308300873000000828010
+:10033000930840087300000082805261696C726FFC
+:1003400061642043726F7373696E670A666F72200F
+:100350005256436F6E74726F6C6C65720A496E69A7
+:100360007469616C697A696E672048570A006C6924
+:10037000676874004F46460062656C6C006F666685
+:1003800000676174650075700049646C650A004C13
+:10039000696768747765696768743A204F6E0A0008
+:1003A000547261696E2064657465637465640A4C97
+:1003B000696768747765696768743A204F66660A8A
+:1003C0000059454C4C4F57004C696768743A2059A6
+:1003D000656C6C6F770A006F6E0042656C6C3A203A
+:1003E0004F6E0A00524544004C696768743A2052C7
+:1003F00065640A00646F776E00476174653A204453
+:100400006F776E0A0042656C6C3A204F66660A0090
+:1004100054696D656F757420696E2000730A00540D
+:10042000696D6520726573657420627920747261EC
+:10043000696E0A0054696D6564206F75740A00471F
+:100440006174653A2055700A004C696768743A20F7
+:050450004F66660A0082
+:00000001FF
diff --git a/c/rrxing-be/rrxing.o b/c/rrxing-be/rrxing.o
new file mode 100644
index 0000000..02faef0
--- /dev/null
+++ b/c/rrxing-be/rrxing.o
Binary files differ
diff --git a/c/rrxing-be/rvcontroller.ld b/c/rrxing-be/rvcontroller.ld
new file mode 100644
index 0000000..985892b
--- /dev/null
+++ b/c/rrxing-be/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
+ }
diff --git a/c/rvcontroller-libraries/Makefile b/c/rvcontroller-libraries/Makefile
index eca2a8c..bd8752d 100644
--- a/c/rvcontroller-libraries/Makefile
+++ b/c/rvcontroller-libraries/Makefile
@@ -1,10 +1,16 @@
-all: rvcontroller-init.o rvcontroller-ecalls.o
+all: rvcontroller-init.o rvcontroller-init-be.o rvcontroller-ecalls.o rvcontroller-ecalls-be.o
rvcontroller-init.o: rvcontroller-init.S
riscv32-none-elf-as -march=rv32imcb_zicsr_zbkx -o rvcontroller-init.o rvcontroller-init.S
+rvcontroller-init-be.o: rvcontroller-init-be.S
+ riscv32be-none-elf-as -march=rv32imcb_zicsr_zbkx -o rvcontroller-init-be.o rvcontroller-init-be.S
+
rvcontroller-ecalls.o: rvcontroller-ecalls.S
riscv32-none-elf-as -march=rv32imcb_zicsr_zbkx -o rvcontroller-ecalls.o rvcontroller-ecalls.S
+rvcontroller-ecalls-be.o: rvcontroller-ecalls.S
+ riscv32be-none-elf-as -march=rv32imcb_zicsr_zbkx -o rvcontroller-ecalls-be.o rvcontroller-ecalls.S
+
clean:
- rm -f rvcontroller-init.o rvcontroller-ecalls.o
+ rm -f rvcontroller-init.o rvcontroller-init-be.o rvcontroller-ecalls.o rvcontroller-ecalls-be.o
diff --git a/c/rvcontroller-libraries/rvcontroller-ecalls-be.o b/c/rvcontroller-libraries/rvcontroller-ecalls-be.o
new file mode 100644
index 0000000..92d830e
--- /dev/null
+++ b/c/rvcontroller-libraries/rvcontroller-ecalls-be.o
Binary files differ
diff --git a/c/rvcontroller-libraries/rvcontroller-init-be.S b/c/rvcontroller-libraries/rvcontroller-init-be.S
new file mode 100644
index 0000000..86389c7
--- /dev/null
+++ b/c/rvcontroller-libraries/rvcontroller-init-be.S
@@ -0,0 +1,30 @@
+#Assembly stub for C programs targeting RVController - Big-endian Flavor
+#A product of Advanced Mesecons Devices, a Cheapie Systems company
+#This is free and unencumbered software released into the public domain.
+#See http://unlicense.org/ for more information
+
+#This file should always be linked first.
+#RVController has a default reset vector of 0,
+#therefore _start should end up as the first thing in the file.
+
+.section .text.startup
+_start:
+
+# Switch to big-endian mode (little-endian is default after reset)
+li t0,0x20 # MBE
+csrrs x0,0x310,t0 # 0x310 = mstatush
+
+# Set up stack pointer
+li sp,0x10000
+
+# Call main function
+call main
+
+# Exit program
+li a7,10
+ecall
+
+# Shouldn't ever get here, will crash if it does
+ret
+
+.globl _start
diff --git a/c/rvcontroller-libraries/rvcontroller-init-be.o b/c/rvcontroller-libraries/rvcontroller-init-be.o
new file mode 100644
index 0000000..b0b782b
--- /dev/null
+++ b/c/rvcontroller-libraries/rvcontroller-init-be.o
Binary files differ
diff --git a/cross-toolchain/activate-be.sh b/cross-toolchain/activate-be.sh
new file mode 100755
index 0000000..1e300fe
--- /dev/null
+++ b/cross-toolchain/activate-be.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+export PREFIX="/home/cheapie/rvcontroller/cross-toolchain/install" # Edit this for your system!
+export TARGET=riscv32be-none-elf
+export PATH="$PREFIX/bin:$PATH"
+export PS1="(cross-be) $PS1"
+export CC=clang