149 lines
3.2 KiB
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 "periph/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;
|
|
}
|