bool SendDescriptor() { Setup& setup = _setup; u8 desc_length = 0; const u8* desc_addr = 0; u8 t = setup.wValueH; if (0x22 == t) { desc_addr = _rawHID; desc_length = sizeof(desc_length); } else if (USB_DEVICE_DESCRIPTOR_TYPE == t) { if (setup.wLength == 8) _cdcComposite = 1; desc_addr = _cdcComposite ? (const u8*)&USB_DeviceDescriptorA : (const u8*)&USB_DeviceDescriptor; } else if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) { desc_addr = (const u8*)&USB_ConfigDescriptor; desc_length = sizeof(USB_ConfigDescriptor); } else if (USB_STRING_DESCRIPTOR_TYPE == t) { if (setup.wValueL == 0) desc_addr = (const u8*)&STRING_LANGUAGE; else if (setup.wValueL == IPRODUCT) desc_addr = (const u8*)&STRING_IPRODUCT; else if (setup.wValueL == ISERIAL) desc_addr = (const u8*)&STRING_SERIAL; else if (setup.wValueL == IMANUFACTURER) desc_addr = (const u8*)&STRING_IMANUFACTURER; else return false; } else return false; if (desc_length == 0) desc_length = pgm_read_byte(desc_addr); if ((u8)setup.wLength < desc_length) // bit of a cheat limiting to 255 bytes TODO (saved 8 bytes) desc_length = (u8)setup.wLength; // Send descriptor // EP0 is 64 bytes long // RWAL and FIFOCON don't work on EP0 u8 n = 0; do { if (!WaitForINOrOUT()) return false; Send8(pgm_read_byte(&desc_addr[n++])); u8 clr = n & 0x3F; if (!clr) ClearIN(); // Fifo is full, release this packet } while (n < desc_length); return true; }
static bool SendControl(uint8_t d) { if (_cmark < _cend) { if (!WaitForINOrOUT()) return (false); Send8(d); if (!((_cmark + 1) & 0x3F)) ClearIN(); } _cmark++; return (true); };
static bool SendControl(u8 d) { if (_cmark < _cend) { if (!WaitForINOrOUT()) return false; Send8(d); if (!((_cmark + 1) & 0x3F)) ClearIN(); // Fifo is full, release this packet } _cmark++; return true; };