From 65156583e3f802b2dd10920366053c2f32d6141e Mon Sep 17 00:00:00 2001 From: eddyem Date: Thu, 2 Apr 2020 20:03:39 +0300 Subject: [PATCH] working CDC-ACM for STM32F103 --- F0-nolib/CANbus_stepper/src/canstepper.bin | Bin 7448 -> 7812 bytes F0-nolib/CANbus_stepper/src/proto.c | 79 +++++++- F0-nolib/CANbus_stepper/src/proto.h | 4 +- F0-nolib/CANbus_stepper/src/usart.c | 1 + F0-nolib/Chiller/chiller.bin | Bin F0-nolib/F0_testbrd/pl2303.bin | Bin F0-nolib/QuadEncoder/encoder.bin | Bin F0-nolib/Servo/servo.bin | Bin F0-nolib/TM1637/tm1637.bin | Bin F0-nolib/USBHID/usbhid.bin | Bin F0-nolib/blink/blink.bin | Bin F0-nolib/canbus/src/canbus.bin | Bin F0-nolib/htu21d_nucleo/usart.bin | Bin F0-nolib/morze/morze.bin | Bin F0-nolib/pl2303/pl2303.bin | Bin F0-nolib/tsys01_nucleo/tsys01.bin | Bin F0-nolib/uart_blink/uartblink.bin | Bin F0-nolib/uart_blink_dma/uartblink.bin | Bin F0-nolib/uart_nucleo/usart.bin | Bin F0-nolib/usbcdc/usbcan.bin | Bin F0/blink/blink.bin | Bin F0/uart/uart.bin | Bin F1-nolib/CDC_ACM/cdcacm.bin | Bin 5808 -> 5008 bytes F1-nolib/CDC_ACM/main.c | 68 ++++--- F1-nolib/CDC_ACM/usart.c | 118 ++++++------ F1-nolib/CDC_ACM/usart.h | 11 +- F1-nolib/CDC_ACM/usb.c | 180 ++++++++++-------- F1-nolib/CDC_ACM/usb.h | 7 +- F1-nolib/CDC_ACM/usb_defs.h | 12 -- F1-nolib/CDC_ACM/usb_lib.c | 177 +++++++---------- F1-nolib/CDC_ACM/usb_lib.h | 20 +- F1-nolib/F1_testbrd/pl2303.bin | Bin F1-nolib/LED_Screen/LEDscreen.bin | Bin F1-nolib/LED_Screen/genlist | 0 F1-nolib/LED_Screen/scrtest/scrtest | Bin F1-nolib/PL2303/pl2303.bin | Bin F1-nolib/SPI/SPI.bin | Bin F1-nolib/USB_HID/usbhid103.bin | Bin F1-nolib/chronometer/chrono.bin | Bin F1-nolib/chronometer_v2/chrono.bin | Bin F1-nolib/led_blink/blink.bin | Bin F1-nolib/uart/uart.bin | Bin F1/1_wire/onewire.bin | Bin F1/2.8TFT/dma_gpio.bin | Bin F1/DMA_GPIO/dma_gpio.bin | Bin F1/GPIO_TIM/tim_gpio.bin | Bin F1/GPS+ultrasonic/timelapse.bin | Bin F1/GPS/GPS.bin | Bin F1/Jeep_generator/jeep_generator.bin | Bin F1/Timelapse_keyboard/timelapse.bin | Bin .../timelapse.bin | Bin F1/USBCDC_template/usb_cdc_simple.bin | Bin F1/canon_lens/canon_lens.bin | Bin F1/distance_meters/ultrasonic.bin | Bin F1/hid_mouse_keyboard/usbhid.bin | Bin F1/keyboard_snippet/keyboard.bin | Bin F1/matrix_keyboard/matrkeyb.bin | Bin F1/nokia5110/nokia5110.bin | Bin F1/simple_cdc/usb_cdc_simple.bin | Bin F1/stepper_motion/usb_cdc_simple.bin | Bin F1/ultrasonic/ultrasonic.bin | Bin 61 files changed, 381 insertions(+), 296 deletions(-) mode change 100755 => 100644 F0-nolib/CANbus_stepper/src/canstepper.bin mode change 100644 => 100755 F0-nolib/Chiller/chiller.bin mode change 100644 => 100755 F0-nolib/F0_testbrd/pl2303.bin mode change 100644 => 100755 F0-nolib/QuadEncoder/encoder.bin mode change 100644 => 100755 F0-nolib/Servo/servo.bin mode change 100644 => 100755 F0-nolib/TM1637/tm1637.bin mode change 100644 => 100755 F0-nolib/USBHID/usbhid.bin mode change 100644 => 100755 F0-nolib/blink/blink.bin mode change 100644 => 100755 F0-nolib/canbus/src/canbus.bin mode change 100644 => 100755 F0-nolib/htu21d_nucleo/usart.bin mode change 100644 => 100755 F0-nolib/morze/morze.bin mode change 100644 => 100755 F0-nolib/pl2303/pl2303.bin mode change 100644 => 100755 F0-nolib/tsys01_nucleo/tsys01.bin mode change 100644 => 100755 F0-nolib/uart_blink/uartblink.bin mode change 100644 => 100755 F0-nolib/uart_blink_dma/uartblink.bin mode change 100644 => 100755 F0-nolib/uart_nucleo/usart.bin mode change 100644 => 100755 F0-nolib/usbcdc/usbcan.bin mode change 100644 => 100755 F0/blink/blink.bin mode change 100644 => 100755 F0/uart/uart.bin mode change 100644 => 100755 F1-nolib/CDC_ACM/cdcacm.bin mode change 100644 => 100755 F1-nolib/F1_testbrd/pl2303.bin mode change 100644 => 100755 F1-nolib/LED_Screen/LEDscreen.bin mode change 100644 => 100755 F1-nolib/LED_Screen/genlist mode change 100644 => 100755 F1-nolib/LED_Screen/scrtest/scrtest mode change 100644 => 100755 F1-nolib/PL2303/pl2303.bin mode change 100644 => 100755 F1-nolib/SPI/SPI.bin mode change 100644 => 100755 F1-nolib/USB_HID/usbhid103.bin mode change 100755 => 100644 F1-nolib/chronometer/chrono.bin mode change 100644 => 100755 F1-nolib/chronometer_v2/chrono.bin mode change 100644 => 100755 F1-nolib/led_blink/blink.bin mode change 100644 => 100755 F1-nolib/uart/uart.bin mode change 100644 => 100755 F1/1_wire/onewire.bin mode change 100644 => 100755 F1/2.8TFT/dma_gpio.bin mode change 100644 => 100755 F1/DMA_GPIO/dma_gpio.bin mode change 100644 => 100755 F1/GPIO_TIM/tim_gpio.bin mode change 100644 => 100755 F1/GPS+ultrasonic/timelapse.bin mode change 100644 => 100755 F1/GPS/GPS.bin mode change 100644 => 100755 F1/Jeep_generator/jeep_generator.bin mode change 100644 => 100755 F1/Timelapse_keyboard/timelapse.bin mode change 100644 => 100755 F1/Timelapse_keyboard_only_lasers/timelapse.bin mode change 100644 => 100755 F1/USBCDC_template/usb_cdc_simple.bin mode change 100644 => 100755 F1/canon_lens/canon_lens.bin mode change 100644 => 100755 F1/distance_meters/ultrasonic.bin mode change 100644 => 100755 F1/hid_mouse_keyboard/usbhid.bin mode change 100644 => 100755 F1/keyboard_snippet/keyboard.bin mode change 100644 => 100755 F1/matrix_keyboard/matrkeyb.bin mode change 100644 => 100755 F1/nokia5110/nokia5110.bin mode change 100644 => 100755 F1/simple_cdc/usb_cdc_simple.bin mode change 100644 => 100755 F1/stepper_motion/usb_cdc_simple.bin mode change 100644 => 100755 F1/ultrasonic/ultrasonic.bin diff --git a/F0-nolib/CANbus_stepper/src/canstepper.bin b/F0-nolib/CANbus_stepper/src/canstepper.bin old mode 100755 new mode 100644 index 0ec29b91d4115fd0bf717cad5e059c7fe5eb2547..f5d089148ddca1d561deb60b6dbf961512099451 GIT binary patch delta 1551 zcmcgseM}o=7=NxG*s@Z-KU=yh9R#@Iy3yzY16jf2qfi!>Y))l1i^h%(yd}dm{!@Ze zx5N*&(}YQsnI(oT%Tj4-%mT{9k3am#olIqJ%h(cgL|r`n!-KZm>vN1`Ta4~MFZtc` z@&2CQbMN!M?P%SRhAe0T`n^Ihy@NQ3IG$~bfEK{oqxnw5?M01nKlEnYpYz`uc_?7H zSLChy4?Zr@=?*9PpLEsKkGxUuqCV%V^rh5?e5?K&6Xh=obFDKhpJn*L93mj^O%mlM z|GQy55;Bc7HOUmnHCkPj!o38Nq%=l2;)^M{vj zO6#1tZ6L=JQOV-WK`+XW8Mif`vVrLwVkw^Kw}pYp60M!quFUSt04y{HtHLz)Xird; zOM)c;E^mNo8Z!zUvly=yY0#ug^ba#Dtl!Yn~GJ=%L(N@n9 zrI}O$QO*-v8&Mhv4J4vWkaU_TuaF{tQAbIzXm!VwKolKmX6rc*7^X&8c^Yc61XfV4UxU5AF6RKg_cT3bq zV+`gV8)x@LSPu@QofsS-9$O&F+bb|O>I3oMLO0%r-AP@Pn-1WxCREnnit}OcK4`Ls zRH8h%vd!;X%l(46K2?%h{IH=U1Sk5~v7`Ku3;I}3ZHS%YaKb8%Td7MCMOG=VHuG;) zgFA9dyee(M24NK3zJkK5$8k{=rCQAPWA=2);Apv`6<<=dvY0w65#`gA0o=%VQl*a) znEa9C-tju01FAdVUK4tg?sgpKTTj- zH2=SF-08Rbp5{Gw7EB@ZkK7gi+edzcoWOI3=z+ohbnTB^^ZTDkhuBtI9+mB;0}WcX N^){o9=DX}){S7nzi+qTVnYIjOVv{M*Bd1}QU5Hdt@mwHXZ0$H+^= z60U^sMi1v91x6=lCF_g>#BCZ%I>bPIIL5S(WZaa?*@&Gl+PilG)avnO(F>psPdw-W zDKi?7?FvZr33wD42&f}*5TO%PF}_yLt@9{XDqj!fDWi0!ob3Y-Cl+tgr!(U3Xo{Fw z18UA#n5K#usI257zs9`F27+QEUwD_{TAZYr9h{3u=B0+?F|xb2nUrU@kHXjR}j&T*ay7k_zVx>)A!dRrFVWjvB*izZdgv_MPgni+!T&9UugI z{Q%FnoBl%HIV~w{^?OVkO@2P7LxP zdSKLtN6BNQfl|M2@oV^N!VnJjmtiHFEejM+tGrJz?ffLAB>~8@DbP_bceRmb3F>8U zu_8YWGL0qjfoZoULQGQ_SCZ^zn#@c^pQ8h`01Z_%7@TBU6VofD>^@zDs~>Pxoa9~k zBl>Xd&zi(;Ql|MPd2nLKvqXLy(^fM(>cND9x|HRheuR?_^jr3G#==fhE3Wn@PHm)_ zC~hY@Xc2D2vxAjUdQZj&@?E|Ra1g-VfHdL@x7tByN6L{J{H2>P?nfGsBS;f+6S-=S z>_}e4o4L6lRHsJHreEM)P1tWV0<>d1hn&&pk!J`vBm1%raR%NJ8Jb_k@s|>5wdv%| zf-K_APIZ}_AQT$Gt;au!?8x3{44DNG`u;Nur}nF!vH6y%g3y4vZCd`fL%yB^Lgb{w J%8@?jqaQwngEasE diff --git a/F0-nolib/CANbus_stepper/src/proto.c b/F0-nolib/CANbus_stepper/src/proto.c index 3f15f39..aafe933 100644 --- a/F0-nolib/CANbus_stepper/src/proto.c +++ b/F0-nolib/CANbus_stepper/src/proto.c @@ -105,6 +105,21 @@ static inline void showUIvals(){ newline(); } +// check address & return 0 if wrong or address to roll to next non-digit +static int chk485addr(const char *txt){ + int32_t N; + int p = getnum(txt, &N); + if(!p){ + USB_send("Not num\n"); + return 0; + } + if(N == getBRDaddr()){ + return p; + } + USB_send("Not me\n"); + return 0; +} + /** * @brief cmd_parser - command parsing * @param txt - buffer with commands & data @@ -113,8 +128,20 @@ static inline void showUIvals(){ void cmd_parser(const char *txt, uint8_t isUSB){ sendbuf(); USBcmd = isUSB; + int p = 0; + // we can't simple use &txt[p] as variable: it can be non-aligned by 4!!! + if(isUSB == TARGET_USART){ // check address and roll message to nearest non-space + p = chk485addr(txt); + if(!p) return; + } + // roll to non-space + char c; + while((c = txt[p])){ + if(c == ' ' || c == '\t') ++p; + else break; + } //int16_t L = strlen(txt); - char _1st = txt[0]; + char _1st = txt[p]; switch(_1st){ case 'a': showADCvals(); @@ -182,3 +209,53 @@ void printuhex(uint32_t val){ } } } + +/** + * @brief getnum - read number from string omiting leading spaces + * @param buf (i) - string to process + * @param N (o) - number read (or NULL for test) + * @return amount of symbols processed (or 0 if none) + */ +int getnum(const char *buf, int32_t *N){ + char c; + int positive = -1, srd = 0; + int32_t val = 0; + while((c = *buf++)){ + if(c == '\t' || c == ' '){ + if(positive < 0){ + ++srd; + continue; // beginning spaces + } + else break; // spaces after number + } + if(c == '-'){ + if(positive < 0){ + ++srd; + positive = 0; + continue; + }else break; // there already was `-` or number + } + if(c < '0' || c > '9') break; + ++srd; + if(positive < 0) positive = 1; + val = val * 10 + (int32_t)(c - '0'); + } + if(positive != -1){ + if(positive == 0){ + if(val == 0) return 0; // single '-' or -0000 + val = -val; + } + if(N) *N = val; + }else return 0; +uint8_t uold = USBcmd; +USBcmd = TARGET_USB; +addtobuf("Got num: "); +if(val < 0){bufputchar('-'); val = -val;} +printu(val); +addtobuf(", N="); +printu(srd); +newline(); +sendbuf(); +USBcmd = uold; + return srd; +} diff --git a/F0-nolib/CANbus_stepper/src/proto.h b/F0-nolib/CANbus_stepper/src/proto.h index 8283ec8..2dfbcb6 100644 --- a/F0-nolib/CANbus_stepper/src/proto.h +++ b/F0-nolib/CANbus_stepper/src/proto.h @@ -40,9 +40,11 @@ void cmd_parser(const char *buf, uint8_t isUSB); void addtobuf(const char *txt); void bufputchar(char ch); +void sendbuf(); void printu(uint32_t val); void printuhex(uint32_t val); -void sendbuf(); +int getnum(const char *buf, int32_t *N); + #define TARGET_USB 1 #define TARGET_USART 0 void buftgt(uint8_t isUSB); diff --git a/F0-nolib/CANbus_stepper/src/usart.c b/F0-nolib/CANbus_stepper/src/usart.c index b176127..f9a1f1e 100644 --- a/F0-nolib/CANbus_stepper/src/usart.c +++ b/F0-nolib/CANbus_stepper/src/usart.c @@ -111,6 +111,7 @@ void usart_send_blocking(const char *str, int len){ USARTX -> TDR = *str++; while(!(USARTX->ISR & USART_ISR_TXE)){IWDG->KR = IWDG_REFRESH;} } + // wait for transfer complete to switch into Rx while(!(USARTX->ISR & USART_ISR_TC)){IWDG->KR = IWDG_REFRESH;} _485_Rx(); } diff --git a/F0-nolib/Chiller/chiller.bin b/F0-nolib/Chiller/chiller.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/F0_testbrd/pl2303.bin b/F0-nolib/F0_testbrd/pl2303.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/QuadEncoder/encoder.bin b/F0-nolib/QuadEncoder/encoder.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/Servo/servo.bin b/F0-nolib/Servo/servo.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/TM1637/tm1637.bin b/F0-nolib/TM1637/tm1637.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/USBHID/usbhid.bin b/F0-nolib/USBHID/usbhid.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/blink/blink.bin b/F0-nolib/blink/blink.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/canbus/src/canbus.bin b/F0-nolib/canbus/src/canbus.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/htu21d_nucleo/usart.bin b/F0-nolib/htu21d_nucleo/usart.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/morze/morze.bin b/F0-nolib/morze/morze.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/pl2303/pl2303.bin b/F0-nolib/pl2303/pl2303.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/tsys01_nucleo/tsys01.bin b/F0-nolib/tsys01_nucleo/tsys01.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/uart_blink/uartblink.bin b/F0-nolib/uart_blink/uartblink.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/uart_blink_dma/uartblink.bin b/F0-nolib/uart_blink_dma/uartblink.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/uart_nucleo/usart.bin b/F0-nolib/uart_nucleo/usart.bin old mode 100644 new mode 100755 diff --git a/F0-nolib/usbcdc/usbcan.bin b/F0-nolib/usbcdc/usbcan.bin old mode 100644 new mode 100755 diff --git a/F0/blink/blink.bin b/F0/blink/blink.bin old mode 100644 new mode 100755 diff --git a/F0/uart/uart.bin b/F0/uart/uart.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/CDC_ACM/cdcacm.bin b/F1-nolib/CDC_ACM/cdcacm.bin old mode 100644 new mode 100755 index 77ff49de5bad6c0f0853e17e7140d1405bc26c6a..ccafebaaacf9f631a7606406ef5cc8dc8986c641 GIT binary patch literal 5008 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 Sx&cxtG#xoX&F~?W4DdfT#*1qJ literal 5808 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 == 0) break;} /* (5) */ IWDG->KR = IWDG_REFRESH; /* (6) */ } - +/* char *parse_cmd(char *buf){ IWDG->KR = IWDG_REFRESH; if(buf[1] != '\n') return buf; @@ -93,43 +93,55 @@ char *parse_cmd(char *buf){ break; } return NULL; +}*/ + +/* +char *get_USB(){ + static char tmpbuf[65]; + int x = USB_receive(tmpbuf, 64); + tmpbuf[x] = 0; + if(!x) return NULL; + return tmpbuf; } // usb getline char *get_USB(){ - static char tmpbuf[512], *curptr = tmpbuf; - static int rest = 511; + static char tmpbuf[128], *curptr = tmpbuf; + static int rest = 127; int x = USB_receive(curptr, rest); curptr[x] = 0; if(!x) return NULL; - MSG(tmpbuf); if(curptr[x-1] == '\n'){ + //DBG("Got \\n"); curptr = tmpbuf; - rest = 511; + rest = 127; return tmpbuf; } curptr += x; rest -= x; if(rest <= 0){ // buffer overflow + //DBG("Buffer full"); curptr = tmpbuf; - rest = 511; + rest = 127; + return tmpbuf; } return NULL; -} +}*/ -uint32_t newrate = 0; +static uint32_t newrate = 0; +// redefine weak handlers void linecoding_handler(usb_LineCoding *lcd){ newrate = lcd->dwDTERate; } -uint16_t cl = 0xffff; +static uint16_t cl = 0xffff; void clstate_handler(uint16_t val){ cl = val; } -int8_t br = 0; +static int8_t br = 0; void break_handler(){ br = 1; } - +/* char *u2str(uint32_t val){ static char strbuf[11]; char *bufptr = &strbuf[10]; @@ -143,7 +155,7 @@ char *u2str(uint32_t val){ } } return bufptr; -} +}*/ int main(void){ uint32_t lastT = 0; @@ -154,6 +166,7 @@ int main(void){ hw_setup(); USBPU_OFF(); usart_setup(); + DBG("Start"); if(RCC->CSR & RCC_CSR_IWDGRSTF){ // watchdog reset occured SEND("WDGRESET=1"); newline(); } @@ -163,7 +176,7 @@ int main(void){ RCC->CSR |= RCC_CSR_RMVF; // remove reset flags USB_setup(); - //iwdg_setup(); + iwdg_setup(); USBPU_ON(); //uint32_t ctr = 0; @@ -173,25 +186,30 @@ int main(void){ LED_blink(LED0); lastT = Tms; transmit_tbuf(); -/* - if(usbON){ - USB_send("String #"); - char *s = u2str(ctr++); - USB_send(s); - USB_send("\n"); - }*/ } usb_proc(); - char *txt, *ans; - if((txt = get_USB())){ - ans = parse_cmd(txt); - if(ans) USB_send(ans); + if(bufovr){ + bufovr = 0; + USB_send((uint8_t*)"USART overflow!\n", 16); + } + uint8_t tmpbuf[USB_RXBUFSZ], *txt; + uint16_t x = USB_receive(tmpbuf); + if(x){ + //for(int _ = 0; _ < 7000000; ++_)nop(); + //USB_send(tmpbuf, x); + usart_senddata(tmpbuf, x); + //transmit_tbuf(); + /*char *ans = parse_cmd(txt); + if(ans) USB_send(ans);*/ + } + if((x = usart_get(&txt))){ + USB_send(txt, x); } int n = 0; if(newrate){SEND("new speed: "); printu(newrate); n = 1; newrate = 0;} if(cl!=0xffff){SEND("controls: "); printuhex(cl); n = 1; cl = 0xffff;} if(br){SEND("break"); n = 1; br = 0;} - if(n) newline(); + if(n){newline(); transmit_tbuf();} } return 0; } diff --git a/F1-nolib/CDC_ACM/usart.c b/F1-nolib/CDC_ACM/usart.c index 7553e0f..d631476 100644 --- a/F1-nolib/CDC_ACM/usart.c +++ b/F1-nolib/CDC_ACM/usart.c @@ -19,8 +19,8 @@ * MA 02110-1301, USA. */ #include "stm32f1.h" -#include "sync.h" #include "usart.h" +#include "usb.h" extern volatile uint32_t Tms; static volatile int idatalen[2] = {0,0}; // received data line length (including '\n') @@ -33,85 +33,93 @@ int linerdy = 0, // received data ready txrdy = 1 // transmission done ; -static mutex_t the_mutex = MUTEX_UNLOCKED; // mutex for sending messages - static int rbufno = 0, tbufno = 0; // current rbuf/tbuf numbers -static char rbuf[2][UARTBUFSZI], tbuf[2][UARTBUFSZO]; // receive & transmit buffers -static char *recvdata = NULL; +static uint8_t rbuf[2][UARTBUFSZI], tbuf[2][UARTBUFSZO]; // receive & transmit buffers +static uint8_t *recvdata = NULL; /** * return length of received data (without trailing zero) */ -int usart_getline(char **line){ +uint16_t usart_get(uint8_t **line){ + if(!line) return 0; + *line = NULL; if(bufovr){ bufovr = 0; linerdy = 0; return 0; } + if(!linerdy) return 0; + USART1->CR1 &= ~USART_CR1_RXNEIE; // disallow Rx IRQ + dlen = idatalen[rbufno]; + recvdata = rbuf[rbufno]; + // prepare other buffer + rbufno = !rbufno; + idatalen[rbufno] = 0; + recvdata[dlen] = 0; *line = recvdata; linerdy = 0; + USART1->CR1 |= USART_CR1_RXNEIE; // allow Rx IRQ return dlen; } // transmit current tbuf and swap buffers -void transmit_tbuf(){ - uint32_t tmout = 160000; - mutex_lock(&the_mutex); +int transmit_tbuf(){ + uint32_t tmout = 7200; while(!txrdy){ // wait for previos buffer transmission IWDG->KR = IWDG_REFRESH; if(--tmout == 0){ - mutex_unlock(&the_mutex); - return; + //DMA1_Channel4->CCR &= ~DMA_CCR_EN; + //txrdy = 1; + return 1; } } - register int l = odatalen[tbufno]; + int l = odatalen[tbufno]; if(!l){ - mutex_unlock(&the_mutex); - return; + return 0; } - txrdy = 0; - odatalen[tbufno] = 0; DMA1_Channel4->CCR &= ~DMA_CCR_EN; DMA1_Channel4->CMAR = (uint32_t) tbuf[tbufno]; // mem DMA1_Channel4->CNDTR = l; - DMA1_Channel4->CCR |= DMA_CCR_EN; tbufno = !tbufno; - mutex_unlock(&the_mutex); + odatalen[tbufno] = 0; + txrdy = 0; + DMA1_Channel4->CCR |= DMA_CCR_EN; + return 0; } void usart_putchar(const char ch){ - mutex_lock(&the_mutex); - if(odatalen[tbufno] == UARTBUFSZO){ - mutex_unlock(&the_mutex); - //return; - transmit_tbuf(); - mutex_lock(&the_mutex); - } tbuf[tbufno][odatalen[tbufno]++] = ch; - mutex_unlock(&the_mutex); + if(odatalen[tbufno] >= UARTBUFSZO){ + while(transmit_tbuf()); + } } void usart_send(const char *str){ - uint32_t x = 512; - mutex_lock(&the_mutex); - while(*str && --x){ - if(odatalen[tbufno] == UARTBUFSZO){ - mutex_unlock(&the_mutex); - //return; - transmit_tbuf(); - mutex_lock(&the_mutex); - } + if(!str) return; + while(*str){ tbuf[tbufno][odatalen[tbufno]++] = *str++; + if(odatalen[tbufno] >= UARTBUFSZO){ + while(transmit_tbuf()); + } + } +} + +/** + * @brief usart_senddata - the same as usart_send, but with given length + */ +void usart_senddata(const uint8_t *str, uint16_t len){ + while(len--){ + tbuf[tbufno][odatalen[tbufno]++] = *str++; + if(odatalen[tbufno] >= UARTBUFSZO){ + while(transmit_tbuf()); + } } - mutex_unlock(&the_mutex); } void newline(){ usart_putchar('\n'); - //transmit_tbuf(); } - /* * USART speed: baudrate = Fck/(USARTDIV) * USARTDIV stored in USART->BRR @@ -135,8 +143,8 @@ void usart_setup(){ NVIC_EnableIRQ(DMA1_Channel4_IRQn); NVIC_SetPriority(USART1_IRQn, 0); // setup usart1 - //USART1->BRR = 72000000 / 115200; - USART1->BRR = 24; // 3000000 + USART1->BRR = 72000000 / 115200; + //USART1->BRR = 24; // 3000000 USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART while(!(USART1->SR & USART_SR_TC)){ // polling idle frame Transmission IWDG->KR = IWDG_REFRESH; @@ -165,18 +173,11 @@ void usart1_isr(){ uint8_t rb = USART1->DR; if(idatalen[rbufno] < UARTBUFSZI){ // put next char into buf rbuf[rbufno][idatalen[rbufno]++] = rb; - if(rb == '\n'){ // got newline - line ready - linerdy = 1; - dlen = idatalen[rbufno]; - recvdata = rbuf[rbufno]; - // prepare other buffer - rbufno = !rbufno; - idatalen[rbufno] = 0; - #ifdef CHECK_TMOUT - // clear timeout at line end - tmout = 0; - #endif - } + linerdy = 1; // ready for reading + #ifdef CHECK_TMOUT + // clear timeout at line end + tmout = 0; + #endif }else{ // buffer overrun bufovr = 1; idatalen[rbufno] = 0; @@ -187,6 +188,7 @@ void usart1_isr(){ } } + // print 32bit unsigned int void printu(uint32_t val){ char bufa[11], bufb[10]; @@ -222,9 +224,9 @@ void printuhex(uint32_t val){ } } } - +/* // dump memory buffer -void hexdump(uint8_t *arr, uint16_t len){ +void hexdump(const uint8_t *arr, uint16_t len){ for(uint16_t l = 0; l < len; ++l, ++arr){ for(int16_t j = 1; j > -1; --j){ register uint8_t half = (*arr >> (4*j)) & 0x0f; @@ -235,12 +237,10 @@ void hexdump(uint8_t *arr, uint16_t len){ else if(l & 1) usart_putchar(' '); } } - +*/ void dma1_channel4_isr(){ - if(DMA1->ISR & DMA_ISR_TCIF4){ // Tx - DMA1->IFCR = DMA_IFCR_CTCIF4; // clear TC flag - txrdy = 1; - } + DMA1->IFCR = DMA_IFCR_CTCIF4; // clear TC flag + txrdy = 1; } /* diff --git a/F1-nolib/CDC_ACM/usart.h b/F1-nolib/CDC_ACM/usart.h index 0b5307d..e64ee73 100644 --- a/F1-nolib/CDC_ACM/usart.h +++ b/F1-nolib/CDC_ACM/usart.h @@ -24,8 +24,8 @@ #define __USART_H__ // input and output buffers size -#define UARTBUFSZI (16) -#define UARTBUFSZO (512) +#define UARTBUFSZI (64) +#define UARTBUFSZO (64) // timeout between data bytes #ifndef TIMEOUT_MS #define TIMEOUT_MS (1500) @@ -51,14 +51,15 @@ extern int linerdy, bufovr, txrdy; -void transmit_tbuf(); +int transmit_tbuf(); void usart_setup(); -int usart_getline(char **line); +uint16_t usart_get(uint8_t **line); void usart_send(const char *str); +void usart_senddata(const uint8_t *str, uint16_t len); void newline(); void usart_putchar(const char ch); void printu(uint32_t val); void printuhex(uint32_t val); -void hexdump(uint8_t *arr, uint16_t len); +void hexdump(const uint8_t *arr, uint16_t len); #endif // __USART_H__ diff --git a/F1-nolib/CDC_ACM/usb.c b/F1-nolib/CDC_ACM/usb.c index 9333be8..45eabfa 100644 --- a/F1-nolib/CDC_ACM/usb.c +++ b/F1-nolib/CDC_ACM/usb.c @@ -24,44 +24,32 @@ #include "usb_lib.h" #include "usart.h" -// incoming buffer size -#define IDATASZ (256) -static uint8_t incoming_data[IDATASZ]; -static uint8_t ovfl = 0; -static uint16_t idatalen = 0; -static volatile uint8_t tx_succesfull = 0; +static volatile uint8_t tx_succesfull = 1; // interrupt IN handler (never used?) -static uint16_t EP1_Handler(ep_t ep){ - if (ep.rx_flag){ - ep.status = SET_VALID_TX(ep.status); - ep.status = KEEP_STAT_RX(ep.status); - }else if (ep.tx_flag){ - ep.status = SET_VALID_RX(ep.status); - ep.status = SET_STALL_TX(ep.status); - } - return ep.status; +static void EP1_Handler(){ + DBG("EP1"); + uint16_t epstatus = KEEP_DTOG(USB->EPnR[1]); + if(RX_FLAG(epstatus)) epstatus = (epstatus & ~USB_EPnR_STAT_TX) ^ USB_EPnR_STAT_RX; // set valid RX + else epstatus = epstatus & ~(USB_EPnR_STAT_TX|USB_EPnR_STAT_RX); + // clear CTR + epstatus = (epstatus & ~(USB_EPnR_CTR_RX|USB_EPnR_CTR_TX)); + USB->EPnR[1] = epstatus; } -// data IN/OUT handler -static uint16_t EP23_Handler(ep_t ep){ - if(ep.rx_flag){ - int rd = ep.rx_cnt, rest = IDATASZ - idatalen; - if(rd){ - if(rd <= rest){ - idatalen += EP_Read(2, (uint16_t*)&incoming_data[idatalen]); - ovfl = 0; - }else{ - ep.status = SET_NAK_RX(ep.status); - ovfl = 1; - return ep.status; - } - } - }else if (ep.tx_flag){ - tx_succesfull = 1; - } - ep.status = SET_VALID_RX(ep.status); - return ep.status; +// 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 +} + +static uint8_t rxNE = 0; +static void receive_Handler(){ // EP2OUT + rxNE = 1; + uint16_t epstatus = KEEP_DTOG_STAT(USB->EPnR[2]); + USB->EPnR[2] = (epstatus & ~(USB_EPnR_CTR_RX)); // clear RX ctr } void USB_setup(){ @@ -76,17 +64,79 @@ void USB_setup(){ USB->ISTR = 0; USB->CNTR = USB_CNTR_RESETM | USB_CNTR_WKUPM; // allow only wakeup & reset interrupts NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); - //NVIC_EnableIRQ(USB_HP_CAN1_TX_IRQn ); + DBG("USB irq enabled"); } + +static int usbwr(const uint8_t *buf, uint16_t l){ + uint32_t ctra = 1000000; + while(--ctra && tx_succesfull == 0){ + IWDG->KR = IWDG_REFRESH; + } + tx_succesfull = 0; + EP_Write(3, buf, l); + ctra = 1000000; + while(--ctra && tx_succesfull == 0){ + IWDG->KR = IWDG_REFRESH; + } + if(tx_succesfull == 0){usbON = 0; DBG("USB disconnected"); return 1;} // usb is OFF? + return 0; +} + +static uint8_t usbbuff[USB_TXBUFSZ-1]; // temporary buffer (63 - to prevent need of ZLP) +static uint8_t buflen = 0; // amount of symbols in usbbuff + +// send next up to 64 bytes of data in usbbuff +static void send_next(){ + if(!buflen || !tx_succesfull) return; + tx_succesfull = 0; + EP_Write(3, usbbuff, buflen); + buflen = 0; +} + +// unblocking sending - just fill a buffer +void USB_send(const uint8_t *buf, uint16_t len){ + if(!usbON || !len) return; + if(len > USB_TXBUFSZ-1){ + USB_send_blk(buf, len); + return; + } + if(len > USB_TXBUFSZ-1 - buflen){ + usbwr(usbbuff, buflen); + buflen = 0; + } + while(len--) usbbuff[buflen++] = *buf++; +} + +// blocking sending +void USB_send_blk(const uint8_t *buf, uint16_t len){ + if(!usbON || !len) return; // USB disconnected + if(buflen){ + usbwr(usbbuff, buflen); + buflen = 0; + } + int needzlp = 0; + while(len){ + if(len == USB_TXBUFSZ) needzlp = 1; + uint16_t s = (len > USB_TXBUFSZ) ? USB_TXBUFSZ : len; + if(usbwr(buf, s)) return; + len -= s; + buf += s; + } + if(needzlp){ + usbwr(NULL, 0); + } +} + + void usb_proc(){ switch(USB_Dev.USB_Status){ case USB_STATE_CONFIGURED: // make new BULK endpoint // Buffer have 1024 bytes, but last 256 we use for CAN bus (30.2 of RM: USB main features) EP_Init(1, EP_TYPE_INTERRUPT, USB_EP1BUFSZ, 0, EP1_Handler); // IN1 - transmit - EP_Init(2, EP_TYPE_BULK, 0, USB_RXBUFSZ, EP23_Handler); // OUT2 - receive data - EP_Init(3, EP_TYPE_BULK, USB_TXBUFSZ, 0, EP23_Handler); // IN3 - transmit data + EP_Init(2, EP_TYPE_BULK, 0, USB_RXBUFSZ, receive_Handler); // OUT2 - receive data + EP_Init(3, EP_TYPE_BULK, USB_TXBUFSZ, 0, transmit_Handler); // IN3 - transmit data USB_Dev.USB_Status = USB_STATE_CONNECTED; DBG("Connected"); break; @@ -96,55 +146,25 @@ void usb_proc(){ DBG("def/adr"); usbON = 0; } - default: - return; - } -} - -void USB_send(const char *buf){ - if(!usbON) return; // USB disconnected - uint16_t l = 0, ctr = 0; - const char *p = buf; - while(*p++) ++l; - while(l){ - uint16_t s = (l > USB_TXBUFSZ) ? USB_TXBUFSZ : l; - tx_succesfull = 0; - EP_Write(3, (uint8_t*)&buf[ctr], s); - uint32_t ctra = 1000000; - while(--ctra && tx_succesfull == 0){ - IWDG->KR = IWDG_REFRESH; - } - if(tx_succesfull == 0){usbON = 0; DBG("USB disconnected"); return;} // usb is OFF? - l -= s; - ctr += s; + break; + default: // USB_STATE_CONNECTED - send next data portion + if(!usbON) return; + send_next(); } } /** * @brief USB_receive - * @param buf (i) - buffer for received data - * @param bufsize - its size + * @param buf (i) - buffer[64] for received data * @return amount of received bytes */ -int USB_receive(char *buf, int bufsize){ - if(bufsize < 1 || !idatalen) return 0; - uint32_t oldcntr = USB->CNTR; - USB->CNTR = 0; - int sz = (idatalen > bufsize) ? bufsize : idatalen, rest = idatalen - sz; - for(int i = 0; i < sz; ++i) buf[i] = incoming_data[i]; - if(rest > 0){ - uint8_t *ptr = &incoming_data[sz]; - for(int i = 0; i < rest; ++i) incoming_data[i] = *ptr++; - idatalen = rest; - }else idatalen = 0; - if(ovfl){ - EP23_Handler(endpoints[2]); - uint16_t epstatus = USB->EPnR[2]; - epstatus = CLEAR_DTOG_RX(epstatus); - epstatus = SET_VALID_RX(epstatus); - USB->EPnR[2] = epstatus; - } - USB->CNTR = oldcntr; +uint8_t USB_receive(uint8_t *buf){ + if(!usbON || !rxNE) return 0; + //DBG("Get data"); + uint8_t sz = EP_Read(2, (uint16_t*)buf); + uint16_t epstatus = KEEP_DTOG(USB->EPnR[2]); + // keep stat_tx & set ACK rx + USB->EPnR[2] = (epstatus & ~(USB_EPnR_STAT_TX)) ^ USB_EPnR_STAT_RX; + rxNE = 0; return sz; } - diff --git a/F1-nolib/CDC_ACM/usb.h b/F1-nolib/CDC_ACM/usb.h index a780e5f..c9d315d 100644 --- a/F1-nolib/CDC_ACM/usb.h +++ b/F1-nolib/CDC_ACM/usb.h @@ -26,11 +26,10 @@ #include "hardware.h" -#define BUFFSIZE (64) - void USB_setup(); void usb_proc(); -void USB_send(const char *buf); -int USB_receive(char *buf, int bufsize); +void USB_send(const uint8_t *buf, uint16_t len); +void USB_send_blk(const uint8_t *buf, uint16_t len); +uint8_t USB_receive(uint8_t *buf); #endif // __USB_H__ diff --git a/F1-nolib/CDC_ACM/usb_defs.h b/F1-nolib/CDC_ACM/usb_defs.h index 7be62b1..1ac3dd0 100644 --- a/F1-nolib/CDC_ACM/usb_defs.h +++ b/F1-nolib/CDC_ACM/usb_defs.h @@ -93,18 +93,6 @@ typedef struct { __IO uint32_t BTABLE; } USB_TypeDef; -/* -typedef struct{ - __IO uint16_t USB_ADDR_TX; - __IO uint16_t res1; - __IO uint16_t USB_COUNT_TX; - __IO uint16_t res2; - __IO uint16_t USB_ADDR_RX; - __IO uint16_t res3; - __IO uint16_t USB_COUNT_RX; - __IO uint16_t res4; -} USB_EPDATA_TypeDef;*/ - typedef struct{ __IO uint32_t USB_ADDR_TX; __IO uint32_t USB_COUNT_TX; diff --git a/F1-nolib/CDC_ACM/usb_lib.c b/F1-nolib/CDC_ACM/usb_lib.c index f34d37e..943fde7 100644 --- a/F1-nolib/CDC_ACM/usb_lib.c +++ b/F1-nolib/CDC_ACM/usb_lib.c @@ -54,14 +54,8 @@ static const uint8_t USB_DeviceDescriptor[] = { bDeviceSubClass, // bDeviceSubClass bDeviceProtocol, // bDeviceProtocol USB_EP0_BUFSZ, // bMaxPacketSize - // 0483:5740 + // 0483:5740 (VID:PID) - stm32 VCP 0x83, 0x04, 0x40, 0x57, - /* - 0xae, // idVendor_L VID=0x25AE, PID=0x24AB - 0x25, // idVendor_H - 0xab, // idProduct_L - 0x24, // idProduct_H -*/ 0x00, // bcdDevice_Ver_L 0x02, // bcdDevice_Ver_H 0x01, // iManufacturer @@ -200,11 +194,10 @@ void WEAK break_handler(){ MSG("break_handler()"); } -static uint16_t wr0(const uint8_t *buf, uint16_t size, uint16_t status){ +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){ EP_WriteIRQ(0, buf, size); - return status; } while(size){ uint16_t l = size; @@ -214,94 +207,86 @@ static uint16_t wr0(const uint8_t *buf, uint16_t size, uint16_t status){ size -= l; uint8_t needzlp = (l == endpoints[0].txbufsz) ? 1 : 0; if(size || needzlp){ // send last data buffer - USB->ISTR = 0; - status = SET_VALID_TX(status); - status = KEEP_DTOG_TX(status); - status = KEEP_DTOG_RX(status); - status = CLEAR_CTR_RX(status); - status = CLEAR_CTR_TX(status); - USB->EPnR[0] = status; + uint16_t status = KEEP_DTOG(USB->EPnR[0]); + // keep DTOGs, clear CTR_RX,TX, set TX VALID, leave stat_Rx + USB->EPnR[0] = (status & ~(USB_EPnR_CTR_RX|USB_EPnR_CTR_TX|USB_EPnR_STAT_RX)) + ^ USB_EPnR_STAT_TX; uint32_t ctr = 1000000; while(--ctr && (USB->ISTR & USB_ISTR_CTR) == 0){IWDG->KR = IWDG_REFRESH;}; if((USB->ISTR & USB_ISTR_CTR) == 0){ - return USB->EPnR[0]; + return; } - USB->ISTR = 0; - status = USB->EPnR[0]; if(needzlp) EP_WriteIRQ(0, (uint8_t*)0, 0); } } - return status; } -static inline uint16_t get_descriptor(uint16_t status){ +static inline void get_descriptor(){ switch(setup_packet.wValue){ case DEVICE_DESCRIPTOR: - MSG("DEVICE_D"); - status = wr0(USB_DeviceDescriptor, sizeof(USB_DeviceDescriptor), status); + //MSG("DEVICE_D"); + wr0(USB_DeviceDescriptor, sizeof(USB_DeviceDescriptor)); break; case CONFIGURATION_DESCRIPTOR: - MSG("CONF_D"); - status = wr0(USB_ConfigDescriptor, sizeof(USB_ConfigDescriptor), status); + //MSG("CONF_D"); + wr0(USB_ConfigDescriptor, sizeof(USB_ConfigDescriptor)); break; case STRING_LANG_DESCRIPTOR: - MSG("S_L_D"); - status = wr0((const uint8_t *)&USB_StringLangDescriptor, STRING_LANG_DESCRIPTOR_SIZE_BYTE, status); + //MSG("S_L_D"); + wr0((const uint8_t *)&USB_StringLangDescriptor, STRING_LANG_DESCRIPTOR_SIZE_BYTE); break; case STRING_MAN_DESCRIPTOR: - MSG("S_M_D"); - status = wr0((const uint8_t *)&USB_StringManufacturingDescriptor, USB_StringManufacturingDescriptor.bLength, status); + //MSG("S_M_D"); + wr0((const uint8_t *)&USB_StringManufacturingDescriptor, USB_StringManufacturingDescriptor.bLength); break; case STRING_PROD_DESCRIPTOR: - MSG("S_P_D"); - status = wr0((const uint8_t *)&USB_StringProdDescriptor, USB_StringProdDescriptor.bLength, status); + //MSG("S_P_D"); + wr0((const uint8_t *)&USB_StringProdDescriptor, USB_StringProdDescriptor.bLength); break; case STRING_SN_DESCRIPTOR: - MSG("S_SN_D"); - status = wr0((const uint8_t *)&USB_StringSerialDescriptor, USB_StringSerialDescriptor.bLength, status); + //MSG("S_SN_D"); + wr0((const uint8_t *)&USB_StringSerialDescriptor, USB_StringSerialDescriptor.bLength); break; case DEVICE_QUALIFIER_DESCRIPTOR: - MSG("D_Q_D"); - status = wr0(USB_DeviceQualifierDescriptor, USB_DeviceQualifierDescriptor[0], status); + //MSG("D_Q_D"); + wr0(USB_DeviceQualifierDescriptor, USB_DeviceQualifierDescriptor[0]); break; default: DBG("WTF?"); break; } - return status; } static uint8_t configuration = 0; // reply for GET_CONFIGURATION (==1 if configured) -static inline uint16_t std_d2h_req(uint16_t status){ +static inline void std_d2h_req(){ uint16_t state = 0; // bus powered switch(setup_packet.bRequest){ case GET_DESCRIPTOR: - status = get_descriptor(status); + get_descriptor(); break; case GET_STATUS: - MSG("GET_STAT"); + //MSG("GET_STAT"); EP_WriteIRQ(0, (uint8_t *)&state, 2); // send status: Bus Powered break; case GET_CONFIGURATION: - MSG("GET_CONF"); + //MSG("GET_CONF"); EP_WriteIRQ(0, &configuration, 1); break; default: DBG("WTF?"); break; } - return status; } static inline void std_h2d_req(){ switch(setup_packet.bRequest){ case SET_ADDRESS: - MSG("SET_ADDR"); + //MSG("SET_ADDR"); // new address will be assigned later - after acknowlegement or request to host USB_Dev.USB_Addr = setup_packet.wValue; break; case SET_CONFIGURATION: - MSG("SET_CONF"); + //MSG("SET_CONF"); // Now device configured USB_Dev.USB_Status = USB_STATE_CONFIGURED; configuration = setup_packet.wValue; @@ -323,47 +308,48 @@ bmRequestType: 76543210 * @param ep - endpoint state * @return data written to EP0R */ -static uint16_t EP0_Handler(ep_t ep){ - uint16_t epstatus = ep.status; // EP0R on input -> return this value after modifications +static void EP0_Handler(){ uint8_t reqtype = setup_packet.bmRequestType & 0x7f; uint8_t dev2host = (setup_packet.bmRequestType & 0x80) ? 1 : 0; - if ((ep.rx_flag) && (ep.setup_flag)){ + uint16_t epstatus = USB->EPnR[0]; + int rxflag = RX_FLAG(epstatus); + if(rxflag && SETUP_FLAG(epstatus)){ switch(reqtype){ case STANDARD_DEVICE_REQUEST_TYPE: // standard device request + //DBG("SDRT"); if(dev2host){ - epstatus = std_d2h_req(epstatus); + std_d2h_req(); }else{ std_h2d_req(); EP_WriteIRQ(0, (uint8_t *)0, 0); } -// epstatus = SET_VALID_TX(epstatus); break; case STANDARD_ENDPOINT_REQUEST_TYPE: // standard endpoint request + //DBG("SERT"); if(setup_packet.bRequest == CLEAR_FEATURE){ - MSG("CLEAR_F"); + //MSG("CLEAR_F"); EP_WriteIRQ(0, (uint8_t *)0, 0); -// epstatus = SET_VALID_TX(epstatus); }else{ DBG("WTF?"); } break; case CONTROL_REQUEST_TYPE: + //DBG("CRT"); switch(setup_packet.bRequest){ case GET_LINE_CODING: - MSG("GET_LINE_C"); + //MSG("GET_LINE_C"); EP_WriteIRQ(0, (uint8_t*)&lineCoding, sizeof(lineCoding)); break; case SET_LINE_CODING: // omit this for next stage, when data will come - MSG("SET_LINE_C"); - usbON = 1; + //MSG("SET_LINE_C"); break; case SET_CONTROL_LINE_STATE: - MSG("SET_CLS"); + //MSG("SET_CLS"); usbON = 1; clstate_handler(setup_packet.wValue); break; case SEND_BREAK: - MSG("SEND_BREAK"); + //MSG("SEND_BREAK"); usbON = 0; break_handler(); break; @@ -372,39 +358,31 @@ static uint16_t EP0_Handler(ep_t ep){ break; } if(setup_packet.bRequest != GET_LINE_CODING) EP_WriteIRQ(0, (uint8_t *)0, 0); -// epstatus = SET_VALID_RX(epstatus); -// epstatus = SET_VALID_TX(epstatus); break; default: EP_WriteIRQ(0, (uint8_t *)0, 0); DBG("WTF?"); -// epstatus = SET_NAK_RX(epstatus); -// epstatus = SET_VALID_TX(epstatus); } - }else if (ep.rx_flag){ // got data over EP0 or host acknowlegement - if(ep.rx_cnt){ + }else if(rxflag){ // got data over EP0 or host acknowlegement + if(endpoints[0].rx_cnt){ if(setup_packet.bRequest == SET_LINE_CODING){ linecoding_handler((usb_LineCoding*)ep0databuf); } } - // wait for new data from host -// epstatus = SET_VALID_RX(epstatus); -// epstatus = SET_STALL_TX(epstatus); - } else if (ep.tx_flag){ // package transmitted + }else if(TX_FLAG(epstatus)){ // package transmitted // now we can change address after enumeration - if ((USB->DADDR & USB_DADDR_ADD) != USB_Dev.USB_Addr){ + if((USB->DADDR & USB_DADDR_ADD) != USB_Dev.USB_Addr){ USB->DADDR = USB_DADDR_EF | USB_Dev.USB_Addr; // change state to ADRESSED USB_Dev.USB_Status = USB_STATE_ADDRESSED; - DBG("Addressed"); + //DBG("Addressed"); } - // end of transaction -// epstatus = SET_VALID_RX(epstatus); -// epstatus = SET_VALID_TX(epstatus); } - epstatus = SET_VALID_RX(epstatus); - epstatus = SET_VALID_TX(epstatus); - return epstatus; + epstatus = KEEP_DTOG(USB->EPnR[0]); + if(rxflag) epstatus ^= USB_EPnR_STAT_TX; // start ZLP/data transmission + else epstatus &= ~USB_EPnR_STAT_TX; // or leave unchanged + // keep DTOGs, clear CTR_RX,TX, set RX VALID + USB->EPnR[0] = (epstatus & ~(USB_EPnR_CTR_RX|USB_EPnR_CTR_TX)) ^ USB_EPnR_STAT_RX; } static uint16_t lastaddr = LASTADDR_DEFAULT; @@ -417,7 +395,7 @@ static uint16_t lastaddr = LASTADDR_DEFAULT; * @param uint16_t (*func)(ep_t *ep) - EP handler function * @return 0 if all OK */ -int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, uint16_t (*func)(ep_t ep)){ +int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, void (*func)(ep_t ep)){ if(number >= STM32ENDPOINTS) return 4; // out of configured amount if(txsz > USB_BTABLE_SIZE || rxsz > USB_BTABLE_SIZE) return 1; // buffer too large if(lastaddr + txsz + rxsz >= USB_BTABLE_SIZE) return 2; // out of btable @@ -446,11 +424,11 @@ int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, uint16_t //extern int8_t dump; // standard IRQ handler void usb_lp_can_rx0_isr(){ - if (USB->ISTR & USB_ISTR_RESET){ - DBG("reset"); + if(USB->ISTR & USB_ISTR_RESET){ + //DBG("USB reset"); usbON = 0; // Reinit registers - USB->CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM | USB_CNTR_SUSPM; + USB->CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM; // Endpoint 0 - CONTROL // ON USB LS size of EP0 may be 8 bytes, but on FS it should be 64 bytes! lastaddr = LASTADDR_DEFAULT; @@ -458,6 +436,7 @@ void usb_lp_can_rx0_isr(){ USB->DADDR = USB_DADDR_EF; // state is default - wait for enumeration USB_Dev.USB_Status = USB_STATE_DEFAULT; + USB->ISTR = ~USB_ISTR_RESET; if(EP_Init(0, EP_TYPE_CONTROL, USB_EP0_BUFSZ, USB_EP0_BUFSZ, EP0_Handler)){ return; } @@ -467,11 +446,6 @@ void usb_lp_can_rx0_isr(){ uint8_t n = USB->ISTR & USB_ISTR_EPID; // copy status register uint16_t epstatus = USB->EPnR[n]; - // dump = 1; - // Calculate flags - endpoints[n].rx_flag = (epstatus & USB_EPnR_CTR_RX) ? 1 : 0; - endpoints[n].setup_flag = (epstatus & USB_EPnR_SETUP) ? 1 : 0; - endpoints[n].tx_flag = (epstatus & USB_EPnR_CTR_TX) ? 1 : 0; // copy received bytes amount endpoints[n].rx_cnt = USB_BTABLE->EP[n].USB_COUNT_RX & 0x3FF; // low 10 bits is counter // check direction @@ -489,23 +463,20 @@ void usb_lp_can_rx0_isr(){ }else{ // IN interrupt - transmit data, only CTR_TX == 1 // enumeration end could be MSG (if EP0) } - // prepare status field for EP handler - endpoints[n].status = epstatus; - // call EP handler (even if it will change EPnR, it should return new status) - epstatus = endpoints[n].func(endpoints[n]); - // keep DTOG state - epstatus = KEEP_DTOG_TX(epstatus); - epstatus = KEEP_DTOG_RX(epstatus); - // clear all RX/TX flags - epstatus = CLEAR_CTR_RX(epstatus); - epstatus = CLEAR_CTR_TX(epstatus); - // refresh EPnR - USB->EPnR[n] = epstatus; + // call EP handler + if(endpoints[n].func) endpoints[n].func(endpoints[n]); } if(USB->ISTR & USB_ISTR_SUSP){ // suspend -> still no connection, may sleep + //DBG("USB suspend"); usbON = 0; + USB->CNTR |= USB_CNTR_FSUSP | USB_CNTR_LP_MODE; + USB->ISTR = ~USB_ISTR_SUSP; + } + if(USB->ISTR & USB_ISTR_WKUP){ // wakeup + //DBG("USB wakeup"); + USB->CNTR &= ~(USB_CNTR_FSUSP | USB_CNTR_LP_MODE); // clear suspend flags + USB->ISTR = ~USB_ISTR_WKUP; } - USB->ISTR = 0; } /** @@ -534,13 +505,10 @@ void EP_WriteIRQ(uint8_t number, const uint8_t *buf, uint16_t size){ * @param size - its size */ void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size){ - uint16_t status = USB->EPnR[number]; EP_WriteIRQ(number, buf, size); - //status = SET_NAK_RX(status); - status = SET_VALID_TX(status); - status = KEEP_DTOG_TX(status); - status = KEEP_DTOG_RX(status); - USB->EPnR[number] = status; + uint16_t status = KEEP_DTOG(USB->EPnR[number]); + // keep DTOGs, clear CTR_TX & set TX VALID to start transmission + USB->EPnR[number] = (status & ~(USB_EPnR_CTR_TX)) ^ USB_EPnR_STAT_TX; } /* @@ -549,11 +517,14 @@ void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size){ * @return amount of data read */ int EP_Read(uint8_t number, uint16_t *buf){ - int n = (endpoints[number].rx_cnt + 1) >> 1; + int sz = endpoints[number].rx_cnt; + if(!sz) return 0; + endpoints[number].rx_cnt = 0; + int n = (sz + 1) >> 1; uint32_t *in = (uint32_t *)endpoints[number].rx_buf; if(n){ for(int i = 0; i < n; ++i, ++in) buf[i] = *(uint16_t*)in; } - return endpoints[number].rx_cnt; + return sz; } diff --git a/F1-nolib/CDC_ACM/usb_lib.h b/F1-nolib/CDC_ACM/usb_lib.h index 54610a9..e4f63ba 100644 --- a/F1-nolib/CDC_ACM/usb_lib.h +++ b/F1-nolib/CDC_ACM/usb_lib.h @@ -78,6 +78,17 @@ #define STRING_SN_DESCRIPTOR 0x303 #define DEVICE_QUALIFIER_DESCRIPTOR 0x600 +#define RX_FLAG(epstat) (epstat & USB_EPnR_CTR_RX) +#define TX_FLAG(epstat) (epstat & USB_EPnR_CTR_TX) +#define SETUP_FLAG(epstat) (epstat & USB_EPnR_SETUP) + +// keep all DTOGs and STATs +#define KEEP_DTOG_STAT(EPnR) (EPnR & ~(USB_EPnR_STAT_RX|USB_EPnR_STAT_TX|USB_EPnR_DTOG_RX|USB_EPnR_DTOG_TX)) +#define KEEP_DTOG(EPnR) (EPnR & ~(USB_EPnR_DTOG_RX|USB_EPnR_DTOG_TX)) + +//#define RX_CNT(N) (USB_BTABLE->EP[N].USB_COUNT_RX & 0x3FF) + +/* // EPnR bits manipulation #define CLEAR_DTOG_RX(R) (R & USB_EPnR_DTOG_RX) ? R : (R & (~USB_EPnR_DTOG_RX)) #define SET_DTOG_RX(R) (R & USB_EPnR_DTOG_RX) ? (R & (~USB_EPnR_DTOG_RX)) : R @@ -98,6 +109,7 @@ #define CLEAR_CTR_RX(R) (R & (~USB_EPnR_CTR_RX)) #define CLEAR_CTR_TX(R) (R & (~USB_EPnR_CTR_TX)) #define CLEAR_CTR_RX_TX(R) (R & (~(USB_EPnR_CTR_TX | USB_EPnR_CTR_RX))) +*/ // USB state: uninitialized, addressed, ready for use typedef enum{ @@ -151,12 +163,8 @@ typedef struct __ep_t{ uint16_t *tx_buf; // transmission buffer address uint16_t txbufsz; // transmission buffer size uint16_t *rx_buf; // reception buffer address - uint16_t (*func)(); // endpoint action function - uint16_t status; // status flags + void (*func)(); // endpoint action function unsigned rx_cnt : 10; // received data counter - unsigned tx_flag : 1; // transmission flag - unsigned rx_flag : 1; // reception flag - unsigned setup_flag : 1; // this is setup packet (only for EP0) } ep_t; // USB status & its address @@ -194,7 +202,7 @@ extern uint8_t usbON; void USB_Init(); void USB_ResetState(); -int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, uint16_t (*func)(ep_t ep)); +int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, void (*func)()); void EP_WriteIRQ(uint8_t number, const uint8_t *buf, uint16_t size); void EP_Write(uint8_t number, const uint8_t *buf, uint16_t size); int EP_Read(uint8_t number, uint16_t *buf); diff --git a/F1-nolib/F1_testbrd/pl2303.bin b/F1-nolib/F1_testbrd/pl2303.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/LED_Screen/LEDscreen.bin b/F1-nolib/LED_Screen/LEDscreen.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/LED_Screen/genlist b/F1-nolib/LED_Screen/genlist old mode 100644 new mode 100755 diff --git a/F1-nolib/LED_Screen/scrtest/scrtest b/F1-nolib/LED_Screen/scrtest/scrtest old mode 100644 new mode 100755 diff --git a/F1-nolib/PL2303/pl2303.bin b/F1-nolib/PL2303/pl2303.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/SPI/SPI.bin b/F1-nolib/SPI/SPI.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/USB_HID/usbhid103.bin b/F1-nolib/USB_HID/usbhid103.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/chronometer/chrono.bin b/F1-nolib/chronometer/chrono.bin old mode 100755 new mode 100644 diff --git a/F1-nolib/chronometer_v2/chrono.bin b/F1-nolib/chronometer_v2/chrono.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/led_blink/blink.bin b/F1-nolib/led_blink/blink.bin old mode 100644 new mode 100755 diff --git a/F1-nolib/uart/uart.bin b/F1-nolib/uart/uart.bin old mode 100644 new mode 100755 diff --git a/F1/1_wire/onewire.bin b/F1/1_wire/onewire.bin old mode 100644 new mode 100755 diff --git a/F1/2.8TFT/dma_gpio.bin b/F1/2.8TFT/dma_gpio.bin old mode 100644 new mode 100755 diff --git a/F1/DMA_GPIO/dma_gpio.bin b/F1/DMA_GPIO/dma_gpio.bin old mode 100644 new mode 100755 diff --git a/F1/GPIO_TIM/tim_gpio.bin b/F1/GPIO_TIM/tim_gpio.bin old mode 100644 new mode 100755 diff --git a/F1/GPS+ultrasonic/timelapse.bin b/F1/GPS+ultrasonic/timelapse.bin old mode 100644 new mode 100755 diff --git a/F1/GPS/GPS.bin b/F1/GPS/GPS.bin old mode 100644 new mode 100755 diff --git a/F1/Jeep_generator/jeep_generator.bin b/F1/Jeep_generator/jeep_generator.bin old mode 100644 new mode 100755 diff --git a/F1/Timelapse_keyboard/timelapse.bin b/F1/Timelapse_keyboard/timelapse.bin old mode 100644 new mode 100755 diff --git a/F1/Timelapse_keyboard_only_lasers/timelapse.bin b/F1/Timelapse_keyboard_only_lasers/timelapse.bin old mode 100644 new mode 100755 diff --git a/F1/USBCDC_template/usb_cdc_simple.bin b/F1/USBCDC_template/usb_cdc_simple.bin old mode 100644 new mode 100755 diff --git a/F1/canon_lens/canon_lens.bin b/F1/canon_lens/canon_lens.bin old mode 100644 new mode 100755 diff --git a/F1/distance_meters/ultrasonic.bin b/F1/distance_meters/ultrasonic.bin old mode 100644 new mode 100755 diff --git a/F1/hid_mouse_keyboard/usbhid.bin b/F1/hid_mouse_keyboard/usbhid.bin old mode 100644 new mode 100755 diff --git a/F1/keyboard_snippet/keyboard.bin b/F1/keyboard_snippet/keyboard.bin old mode 100644 new mode 100755 diff --git a/F1/matrix_keyboard/matrkeyb.bin b/F1/matrix_keyboard/matrkeyb.bin old mode 100644 new mode 100755 diff --git a/F1/nokia5110/nokia5110.bin b/F1/nokia5110/nokia5110.bin old mode 100644 new mode 100755 diff --git a/F1/simple_cdc/usb_cdc_simple.bin b/F1/simple_cdc/usb_cdc_simple.bin old mode 100644 new mode 100755 diff --git a/F1/stepper_motion/usb_cdc_simple.bin b/F1/stepper_motion/usb_cdc_simple.bin old mode 100644 new mode 100755 diff --git a/F1/ultrasonic/ultrasonic.bin b/F1/ultrasonic/ultrasonic.bin old mode 100644 new mode 100755