diff options
| author | cheapie <no-email-for-you@example.com> | 2026-05-25 14:01:06 -0500 |
|---|---|---|
| committer | cheapie <no-email-for-you@example.com> | 2026-05-25 14:01:06 -0500 |
| commit | 2ecf97e382b4aff25bb97ea730a0c36d08747998 (patch) | |
| tree | 766ba234b73390a78cc3eae8ad3a2c09df7faead /c/rrxing-be | |
| parent | 6ecdb461c1a823f9c2ff007457ee9963d7e1f681 (diff) | |
| download | rvcontroller-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
Diffstat (limited to 'c/rrxing-be')
| -rw-r--r-- | c/rrxing-be/Makefile | 20 | ||||
| -rw-r--r-- | c/rrxing-be/rrxing.c | 86 | ||||
| -rwxr-xr-x | c/rrxing-be/rrxing.elf | bin | 0 -> 7304 bytes | |||
| -rw-r--r-- | c/rrxing-be/rrxing.hex | 71 | ||||
| -rw-r--r-- | c/rrxing-be/rrxing.o | bin | 0 -> 7340 bytes | |||
| -rw-r--r-- | c/rrxing-be/rvcontroller.ld | 45 |
6 files changed, 222 insertions, 0 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 Binary files differnew file mode 100755 index 0000000..3accaa0 --- /dev/null +++ b/c/rrxing-be/rrxing.elf 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 Binary files differnew file mode 100644 index 0000000..02faef0 --- /dev/null +++ b/c/rrxing-be/rrxing.o 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 + } |
