50 inline Setup(uint8_t requestType, uint8_t request, uint16_t value, uint16_t index,
52 : nRequestType(requestType),
67 : nType(type), nLength(length) {
68 pDescriptor =
new uint8_t[nLength];
69 MemoryCopy(pDescriptor, pBuffer, nLength);
73 delete[]
static_cast<uint8_t*
>(pDescriptor);
84 enum TransferTypes { Control = 0, Isochronus = 1, Bulk = 2, Interrupt = 3 };
89 uint8_t nTransferType;
90 uint16_t nMaxPacketSize;
92 uint8_t nTransactions;
93 uint8_t nMaxBurst = 0;
95 uint16_t nBytesPerInterval = 0;
96 bool hasCompanion =
false;
106 uint8_t nAlternateSetting;
118 ConfigDescriptor(
void* pConfigBuffer,
size_t nConfigLength, UsbSpeed speed);
137 uint16_t nBcdUsbRelease;
141 uint8_t nMaxControlPacketSize;
144 uint16_t nBcdDeviceRelease;
145 uint8_t nVendorString;
146 uint8_t nProductString;
147 uint8_t nSerialString;
148 uint8_t nConfigurations;
164 uint8_t nMaxControlPacketSize;
165 uint8_t nConfigurations;
170 enum UsbState { Connected = 0, Addressed, HasDescriptors, Configured, HasInterface, HasDriver };
182 void initialise(uint8_t nAddress);
187 virtual void getUsbDeviceName(
String& str) {
188 str.assign(
"Generic USB Device", 19);
217 return m_pDescriptor;
222 return m_pConfiguration;
231 void useConfiguration(uint8_t nConfig);
234 void useInterface(uint8_t nInterface);
263 ssize_t doSync(Endpoint* pEndpoint, UsbPid pid, uintptr_t pBuffer,
size_t nBytes,
size_t timeout);
264 ssize_t syncIn(Endpoint* pEndpoint, uintptr_t pBuffer,
size_t nBytes,
size_t timeout = 5000);
265 ssize_t syncOut(Endpoint* pEndpoint, uintptr_t pBuffer,
size_t nBytes,
size_t timeout = 5000);
267 MUST_USE_RESULT bool addInterruptInHandler(Endpoint* pEndpoint, uintptr_t pBuffer,
268 uint16_t nBytes,
void (*pCallback)(uintptr_t, ssize_t),
272 bool controlRequest(uint8_t nRequestType, uint8_t nRequest, uint16_t nValue, uint16_t nIndex,
273 uint16_t nLength = 0, uintptr_t pBuffer = 0, uint32_t timeout = 5000);
275 ssize_t controlRequestResult(uint8_t nRequestType, uint8_t nRequest, uint16_t nValue,
276 uint16_t nIndex, uint16_t nLength = 0, uintptr_t pBuffer = 0,
277 uint32_t timeout = 5000);
280 uint16_t getStatus();
283 bool clearEndpointHalt(Endpoint* pEndpoint);
286 void* getDescriptor(uint8_t nDescriptorType, uint8_t nDescriptorIndex, uint16_t nBytes,
287 uint8_t requestType = 0);
290 uint8_t getDescriptorLength(uint8_t nDescriptorType, uint8_t nDescriptorIndex,
291 uint8_t requestType = 0);
294 String getString(uint8_t nString);
298 uint16_t m_ControlPacketSize;
305 size_t m_nRootPortGeneration;