void USBSetupInterrupt() { SetEP(0); if (!ReceivedSetupInt()) return; Setup& setup = _setup; // global saves ~30 bytes Recv((u8*)&setup,8); ClearSetupInt(); if (setup.bmRequestType & DEVICETOHOST) WaitIN(); else ClearIN(); bool ok = true; u8 r = setup.bRequest; if (SET_ADDRESS == r) { WaitIN(); UDADDR = setup.wValueL | (1<<ADDEN); } else if (SET_CONFIGURATION == r) { _usbConfiguration = setup.wValueL; InitEndpoints(); } else if (GET_CONFIGURATION == r) { Send8(_usbConfiguration); } else if (GET_STATUS == r) { Send8(0); // All good as far as I know } else if (GET_DESCRIPTOR == r) { ok = SendDescriptor(); } else { ok = USBHook(); } if (ok) ClearIN(); else Stall(); }
static inline void Send8(u8 d) { uint8_t iTemp, oldSREG; // UEDATX = d; oldSREG = SREG; cli(); // disable interrupts // auto wait-to-send if buffer being sent right now WaitIN(); // automatic (for now), misleading function name waits for OUTPUT COMPLETE iTemp = aEPBuff[endpointIndex].iBufLen2; if(iTemp < INTERNAL_BUFFER_LENGTH) { aEPBuff[endpointIndex].aBuf2[iTemp++] = d; aEPBuff[endpointIndex].iBufLen2 = iTemp; if(iTemp >= INTERNAL_BUFFER_LENGTH) { // do I force-send the buffer now? ClearIN(); /// misleading function name, sends the data } } SREG=oldSREG; }