From 7fa84cb0ef159d649b7acc12cdfc0abfb54572e0 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Sat, 29 Apr 2023 16:35:43 +0300 Subject: [PATCH] works, but still have a lot of bugzzz --- F1:F103/CDC_ACM/cdcacm.bin | Bin 4684 -> 4672 bytes F3:F303/Seven_CDCs/cmdproto.c | 2 +- F3:F303/Seven_CDCs/debug.h | 2 + F3:F303/Seven_CDCs/main.c | 6 +-- F3:F303/Seven_CDCs/sevenCDCs.bin | Bin 7332 -> 8416 bytes F3:F303/Seven_CDCs/usart.c | 43 +++++++++++++---- F3:F303/Seven_CDCs/usart.h | 2 +- F3:F303/Seven_CDCs/usb.c | 15 +++--- F3:F303/Seven_CDCs/usb.h | 15 ++++-- F3:F303/Seven_CDCs/usb_lib.c | 76 +++++++++++++++++++++---------- F3:F303/Seven_CDCs/usb_lib.h | 2 +- F3:F303/Seven_CDCs/usbhw.c | 31 +++++++++---- F3:F303/Seven_CDCs/usbhw.h | 7 +-- F3:F303/Seven_CDCs/version.inc | 4 +- 14 files changed, 138 insertions(+), 67 deletions(-) diff --git a/F1:F103/CDC_ACM/cdcacm.bin b/F1:F103/CDC_ACM/cdcacm.bin index cf38f7dd5ddf848bee311e724341d9fd32eba173..cb3bc43e3c6f4d9479b837f6800343421a221969 100755 GIT binary patch delta 137 zcmX@3azJH+1q&n3W=od&OoEz%3>+~G3<|P9S^`K5On%AM%$T@2m;EuD+~G3<{b+S^`MROn%AM%$U15m;EuDo!@&EVsAOD^+yk&U60JIBapUGxML3>63aGxtK diff --git a/F3:F303/Seven_CDCs/cmdproto.c b/F3:F303/Seven_CDCs/cmdproto.c index cf607fe..0776302 100644 --- a/F3:F303/Seven_CDCs/cmdproto.c +++ b/F3:F303/Seven_CDCs/cmdproto.c @@ -69,7 +69,7 @@ void parse_cmd(const char *buf){ uint32_t Num = 0; const char *nxt; char cmd = *buf++; - if(cmd > '0'+CMD_EPNO && cmd <= '0'+DBG_EPNO){ // send data to iface + if(cmd > '0'+CMD_EPNO && cmd <= '0'+MAX_EPNO){ // send data to iface cmd -= '1'; if(USBON(cmd)){ SENDN("OK"); diff --git a/F3:F303/Seven_CDCs/debug.h b/F3:F303/Seven_CDCs/debug.h index 793ff6b..c225f54 100644 --- a/F3:F303/Seven_CDCs/debug.h +++ b/F3:F303/Seven_CDCs/debug.h @@ -23,10 +23,12 @@ #ifdef EBUG #define DBG(str) do{USB_sendstr(DBG_IDX, __FILE__ " (L" STR(__LINE__) "): " str); newline(DBG_IDX);}while(0) #define DBGmesg(str) do{USB_sendstr(DBG_IDX, str);}while(0) +#define DBGmesgn(str,n) do{USB_send(DBG_IDX, str, n);}while(0) #define DBGnl() newline(DBG_IDX) #else #define DBG(str) #define DBGmesg(str) +#define DBGmesgn(str,n) #define DBGnl() #endif diff --git a/F3:F303/Seven_CDCs/main.c b/F3:F303/Seven_CDCs/main.c index 9de99b7..b09f5d4 100644 --- a/F3:F303/Seven_CDCs/main.c +++ b/F3:F303/Seven_CDCs/main.c @@ -32,7 +32,7 @@ void sys_tick_handler(void){ } 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"}; +static const char *idxnames[MAX_IDX] = {"CMD", "DBG", "USART1", "USART2", "USART3", "NOFUNCT", "CAN"}; int main(void){ char inbuff[MAXSTRLEN+1]; @@ -68,10 +68,6 @@ int main(void){ 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); diff --git a/F3:F303/Seven_CDCs/sevenCDCs.bin b/F3:F303/Seven_CDCs/sevenCDCs.bin index a3b872e0f75f5eaa3fd13a54cdb29a22a7fb3fec..a66c56dd49fae6b66fb3f5b9bcac5ed36c9a3bc2 100755 GIT binary patch literal 8416 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 ay!m;7W&RsvSLay( diff --git a/F3:F303/Seven_CDCs/usart.c b/F3:F303/Seven_CDCs/usart.c index 447290a..f451ae4 100644 --- a/F3:F303/Seven_CDCs/usart.c +++ b/F3:F303/Seven_CDCs/usart.c @@ -17,7 +17,9 @@ */ #include "stm32f3.h" +#include "debug.h" #include "hardware.h" +#include "strfunc.h" #include "usart.h" #include "usb.h" #include @@ -31,12 +33,12 @@ volatile int linerdy = 0, // received data ready bufovr = 0; // input buffer overfull // USARTs speeds static usb_LineCoding lineCodings[USARTSNO+1] = { - {115200, USB_CDC_1_STOP_BITS, USB_CDC_NO_PARITY, 8}, {0}}; + {9600, USB_CDC_1_STOP_BITS, USB_CDC_NO_PARITY, 8}, {0}}; usb_LineCoding *getLineCoding(int ifNo){ int usartNo = ifNo - USART1_EPNO + 1; if(usartNo < 1 || usartNo > USARTSNO) return lineCodings; - return & lineCodings[usartNo]; + return &lineCodings[usartNo]; // TODO: fixme for different settings //lineCoding.dwDTERate = speeds[usartNo]; //lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; @@ -44,14 +46,14 @@ usb_LineCoding *getLineCoding(int ifNo){ //lineCoding.bDataBits = 8; } -void usart_putchar(uint8_t ch){ - while(!(USART1->ISR & USART_ISR_TXE)); - USART1->TDR = ch; +static void usart_putchar(int no, uint8_t ch){ + while(!(USARTx[no]->ISR & USART_ISR_TXE)); + USARTx[no]->TDR = ch; } -void usart_sendn(const uint8_t *str, int L){ - if(!str || L < 0) return; +void usart_sendn(int no, const uint8_t *str, int L){ + if(!str || L < 0 || no < 1 || no > USARTSNO) return; for(int i = 0; i < L; ++i){ - usart_putchar(str[i]); + usart_putchar(no, str[i]); } } @@ -60,17 +62,21 @@ void usarts_setup(){ // clock RCC->APB1ENR |= RCC_APB1ENR_USART2EN | RCC_APB1ENR_USART3EN; RCC->APB2ENR |= RCC_APB2ENR_USART1EN; + for(int i = USART1_IDX; i <= USART3_IDX; ++i) + usart_config(i, lineCodings); NVIC_EnableIRQ(USART1_IRQn); NVIC_EnableIRQ(USART2_IRQn); NVIC_EnableIRQ(USART3_IRQn); } void usart_config(uint8_t ifNo, usb_LineCoding *lc){ - int usartNo = ifNo - USART1_EPNO + 1; + int usartNo = ifNo - USART1_IDX + 1; if(usartNo < 1 || usartNo > USARTSNO) return; + DBGmesg("setup USART"); DBGmesg(u2str(usartNo)); DBGnl(); lineCodings[usartNo] = *lc; // FIXME: change also parity and so on volatile USART_TypeDef *U = USARTx[usartNo]; + U->CR1 = 0; // disable for reconfigure U->ICR = 0xffffffff; // clear all flags U->BRR = SysFreq / lc->dwDTERate; U->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE | USART_CR1_RXNEIE; // 1start,8data,nstop; enable Rx,Tx,USART @@ -81,8 +87,25 @@ void usart_config(uint8_t ifNo, usb_LineCoding *lc){ void usart1_exti25_isr(){ if(USART1->ISR & USART_ISR_RXNE){ // RX not emty - receive next char + DBG("got\n"); // read RDR clears flag uint8_t rb = USART1->RDR; - USB_putbyte(1, rb); + USB_putbyte(USART1_IDX, rb); + } +} + +void usart2_exti26_isr(){ + if(USART2->ISR & USART_ISR_RXNE){ + DBG("got\n"); + uint8_t rb = USART2->RDR; + USB_putbyte(USART2_IDX, rb); + } +} + +void usart3_exti28_isr(){ + if(USART3->ISR & USART_ISR_RXNE){ + DBG("got\n"); + uint8_t rb = USART3->RDR; + USB_putbyte(USART3_IDX, rb); } } diff --git a/F3:F303/Seven_CDCs/usart.h b/F3:F303/Seven_CDCs/usart.h index 2d40ee7..81bad8c 100644 --- a/F3:F303/Seven_CDCs/usart.h +++ b/F3:F303/Seven_CDCs/usart.h @@ -30,7 +30,7 @@ extern volatile int linerdy, bufovr; void usarts_setup(); void usart_config(uint8_t ifNo, usb_LineCoding *lc); -void usart_sendn(const uint8_t *str, int L); +void usart_sendn(int no, const uint8_t *str, int L); usb_LineCoding *getLineCoding(int ifNo); #endif // __USART_H__ diff --git a/F3:F303/Seven_CDCs/usb.c b/F3:F303/Seven_CDCs/usb.c index b0feeb7..de17081 100644 --- a/F3:F303/Seven_CDCs/usb.c +++ b/F3:F303/Seven_CDCs/usb.c @@ -27,7 +27,7 @@ static volatile uint8_t usbbuff[USB_TRBUFSZ]; // temporary buffer for sending da static uint8_t obuf[WORK_EPs][RBOUTSZ], ibuf[WORK_EPs][RBINSZ]; #define OBUF(N) {.data = obuf[N], .length = RBOUTSZ, .head = 0, .tail = 0} volatile ringbuffer rbout[WORK_EPs] = {OBUF(0), OBUF(1), OBUF(2), OBUF(3), OBUF(4), OBUF(5), OBUF(6)}; -#define IBUF(N) {.data = ibuf[N], .length = RBOUTSZ, .head = 0, .tail = 0} +#define IBUF(N) {.data = ibuf[N], .length = RBINSZ, .head = 0, .tail = 0} volatile ringbuffer rbin[WORK_EPs] = {IBUF(0), IBUF(1), IBUF(2), IBUF(3), IBUF(4), IBUF(5), IBUF(6)}; // transmission is succesfull volatile uint8_t bufisempty[WORK_EPs] = {1,1,1,1,1,1,1}; @@ -39,7 +39,7 @@ void send_next(int ifNo){ static uint8_t lastdsz[WORK_EPs] = {0}; int buflen = RB_read((ringbuffer*)&rbout[ifNo], (uint8_t*)usbbuff, USB_TRBUFSZ); if(!buflen){ - if(lastdsz[ifNo] == 64) EP_Write(ifNo+1, NULL, 0); // send ZLP after 64 bits packet when nothing more to send + if(lastdsz[ifNo] == USB_TRBUFSZ) EP_Write(ifNo+1, NULL, 0); // send ZLP after 64 bits packet when nothing more to send lastdsz[ifNo] = 0; bufisempty[ifNo] = 1; return; @@ -62,7 +62,7 @@ int USB_send(int ifNo, const uint8_t *buf, int len){ uint32_t T = Tms; while(len){ int a = RB_write((ringbuffer*)&rbout[ifNo], buf, len); - if(a == 0 && Tms - T > 5){ + if(a == 0 && Tms - T > 5){ // buffer overflow && timeout -> interface disconnected usbON &= ~(1< #include "debug.h" -#ifdef EBUG #include "strfunc.h" -#endif #include "usart.h" #include "usb.h" #include "usb_lib.h" @@ -188,7 +186,7 @@ static const uint8_t USB_ConfigDescriptor[] = { 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x00, /* bInterfaceProtocol */ - iINTERFACE_DESCR_USART1, /* iInterface: */ + iINTERFACE_DESCR_DBG, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ @@ -269,7 +267,7 @@ static const uint8_t USB_ConfigDescriptor[] = { 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x00, /* bInterfaceProtocol */ - iINTERFACE_DESCR_USART2, /* iInterface: */ + iINTERFACE_DESCR_USART1, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ @@ -350,7 +348,7 @@ static const uint8_t USB_ConfigDescriptor[] = { 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x00, /* bInterfaceProtocol */ - iINTERFACE_DESCR_USART3, /* iInterface: */ + iINTERFACE_DESCR_USART2, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ @@ -430,8 +428,8 @@ static const uint8_t USB_ConfigDescriptor[] = { 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ - iINTERFACE_DESCR_USART4, /* bInterfaceProtocol */ - 0x00, /* iInterface: */ + 0x00, /* bInterfaceProtocol */ + iINTERFACE_DESCR_USART3, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ @@ -512,7 +510,7 @@ static const uint8_t USB_ConfigDescriptor[] = { 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x00, /* bInterfaceProtocol */ - iINTERFACE_DESCR_CAN, /* iInterface: */ + iINTERFACE_DESCR_USART4, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ @@ -593,7 +591,7 @@ static const uint8_t USB_ConfigDescriptor[] = { 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x00, /* bInterfaceProtocol */ - iINTERFACE_DESCR_DBG, /* iInterface: */ + iINTERFACE_DESCR_CAN, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ 0x24, /* bDescriptorType: CS_INTERFACE */ @@ -673,12 +671,12 @@ static void const *StringDescriptor[iDESCR_AMOUNT] = { [iPRODUCT_DESCR] = &PD, [iSERIAL_DESCR] = &SD, [iINTERFACE_DESCR_CMD] = &ID0, + [iINTERFACE_DESCR_DBG] = &ID6, [iINTERFACE_DESCR_USART1] = &ID1, [iINTERFACE_DESCR_USART2] = &ID2, [iINTERFACE_DESCR_USART3] = &ID3, [iINTERFACE_DESCR_USART4] = &ID4, - [iINTERFACE_DESCR_CAN] = &ID5, - [iINTERFACE_DESCR_DBG] = &ID6 + [iINTERFACE_DESCR_CAN] = &ID5 }; static void wr0(const uint8_t *buf, uint16_t size){ @@ -760,9 +758,30 @@ static void rxtx_Handler(uint8_t epno){ 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); + DBG("epno"); + DBGmesg(u2str(epno)); DBGmesg(" ("); DBGmesg(u2str(sz)); + DBGmesg(") > "); hexdump(DBG_IDX, buf, sz); DBGnl(); if(sz){ - if(RB_write((ringbuffer*)&rbin[idx], buf, sz) != sz) bufovrfl[idx] = 1; + switch(epno){ + case USART1_EPNO: + usart_sendn(1, buf, sz); + break; + case USART2_EPNO: + usart_sendn(2, buf, sz); + break; + case USART3_EPNO: + usart_sendn(3, buf, sz); + break; + case USART4_EPNO: + ; // we have no USART4 in STM32F303CBT6 + break; + default: + if(RB_write((ringbuffer*)&rbin[idx], buf, sz) != sz) bufovrfl[idx] = 1; + } } + /*if(epno != DBG_EPNO){ + MSG(); + }*/ // set ACK Rx USB->EPnR[epno] = (KEEP_DTOG(USB->EPnR[epno]) & ~(USB_EPnR_STAT_TX)) ^ USB_EPnR_STAT_RX; }else{ @@ -807,9 +826,13 @@ 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(iFno != DBG_IDX){ + DBGmesg(uhex2str(epstatus)); + DBGmesg(" ("); DBGmesg(u2str(iFno)); + DBGmesg(") - "); hexdump(DBG_IDX, (uint8_t*)setup_packet, sizeof(config_pack_t)); + } if(rxflag && SETUP_FLAG(epstatus)){ + if(iFno != DBG_IDX){DBGmesg("setup\n");} switch(reqtype){ case STANDARD_DEVICE_REQUEST_TYPE: // standard device request if(dev2host){ @@ -827,24 +850,24 @@ void EP0_Handler(uint8_t __attribute__((unused)) epno){ case CONTROL_REQUEST_TYPE: switch(setup_packet->bRequest){ case GET_LINE_CODING: - DBG("GLC"); + if(iFno != DBG_IDX){ 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"); + if(iFno != DBG_IDX){ DBG("SLC");} break; case SET_CONTROL_LINE_STATE: - DBG("SCLS"); + if(iFno != DBG_IDX){ DBG("SCLS");} usbON |= 1 << iFno; // now this interface is connected break; case SEND_BREAK: - DBG("B"); + if(iFno != DBG_IDX){ DBG("B");} usbON &= ~(1<bRequest != GET_LINE_CODING) EP_WriteIRQ(0, (uint8_t *)0, 0); // write acknowledgement @@ -853,11 +876,16 @@ void EP0_Handler(uint8_t __attribute__((unused)) epno){ EP_WriteIRQ(0, (uint8_t *)0, 0); } }else if(rxflag){ // got data over EP0 or host acknowlegement - if(endpoints[0].rx_cnt){ - if(setup_packet->bRequest == SET_LINE_CODING){ - usart_config(iFno + 1 - USART1_EPNO, (usb_LineCoding*)ep0databuf); - } - } + if(iFno != DBG_IDX){ DBGmesg("rxflag\n");} + //if(endpoints[0].rx_cnt){ + // if(setup_packet->bRequest == SET_LINE_CODING){ + if(iFno != DBG_IDX){ + DBGmesg("USART"); DBGmesg(u2str(iFno + 2 - USART1_EPNO)); + DBGmesg(" speed = "); DBGmesg(u2str(((usb_LineCoding*)ep0databuf)->dwDTERate)); DBGnl(); + } + usart_config(iFno, (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){ diff --git a/F3:F303/Seven_CDCs/usb_lib.h b/F3:F303/Seven_CDCs/usb_lib.h index 993e6dc..13e45a5 100644 --- a/F3:F303/Seven_CDCs/usb_lib.h +++ b/F3:F303/Seven_CDCs/usb_lib.h @@ -67,12 +67,12 @@ enum{ iPRODUCT_DESCR, iSERIAL_DESCR, iINTERFACE_DESCR_CMD, + iINTERFACE_DESCR_DBG, iINTERFACE_DESCR_USART1, iINTERFACE_DESCR_USART2, iINTERFACE_DESCR_USART3, iINTERFACE_DESCR_USART4, iINTERFACE_DESCR_CAN, - iINTERFACE_DESCR_DBG, iDESCR_AMOUNT }; diff --git a/F3:F303/Seven_CDCs/usbhw.c b/F3:F303/Seven_CDCs/usbhw.c index 33a5c6e..9dfe6bc 100644 --- a/F3:F303/Seven_CDCs/usbhw.c +++ b/F3:F303/Seven_CDCs/usbhw.c @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +#include "debug.h" #include "usb.h" #include "usb_lib.h" @@ -33,7 +34,7 @@ void USB_setup(){ USB->BTABLE = 0; USB->DADDR = 0; USB->ISTR = 0; - USB->CNTR = USB_CNTR_RESETM | USB_CNTR_WKUPM; // allow only wakeup & reset interrupts + USB->CNTR = USB_CNTR_RESETM;// | USB_CNTR_WKUPM; // allow only wakeup & reset interrupts NVIC_EnableIRQ(USB_LP_IRQn); } @@ -50,11 +51,11 @@ static uint16_t lastaddr = LASTADDR_DEFAULT; int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, void (*func)(uint8_t epno)){ 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 + if(lastaddr + txsz + rxsz >= USB_BTABLE_SIZE/ACCESSZ) return 2; // out of btable USB->EPnR[number] = (type << 9) | (number & USB_EPnR_EA); USB->EPnR[number] ^= USB_EPnR_STAT_RX | USB_EPnR_STAT_TX_1; - if(rxsz & 1 || rxsz > 512) return 3; // wrong rx buffer size - uint16_t countrx = 0; + if(rxsz & 1 || rxsz > USB_BTABLE_SIZE) return 3; // wrong rx buffer size + uint16_t countrx = 0; // BLSIZE:NUM_BLOCKS[4:0] if(rxsz < 64) countrx = rxsz / 2; else{ if(rxsz & 0x1f) return 3; // should be multiple of 32 @@ -73,13 +74,17 @@ int EP_Init(uint8_t number, uint8_t type, uint16_t txsz, uint16_t rxsz, void (*f return 0; } +static uint8_t oldusbon = 0; // to store flags while suspended + // standard IRQ handler void usb_lp_isr(){ - static uint8_t oldusbon = 0; // to store flags while suspended + // EP number + uint8_t n = USB->ISTR & USB_ISTR_EPID; + //if(n && n != DBG_EPNO) DBG("ISR\n"); if(USB->ISTR & USB_ISTR_RESET){ usbON = 0; // Reinit registers - USB->CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM; + USB->CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM | USB_CNTR_SUSPM; // Endpoint 0 - CONTROL // ON USB LS size of EP0 may be 8 bytes, but on FS it should be 64 bytes! lastaddr = LASTADDR_DEFAULT; @@ -91,8 +96,6 @@ void usb_lp_isr(){ USB->ISTR = ~USB_ISTR_RESET; } if(USB->ISTR & USB_ISTR_CTR){ - // EP number - uint8_t n = USB->ISTR & USB_ISTR_EPID; // copy status register uint16_t epstatus = USB->EPnR[n]; // copy received bytes amount @@ -101,9 +104,11 @@ void usb_lp_isr(){ if(USB->ISTR & USB_ISTR_DIR){ // OUT interrupt - receive data, CTR_RX==1 (if CTR_TX == 1 - two pending transactions: receive following by transmit) if(n == 0){ // control endpoint if(epstatus & USB_EPnR_SETUP){ // setup packet -> copy data to conf_pack + DBG("setup\n"); EP_Read(0, setupdatabuf); // interrupt handler will be called later }else if(epstatus & USB_EPnR_CTR_RX){ // data packet -> push received data to ep0databuf + DBG("data\n"); EP_Read(0, ep0databuf); } } @@ -112,15 +117,25 @@ void usb_lp_isr(){ if(endpoints[n].func) endpoints[n].func(n); } if(USB->ISTR & USB_ISTR_SUSP){ // suspend -> still no connection, may sleep + DBG("susp"); oldusbon = usbON; usbON = 0; USB->CNTR |= USB_CNTR_FSUSP | USB_CNTR_LP_MODE; USB->ISTR = ~USB_ISTR_SUSP; } if(USB->ISTR & USB_ISTR_WKUP){ // wakeup + DBG("wkup"); USB->CNTR &= ~(USB_CNTR_FSUSP | USB_CNTR_LP_MODE); // clear suspend flags USB->ISTR = ~USB_ISTR_WKUP; usbON = oldusbon; } } +void usb_wkup_isr(){ + DBG("wkup"); + 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 = oldusbon; + } +} diff --git a/F3:F303/Seven_CDCs/usbhw.h b/F3:F303/Seven_CDCs/usbhw.h index b1656aa..51457ae 100644 --- a/F3:F303/Seven_CDCs/usbhw.h +++ b/F3:F303/Seven_CDCs/usbhw.h @@ -25,13 +25,14 @@ /** * Buffers size definition **/ -#define USB_BTABLE_SIZE 768 -// first 64 bytes of USB_BTABLE are registers! +#define USB_BTABLE_SIZE 512 +// first 64*ACCESSZ bytes of USB_BTABLE are registers! //#define USB_EP0_BASEADDR 64 // for USB FS EP0 buffers are from 8 to 64 bytes long +// For STM32F303CBT6 ACCESSZ=2, so real available buffers size for all EPs = only 192 bytes (128 - EP0) #define USB_EP0_BUFSZ 64 // USB transmit/receive buffer size -#define USB_TRBUFSZ 64 +#define USB_TRBUFSZ 4 // EP1 - interrupt - buffer size #define USB_EP1BUFSZ 8 diff --git a/F3:F303/Seven_CDCs/version.inc b/F3:F303/Seven_CDCs/version.inc index 6a70e07..75bf78b 100644 --- a/F3:F303/Seven_CDCs/version.inc +++ b/F3:F303/Seven_CDCs/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "77" -#define BUILD_DATE "2023-04-26" +#define BUILD_NUMBER "102" +#define BUILD_DATE "2023-04-29"