From 3c7687bb0e0577176d9495e55a2d2ba164ecacb4 Mon Sep 17 00:00:00 2001 From: eddyem Date: Wed, 26 Apr 2023 23:15:52 +0300 Subject: [PATCH] still have unknown problems --- F3:F303/Seven_CDCs/cmdproto.c | 23 ++++++--- F3:F303/Seven_CDCs/main.c | 36 +++++++++++--- F3:F303/Seven_CDCs/sevenCDCs.bin | Bin 7016 -> 7332 bytes F3:F303/Seven_CDCs/strfunc.c | 9 ++-- F3:F303/Seven_CDCs/strfunc.h | 2 +- F3:F303/Seven_CDCs/usb.c | 23 +++++---- F3:F303/Seven_CDCs/usb.h | 3 +- F3:F303/Seven_CDCs/usb_lib.c | 80 +++++++++++++------------------ F3:F303/Seven_CDCs/usb_lib.h | 2 + F3:F303/Seven_CDCs/usbhw.c | 4 +- F3:F303/Seven_CDCs/version.inc | 4 +- 11 files changed, 108 insertions(+), 78 deletions(-) diff --git a/F3:F303/Seven_CDCs/cmdproto.c b/F3:F303/Seven_CDCs/cmdproto.c index 72387cc..cf607fe 100644 --- a/F3:F303/Seven_CDCs/cmdproto.c +++ b/F3:F303/Seven_CDCs/cmdproto.c @@ -20,16 +20,17 @@ #include "debug.h" #include "strfunc.h" #include "usb.h" +#include "usb_lib.h" // USBON #include "version.inc" #define SEND(str) do{USB_sendstr(CMD_IDX, str);}while(0) #define SENDN(str) do{USB_sendstr(CMD_IDX, str); USB_putbyte(CMD_IDX, '\n');}while(0) extern volatile uint32_t Tms; -extern uint8_t usbON; const char* helpmsg = "https://github.com/eddyem/stm32samples/tree/master/F3:F303/PL2303 build#" BUILD_NUMBER " @ " BUILD_DATE "\n" + "2..7 - send next string to given EP\n" "'i' - print USB->ISTR state\n" "'N' - read number (dec, 0xhex, 0oct, bbin) and show it in decimal\n" "'R' - software reset\n" @@ -53,8 +54,7 @@ void parse_cmd(const char *buf){ break; case 'U': SEND("USB status: "); - if(usbON) SENDN("ON"); - else SENDN("OFF"); + SENDN(uhex2str(usbON)); break; case 'W': SENDN("Wait for reboot"); @@ -68,9 +68,20 @@ void parse_cmd(const char *buf){ } uint32_t Num = 0; const char *nxt; - switch(*buf){ // long messages + char cmd = *buf++; + if(cmd > '0'+CMD_EPNO && cmd <= '0'+DBG_EPNO){ // send data to iface + cmd -= '1'; + if(USBON(cmd)){ + SENDN("OK"); + USB_sendstr(cmd, buf); + USB_putbyte(cmd, '\n'); + }else{ + SENDN("Not connected"); + } + return; + } + switch(cmd){ // long messages case 'N': - ++buf; nxt = getnum(buf, &Num); if(buf == nxt){ if(Num == 0) SENDN("Wrong number"); @@ -84,7 +95,7 @@ void parse_cmd(const char *buf){ }else SEND("\n"); break; default: - SEND(buf); + SEND(buf-1); // echo return; } } diff --git a/F3:F303/Seven_CDCs/main.c b/F3:F303/Seven_CDCs/main.c index 3cf3ff1..9de99b7 100644 --- a/F3:F303/Seven_CDCs/main.c +++ b/F3:F303/Seven_CDCs/main.c @@ -19,6 +19,7 @@ #include "cmdproto.h" #include "debug.h" #include "hardware.h" +#include "strfunc.h" #include "usart.h" #include "usb.h" @@ -30,6 +31,9 @@ void sys_tick_handler(void){ ++Tms; } +static const char *ebufovr = "ERROR: USB buffer overflow or string was too long\n"; +static const char *idxnames[MAX_IDX] = {"CMD", "USART1", "USART2", "USART3", "NOFUNCT", "CAN", "DBG"}; + int main(void){ char inbuff[MAXSTRLEN+1]; USBPU_OFF(); @@ -49,14 +53,32 @@ int main(void){ if(Tms - ctr > 499){ ctr = Tms; pin_toggle(GPIOB, 1 << 1 | 1 << 0); // toggle LED @ PB0 - //DBG("blink\n"); + //DBGmesg(u2str(Tms)); + //DBGnl(); } - int l = USB_receivestr(CMD_IDX, inbuff, MAXSTRLEN); - if(l < 0) USB_sendstr(CMD_IDX, "ERROR: USB buffer overflow or string was too long\n"); - else if(l){ - parse_cmd(inbuff); + for(int i = 0; i < MAX_IDX; ++i){ + int l = USB_receivestr(i, inbuff, MAXSTRLEN); + if(l < 0){ + USB_sendstr(DBG_IDX, ebufovr); + if(i == CMD_IDX) USB_sendstr(CMD_IDX, ebufovr); + continue; + } + if(l == 0) continue; + USB_sendstr(DBG_IDX, idxnames[i]); + USB_sendstr(DBG_IDX, "> "); + USB_sendstr(DBG_IDX, inbuff); + USB_putbyte(DBG_IDX, '\n'); + USB_sendstr(CMD_IDX, idxnames[i]); + USB_sendstr(CMD_IDX, "> "); + USB_sendstr(CMD_IDX, inbuff); + USB_putbyte(CMD_IDX, '\n'); + switch(i){ + case CMD_IDX: + parse_cmd(inbuff); + break; + default: + break; + } } - l = USB_receivestr(DBG_IDX, inbuff, MAXSTRLEN); - if(l) USB_sendstr(DBG_IDX, inbuff); // just echo back all from USB-DBG interface } } diff --git a/F3:F303/Seven_CDCs/sevenCDCs.bin b/F3:F303/Seven_CDCs/sevenCDCs.bin index 202f361950c1cf9d396c3cdf7c14e61252037e03..a3b872e0f75f5eaa3fd13a54cdb29a22a7fb3fec 100755 GIT binary patch delta 3791 zcmb_eeQaCR6~EWdi9ZuNaoi?$+CJOS;XJn1n zhRM^=Y-mAYuo3!%)Y5%WK!QSHjza_;joNLD4WVf^h0zi|%nExcS*w@Ul|yXDJNMb` znE3<#*pq%f@BGfW=iYbjx#xO*5*ImD98cId58}Ip^1Ep`udpM7~i1# zzc%SN4ER?5YgFHMVg7IH`2X?yLt#!F#m$s+58*oh_ac<9yJ@v;*ZEK8DZ$#)v!RFS z$$ixQZHPv~J*mF-fl(x!N??ZQdsDZI{O%MD?8{m9j+D|wtW~L7qFtiBGs~D#g#Udq z9Y2|Nix#Ip)y9_kkT97Yyd~?ZPOXb>6#5|^yoVJ1oyai`@(^GW5RfDK zDZ(Q}2SL69mtj(IWGcgEF&WFde@q zjfA(Ck+3-_ra>TSsAJc8pcXuH#_8+Je$}}e&}-V*5rb3`bJWebC`gaa^~fNq$ct9C zVc7aN{fU#)xFLW2#Sa5!e1g=+M+syV=8*MT*v$4URSeWJ#4(gux1&;gdntiW5avWe zX(IBciCS?}k0&Zc`D?I~syYgGBJW9{^?!@t=hJcd%3HizEQCiAZ}3PfaRjc^Y=pg* zIFNJ=dR_tUPrIeJm0^S~qi8t>U5d7^Uk%j(7ywLn8N_~ zb~Uwx-^N>tL#V27?ujLI_Hop{jFW0XqdvW;&|E&RUbKro|K_EFMxv=wglRL3vEhbi zLwLh0PSrcu9Oac}gBO|my!b>Tq~ecX;uo**_yx`>3xCC;1=GxznxHT%pFyT{T*0-; zr*R9Hl2@AkwQ|V$Ma0U?^SGfF&Rse#OCNH63d|>bEodRGRWXxy5&E`s(#NZLlU4M{1xruPEB z9un9L2j^Lk>mg+lCZ9caXVa-Xu_@?CQ$W`vD2i!sEAb_VtoqWD3spM8GDgo#FeX1+ z?)xkxZ7C73v_6cgHip-*=a$f@>(dA9ir*z&q#&eb0(XjA%h4wbh6KIDU5;(atFiz-B|5w!c#@AJ5VW@hJ? z4x)->URJ^^@#su|D^ivDHP9~4hUgY8th*$P%>|1xtlEwiq}p`+mQ>d%1!M`?u7+h| zmPm%#^a77*Nl-frF>Yi6zVxjr`OG2amyDV<_}&RgT8bf}Jgg#B8pU=UY(A=5j-XTW zSqbwaW&k4nAicDON06vYpz2FPid#B#~I8d%PO zDZ;Mh-dAnF4buhce!N)@#cZEB7=+_Js*452dLm8Y8|t)%8{NA`p$MhjOBG!fOf3dn z)b+Ej^B(EKAza5DFEIMu5q%7Gwnu=GSXpY}0cy^pnxdH_treLlV+COgTjsO4i=bQ$ z-nFb@)G4SXhM}<-+S4~=$jrK16)pvfIco`Y_YJLvTzB=z?J zN}vcY7eQBt_cs7q*5K*!<=G@*g-sgvwsubxu!exQRXg)QuzNxU@3=w{Rl=MOi-AFK zNtx5}iz~R{vyg24wF{YjErp;`nB->=@ZJ(6=jIFBv7FnWc@BO*(u@_38=*^-A-TO2 z$vsA{Ps{j;FKnUfU~rsW>lyEC@)&#)!7qPTksm|bj!blZ(WMB6((&iuhQo9^zB4rn zO)(wck&>G?dqgIIs*&)Uz^WJ;L&C#>*A^w3)#29`O&S`0kp@~eoJ}ok{^gaU(UPfj z{F(F<(RBRu3h;i>@af7gqP=iN`hD2u5GDdQ2E4a&f3#EN=_bn7E&e$%N@{Lv7nh)h z+nX%l)SXp1=F8eF$z#GjK}#Hc2lf9K8B{dR?o zHi~Z1tXn9F&5~us)rK~ePv@Eosk|5YI?;pN~qk@*(G?uoQZFU+?G8>&T&LfF9MrDN0(5OnQZIaOq7z86)7y zF>SPh>7#pYej_unwymx$f2qEs(k|*jnZK54? zoxQHU+TKuIw^3PFQ?rS#rVkA78>06O`^M=5E2a~GO{i!>tU`=rnkej3%Oc4&{k(F8iKTY0A7HPYyn^b@F)OQk5D6a zpsmP(wj&43kM2FNXZPsHo|?V1wY{<4Ub%&CZFhlNmiK238^O@?RYR8FOn6s&&&>fD zzM&p?=Zzp)ZWD05=uzkd0{|-^0MG&isE;rp2$%%;0Cxfm)Ub!S(0PV(VM9pdyd{L&9VQl-i?~` ZavXB>=KLIcj@~TGv2#0(Iw@)2{{hUlj;;Uz delta 3501 zcmb_eeQZ+#V#cJe~}(wHTIY8V=a1?sG+624Tc zqIzD!P{s;kymn$`QYm99RQrf+!bsPMPLyfV{+K;FsUc{%0_o9)(g%1=h+pEJ`}|<4 znNDsM8A+ageB-zi&nm0tOw~EQx-zL{d zmS3^rTE^ga2G>gB+cL0Utc*2Enm1*QS2V=xB+ZDdc~NqfC8A3U{3@o*hh6U%)iGou zIMUx?QAJWoz9N!i*2(5_;v7XIp)8@I4?1)aqvUJ5$Py=zaCtrj-6C52*}*JJY1AN@ zJH*d<;-oWJCP}SwV1pRrizUr-vZhe{iZ7Hj4PuqFGBx5Sybt&7He}xi{2lhux&9&-!FobEVsywi(}==k?2&eglhwwGajh> zFRlgS;^=u*6#VJIp+f>TNe)X$r%*)dyz80gxZO$}+xW;S1_QQE!q&LDq!gWkg6w*n zfCUmIg&a~1yOKhi0e$~!6|>T%_qv6csmisrx5_0{49}Ug$oNigrcvLUoP8yUgr0dM z{4OCagn$=#<0yY0l$7^nTsN7sFeUhmoN_Z z-rRUoSVb4ndGr#%n8LN;VwPFvQ^s!TpJ~=Hp6w$O=YvMNhA!BMW>nhbY-E9?k@@Rr zwyV(h4})sums8m>4Wzhrvl$BdMUv+UlLF2hw3(@to}1Ls2_6T+%Y}pD#I)nXV@mqS zT&6Y;f`)^HG5203kpmHw5aH!_7dA~~F^28PazCQR)o;ct*Poo>2}&`hokUau_6Iwa zssxAc1=ZsR>7z8v@{a_w@rjEOR^1$7K`ZB@_Mn2^O?$z|Pm_=uuAfp*zRo?&F_dgr z$fRSzv3rDC@o7H9+#AGY40D#;2ErQd&GisV5p2A5d}M4b;~CJ!1B2~Rn>0dhbEJWr z$}_NQ7;@&vWZ7Zw0}W9&+%=#RwD}p4>WShw8gxeC*WD6T&Ky)M2i!0@?aK~Q^oiDr zl$XJ*2!)FrTFU4L972vl-!~XXJGScKqsz9BJ&r~OlB}10C&ISv!oN!IzPdyrIBO)JnnP2k#LE4 zJ&RzIexpU|12FywsDRP?y8J4OBBHS>q0H(BQyI8vhwzq_;==+C{XjLk)U~G`A9+S$K~w5U!uD|}IqO+?$a7Y0 zJAt@2wC}_3@`AxUn;xmVOOZMbXQW!soi3nR>|+QLcny+!4et4D|LAC895o~1Vt^Fb zjA>1a8stGFyctleE{asFE|07Z;$x$Q?3Bq1F zdU((=6Tt`P+Gbu}fm=}Q9iV!+>8zZlxXExfxrlA>3bn)efWN}h^@^|9Gu+PNbtUc& zgxoZZUhM7PN9`KiL+#nQV{mXEce(iO{Dwx#PSsj#>sDFoSJl>WKU?xo7CaziBkXX9 z>}Vsh@87$lXP|$_>K{_(c3XXY)mo~xrMsuSt)r#K>27Z8Xr*@T8GIF?Z{Zqh0oMgM zr@N!O)7_rJcXc;)x5)4`e4~W#XzpPhoh?nw{{%g2m7P8rywl(9-vD`6Q#*(D?%RMi z!8K6{bf*NVn}L4{{5;TGK>L8Yfz|_2Kzed7+KKj{e$-Eo*~i58wrqzl&+IO_63#lWk<0Jx#VL)9l}t`;kqR Z21t`_8EN)3*_N4RPm}FX*a0|X{{iWVF$Dks diff --git a/F3:F303/Seven_CDCs/strfunc.c b/F3:F303/Seven_CDCs/strfunc.c index d599669..69f10ea 100644 --- a/F3:F303/Seven_CDCs/strfunc.c +++ b/F3:F303/Seven_CDCs/strfunc.c @@ -19,13 +19,14 @@ #include #include #include +#include "usb.h" /** * @brief hexdump - dump hex array by 16 bytes in string - * @param sendfun - function to send data + * @param ifno - USB interface number * @param arr - array to dump * @param len - length of `arr` */ -void hexdump(int (*sendfun)(const char *s), uint8_t *arr, uint16_t len){ +void hexdump(int ifno, uint8_t *arr, uint16_t len){ char buf[52], *bptr = buf; for(uint16_t l = 0; l < len; ++l, ++arr){ for(int16_t j = 1; j > -1; --j){ @@ -36,14 +37,14 @@ void hexdump(int (*sendfun)(const char *s), uint8_t *arr, uint16_t len){ if(l % 16 == 15){ *bptr++ = '\n'; *bptr = 0; - sendfun(buf); + USB_sendstr(ifno, buf); bptr = buf; }else *bptr++ = ' '; } if(bptr != buf){ *bptr++ = '\n'; *bptr = 0; - sendfun(buf); + USB_sendstr(ifno, buf); } } diff --git a/F3:F303/Seven_CDCs/strfunc.h b/F3:F303/Seven_CDCs/strfunc.h index a63ac4b..fc61644 100644 --- a/F3:F303/Seven_CDCs/strfunc.h +++ b/F3:F303/Seven_CDCs/strfunc.h @@ -21,7 +21,7 @@ #include #include -void hexdump(int (*sendfun)(const char *s), uint8_t *arr, uint16_t len); +void hexdump(int ifno, uint8_t *arr, uint16_t len); const char *u2str(uint32_t val); const char *i2str(int32_t i); const char *uhex2str(uint32_t val); diff --git a/F3:F303/Seven_CDCs/usb.c b/F3:F303/Seven_CDCs/usb.c index 04edb91..b0feeb7 100644 --- a/F3:F303/Seven_CDCs/usb.c +++ b/F3:F303/Seven_CDCs/usb.c @@ -36,33 +36,38 @@ volatile uint8_t bufovrfl[WORK_EPs] = {0}; // here and later: ifNo is index of buffers, i.e. ifNo = epno-1 !!! void send_next(int ifNo){ if(bufisempty[ifNo]) return; - static int lastdsz = 0; + static uint8_t lastdsz[WORK_EPs] = {0}; int buflen = RB_read((ringbuffer*)&rbout[ifNo], (uint8_t*)usbbuff, USB_TRBUFSZ); if(!buflen){ - if(lastdsz == 64) EP_Write(ifNo+1, NULL, 0); // send ZLP after 64 bits packet when nothing more to send - lastdsz = 0; + if(lastdsz[ifNo] == 64) EP_Write(ifNo+1, NULL, 0); // send ZLP after 64 bits packet when nothing more to send + lastdsz[ifNo] = 0; bufisempty[ifNo] = 1; return; } EP_Write(ifNo+1, (uint8_t*)usbbuff, buflen); - lastdsz = buflen; + lastdsz[ifNo] = buflen; } // blocking send full content of ring buffer int USB_sendall(int ifNo){ while(!bufisempty[ifNo]){ - if(!usbON) return 0; + if(!USBON(ifNo)) return 0; } return 1; } // put `buf` into queue to send int USB_send(int ifNo, const uint8_t *buf, int len){ - if(!buf || !usbON || !len) return 0; + if(!buf || !USBON(ifNo) || !len) return 0; uint32_t T = Tms; while(len){ int a = RB_write((ringbuffer*)&rbout[ifNo], buf, len); - if(a == 0 && Tms - T > 5) return 0; // timeout + if(a == 0 && Tms - T > 5){ + usbON &= ~(1< USARTMAX_EPNO) return; - usart_config(ifNo + 1 - USART1_EPNO, lc); -} - -// SET_CONTROL_LINE_STATE -static void clstate_handler(int __attribute__((unused)) ifNo, uint16_t __attribute__((unused)) val){ -} - -// SEND_BREAK -static void break_handler(int __attribute__((unused)) ifNo){ -} - static void wr0(const uint8_t *buf, uint16_t size){ if(setup_packet->wLength < size) size = setup_packet->wLength; // shortened request if(size < endpoints[0].txbufsz){ @@ -772,17 +754,20 @@ static void rxtx_Handler(uint8_t epno){ uint8_t buf[USB_TRBUFSZ]; int idx = epno - 1; uint16_t epstatus = KEEP_DTOG(USB->EPnR[epno]); - DBGmesg("RxTx="); DBGmesg(u2str(epno)); - DBGmesg(", epst="); DBGmesg(u2str(epstatus)); DBGnl(); + //uint16_t epstatus = USB->EPnR[epno]; if(RX_FLAG(epstatus)){ + epstatus = (epstatus & ~(USB_EPnR_STAT_TX|USB_EPnR_CTR_RX)) ^ USB_EPnR_STAT_RX; // keep stat Tx & set valid RX, clear CTR Rx + USB->EPnR[epno] = epstatus; + //USB->EPnR[epno] = (KEEP_DTOG(epstatus) & ~USB_EPnR_CTR_RX) ^ USB_EPnR_STAT_RX; uint8_t sz = EP_Read(epno, (uint8_t*)buf); if(sz){ if(RB_write((ringbuffer*)&rbin[idx], buf, sz) != sz) bufovrfl[idx] = 1; } - epstatus = (epstatus & ~(USB_EPnR_STAT_TX|USB_EPnR_CTR_RX)) ^ USB_EPnR_STAT_RX; // keep stat Tx & set valid RX, clear CTR Rx - USB->EPnR[epno] = epstatus; + // set ACK Rx + USB->EPnR[epno] = (KEEP_DTOG(USB->EPnR[epno]) & ~(USB_EPnR_STAT_TX)) ^ USB_EPnR_STAT_RX; }else{ - USB->EPnR[epno] = (epstatus & ~(USB_EPnR_CTR_TX)); // clear TX ctr + USB->EPnR[epno] = (epstatus & ~(USB_EPnR_STAT_TX|USB_EPnR_CTR_TX)) ^ USB_EPnR_STAT_RX; // clear TX ctr + //USB->EPnR[epno] = (KEEP_DTOG_STAT(epstatus) & ~(USB_EPnR_CTR_TX)); // clear TX ctr send_next(idx); } } @@ -799,7 +784,6 @@ static inline void std_h2d_req(){ for(uint8_t i = 1; i <= WORK_EPs; ++i){ EP_Init(i, EP_TYPE_BULK, USB_TRBUFSZ, USB_TRBUFSZ, rxtx_Handler); } - usbON = 1; break; default: break; @@ -823,6 +807,8 @@ void EP0_Handler(uint8_t __attribute__((unused)) epno){ usb_LineCoding *lc; // calculate iFno (EP number minus 1) by setup_packet->wIndex (bInterfaceNumber): iFno = wIndex >> 1 int iFno = setup_packet->wIndex >> 1; + DBGmesg(uhex2str(epstatus)); + DBGmesg(" - "); hexdump(DBG_IDX, (uint8_t*)setup_packet, sizeof(config_pack_t)); if(rxflag && SETUP_FLAG(epstatus)){ switch(reqtype){ case STANDARD_DEVICE_REQUEST_TYPE: // standard device request @@ -841,22 +827,24 @@ void EP0_Handler(uint8_t __attribute__((unused)) epno){ case CONTROL_REQUEST_TYPE: switch(setup_packet->bRequest){ case GET_LINE_CODING: - DBG("GET_LINE_CODING from"); DBGmesg(u2str(iFno)); DBGnl(); + DBG("GLC"); lc = getLineCoding(iFno); if(!lc) EP_WriteIRQ(0, (uint8_t *)0, 0); else EP_WriteIRQ(0, (uint8_t*)&lc, sizeof(usb_LineCoding)); break; case SET_LINE_CODING: // omit this for next stage, when data will come + DBG("SLC"); break; case SET_CONTROL_LINE_STATE: - DBG("SET_CONTROL_LINE_STATE from"); DBGmesg(u2str(iFno)); DBGnl(); - clstate_handler(iFno, setup_packet->wValue); + DBG("SCLS"); + usbON |= 1 << iFno; // now this interface is connected break; case SEND_BREAK: - DBG("SEND_BREAK from"); DBGmesg(u2str(iFno)); DBGnl(); - break_handler(iFno); + DBG("B"); + usbON &= ~(1<bRequest != GET_LINE_CODING) EP_WriteIRQ(0, (uint8_t *)0, 0); // write acknowledgement @@ -867,15 +855,13 @@ void EP0_Handler(uint8_t __attribute__((unused)) epno){ }else if(rxflag){ // got data over EP0 or host acknowlegement if(endpoints[0].rx_cnt){ if(setup_packet->bRequest == SET_LINE_CODING){ - DBG("SET_LINE_CODING from"); DBGmesg(u2str(iFno)); DBGnl(); - linecoding_handler(iFno, (usb_LineCoding*)ep0databuf); + usart_config(iFno + 1 - USART1_EPNO, (usb_LineCoding*)ep0databuf); } } } else if(TX_FLAG(epstatus)){ // package transmitted // now we can change address after enumeration if ((USB->DADDR & USB_DADDR_ADD) != USB_Addr){ USB->DADDR = USB_DADDR_EF | USB_Addr; - usbON = 0; } } epstatus = KEEP_DTOG(USB->EPnR[0]); diff --git a/F3:F303/Seven_CDCs/usb_lib.h b/F3:F303/Seven_CDCs/usb_lib.h index e0cd1c2..993e6dc 100644 --- a/F3:F303/Seven_CDCs/usb_lib.h +++ b/F3:F303/Seven_CDCs/usb_lib.h @@ -153,6 +153,8 @@ typedef struct { } __attribute__ ((packed)) usb_LineCoding; extern ep_t endpoints[]; +// device disconnected from terminal (BIT flags!!!) +#define USBON(ifno) (usbON & (1<ISTR & USB_ISTR_RESET){ usbON = 0; // Reinit registers @@ -111,6 +112,7 @@ void usb_lp_isr(){ if(endpoints[n].func) endpoints[n].func(n); } if(USB->ISTR & USB_ISTR_SUSP){ // suspend -> still no connection, may sleep + oldusbon = usbON; usbON = 0; USB->CNTR |= USB_CNTR_FSUSP | USB_CNTR_LP_MODE; USB->ISTR = ~USB_ISTR_SUSP; @@ -118,7 +120,7 @@ void usb_lp_isr(){ if(USB->ISTR & USB_ISTR_WKUP){ // wakeup USB->CNTR &= ~(USB_CNTR_FSUSP | USB_CNTR_LP_MODE); // clear suspend flags USB->ISTR = ~USB_ISTR_WKUP; - usbON = 1; + usbON = oldusbon; } } diff --git a/F3:F303/Seven_CDCs/version.inc b/F3:F303/Seven_CDCs/version.inc index 70e8760..6a70e07 100644 --- a/F3:F303/Seven_CDCs/version.inc +++ b/F3:F303/Seven_CDCs/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "56" -#define BUILD_DATE "2023-04-23" +#define BUILD_NUMBER "77" +#define BUILD_DATE "2023-04-26"