if (!USBD_Composite_IsConfigured(&configUsbDev))\r
{\r
usbInEpState = USB_IDLE;\r
+ hidPacket_reset();\r
goto out;\r
}\r
\r
if (USBD_HID_IsReportReady(&configUsbDev))\r
{\r
- s2s_ledOn();\r
-\r
- // The host sent us some data!\r
- uint8_t hidBuffer[USBHID_LEN];\r
- int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));\r
- hidPacket_recv(hidBuffer, byteCount);\r
+ // Check if we have a previous command outstanding\r
+ // before accepting another\r
+ size_t cmdSize;\r
+ if (hidPacket_peekPacket(&cmdSize) == NULL)\r
+ {\r
+ uint8_t hidBuffer[USBHID_LEN];\r
+ int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));\r
+ hidPacket_recv(hidBuffer, byteCount);\r
+ }\r
+ }\r
\r
+ if (hidPacket_getHIDBytesReady() == 0) // Nothing queued to send\r
+ {\r
size_t cmdSize;\r
const uint8_t* cmd = hidPacket_getPacket(&cmdSize);\r
if (cmd && (cmdSize > 0))\r
{\r
+ s2s_ledOn();\r
processCommand(cmd, cmdSize);\r
+ s2s_ledOff();\r
}\r
-\r
- s2s_ledOff();\r
}\r
\r
switch (usbInEpState)\r
\r
if (USBD_HID_IsReportReady(&configUsbDev))\r
{\r
- uint8_t hidBuffer[USBHID_LEN];\r
- int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));\r
- hidPacket_recv(hidBuffer, byteCount);\r
+ // Check if we have a previous command outstanding\r
+ // before accepting another\r
+ size_t cmdSize;\r
+ if (hidPacket_peekPacket(&cmdSize) == NULL)\r
+ {\r
+ uint8_t hidBuffer[USBHID_LEN];\r
+ int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));\r
+ hidPacket_recv(hidBuffer, byteCount);\r
+ }\r
+ }\r
\r
+ if (hidPacket_getHIDBytesReady() == 0) // Nothing queued to send\r
+ {\r
size_t cmdSize;\r
const uint8_t* cmd = hidPacket_peekPacket(&cmdSize);\r
// This is called from an ISR, only process simple commands.\r
}\r
\r
}\r
- else\r
- {\r
- // TODO this hurts performance significantly! Work out why __WFI()\r
- // doesn't wake up immediately !\r
-#if 0\r
- // Wait for our 1ms timer to save some power.\r
- // There's an interrupt on the SEL signal to ensure we respond\r
- // quickly to any SCSI commands. The selection abort time is\r
- // only 250us, and new SCSI-3 controllers time-out very\r
- // not long after that, so we need to ensure we wake up quickly.\r
- uint32_t interruptState = __get_PRIMASK();\r
- __disable_irq();\r
-\r
- if (!*SCSI_STS_SELECTED)\r
- {\r
- //__WFI(); // Will wake on interrupt, regardless of mask\r
- }\r
- if (!interruptState)\r
- {\r
- __enable_irq();\r
- }\r
-#endif\r
- }\r
}\r
else if ((scsiDev.phase >= 0) && (blockDev.state & DISK_PRESENT))\r
{\r