From 1dc60d18b5a2924c0378ac235fd424b15b6ade78 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 27 Oct 2022 11:58:56 +0300 Subject: [PATCH] USB @F042 receive/send in IRQ, circular buffers --- .../PL2303_ringbuffer/PL2303.bin | Bin 6576 -> 6784 bytes F0:F030,F042,F072/PL2303_ringbuffer/proto.c | 7 ++++- F0:F030,F042,F072/PL2303_ringbuffer/usb.c | 27 ++++++++++++------ .../PL2303_ringbuffer/version.inc | 2 +- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/F0:F030,F042,F072/PL2303_ringbuffer/PL2303.bin b/F0:F030,F042,F072/PL2303_ringbuffer/PL2303.bin index 2ccd7a8a944d2a728decdc5c37e3bb3710d003c2..f2ab21678bdb8572324d56a0a5232a5add4ecda7 100755 GIT binary patch delta 2654 zcmcImeQZ!1vYSi@caxgmlMq(+Gnpw0AIl5!}+`L)gc%7|5M3-8yVg= zSjU#^8@tGkCx6SDtM2EvxoZKkmvZ1W-_jJ$&l&^oEd{cl=B{T}AY?zzUCpe)mtv6p zNpg{)YU$20FfRcRdgu)%2#1N62c|AJfn@=Brzrwh+${TOjJ;A_BY;olt4(7sk!aD& z+3Q}A2hXF@{|mz}S)vV>;$QJq?2Bjveak`gOSZi-v{1_k_}EKC{V zt1CebrQpU1t(~~OI~|pLe|&atq&IpPD`LIClC?2b57`Y*ATXu|V~3FLsx5cCv2s}E zI*W&+;5mgBu?u^VExOQgDdF6QPaGeHOiBn@@GqTE`A|KItI#h+a3cmK@U&xzybjr+ z;@F<>O6Q)IWcT(ET;GwhL3MCdcTsf&mAsLIDVWoaXYmLYX>OUhUv;s%#jqP$HFx2A zDHbmU@ZD3pa0x;csP|HKd22Lbai2w2x58y#U0$&Z3(I@RmG#Kx7rhR?hiU{*VU_ShD+pK+9pct9<8-`b!*rKo(Xp^mM(6N{@yX( zamjfU_u+)!q`Wbit^4F6zv+=%A^~a5+xp1gCP0kf0m=i9`;pd#W{u5fbw`lRVbvCy z@BTwG#N7au_tgYX#e1m$#VF>FewS)>t(z4Pz|)HhqZ@IkB2_*X~!A9=lBuf zD1vO>;ZE>BRM(?dqPrfWY@{3%C>F8F#TNM`Lqeu)@j%!q@6B+vXP!~J|9`0cP3Xom zYOiGUk(%6vG-N-S&_@Eft!Z9Jjs{NeM|f#&_drIne=yiAEals<)tJi6)N z5FPy>y~HJe@t8j1&TYf*hERF8d2=3wYef#jZ{|UG6#tyh&r=9K$mi#+i1FZQ3`h&5 zkGjG8vRXZFU3XE?0UV4o0sMukPh)i)f^5E>iY_R5JS3>eplYe&mK(7sp7-9jOa;G7 zvA8=3KmqA1JhX;AvYs{`2LD`TMR+`|kNoFORvIqe1W*4Jm(ZeR|)>rg!Fbiow4`^ z6!2eF_@wB;_iRbodB5Gea zU=$#G=W$`gB@Jgl1UFybe9Udopcb?O5WD~h;kFS3Q;TijO3c(ewc(1Sk6hAi^!?(F zOy5f%%YiSj0IUE5;432&*62aBwlNI?(-o0gsuuK-xq2`@+d0=kWl@?iDC;Ai=n(i) zWx}?zr)ZjxA%Pp65-DsckJDYBNhzUV#uXbAb3!!@J_#DU{jX2^Idk)Ba&dh` z*Yz)Tor`_D7|dMd5Rp0gqD?O_lY}?vvnQFif6#uBwe#b>1O|S-uY$9%< zo>Xzwj3(dJavHSs9-{ZJhz!JAonWpdx=!oe<;iO$ZOof|u{21(YfBp|uI45<>Ij#7 zobzd2Pr{rp?H?%poE2NPbgzGR^Eck?7Pf49=S^YLW+C}jS<*1Cx?eB*mSM>jLUwhW g?oB>Fbby%=f15B%Rr~tU2xiZ&8~DiuE@_7U0O2GtV*mgE delta 2376 zcmcIme{2)?6@OpbNiL29c1VbEOmsdw)X6z(LXs-rfG#O~YvTOqLQvC?sux%%cLM2( zG}Wu78EB=A6^&+xCJ3nNBBqUPOetA3O{<03*xGGWx`Rn%{FpA)mfL74E|fVTjc@O3 z0z&HFJL&no@Avz@-}m0<^S*c9-!|Fe1~2e0RRTAP@&d}3rzQn#0Lu@vZ^45_=J5ZQ zRbLL$IF^nQX>8$r(yyK;+n)UX(*8g@Kz7#>gt=>m#_ZY!2w&46+qE=fK1(6HdFgNF z5M7sm>;`p%?a8fL6>t&&|4-E5fY=tamFcox2RPdxyh7u_86es51+uBBnTL9Xjmj6+ zp=;?^vNK^&(iwVj>WuAOl6sEz(XI3!G!r+bGyTVCRJMZW`ao!rpQb+L>E!E^PSK`; z2-;1e;6C!~05Gyf94Jk*jAxxK2eFqfTQNbtxo3)|2Q_dWe!HOjUQxI+CLl zB3Zqg0;YOm)}=W4Za;}`lsTnEhM+`ODc?0-Zm0(BO{0?@>WTRwm=Bzyl^eIx3*MV* zN%7j$cj6uL&>kySZ-Ee}M`;~^=+t$?sSts*l4uK_Ib3PA&fps&n213S=rlk8cpS5zE^JxPAphbg^n*eA2^ z{f?fcr|CO1o2GGZ;+{zYom&pmE!z-?x_FM2!aUk3l<%Zm=Jn-2LaMxf!2 z4uYUWyF28HWU~wn>vX6`o{c48)PI;hwe7O6zYc^$bd>&N@O$3lK2~WjCF{?OK;!3n zyL!H4RVpgm6x=IFNcg)Z+yAHK{h=@ISG#UJw*QI=*-YNby|Xkow-Hf>;3~yoGQ1gn zOv>X7!C0Ocn+mg{@~U|eugC`|7f|r(qKu%k^)KU?=(bcVW(wILVc$2=2cs(y1rVOTGY@JI;?igio?Lu-dAzYs! zTyZKO59HX3NbmSQ2&Xpd4_o>{Z-L0^PZUUIjZB(ID~M~g2L#_Obk$}ppwuS|b=FHd zh+fSZ7(|LY9#M>yo8$zDPiQp8JwileO(K4(IYpvZ!cCJQv^OWs2@v7M zx$Sg-dhzbvK+LxnLS{5^f(mmjF$3qlikJj(0GoAyW=v=Od-!6wqCM+>okn6L zdXhpQ5!uZRb+FQ`gRwbJ46?snfb5SK-0=)0 zQ4kmPb9eiXl*d#dNl(F>6xEsBBfYE~|7Wlh4*r&-Qyvog)~aJ>%0%1v4WAeusfP%-r+qyKCxb~MuKl}B6!hviC)fj^5_~U0_M`dAII9v=8!zGb>bxf| z383Okuu%ED9lO>xiP7V}Bs45&Ao!I3nx*j?O#F_<74)ZAWV7|L=|}W8l>v9W49d7~ zp}|sa1$B7E&pl6JL5wWE2}zSd3Qbk5{3!`A!kCwpvn=bjWihw&9^lwf7f>AP4YyU~ zK#!0*>rqK)>YEkslL5AT?0xdMr8~Bda62Wn(}!hopq~QuXM$jy?1En1BTEdxGm6{15);)cXJc diff --git a/F0:F030,F042,F072/PL2303_ringbuffer/proto.c b/F0:F030,F042,F072/PL2303_ringbuffer/proto.c index 2e70caf..62ae31f 100644 --- a/F0:F030,F042,F072/PL2303_ringbuffer/proto.c +++ b/F0:F030,F042,F072/PL2303_ringbuffer/proto.c @@ -23,6 +23,7 @@ extern uint32_t Tms; +// 250 symbols == 1000 bit const char *test = "123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789S123456789T123456789U123456789V123456789W123456789X123456789Y"; char *omit_spaces(const char *buf){ @@ -198,7 +199,11 @@ const char *parse_cmd(const char *buf){ u3 = Tms; for(int i = 0; i < 1000; ++i) USB_sendstr(test); add2buf("\n\nspd="); - add2buf(u2str(2000000000/(Tms - u3))); add2buf("\n"); // strlen == 2Mbit, speed in bits per second + // strlen == 2Mbit, speed in bits per second + add2buf(u2str(2000000000/(Tms - u3))); + add2buf("\ntransfer time is "); + add2buf(u2str(Tms - u3)); + add2buf("\n"); break; case 'U': add2buf("USB status: "); diff --git a/F0:F030,F042,F072/PL2303_ringbuffer/usb.c b/F0:F030,F042,F072/PL2303_ringbuffer/usb.c index e5ef3a1..bf03dd6 100644 --- a/F0:F030,F042,F072/PL2303_ringbuffer/usb.c +++ b/F0:F030,F042,F072/PL2303_ringbuffer/usb.c @@ -16,7 +16,15 @@ * along with this program. If not, see . */ -// USB read/write for text or binary data through ring-buffers (mean 5187476b/s) +// USB read/write for text or binary data through ring-buffers +/* + * mean speeds (bit/s) @ buffer size (bytes): + 5333333 @ 128 + 5249343 @ 256 + 5181347 @ 512 + 5277044 @ 2048 + 5434782 @ 4096 +*/ #include "ringbuffer.h" #include "usb.h" @@ -28,27 +36,26 @@ static uint8_t obuf[RBOUTSZ], ibuf[RBINSZ]; static ringbuffer out = {.data = obuf, .length = RBOUTSZ, .head = 0, .tail = 0}; static ringbuffer in = {.data = ibuf, .length = RBINSZ, .head = 0, .tail = 0}; // transmission is succesfull -static volatile uint8_t tx_succesfull = 1; +static volatile uint8_t bufisempty = 1; static volatile uint8_t bufovrfl = 0; static void send_next(){ - if(!tx_succesfull) return; + if(bufisempty) return; static int lastdsz = 0; int buflen = RB_read(&out, usbbuff, USB_TXBUFSZ); if(!buflen){ if(lastdsz == 64) EP_Write(3, NULL, 0); // send ZLP after 64 bits packet when nothing more to send lastdsz = 0; + bufisempty = 1; return; } - tx_succesfull = 0; EP_Write(3, usbbuff, buflen); lastdsz = buflen; } // send full content of ring buffer int USB_sendall(){ - while(RB_datalen(&out)){ - send_next(); + while(!bufisempty){ if(!usbON) return 0; } return 1; @@ -58,10 +65,13 @@ int USB_sendall(){ int USB_send(const uint8_t *buf, int len){ if(!buf || !usbON || !len) return 0; while(len){ - if(tx_succesfull) send_next(); int a = RB_write(&out, buf, len); len -= a; buf += a; + if(bufisempty){ + bufisempty = 0; + send_next(); + } } return 1; } @@ -119,10 +129,10 @@ static void EP1_Handler(){ // data IN/OUT handlers static void transmit_Handler(){ // EP3IN - tx_succesfull = 1; uint16_t epstatus = KEEP_DTOG_STAT(USB->EPnR[3]); // clear CTR keep DTOGs & STATs USB->EPnR[3] = (epstatus & ~(USB_EPnR_CTR_TX)); // clear TX ctr + send_next(); } static void receive_Handler(){ // EP2OUT @@ -153,6 +163,5 @@ void USB_proc(){ break; default: // USB_STATE_CONNECTED - send next data portion if(!usbON) return; - if(tx_succesfull) send_next(); } } diff --git a/F0:F030,F042,F072/PL2303_ringbuffer/version.inc b/F0:F030,F042,F072/PL2303_ringbuffer/version.inc index d4f59f2..21af120 100644 --- a/F0:F030,F042,F072/PL2303_ringbuffer/version.inc +++ b/F0:F030,F042,F072/PL2303_ringbuffer/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "111" +#define BUILD_NUMBER "120" #define BUILD_DATE "2022-10-27"