From 2ecf97e382b4aff25bb97ea730a0c36d08747998 Mon Sep 17 00:00:00 2001 From: cheapie Date: Mon, 25 May 2026 14:01:06 -0500 Subject: Add big-endian railroad crossing sample and big-endian versions of libraries --- c/rrxing-be/Makefile | 20 +++++++++++ c/rrxing-be/rrxing.c | 86 ++++++++++++++++++++++++++++++++++++++++++++ c/rrxing-be/rrxing.elf | Bin 0 -> 7304 bytes c/rrxing-be/rrxing.hex | 71 ++++++++++++++++++++++++++++++++++++ c/rrxing-be/rrxing.o | Bin 0 -> 7340 bytes c/rrxing-be/rvcontroller.ld | 45 +++++++++++++++++++++++ 6 files changed, 222 insertions(+) create mode 100644 c/rrxing-be/Makefile create mode 100644 c/rrxing-be/rrxing.c create mode 100755 c/rrxing-be/rrxing.elf create mode 100644 c/rrxing-be/rrxing.hex create mode 100644 c/rrxing-be/rrxing.o create mode 100644 c/rrxing-be/rvcontroller.ld (limited to 'c/rrxing-be') 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 +#include +#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 Binary files /dev/null and b/c/rrxing-be/rrxing.elf 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 Binary files /dev/null and b/c/rrxing-be/rrxing.o 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 + } -- cgit v1.2.3