void configPoll() { int reset = 0; if (!usbReady || USBFS_IsConfigurationChanged()) { reset = 1; } usbReady = USBFS_bGetConfiguration(); if (!usbReady) { return; } if (reset) { USBFS_EnableOutEP(USB_EP_OUT); USBFS_EnableOutEP(USB_EP_COMMAND); usbInEpState = usbDebugEpState = USB_IDLE; } if(USBFS_GetEPState(USB_EP_OUT) == USBFS_OUT_BUFFER_FULL) { ledOn(); // The host sent us some data! int byteCount = USBFS_GetEPCount(USB_EP_OUT); USBFS_ReadOutEP(USB_EP_OUT, hidBuffer, sizeof(hidBuffer)); hidPacket_recv(hidBuffer, byteCount); size_t cmdSize; const uint8_t* cmd = hidPacket_getPacket(&cmdSize); if (cmd && (cmdSize > 0)) { processCommand(cmd, cmdSize); } // Allow the host to send us another updated config. USBFS_EnableOutEP(USB_EP_OUT); ledOff(); } switch (usbInEpState) { case USB_IDLE: { const uint8_t* nextChunk = hidPacket_getHIDBytes(hidBuffer); if (nextChunk) { USBFS_LoadInEP(USB_EP_IN, nextChunk, sizeof(hidBuffer)); usbInEpState = USB_DATA_SENT; } } break; case USB_DATA_SENT: if (USBFS_bGetEPAckState(USB_EP_IN)) { // Data accepted. usbInEpState = USB_IDLE; } break; } }
void debugPoll() { if (!usbReady) { return; } if(USBFS_GetEPState(USB_EP_COMMAND) == USBFS_OUT_BUFFER_FULL) { // The host sent us some data! int byteCount = USBFS_GetEPCount(USB_EP_COMMAND); USBFS_ReadOutEP(USB_EP_COMMAND, (uint8 *)&hidBuffer, byteCount); if (byteCount >= 1 && hidBuffer[0] == 0x01) { // Reboot command. Bootloadable_1_Load(); } // Allow the host to send us another command. // (assuming we didn't reboot outselves) USBFS_EnableOutEP(USB_EP_COMMAND); } switch (usbDebugEpState) { case USB_IDLE: memcpy(&hidBuffer, &scsiDev.cdb, 12); hidBuffer[12] = scsiDev.msgIn; hidBuffer[13] = scsiDev.msgOut; hidBuffer[14] = scsiDev.lastStatus; hidBuffer[15] = scsiDev.lastSense; hidBuffer[16] = scsiDev.phase; hidBuffer[17] = SCSI_ReadFilt(SCSI_Filt_BSY); hidBuffer[18] = SCSI_ReadFilt(SCSI_Filt_SEL); hidBuffer[19] = SCSI_ReadFilt(SCSI_Filt_ATN); hidBuffer[20] = SCSI_ReadFilt(SCSI_Filt_RST); hidBuffer[21] = scsiDev.rstCount; hidBuffer[22] = scsiDev.selCount; hidBuffer[23] = scsiDev.msgCount; hidBuffer[24] = scsiDev.cmdCount; hidBuffer[25] = scsiDev.watchdogTick; hidBuffer[26] = blockDev.state; hidBuffer[27] = scsiDev.lastSenseASC >> 8; hidBuffer[28] = scsiDev.lastSenseASC; hidBuffer[29] = scsiReadDBxPins(); hidBuffer[30] = LastTrace; hidBuffer[58] = sdDev.capacity >> 24; hidBuffer[59] = sdDev.capacity >> 16; hidBuffer[60] = sdDev.capacity >> 8; hidBuffer[61] = sdDev.capacity; hidBuffer[62] = FIRMWARE_VERSION >> 8; hidBuffer[63] = FIRMWARE_VERSION; USBFS_LoadInEP(USB_EP_DEBUG, (uint8 *)&hidBuffer, sizeof(hidBuffer)); usbDebugEpState = USB_DATA_SENT; break; case USB_DATA_SENT: if (USBFS_bGetEPAckState(USB_EP_DEBUG)) { // Data accepted. usbDebugEpState = USB_IDLE; } break; } }
void USBrefresh() { uint8 skipNextOut = 0u; /* Check if configuration or interface settings are changed. */ if (0u != USBFS_IsConfigurationChanged()) { /* Check active alternate setting. */ if ((0u != USBFS_GetConfiguration()) && (0u != USBFS_GetInterfaceSetting(AUDIO_INTERFACE))) { /* Alternate settings 1: Audio is streaming. */ /* Reset variables. */ inIndex = 0u; outIndex = 0u; syncDma = 0u; skipNextOut = 0u; syncDmaCounter = 0u; /* Enable OUT endpoint to receive audio stream. */ USBFS_EnableOutEP(OUT_EP_NUM); } if (USBFS_OUT_BUFFER_FULL == USBFS_GetEPState(OUT_EP_NUM)) { if (0u == skipNextOut) { /* Trigger DMA to copy data from OUT endpoint buffer. */ USBFS_ReadOutEP(OUT_EP_NUM, &soundBuffer[inIndex * TRANSFER_SIZE], TRANSFER_SIZE); /* Wait until DMA completes copying data from OUT endpoint buffer. */ while (USBFS_OUT_BUFFER_FULL == USBFS_GetEPState(OUT_EP_NUM)) { } /* Move to the next buffer location and adjust to be within * buffer size. Lock from DmaDone interruption. */ DmaDone_Disable(); ++inIndex; inIndex = (inIndex >= NUM_OF_BUFFERS) ? 0u : inIndex; DmaDone_Enable(); ++syncDmaCounter; /* Enable OUT endpoint to receive data from host. */ USBFS_EnableOutEP(OUT_EP_NUM); } else { /* Ignore received data from host and arm OUT endpoint * without reading if overflow is detected. */ USBFS_EnableOutEP(OUT_EP_NUM); skipNextOut = 0u; } /* When internal 32-kHz clock is slower, compare to PC traffic * then skip next transfer from PC. */ if (outIndex == inIndex) { skipNextOut = 1u; } } /* Enable DMA transfers when sound buffer is half-full. */ if ((0u == syncDma) && (syncDmaCounter == (NUM_OF_BUFFERS / 2u))) { /* Start DMA operation. */ CyDmaChEnable(TxOutDmaCh, TX_DMA_ENABLE_PRESERVE_TD); /* Disable underflow delayed start. */ syncDma = 1u; } } }