sc8-gat-stand/gat_stand_fw/usblib/config/usb_endp.c

149 lines
3.2 KiB
C

/********************************** (C) COPYRIGHT *******************************
* File Name : usb_endp.c
* Author : WCH
* Version : V1.0.0
* Date : 2021/08/08
* Description : Endpoint routines
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "usb_lib.h"
#include "usb_mem.h"
#include "hw_config.h"
#include "usb_desc.h"
#include "usb_istr.h"
#include "usb_prop.h"
#include "usb_pwr.h"
#include "../../user/usb/cdc.h"
uint8_t USBD_Endp3_Busy;
uint16_t USB_Rx_Cnt = 0;
uint8_t HID_Buffer[DEF_USBD_MAX_PACK_SIZE];
/*********************************************************************
* @fn EP1_IN_Callback
*
* @brief Endpoint 1 IN.
*
* @return none
*/
void EP1_IN_Callback (void)
{
}
/*********************************************************************
* @fn EP2_OUT_Callback
*
* @brief Endpoint 2 OUT.
*
* @return none
*/
void EP2_OUT_Callback (void)
{
uint32_t len;
len = GetEPRxCount( EP2_OUT & 0x7F );
PMAToUserBufferCopy( &CDC_Tx_Buf[ ( Cdc.Tx_LoadNum * DEF_USB_FS_PACK_LEN ) ], GetEPRxAddr( EP2_OUT & 0x7F ), len );
Cdc.Tx_PackLen[ Cdc.Tx_LoadNum ] = len;
Cdc.Tx_LoadNum++;
if( Cdc.Tx_LoadNum >= DEF_CDC_TX_BUF_NUM_MAX )
{
Cdc.Tx_LoadNum = 0x00;
}
Cdc.Tx_RemainNum++;
if( Cdc.Tx_RemainNum >= ( DEF_CDC_TX_BUF_NUM_MAX - 2 ) )
{
Cdc.USB_Down_StopFlag = 0x01;
}
else
{
SetEPRxValid( ENDP2 );
}
}
/*********************************************************************
* @fn EP3_IN_Callback
*
* @brief Endpoint 3 IN.
*
* @return none
*/
void EP3_IN_Callback (void)
{
USBD_Endp3_Busy = 0;
Cdc.USB_Up_IngFlag = 0x00;
}
/*********************************************************************
* @fn EP4_IN_Callback
*
* @brief Endpoint 4 IN.
*
* @return none
*/
void EP4_IN_Callback (void)
{
}
/*********************************************************************
* @fn EP4_OUT_Callback
*
* @brief Endpoint 4 OUT.
*
* @return none
*/
void EP4_OUT_Callback (void)
{
uint16_t i;
USB_Rx_Cnt = USB_SIL_Read(EP4_IN,HID_Buffer);
for ( i = 0; i < USB_Rx_Cnt; i++)
{
HID_Buffer[i] = ~HID_Buffer[i];
}
USB_SIL_Write( EP4_OUT, HID_Buffer, USB_Rx_Cnt );
SetEPTxValid( ENDP4 );
SetEPRxValid( ENDP4 );
}
/*********************************************************************
* @fn USBD_ENDPx_DataUp
*
* @brief USBD ENDPx DataUp Function
*
* @param endp - endpoint num.
* *pbuf - A pointer points to data.
* len - data length to transmit.
*
* @return data up status.
*/
uint8_t USBD_ENDPx_DataUp( uint8_t endp, uint8_t *pbuf, uint16_t len )
{
if( endp == ENDP3 )
{
if (USBD_Endp3_Busy)
{
return USB_ERROR;
}
USB_SIL_Write( EP3_IN, pbuf, len );
USBD_Endp3_Busy = 1;
SetEPTxStatus( ENDP3, EP_TX_VALID );
}
else
{
return USB_ERROR;
}
return USB_SUCCESS;
}