//this function is used only by USB interrupt BOOL CdcToHostFromBuffer (BYTE intfNum) { BYTE byte_count, nTmp2; BYTE * pEP1; BYTE * pEP2; BYTE * pCT1; BYTE * pCT2; BYTE bWakeUp = FALSE; //TRUE for wake up after interrupt BYTE edbIndex; edbIndex = stUsbHandle[intfNum].edb_Index; if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft == 0){ //do we have somtething to send? if (!CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent){ //zero packet was not yet sent CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent = TRUE; if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend == EP_MAX_PACKET_SIZE_CDC){ if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ if (tInputEndPointDescriptorBlock[edbIndex].bEPBCTX & EPBCNT_NAK){ tInputEndPointDescriptorBlock[edbIndex].bEPBCTX = 0; CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = Y_BUFFER; //switch buffer } } else { if (tInputEndPointDescriptorBlock[edbIndex].bEPBCTY & EPBCNT_NAK){ tInputEndPointDescriptorBlock[edbIndex].bEPBCTY = 0; CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = X_BUFFER; //switch buffer } } } CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSend = 0; //nothing to send //call event callback function if (wUsbEventMask & kUSB_sendCompletedEvent){ bWakeUp = USBCDC_handleSendCompleted(intfNum); } } //if (!bSentZeroPacket) return (bWakeUp); } CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bZeroPacketSent = FALSE; //zero packet will be not sent: we have data if (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY == X_BUFFER){ //this is the active EP buffer pEP1 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; //second EP buffer pEP2 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; } else { //this is the active EP buffer pEP1 = (BYTE*)stUsbHandle[intfNum].iep_Y_Buffer; pCT1 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTY; //second EP buffer pEP2 = (BYTE*)stUsbHandle[intfNum].iep_X_Buffer; pCT2 = &tInputEndPointDescriptorBlock[edbIndex].bEPBCTX; } //how many byte we can send over one endpoint buffer byte_count = (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft > EP_MAX_PACKET_SIZE_CDC) ? EP_MAX_PACKET_SIZE_CDC : CdcWriteCtrl[ INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft; nTmp2 = *pCT1; if (nTmp2 & EPBCNT_NAK){ USB_TX_memcpy(pEP1, CdcWriteCtrl[INTFNUM_OFFSET( intfNum)].pUsbBufferToSend, byte_count); //copy data into IEP3 X or Y buffer *pCT1 = byte_count; //Set counter for usb In-Transaction CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; //switch buffer CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft -= byte_count; CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend += byte_count; //move buffer pointer CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend = byte_count; //try to send data over second buffer nTmp2 = *pCT2; if ((CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft > 0) && //do we have more data to send? (nTmp2 & EPBCNT_NAK)){ //if the second buffer is free? //how many byte we can send over one endpoint buffer byte_count = (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft > EP_MAX_PACKET_SIZE_CDC) ? EP_MAX_PACKET_SIZE_CDC : CdcWriteCtrl[ INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft; USB_TX_memcpy(pEP2, CdcWriteCtrl[INTFNUM_OFFSET( intfNum)].pUsbBufferToSend, byte_count); //copy data into IEP3 X or Y buffer *pCT2 = byte_count; //Set counter for usb In-Transaction CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY = (CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].bCurrentBufferXY + 1) & 0x01; //switch buffer CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].nCdcBytesToSendLeft -= byte_count; CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].pUsbBufferToSend += byte_count; //move buffer pointer CdcWriteCtrl[INTFNUM_OFFSET(intfNum)].last_ByteSend = byte_count; } } return (bWakeUp); }
//this function is used only by USB interrupt BOOL CdcToHostFromBuffer() { BYTE byte_count, nTmp2; BYTE * pEP1; BYTE * pEP2; BYTE * pCT1; BYTE * pCT2; BYTE bWakeUp = FALSE; //TRUE for wake up after interrupt static BYTE bZeroPacketSent; // = FALSE; if (CdcWriteCtrl.nCdcBytesToSendLeft == 0) // do we have somtething to send? { if (!bZeroPacketSent) // zero packet was not yet sent { bZeroPacketSent = TRUE; CdcWriteCtrl.nCdcBytesToSend = 0; // nothing to send //call event callback function if (wUsbEventMask & kUSB_sendCompletedEvent) { bWakeUp = USBCDC_handleSendCompleted(1); } } // if (!bSentZeroPacket) return bWakeUp; } bZeroPacketSent = FALSE; // zero packet will be not sent: we have data if (CdcWriteCtrl.bCurrentBufferXY == X_BUFFER) { //this is the active EP buffer pEP1 = (BYTE*)IEP3_X_BUFFER_ADDRESS; pCT1 = &tInputEndPointDescriptorBlock[EDB(CDC_INEP_ADDR)].bEPBCTX; //second EP buffer pEP2 = (BYTE*)IEP3_Y_BUFFER_ADDRESS; pCT2 = &tInputEndPointDescriptorBlock[EDB(CDC_INEP_ADDR)].bEPBCTY; } else { //this is the active EP buffer pEP1 = (BYTE*)IEP3_Y_BUFFER_ADDRESS; pCT1 = &tInputEndPointDescriptorBlock[EDB(CDC_INEP_ADDR)].bEPBCTY; //second EP buffer pEP2 = (BYTE*)IEP3_X_BUFFER_ADDRESS; pCT2 = &tInputEndPointDescriptorBlock[EDB(CDC_INEP_ADDR)].bEPBCTX; } // how many byte we can send over one endpoint buffer byte_count = (CdcWriteCtrl.nCdcBytesToSendLeft > EP_MAX_PACKET_SIZE_CDC) ? EP_MAX_PACKET_SIZE_CDC : CdcWriteCtrl.nCdcBytesToSendLeft; nTmp2 = *pCT1; if(nTmp2 & EPBCNT_NAK) { USB_TX_memcpy(pEP1, CdcWriteCtrl.pBufferToSend, byte_count); // copy data into IEP3 X or Y buffer *pCT1 = byte_count; // Set counter for usb In-Transaction CdcWriteCtrl.bCurrentBufferXY = (CdcWriteCtrl.bCurrentBufferXY+1)&0x01; //switch buffer CdcWriteCtrl.nCdcBytesToSendLeft -= byte_count; CdcWriteCtrl.pBufferToSend += byte_count; // move buffer pointer //try to send data over second buffer nTmp2 = *pCT2; if ((CdcWriteCtrl.nCdcBytesToSendLeft > 0) && // do we have more data to send? (nTmp2 & EPBCNT_NAK)) // if the second buffer is free? { // how many byte we can send over one endpoint buffer byte_count = (CdcWriteCtrl.nCdcBytesToSendLeft > EP_MAX_PACKET_SIZE_CDC) ? EP_MAX_PACKET_SIZE_CDC : CdcWriteCtrl.nCdcBytesToSendLeft; USB_TX_memcpy(pEP2, CdcWriteCtrl.pBufferToSend, byte_count); // copy data into IEP3 X or Y buffer *pCT2 = byte_count; // Set counter for usb In-Transaction CdcWriteCtrl.bCurrentBufferXY = (CdcWriteCtrl.bCurrentBufferXY+1)&0x01; //switch buffer CdcWriteCtrl.nCdcBytesToSendLeft -= byte_count; CdcWriteCtrl.pBufferToSend += byte_count; //move buffer pointer } } return bWakeUp; }