|
|
|
|
|
|
|
|
endpoint0_complete(); |
|
|
endpoint0_complete(); |
|
|
} |
|
|
} |
|
|
completestatus &= endpointN_notify_mask; |
|
|
completestatus &= endpointN_notify_mask; |
|
|
|
|
|
#if 1 |
|
|
|
|
|
if (completestatus) { |
|
|
|
|
|
int s; |
|
|
|
|
|
|
|
|
|
|
|
// transmit: |
|
|
|
|
|
s = 0; |
|
|
|
|
|
uint32_t tx = completestatus >> 16; |
|
|
|
|
|
while(tx) { |
|
|
|
|
|
int p=__builtin_ctz(tx); |
|
|
|
|
|
if (p==0) { |
|
|
|
|
|
run_callbacks(endpoint_queue_head + s * 2 + 1); |
|
|
|
|
|
p = 1; |
|
|
|
|
|
} |
|
|
|
|
|
tx >>= p; |
|
|
|
|
|
s += p; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// receive: |
|
|
|
|
|
s = 0; |
|
|
|
|
|
uint32_t rx = completestatus & 0xffff; |
|
|
|
|
|
while(rx) { |
|
|
|
|
|
int p=__builtin_ctz(rx); |
|
|
|
|
|
if (p==0) { |
|
|
|
|
|
run_callbacks(endpoint_queue_head + s * 2); |
|
|
|
|
|
p = 1; |
|
|
|
|
|
} |
|
|
|
|
|
rx >>= p; |
|
|
|
|
|
s += p; |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
#else |
|
|
if (completestatus) { |
|
|
if (completestatus) { |
|
|
int i; // TODO: optimize with __builtin_ctz() |
|
|
int i; // TODO: optimize with __builtin_ctz() |
|
|
for (i=2; i <= NUM_ENDPOINTS; i++) { |
|
|
for (i=2; i <= NUM_ENDPOINTS; i++) { |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if (status & USB_USBSTS_URI) { // page 3164 |
|
|
if (status & USB_USBSTS_URI) { // page 3164 |