Example #1
0
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();
}
Example #2
0
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;
}