Skip to content

Commit a24ce89

Browse files
facchinmturmary
authored andcommitted
USB: only clear pending interrupts explicitely
1 parent 66f1e77 commit a24ce89

File tree

5 files changed

+35
-39
lines changed

5 files changed

+35
-39
lines changed

cores/arduino/USB/PluggableUSB.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ uint8_t PluggableUSB_::getShortName(char *iSerialNum)
7070
bool PluggableUSB_::setup(USBSetup& setup)
7171
{
7272
PluggableUSBModule* node;
73+
7374
for (node = rootNode; node; node = node->next) {
7475
if (node->setup(setup)) {
7576
return true;
@@ -78,12 +79,16 @@ bool PluggableUSB_::setup(USBSetup& setup)
7879
return false;
7980
}
8081

81-
void PluggableUSB_::handleEndpoint(int ep)
82+
int PluggableUSB_::handleEndpoint(int ep)
8283
{
8384
PluggableUSBModule* node;
8485
for (node = rootNode; node; node = node->next) {
85-
node->handleEndpoint(ep);
86+
int r = node->handleEndpoint(ep);
87+
if (r != 0) {
88+
return r;
89+
}
8690
}
91+
return 0;
8792
}
8893

8994
bool PluggableUSB_::plug(PluggableUSBModule *node)

cores/arduino/USB/PluggableUSB.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class PluggableUSBModule {
3535
virtual bool setup(USBSetup& setup) = 0;
3636
virtual int getInterface(uint8_t* interfaceCount) = 0;
3737
virtual int getDescriptor(USBSetup& setup) = 0;
38-
virtual void handleEndpoint(int ep) { (void)ep;/* Do nothing */}
38+
virtual int handleEndpoint(int ep) { (void)ep;/* Do nothing */; return 0; }
3939
virtual uint8_t getShortName(char *name) { name[0] = 'A'+pluggedInterface; return 1; }
4040

4141
uint8_t pluggedInterface;
@@ -57,7 +57,7 @@ class PluggableUSB_ {
5757
int getInterface(uint8_t* interfaceCount);
5858
int getDescriptor(USBSetup& setup);
5959
bool setup(USBSetup& setup);
60-
void handleEndpoint(int ep);
60+
int handleEndpoint(int ep);
6161
uint8_t getShortName(char *iSerialNum);
6262

6363
private:

cores/arduino/USB/SAMD21_USBDevice.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,9 @@ class DoubleBufferedEPOutHandler : public EPHandler {
393393
}
394394
release();
395395
}
396-
usbd.epAckPendingInterrupts(ep);
396+
if (usbd.epBank0IsTransferComplete(ep) || usbd.epBank1IsTransferComplete(ep)) {
397+
usbd.epAckPendingInterrupts(ep);
398+
}
397399
}
398400

399401
// Returns how many bytes are stored in the buffers

cores/arduino/USB/USBCore.cpp

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -297,22 +297,23 @@ void USBDeviceClass::standby() {
297297
void USBDeviceClass::handleEndpoint(uint8_t ep)
298298
{
299299
#if defined(CDC_ENABLED)
300-
if (ep == CDC_ENDPOINT_IN)
300+
if (ep == CDC_ENDPOINT_IN || ep == CDC_ENDPOINT_ACM)
301301
{
302-
// NAK on endpoint IN, the bank is not yet filled in.
303-
usbd.epBank1ResetReady(CDC_ENDPOINT_IN);
304-
usbd.epBank1AckTransferComplete(CDC_ENDPOINT_IN);
305-
}
306-
if (ep == CDC_ENDPOINT_ACM)
307-
{
308-
// NAK on endpoint IN, the bank is not yet filled in.
309-
usbd.epBank1ResetReady(CDC_ENDPOINT_ACM);
310-
usbd.epBank1AckTransferComplete(CDC_ENDPOINT_ACM);
302+
if (usbd.epBank0IsTransferComplete(ep) || usbd.epBank1IsTransferComplete(ep)) {
303+
// NAK on endpoint IN, the bank is not yet filled in.
304+
usbd.epBank1ResetReady(ep);
305+
usbd.epBank1AckTransferComplete(ep);
306+
}
307+
return;
311308
}
312309
#endif
313310

314311
#if defined(PLUGGABLE_USB_ENABLED)
315-
// Empty
312+
int r = PluggableUSB().handleEndpoint(ep);
313+
if (r != 0) {
314+
usbd.epAckPendingInterrupts(ep);
315+
return;
316+
}
316317
#endif
317318
}
318319

@@ -1010,29 +1011,17 @@ void USBDeviceClass::ISRHandler()
10101011
}
10111012

10121013
} // end Received Setup handler
1013-
1014-
uint8_t i=0;
1015-
uint8_t ept_int = usbd.epInterruptSummary() & 0xFE; // Remove endpoint number 0 (setup)
1016-
while (ept_int != 0)
1017-
{
1018-
// Check if endpoint has a pending interrupt
1019-
if ((ept_int & (1 << i)) != 0)
1020-
{
1021-
// Endpoint Transfer Complete (0/1) Interrupt
1022-
if (usbd.epBank0IsTransferComplete(i) ||
1023-
usbd.epBank1IsTransferComplete(i))
1024-
{
1025-
if (epHandlers[i]) {
1026-
epHandlers[i]->handleEndpoint();
1027-
} else {
1028-
handleEndpoint(i);
1029-
}
1014+
// usbd.epAckPendingInterrupts(0);
1015+
1016+
for (int ep = 1; ep < USB_EPT_NUM; ep++) {
1017+
// Endpoint Transfer Complete (0/1) Interrupt
1018+
if (usbd.epHasPendingInterrupts(ep)) {
1019+
if (epHandlers[ep]) {
1020+
epHandlers[ep]->handleEndpoint();
1021+
} else {
1022+
handleEndpoint(ep);
10301023
}
1031-
ept_int &= ~(1 << i);
10321024
}
1033-
i++;
1034-
if (i > USB_EPT_NUM)
1035-
break; // fire exit
10361025
}
10371026
}
10381027

cores/arduino/USB/USBCore.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333

3434
// bEndpointAddress in Endpoint Descriptor
3535
#define USB_ENDPOINT_DIRECTION_MASK 0x80
36-
#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
37-
#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
36+
#define USB_ENDPOINT_OUT(addr) ((unsigned char)((addr) | 0x00))
37+
#define USB_ENDPOINT_IN(addr) ((unsigned char)((addr) | 0x80))
3838

3939
#define USB_ENDPOINTS 7
4040

0 commit comments

Comments
 (0)