/**************************************************************************//** * @file endpoint.c * @version V1.00 * $Revision: 2 $ * $Date: 20/08/04 14:25 $ * @brief Endpoint interrupt routine for MUSBFSFC firmware * * @note * Copyright (C) 2020 Panchip Technology Corp. All rights reserved. *****************************************************************************/ #include "endpoint.h" #include "PanSeries.h" #include "usb.h" USB_BulkInStatus gepbin1 = {0,}, gepbin2 = {0,}, gepbin3 = {0,}; USB_BulkOutStatus gepbout1 = {0,}, gepbout2 = {0,}, gepbout3 = {0,}; /**************************************** EndpointBulkIn service routine This routine provides simple handling for bulk in endpoints. Endpoint MaxP is defined in endpoint.h. While the nBytesLeft field of the pbostate structure is >= 0 the endpoint will send packets of MaxP, with the residue in the last packet. If the data to send is an exact multiple of MaxP then a null data packet will be sent. ****************************************/ void EndpointBulkIn(USB_BulkInStatus *pbistate, uint32_t nCallState) { uint32_t nBytes; uint8_t byInCSR; /* Reset endpoint */ if (nCallState == M_EP_RESET) { pbistate->nBytesLeft = M_EP_NODATA; WRITE_REG(USB->INDEX, pbistate->byEP); byInCSR = M_INCSR_CDT | M_INCSR_FF; WRITE_REG(USB->CSR0_INCSR1, byInCSR); return; } /* Check whether there is any data to send */ if (pbistate->nBytesLeft == M_EP_NODATA) return; /* Determine number of bytes to send */ if (pbistate->nBytesLeft < M_EP_MAXP) { nBytes = pbistate->nBytesLeft; pbistate->nBytesLeft = M_EP_NODATA; } else { nBytes = M_EP_MAXP; pbistate->nBytesLeft -= M_EP_MAXP; } ///* Load FIFO */ WRITE_REG(USB->INDEX, pbistate->byEP); USB_Write((uint32_t)pbistate->byEP, nBytes, pbistate->pData); pbistate->pData = (uint8_t *)pbistate->pData + nBytes; byInCSR = M_INCSR_IPR; WRITE_REG(USB->CSR0_INCSR1, byInCSR); } /**************************************** EndpointBulkOut service routine This routine provides simple handling for bulk out endpoints. Endpoint MaxP is defined in endpoint.h. It assumes a transfer is complete when a packet of less than MaxP is received. ****************************************/ void EndpointBulkOut (USB_BulkOutStatus *pbostate, uint32_t nCallState) { uint32_t nBytes; uint8_t byOutCSR; /* Reset endpoint */ if (nCallState == M_EP_RESET) { pbostate->nBytesRecv = 0; pbostate->nBuffLen = 0; WRITE_REG(USB->INDEX, pbostate->byEP); byOutCSR = M_OUTCSR_CDT | M_OUTCSR_FF; WRITE_REG(USB->OUT_CSR1, byOutCSR); return; } /* Set index register */ WRITE_REG(USB->INDEX, pbostate->byEP); /* Read OUT CSR register */ byOutCSR = READ_REG(USB->OUT_CSR1); /* Get packet, */ /* may need to unload more than one packet if double buffering enabled */ while (byOutCSR & M_OUTCSR_OPR) { /* Get packet size */ nBytes = (int)READ_REG(USB->OUT_COUNT2); nBytes <<= 8; nBytes |= (int)READ_REG(USB->OUT_COUNT1); pbostate->nBuffLen = READ_REG(USB->MAX_PKT_OUT)<<3; /* Check there is room in the buffer */ // SYS_TEST("AA :%x,%x,%x \r\n",pbostate->nBytesRecv,nBytes,pbostate->nBuffLen); if (pbostate->nBytesRecv + nBytes > pbostate->nBuffLen) { /* Call to function to handle buffer over run */ WRITE_REG(USB->OUT_CSR1, 0); return; } /* Unload FIFO */ USB_Read ((int)pbostate->byEP, nBytes, pbostate->pData); /* Update status */ pbostate->nBytesRecv += nBytes; pbostate->pData = (uint8_t *)pbostate->pData + nBytes; /* Check for end of transfer */ if (nBytes < M_EP_MAXP) { /* Call function to handle received data */ } /* Clear OutPktRdy */ WRITE_REG(USB->OUT_CSR1, 0); /* Check for another packet */ byOutCSR = READ_REG(USB->OUT_CSR1); // WRITE_REG(USB->OUT_CSR1, M_OUTCSR_CDT); } } #if 1 void USB_DmaTransfer(uint8_t *pBuffer,uint8_t u8Ep,uint32_t data_len) { // uint32_t ret= 0,i=0,k=0; uint32_t usb_pkt_size,usbdma_pkt_size; WRITE_REG (USB->INDEX,u8Ep); if(data_len > 32){ usbdma_pkt_size = DmaMode1Max4; WRITE_REG(USB->MAX_PKT_IN, 4); } else{ usb_pkt_size = (data_len/8); usbdma_pkt_size = (data_len/8)<<8; WRITE_REG(USB->MAX_PKT_IN, usb_pkt_size); } // WRITE_REG (USB->IN_CSR2,M_INCSR2_MODE | M_INCSR2_DMAEnab | M_INCSR2_AUTOSET ); //set as in mode,AUTO SET INPKTRDY //set DMA CONTROL REGISTER WRITE_REG (USBDMA->ADDR1,(uint32_t)pBuffer); //ADDR1 32 WRITE_REG (USBDMA->COUNT1, data_len); // WRITE_REG (USBDMA->CNTL1,(EnableDMA | DIR_IN | (u8Ep<<4) | IntEnab| usbdma_pkt_size)); //CNTRL WRITE_REG (USBDMA->CNTL1,(EnableDMA | DIR_IN | DMAMode1 | (u8Ep<<4) | IntEnab| usbdma_pkt_size)); //CNTRL // while(!(READ_REG(USB->CSR0_INCSR1) & 0x01));//wait inpktrdy set // while((READ_REG(USB->CSR0_INCSR1) & 0x01)); //wait data sent // // //SECOND PACKET // WRITE_REG(USBDMA->CNTL1,(EnableDMA | DIR_IN | DMAMode1 | (u8Ep<<4) | IntEnab | DmaMode1Max4)); //CNTRL // // WRITE_REG (COUNT1, 64); // // while(!(READ_REG(USB->CSR0_INCSR1) & 0x01));//wait inpktrdy set // while((READ_REG(USB->CSR0_INCSR1) & 0x02)); //wait data sent // //THIRD PACKET // WRITE_REG (USB->MAX_PKT_IN, 1); // WRITE_REG (USBDMA->CNTL1,(EnableDMA | DIR_IN | DMAMode1 | (u8Ep<<4) | IntEnab | DmaMode1Max1)); //CNTRL // WRITE_REG (USB->CSR0_INCSR1, 1); // // while(!(READ_REG(USB->CSR0_INCSR1) & 0x01));//wait inpktrdy set // while((READ_REG(USB->CSR0_INCSR1) & 0x02)); //wait data sent } void USB_DmaReceivePre(uint8_t *pBuffer,uint8_t u8Ep,uint32_t data_len) { // uint32_t ret= 0,i=0,k=0; uint32_t /*reg_outcnt,*/usb_pkt_size,usbdma_pkt_size; //PID_OUT TEST WRITE_REG(USBDMA->CNTL1,DIR_OUT); //CNTRL WRITE_REG(USB->INDEX,u8Ep); if(data_len > 32){ usbdma_pkt_size = DmaMode1Max4; WRITE_REG(USB->MAX_PKT_OUT, 4); } else{ usb_pkt_size = (data_len/8); usbdma_pkt_size = (data_len/8)<<8; WRITE_REG(USB->MAX_PKT_OUT, usb_pkt_size); } // WRITE_REG(USB->OUT_CSR2, M_OUTCSR2_DMAEnab | M_OUTCSR2_DMAMode | M_OUTCSR2_AutoClear); WRITE_REG(USBDMA->ADDR1,(uint32_t)pBuffer); //ADDR1 32 WRITE_REG(USBDMA->COUNT1, data_len); WRITE_REG(USBDMA->CNTL1,(EnableDMA | DIR_OUT | DMAMode1 | EndPoint2 | IntEnab | usbdma_pkt_size)); //CNTRL // reg_outcnt = (READ_REG(USB->OUT_COUNT1) | (READ_REG(USB->OUT_COUNT1)<<8)); // SYS_TEST("USBDMA->CNTL1:%x \r\n",USBDMA->CNTL1); } #endif