From dba4cdf5153ce0706e965340d8fd4ce887987d8a Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 10 Apr 2023 22:28:16 +0300 Subject: [PATCH] fixed USB: add iInterface, remove trash --- F3:F303/NitrogenFlooding/hardware.c | 2 +- F3:F303/NitrogenFlooding/main.c | 1 - F3:F303/NitrogenFlooding/nitrogen.bin | Bin 10228 -> 9280 bytes F3:F303/NitrogenFlooding/usb.c | 75 +++------------- F3:F303/NitrogenFlooding/usb.h | 6 +- F3:F303/NitrogenFlooding/usb_lib.c | 118 +++++++++++++++++--------- F3:F303/NitrogenFlooding/usb_lib.h | 53 ++++++------ F3:F303/NitrogenFlooding/usbhw.c | 5 +- F3:F303/NitrogenFlooding/version.inc | 4 +- 9 files changed, 125 insertions(+), 139 deletions(-) diff --git a/F3:F303/NitrogenFlooding/hardware.c b/F3:F303/NitrogenFlooding/hardware.c index 3d2da1f..8bf160c 100644 --- a/F3:F303/NitrogenFlooding/hardware.c +++ b/F3:F303/NitrogenFlooding/hardware.c @@ -19,7 +19,7 @@ #include "hardware.h" #include "i2c.h" -int LEDsON = 0; +int LEDsON = 1; // setup here ALL GPIO pins (due to table in Readme.md) // leave SWD as default AF; high speed for CLK and some other AF; med speed for some another AF diff --git a/F3:F303/NitrogenFlooding/main.c b/F3:F303/NitrogenFlooding/main.c index 04857b7..f29f1dc 100644 --- a/F3:F303/NitrogenFlooding/main.c +++ b/F3:F303/NitrogenFlooding/main.c @@ -87,7 +87,6 @@ int main(void){ } } i2c_have_DMA_Rx(); // check if there's DMA Rx complete - USB_proc(); int l = USB_receivestr(inbuff, MAXSTRLEN); if(l < 0) USB_sendstr("ERROR: USB buffer overflow or string was too long\n"); else if(l){ diff --git a/F3:F303/NitrogenFlooding/nitrogen.bin b/F3:F303/NitrogenFlooding/nitrogen.bin index 4f0e0ee1c932e14be2f059e530de63b69d9de941..05e6931e654cbfbe115985cd0126bf5c31a56bd1 100755 GIT binary patch literal 9280 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 I_j>^U4KM*u&Hw-a literal 10228 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 UKaM5iee|b&3juvXFy-*S0Xy #include "hardware.h" -#include "ringbuffer.h" #include "usb.h" #include "usb_lib.h" static volatile uint8_t usbbuff[USB_TXBUFSZ]; // temporary buffer for sending data // ring buffers for incoming and outgoing data static uint8_t obuf[RBOUTSZ], ibuf[RBINSZ]; -static volatile ringbuffer out = {.data = obuf, .length = RBOUTSZ, .head = 0, .tail = 0}; -static volatile ringbuffer in = {.data = ibuf, .length = RBINSZ, .head = 0, .tail = 0}; +volatile ringbuffer rbout = {.data = obuf, .length = RBOUTSZ, .head = 0, .tail = 0}; +volatile ringbuffer rbin = {.data = ibuf, .length = RBINSZ, .head = 0, .tail = 0}; // transmission is succesfull -static volatile uint8_t bufisempty = 1; -static volatile uint8_t bufovrfl = 0; +volatile uint8_t bufisempty = 1; +volatile uint8_t bufovrfl = 0; -static void send_next(){ +void send_next(){ if(bufisempty) return; static int lastdsz = 0; - int buflen = RB_read((ringbuffer*)&out, (uint8_t*)usbbuff, USB_TXBUFSZ); + int buflen = RB_read((ringbuffer*)&rbout, (uint8_t*)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; @@ -58,7 +57,7 @@ int USB_sendall(){ int USB_send(const uint8_t *buf, int len){ if(!buf || !usbON || !len) return 0; while(len){ - int a = RB_write((ringbuffer*)&out, buf, len); + int a = RB_write((ringbuffer*)&rbout, buf, len); len -= a; buf += a; if(bufisempty){ @@ -71,7 +70,7 @@ int USB_send(const uint8_t *buf, int len){ int USB_putbyte(uint8_t byte){ if(!usbON) return 0; - while(0 == RB_write((ringbuffer*)&out, &byte, 1)){ + while(0 == RB_write((ringbuffer*)&rbout, &byte, 1)){ if(bufisempty){ bufisempty = 0; send_next(); @@ -96,9 +95,9 @@ int USB_sendstr(const char *string){ * @return amount of received bytes (negative, if overfull happened) */ int USB_receive(uint8_t *buf, int len){ - int sz = RB_read((ringbuffer*)&in, buf, len); + int sz = RB_read((ringbuffer*)&rbin, buf, len); if(bufovrfl){ - RB_clearbuf((ringbuffer*)&in); + RB_clearbuf((ringbuffer*)&rbin); if(!sz) sz = -1; else sz = -sz; bufovrfl = 0; @@ -113,9 +112,9 @@ int USB_receive(uint8_t *buf, int len){ * @return strlen or negative value indicating overflow (if so, string won't be ends with 0 and buffer should be cleared) */ int USB_receivestr(char *buf, int len){ - int l = RB_readto((ringbuffer*)&in, '\n', (uint8_t*)buf, len); + int l = RB_readto((ringbuffer*)&rbin, '\n', (uint8_t*)buf, len); if(l == 0) return 0; - if(--l < 0 || bufovrfl) RB_clearbuf((ringbuffer*)&in); + if(--l < 0 || bufovrfl) RB_clearbuf((ringbuffer*)&rbin); else buf[l] = 0; // replace '\n' with strend if(bufovrfl){ if(l > 0) l = -l; @@ -125,53 +124,3 @@ int USB_receivestr(char *buf, int len){ return l; } -// interrupt IN handler (never used?) -static void EP1_Handler(){ - 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 handlers -static void transmit_Handler(){ // EP3IN - 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 - uint8_t buf[USB_RXBUFSZ]; - uint16_t epstatus = KEEP_DTOG(USB->EPnR[2]); - uint8_t sz = EP_Read(2, (uint8_t*)buf); - if(sz){ - if(RB_write((ringbuffer*)&in, buf, sz) != sz) bufovrfl = 1; - } - // keep stat_tx & set ACK rx, clear RX ctr - USB->EPnR[2] = (epstatus & ~USB_EPnR_CTR_RX) ^ USB_EPnR_STAT_RX; -} - -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, 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; - break; - case USB_STATE_DEFAULT: - case USB_STATE_ADDRESSED: - if(usbON){ - usbON = 0; - } - break; - default: // USB_STATE_CONNECTED - send next data portion - // if(!usbON) return; // WTF? - break; - } -} diff --git a/F3:F303/NitrogenFlooding/usb.h b/F3:F303/NitrogenFlooding/usb.h index ef35a6c..8a4487b 100644 --- a/F3:F303/NitrogenFlooding/usb.h +++ b/F3:F303/NitrogenFlooding/usb.h @@ -18,6 +18,7 @@ #pragma once +#include "ringbuffer.h" #include "usbhw.h" // sizes of ringbuffers for outgoing and incoming data @@ -36,7 +37,10 @@ #define DBG(str) #endif -void USB_proc(); +extern volatile ringbuffer rbout, rbin; +extern volatile uint8_t bufisempty, bufovrfl; + +void send_next(); int USB_sendall(); int USB_send(const uint8_t *buf, int len); int USB_putbyte(uint8_t byte); diff --git a/F3:F303/NitrogenFlooding/usb_lib.c b/F3:F303/NitrogenFlooding/usb_lib.c index 63b7303..4dee060 100644 --- a/F3:F303/NitrogenFlooding/usb_lib.c +++ b/F3:F303/NitrogenFlooding/usb_lib.c @@ -17,14 +17,16 @@ */ #include +#include "usb.h" #include "usb_lib.h" +#include "usbhw.h" ep_t endpoints[STM32ENDPOINTS]; -usb_dev_t USB_Dev; +static uint16_t USB_Addr = 0; static usb_LineCoding lineCoding = {115200, 0, 0, 8}; -config_pack_t setup_packet; -uint8_t ep0databuf[EP0DATABUF_SIZE]; +uint8_t ep0databuf[EP0DATABUF_SIZE], setupdatabuf[EP0DATABUF_SIZE]; +config_pack_t *setup_packet = (config_pack_t*) setupdatabuf; usb_LineCoding getLineCoding(){return lineCoding;} @@ -53,9 +55,9 @@ static const uint8_t USB_DeviceDescriptor[] = { 0x23, // idProduct_H 0x00, // bcdDevice_Ver_L 0x03, // bcdDevice_Ver_H - 0x01, // iManufacturer - 0x02, // iProduct - 0x00, // iSerialNumber + iMANUFACTURER_DESCR, // iManufacturer + iPRODUCT_DESCR, // iProduct + iSERIAL_DESCR, // iSerialNumber bNumConfigurations // bNumConfigurations }; @@ -95,7 +97,7 @@ static const uint8_t USB_ConfigDescriptor[] = { 0xff, /* bInterfaceClass */ 0x00, /* bInterfaceSubClass */ 0x00, /* bInterfaceProtocol */ - 0x00, /* iInterface: */ + iINTERFACE_DESCR, /* iInterface: */ /////////////////////////////////////////////////// /*Endpoint 1 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ @@ -125,11 +127,19 @@ static const uint8_t USB_ConfigDescriptor[] = { 0x00, /* bInterval: ignore for Bulk transfer */ }; -_USB_LANG_ID_(USB_StringLangDescriptor, LANG_US); -// these descriptors are not used in PL2303 emulator! -_USB_STRING_(USB_StringSerialDescriptor, u"0"); -_USB_STRING_(USB_StringManufacturingDescriptor, u"Prolific Technology Inc."); -_USB_STRING_(USB_StringProdDescriptor, u"USB-Serial Controller"); +_USB_LANG_ID_(LD, LANG_US); +_USB_STRING_(SD, u"0.0.1"); +_USB_STRING_(MD, u"Prolific Technology Inc."); +_USB_STRING_(PD, u"USB-Serial Controller"); +_USB_STRING_(ID, u"nitrogen_flooding"); +static void const *StringDescriptor[iDESCR_AMOUNT] = { + [iLANGUAGE_DESCR] = &LD, + [iMANUFACTURER_DESCR] = &MD, + [iPRODUCT_DESCR] = &PD, + [iSERIAL_DESCR] = &SD, + [iINTERFACE_DESCR] = &ID +}; + /* * default handlers @@ -171,7 +181,7 @@ void WEAK vendor_handler(config_pack_t *packet){ } static void wr0(const uint8_t *buf, uint16_t size){ - if(setup_packet.wLength < size) size = setup_packet.wLength; // shortened request + if(setup_packet->wLength < size) size = setup_packet->wLength; // shortened request if(size < endpoints[0].txbufsz){ EP_WriteIRQ(0, buf, size); return; @@ -199,24 +209,18 @@ static void wr0(const uint8_t *buf, uint16_t size){ } static inline void get_descriptor(){ - switch(setup_packet.wValue){ + uint8_t descrtype = setup_packet->wValue >> 8, + descridx = setup_packet->wValue & 0xff; + switch(descrtype){ case DEVICE_DESCRIPTOR: wr0(USB_DeviceDescriptor, sizeof(USB_DeviceDescriptor)); break; case CONFIGURATION_DESCRIPTOR: wr0(USB_ConfigDescriptor, sizeof(USB_ConfigDescriptor)); break; - case STRING_LANG_DESCRIPTOR: - wr0((const uint8_t *)&USB_StringLangDescriptor, STRING_LANG_DESCRIPTOR_SIZE_BYTE); - break; - case STRING_MAN_DESCRIPTOR: - wr0((const uint8_t *)&USB_StringManufacturingDescriptor, USB_StringManufacturingDescriptor.bLength); - break; - case STRING_PROD_DESCRIPTOR: - wr0((const uint8_t *)&USB_StringProdDescriptor, USB_StringProdDescriptor.bLength); - break; - case STRING_SN_DESCRIPTOR: - wr0((const uint8_t *)&USB_StringSerialDescriptor, USB_StringSerialDescriptor.bLength); + case STRING_DESCRIPTOR: + if(descridx < iDESCR_AMOUNT) wr0((const uint8_t *)StringDescriptor[descridx], *((uint8_t*)StringDescriptor[descridx])); + else EP_WriteIRQ(0, (uint8_t*)0, 0); break; case DEVICE_QUALIFIER_DESCRIPTOR: wr0(USB_DeviceQualifierDescriptor, USB_DeviceQualifierDescriptor[0]); @@ -229,7 +233,7 @@ static inline void get_descriptor(){ static uint16_t configuration = 0; // reply for GET_CONFIGURATION (==1 if configured) static inline void std_d2h_req(){ uint16_t status = 0; // bus powered - switch(setup_packet.bRequest){ + switch(setup_packet->bRequest){ case GET_DESCRIPTOR: get_descriptor(); break; @@ -244,16 +248,47 @@ static inline void std_d2h_req(){ } } +// interrupt IN handler (never used?) +static void EP1_Handler(){ + 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 handlers +static void transmit_Handler(){ // EP3IN + 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 + uint8_t buf[USB_RXBUFSZ]; + uint16_t epstatus = KEEP_DTOG(USB->EPnR[2]); + uint8_t sz = EP_Read(2, (uint8_t*)buf); + if(sz){ + if(RB_write((ringbuffer*)&rbin, buf, sz) != sz) bufovrfl = 1; + } + // keep stat_tx & set ACK rx, clear RX ctr + USB->EPnR[2] = (epstatus & ~USB_EPnR_CTR_RX) ^ USB_EPnR_STAT_RX; +} + static inline void std_h2d_req(){ - switch(setup_packet.bRequest){ + switch(setup_packet->bRequest){ case SET_ADDRESS: // new address will be assigned later - after acknowlegement or request to host - USB_Dev.USB_Addr = setup_packet.wValue; + USB_Addr = setup_packet->wValue; break; case SET_CONFIGURATION: // Now device configured - USB_Dev.USB_Status = USB_STATE_CONFIGURED; - configuration = setup_packet.wValue; + configuration = setup_packet->wValue; + EP_Init(1, EP_TYPE_INTERRUPT, USB_EP1BUFSZ, 0, EP1_Handler); // IN1 - transmit + 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 break; default: break; @@ -271,8 +306,8 @@ bmRequestType: 76543210 */ void EP0_Handler(){ uint16_t epstatus = USB->EPnR[0]; // EP0R on input -> return this value after modifications - uint8_t reqtype = setup_packet.bmRequestType & 0x7f; - uint8_t dev2host = (setup_packet.bmRequestType & 0x80) ? 1 : 0; + uint8_t reqtype = setup_packet->bmRequestType & 0x7f; + uint8_t dev2host = (setup_packet->bmRequestType & 0x80) ? 1 : 0; int rxflag = RX_FLAG(epstatus); if(rxflag && SETUP_FLAG(epstatus)){ switch(reqtype){ @@ -285,15 +320,15 @@ void EP0_Handler(){ } break; case STANDARD_ENDPOINT_REQUEST_TYPE: // standard endpoint request - if(setup_packet.bRequest == CLEAR_FEATURE){ + if(setup_packet->bRequest == CLEAR_FEATURE){ EP_WriteIRQ(0, (uint8_t *)0, 0); } break; case VENDOR_REQUEST_TYPE: - vendor_handler(&setup_packet); + vendor_handler(setup_packet); break; case CONTROL_REQUEST_TYPE: - switch(setup_packet.bRequest){ + switch(setup_packet->bRequest){ case GET_LINE_CODING: EP_WriteIRQ(0, (uint8_t*)&lineCoding, sizeof(lineCoding)); break; @@ -301,7 +336,7 @@ void EP0_Handler(){ break; case SET_CONTROL_LINE_STATE: usbON = 1; - clstate_handler(setup_packet.wValue); + clstate_handler(setup_packet->wValue); break; case SEND_BREAK: usbON = 0; @@ -310,23 +345,22 @@ void EP0_Handler(){ default: break; } - if(setup_packet.bRequest != GET_LINE_CODING) EP_WriteIRQ(0, (uint8_t *)0, 0); // write acknowledgement + if(setup_packet->bRequest != GET_LINE_CODING) EP_WriteIRQ(0, (uint8_t *)0, 0); // write acknowledgement break; default: 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){ + if(setup_packet->bRequest == SET_LINE_CODING){ linecoding_handler((usb_LineCoding*)ep0databuf); } } } else if(TX_FLAG(epstatus)){ // package transmitted // now we can change address after enumeration - 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; + 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/NitrogenFlooding/usb_lib.h b/F3:F303/NitrogenFlooding/usb_lib.h index 5d07f3b..6ade2c2 100644 --- a/F3:F303/NitrogenFlooding/usb_lib.h +++ b/F3:F303/NitrogenFlooding/usb_lib.h @@ -60,14 +60,21 @@ #define CONTROL_DTR 0x01 #define CONTROL_RTS 0x02 -// wValue -#define DEVICE_DESCRIPTOR 0x100 -#define CONFIGURATION_DESCRIPTOR 0x200 -#define STRING_LANG_DESCRIPTOR 0x300 -#define STRING_MAN_DESCRIPTOR 0x301 -#define STRING_PROD_DESCRIPTOR 0x302 -#define STRING_SN_DESCRIPTOR 0x303 -#define DEVICE_QUALIFIER_DESCRIPTOR 0x600 +// string descriptors +enum{ + iLANGUAGE_DESCR, + iMANUFACTURER_DESCR, + iPRODUCT_DESCR, + iSERIAL_DESCR, + iINTERFACE_DESCR, + iDESCR_AMOUNT +}; + +// Types of descriptors +#define DEVICE_DESCRIPTOR 0x01 +#define CONFIGURATION_DESCRIPTOR 0x02 +#define STRING_DESCRIPTOR 0x03 +#define DEVICE_QUALIFIER_DESCRIPTOR 0x06 #define RX_FLAG(epstat) (epstat & USB_EPnR_CTR_RX) #define TX_FLAG(epstat) (epstat & USB_EPnR_CTR_TX) @@ -77,14 +84,6 @@ #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)) -// USB state: uninitialized, addressed, ready for use -typedef enum{ - USB_STATE_DEFAULT, - USB_STATE_ADDRESSED, - USB_STATE_CONFIGURED, - USB_STATE_CONNECTED -} USB_state; - // EP types #define EP_TYPE_BULK 0x00 #define EP_TYPE_CONTROL 0x01 @@ -93,6 +92,16 @@ typedef enum{ #define LANG_US (uint16_t)0x0409 +#if 0 +typedef struct{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t *bString; +} string_descriptor_t; + +#define _USB_STRING_(name, str) string_descriptor_t name = {(sizeof(str) + 2), STRING_DESCRIPTOR, str} +#endif + #define _USB_STRING_(name, str) \ static const struct name \ { \ @@ -113,7 +122,6 @@ static const struct name \ \ } \ name = {0x04, 0x03, lng_id} -#define STRING_LANG_DESCRIPTOR_SIZE_BYTE (4) // EP0 configuration packet typedef struct { @@ -133,12 +141,6 @@ typedef struct{ unsigned rx_cnt : 10; // received data counter } ep_t; -// USB status & its address -typedef struct { - uint8_t USB_Status; - uint16_t USB_Addr; -}usb_dev_t; - typedef struct { uint32_t dwDTERate; uint8_t bCharFormat; @@ -163,10 +165,9 @@ typedef struct { } __attribute__ ((packed)) usb_cdc_notification; extern ep_t endpoints[]; -extern usb_dev_t USB_Dev; extern volatile uint8_t usbON; -extern config_pack_t setup_packet; -extern uint8_t ep0databuf[]; +extern config_pack_t *setup_packet; +extern uint8_t ep0databuf[], setupdatabuf[]; void EP0_Handler(); diff --git a/F3:F303/NitrogenFlooding/usbhw.c b/F3:F303/NitrogenFlooding/usbhw.c index fc42f3e..8d2a880 100644 --- a/F3:F303/NitrogenFlooding/usbhw.c +++ b/F3:F303/NitrogenFlooding/usbhw.c @@ -84,7 +84,6 @@ void usb_lp_isr(){ lastaddr = LASTADDR_DEFAULT; // clear address, leave only enable bit USB->DADDR = USB_DADDR_EF; - USB_Dev.USB_Status = USB_STATE_DEFAULT; if(EP_Init(0, EP_TYPE_CONTROL, USB_EP0_BUFSZ, USB_EP0_BUFSZ, EP0_Handler)){ return; } @@ -101,10 +100,10 @@ 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 - EP_Read(0, (uint8_t*)&setup_packet); + EP_Read(0, setupdatabuf); // interrupt handler will be called later }else if(epstatus & USB_EPnR_CTR_RX){ // data packet -> push received data to ep0databuf - EP_Read(0, (uint8_t*)&ep0databuf); + EP_Read(0, ep0databuf); } } } diff --git a/F3:F303/NitrogenFlooding/version.inc b/F3:F303/NitrogenFlooding/version.inc index 230edd2..379d92d 100644 --- a/F3:F303/NitrogenFlooding/version.inc +++ b/F3:F303/NitrogenFlooding/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "24" -#define BUILD_DATE "2023-03-22" +#define BUILD_NUMBER "52" +#define BUILD_DATE "2023-04-10"