From b1eed8126e0e785e4ec7455a715b3e7b59d20e2a Mon Sep 17 00:00:00 2001 From: kaqu Date: Sat, 2 Jan 2021 14:39:36 +0100 Subject: [PATCH] Merged, yet not integrated ... --- .../__pycache__/dramtransfer.cpython-38.pyc | Bin 0 -> 5386 bytes libmodules/__pycache__/systime.cpython-38.pyc | Bin 0 -> 1646 bytes {modules => libmodules}/dramtransfer.py | 0 {modules => libmodules}/systime.py | 0 neopixelar.py | 20 ++++++++++++++---- software/include/dramtransfer.h | 2 +- software/ramcreate.sh | 13 +++++++----- software/source/illumination.c | 2 +- software/source/main.c | 16 +++++++++++--- 9 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 libmodules/__pycache__/dramtransfer.cpython-38.pyc create mode 100644 libmodules/__pycache__/systime.cpython-38.pyc rename {modules => libmodules}/dramtransfer.py (100%) rename {modules => libmodules}/systime.py (100%) diff --git a/libmodules/__pycache__/dramtransfer.cpython-38.pyc b/libmodules/__pycache__/dramtransfer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50195700deeb5886dded02406eac85f2b6e5cce6 GIT binary patch literal 5386 zcmZu#&2!tv6$d~Ngh=YsvizB3ZO69gNR({JiS21KmMuF~D$5yLai^H+&=7Vhg9ZV4 z0a_MEp3YS1(K9*sWFON*Z~Y5;>7nON2iKl->ZzSJX`24t0;DKA;9$A?zV^MhZ}+{$ zm&3zl4bSnRe>9$5)U?0TVDKqna1(F*2Q*ycdZ4Y-zY*wd!!dN~7lK0Dbj)_qDYh-g zYL}c++jeY)GlQXa*(tXxPDPFNprH7RLA5>X3@exwjI>9cQC<5?<0Wo?rEyz~2~(6s zWzTZP`4BIEr8yJg2(LUfANEk|BDbT8taK%fh;W2=55mLDwLyDg(Q-f$&g1>SZ&ntSjmU~m&}d=ib&9Gz>9 z!F8v=EpGDSSGr^J0<WVl_kz4 zyzuxj+xC+uY{QKOb2Au=nhd&b3Yt+0a5QDqX49nZ4fg3z+5C&e`Ru73h+YY~@41O! zfe1Gt@f{%>J1iDS;)k28vqef=TNNSZpAMshbz;Gp*O5|$Nw71clqVOtL9p%a#2|0G zFSaAeN#jdwk!|cGFn-$)0=9uUVHX5UD+>0f*KFa+?1rDz>IeGW^+O2TnPDPyHv;8c z3IkGSKr^UyN8vFItWRV|u<6T#a_)zoAnhNyfzLs;A-t$f3zn14u)AM;wginlH(+fQ zq0EnS4QCh^u9x`F$x#Dy9jLiZE>EN{o{Jg9L}b_RH=FPsW>bq5sS%r2%aX4gEoSYl z1)FE}I=g!La&3n79SUg+SC-wxRl?vsFA5Xa4^_ZrUdtjY7oXXoOv;V9nN43)B2}{z zZgrCQ2CWy%X3FC3TxQmdgK#67TNG*(ODvB;(wY`fg;|e%2o=EL6-v9-)ETv?spRSbZ`^*ov8w^=bHYm z!)f4iKiMJc-&wO6rd)F|+a?!#KF$Im7qzMac2FxfVZF%9IQDHEbZZ`tul_@jVZ68T z#wkw31Q~@JiOvi7$0_)#u&LubEWI*!wT1z#t*}G*FXz}wjx7LNRoG$tkI?zQY4Gt^ zCL~PcG$v?{D4I!rluzXnj^)^5U&3)E;RHX~mvAblu|Sh)czQs?_i}8hk9~gt`$3Mi zlOe9}>9C}X9#g$aA689v>(d$aC{Za6!oI;z z*LF$Xg`AssatcU$uk}90$Fm+}U4$&-4YIf5xd=?5^+Ag%4qNGhmRFByiVHgI>Q8CL zV(ScPq+}OcXBF4E)`$7{Jn6h=f{vtJP!^ox)0nH+*Kb-$Ij?LY%OROpk84khYVOR| zo@L~LQ~a#5`(lPCj$AKg#T&9Rn~nTH7MZU{-)JvO`P!B8m8Nx{26siRP!ZOh=e6G& zC$Ji71prYtl1>$V{;9EBYMtrRvRk0rGnDr$y!saQ(oK!mh~iC;qV^*c)k75QT?*pI z>{ZNKYSl1bVbf6BLvLu0SZbB>2&?vDh-;{0K3dyn*yih~o3cWod-Rg3sxIB2e0$4J zvdn?X%8dQ4NGm90Jn3)I@z~AIGL<3@C4s!?m^qXM4)PT-)Cy@C`AsB^09h`znpDcg zastZ85j0K#38MR6UzuwMx~QWUr9-Xz%YF(Zk$FZLEK=xjoH?jL4syqIuLxOWDA77? z!L!^)a_HIDNe3&d8@koL8dQK3QhnaBmscJx-CDh~+#OxTB$Pt3jKT?jIW65;%g|#z zH1}gFQh=A^WF?uJT3N-{{rHe2*|c*R2Z>gxH7gVk5$+EuHM5koU&Ua+W!K+w8D*>P zCx`g+T!!^RrG<<&STfcRQ94DHqoDj0>0Me`d$hE=vfMpEbq9-7YE$lYpSylQhJy4M zX;;h$%ZgB?wC>y?(FX|RQdMvwwhmD^Ced_1Is{zuk`8jNa-d4Jhp>+I;C9prlkS&? zz-v*RvgzHGyZ5nPRFlP7nvNsZbS0aP!eECrBgs&Ts=9WoBe$Yh#Baq1T@-MM7~Yn+ zSu{L%i%d?}0wnqy<#Nsj<>bht|Z41Yy$=PNks=7&rt%6`ZbgaM+!|Z$cc8LXleJ zFI@AiIO<4Gq(v1ikjG_O&qv>O@=g53(8w*V)H{*6{Nlt@rH2E{&zIEo>VKV0~%+Ft4 zbouN;Q+zzTxVY%fUgOsnW-outo7WdU5sQo0#2hYoE#W2cTytyFoeM>@<-ZVtE9Y_# z&T;9sll*??O5lwQRg6F-=StxqZ0Q{S1Etxx>N7^?mg){J$J z4&ILIJ-cyG(22jchFd?J5xQ;BXr$#vBl8&g)kfnP_Ii#fH4rXdqai;Bms+2JW`$r> zy&lIK)7G4MLL=FYW2e+OK~162&wMOB)|k@HvG(kwA{!G9GC! z3%mFPfe$NxNwj1L&@w?$-u#Hh;pf0(o=5lq^wjuTmm{#Pq9}D0!XLq{UbEi=1lwo~ zA&!vNCk)yyL^pwOmyf_jvD?P28-c09xn{`Q0Lx`G-LXTv{<+8DkDYjb3^@4420+Dq zYI!&(pT@PLX|e5ZiZDH*{_4#qJgE21=j^yX86fk#sK=34hr@)#r9Z^MQ}<#iDY|8m zntmpcHiqem!%Uk}-E-^MPm)RrN#7ZrDIy|;>s};9-OIn3$qFII`$$~SF>lBv)gAb9 zr!s_E0_6|+a{`axg58Myb|+9X4Xgzntdh2CYX2nL>7SC{V%oSkm-N$cwhfn8jj3O2 Jm+cP-_J16*kSG8E literal 0 HcmV?d00001 diff --git a/libmodules/__pycache__/systime.cpython-38.pyc b/libmodules/__pycache__/systime.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..343443ba4a06b73549c79b40a012f779a48be636 GIT binary patch literal 1646 zcmb^yO>Y}TbY{HXU9X)sDpZJ2p^+jX9N`aY(~k(Dh9FQ62@*~&%VD$G89U?bhdVP4 zb(C9rE#fE88~mlYatasjNVL4!b-<-UT$p6uzIpS$=6(5aZ7o2s$i{EcM;=1I*u&}q z8hQjVWZvk-kcvi?oyKcOlxh{4`-`q z8Be(J0sm6)l$8uSNy3$ClS=H1A~B7K~fuBblYG!sgRd_vViX`WFHazQC` zsKDXv65T9UMc(XEy2GY(r9oSfoYLdPQlZt7%%$YHrq(>w1wA@C9^Bonh+Lt~E_o@vHkyev6{>QI zekb&a$SDIKz;DHMrRVFp20N=^_#X^Fz!OgU{q6F5ENQ-|B8ZF2jR_sB>4RHR$1d)+jMZZ z^SRLUEKcVf>fBM{oSP=pULwUziy}YYD|1(+@xN2^dgQwOe!t57wS2o~0?8qJQ3{=9 z+_CL7C2xYCSI`VdS|DD1`$4_kkgg@zi4op0iKOEfW!{GzogT|clM62F-Hi>&VFJ|H?Ph;83%Bi4wwn?G0y0eAxqe$dJN7091 zM7<9H5f|UUU*Ox<}do8%%#?saoj4e=>#~F_z6GTyE z4DePIJ(PP%Q_sYN=jN^Q(;c6% zw5w)35pk-dooi+z6`DWosv_wM8)+C6IYgqHC@HNrS-0S?gh}5Dz5BY*M8>wFy5Oa3 nSa$nU0kgS`UFph-!!|Y2dTsnqs|SC!1}9||`w+A{c%A$Svgx&? literal 0 HcmV?d00001 diff --git a/modules/dramtransfer.py b/libmodules/dramtransfer.py similarity index 100% rename from modules/dramtransfer.py rename to libmodules/dramtransfer.py diff --git a/modules/systime.py b/libmodules/systime.py similarity index 100% rename from modules/systime.py rename to libmodules/systime.py diff --git a/neopixelar.py b/neopixelar.py index 3389ded..41a9e46 100755 --- a/neopixelar.py +++ b/neopixelar.py @@ -56,9 +56,11 @@ from litex.soc.integration.soc_core import * from litex.soc.integration.builder import * from litex.soc.interconnect.csr import AutoCSR, CSRStatus, CSRStorage, CSRField +from litex.soc.interconnect.stream import SyncFIFO from litedram.modules import M12L16161A, M12L64322A from litedram.phy import GENSDRPHY, HalfRateGENSDRPHY +from litedram.frontend.dma import LiteDRAMDMAReader, LiteDRAMDMAWriter from liteeth.phy.ecp5rgmii import LiteEthPHYRGMII @@ -67,8 +69,8 @@ from litex.build.generic_platform import * import litex.soc.doc as lxsocdoc # KQ's helper modules ... -from modules.systime import SysTime -from modules.dramtransfer import DRAMTransfer +from libmodules.systime import SysTime +from libmodules.dramtransfer import DRAMTransfer from neopixelengine import NeoPixelEngine @@ -387,9 +389,19 @@ class BaseSoC(SoCCore): self.submodules.systime = systime = SysTime(comparecount=0x0000EA90) self.add_csr("systime") + # DRAM test + MAXWORDS = 32 # Transfer length x 32-bit, FIFO depth + self.submodules.mm2s = mm2s = LiteDRAMDMAReader(self.sdram.crossbar.get_port(), fifo_depth=MAXWORDS, fifo_buffered=True) + mm2s.add_csr() + self.add_csr("mm2s") + self.submodules.sync_fifo = sync_fifo = SyncFIFO([("data", 32)], MAXWORDS, True) + self.comb += mm2s.source.connect(sync_fifo.sink) # Connect DMA-Reader.source -> FIFO.sink + self.submodules.dramtransfer = DRAMTransfer(maxwords=MAXWORDS, dma_reader=mm2s, sync_fifo=sync_fifo) + self.add_csr("dramtransfer") + # Adjust no. for your actual project ... - max_TABLES = 3 # 1..16 - max_LEDS_per_chain = 27 # 1..256 + max_TABLES = 2 # 1..16 + max_LEDS_per_chain = MAXWORDS # 1..256 self.submodules.npe = NeoPixelEngine(n_TABLES=max_TABLES, n_LEDs=max_LEDS_per_chain) self.add_csr("npe") for i in range(42,56+2): # Example: Do output on J4 (14) & J5 (2) diff --git a/software/include/dramtransfer.h b/software/include/dramtransfer.h index 177f7a5..02b8901 100644 --- a/software/include/dramtransfer.h +++ b/software/include/dramtransfer.h @@ -9,7 +9,7 @@ // 29.12.20/KQ Initial version // -#define FIFOSIZE 256 //128, 8 +#define FIFOSIZE 32 // 256 #define TIMEOUT 100 extern int load_FPGA(uint32_t iBaseAddress, int8_t bLen); extern int32_t retrieve_FPGA(int iOffset); diff --git a/software/ramcreate.sh b/software/ramcreate.sh index b8243c0..f804aec 100755 --- a/software/ramcreate.sh +++ b/software/ramcreate.sh @@ -20,10 +20,7 @@ echo "Creating $PROJECTNAME application ..." # Additional user libs, not project specific LIBSYSTIME="systime" LIBPRINTF="my_vsnprintf" - -# Additional user libs, not project specific -LIBSYSTIME="systime" -LIBPRINTF="my_vsnprintf" +LIBDRAMTRANSFER="dramtransfer" # Adjust these paths according to your local installation !!! MY_LOCAL_LITEX_PATH=$HOME"/fpga/litex" @@ -91,9 +88,15 @@ then echo "*** gcc for $LIBSYSTIME.c failed!" exit $? fi +$MY_LOCAL_LITEX_PATH/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc -c $COMMONFLAGS $CFLAGS -Wa,-fPIC source/$LIBDRAMTRANSFER.c -o build/$LIBDRAMTRANSFER.o +if [ $? -ne 0 ]; +then + echo "*** gcc for $LIBDRAMTRANSFER.c failed!" + exit $? +fi echo "Linking ..." -$MY_LOCAL_LITEX_PATH/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-ld $LDFLAGS -T linker/ram$3.ld -N $CRT0 $OBJECTS $LXR build/$2.o build/$1.o build/$LIBSYSTIME.o build/$LIBPRINTF.o lib/rv32ilibm.a lib/rv32ilibgcc.a -o build/$1.elf +$MY_LOCAL_LITEX_PATH/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-ld $LDFLAGS -T linker/ram$3.ld -N $CRT0 $OBJECTS $LXR build/$2.o build/$1.o build/$LIBSYSTIME.o build/$LIBPRINTF.o build/$LIBDRAMTRANSFER.o lib/rv32ilibm.a lib/rv32ilibgcc.a -o build/$1.elf if [ $? -ne 0 ]; then echo "*** Link/Loader for build/$1.elf failed!" diff --git a/software/source/illumination.c b/software/source/illumination.c index ec6b2d0..d98a539 100644 --- a/software/source/illumination.c +++ b/software/source/illumination.c @@ -105,7 +105,7 @@ int illumination(void) int32_t blue = 0x000004; int iTable; - printf("Illumination demo starting ...\n"); + printf("----- Illumination demo -----\n"); // Prepare first output iTable = 0; load_triple_LEDs(iTable, green, red, blue); // 1st load diff --git a/software/source/main.c b/software/source/main.c index 37b1a7a..3c9855c 100644 --- a/software/source/main.c +++ b/software/source/main.c @@ -42,6 +42,7 @@ #include #include "../include/systime.h" +#include "../include/dramtransfer.h" #include "../include/illumination.h" extern void busy_wait(unsigned int ms); // Worx! @@ -71,6 +72,8 @@ int main(int i, char **c) irq_setmask(0); irq_setie(1); #endif + setsystime(14, 30, 00); // Reset to defined value (14:30) ... + // Prepare first output int32_t green = 0x040201; int32_t red = 0x010402; @@ -107,9 +110,11 @@ int main(int i, char **c) printf("\e[1mExecuting within RAM ...\e[0m\n"); printf("Press [w] slower, [s] faster, [x] to exit demo!\n"); - while(1) + while(1) { + dramtest(); // Test ... if(illumination()) // The DEMO ! break; + } *statept = get_console(); // Make sure, we know what was going on ... #ifdef FLOAT_TEST @@ -130,8 +135,12 @@ int main(int i, char **c) float f3add = f1 + f2; printf1("1.5+3.5 => %8.5f\n", f3add); #endif - while(1) { - printf("\n%s", PROMPT); + int hh, mm, ss; + + while(1) { + getsystime(&hh, &mm, &ss); + printf("\n%02d:%02d:%02d %s", hh, mm, ss, PROMPT); + readline(buffer, CMD_LINE_BUFFER_SIZE); if (buffer[0] != 0) { printf("\n"); @@ -139,6 +148,7 @@ int main(int i, char **c) cmd = command_dispatcher(command, nb_params, params); if (!cmd) { printf("Command not found?! Executing illumination demo instead ...\n"); + dramtest(); // Test ... illumination(); // more DEMO ... } }