/********************************** (C) COPYRIGHT ******************************* * File Name : usb_regs.c * Author : WCH * Version : V1.0.0 * Date : 2021/08/08 * Description : Interface functions to USB cell registers ********************************************************************************* * 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 "../../driver/inc/usb_lib.h" /******************************************************************************* * @fn SetCNTR. * * @brief Set the CNTR register value. * * @param wRegValue: new register value. * * @return None. */ void SetCNTR(uint16_t wRegValue) { _SetCNTR(wRegValue); } /******************************************************************************* * @fn GetCNTR. * * @brief returns the CNTR register value. * * @param None. * * @return CNTR register Value. */ uint16_t GetCNTR(void) { return(_GetCNTR()); } /******************************************************************************* * @fn SetISTR. * * @brief Set the ISTR register value. * * @param wRegValue: new register value. * * @return None. */ void SetISTR(uint16_t wRegValue) { _SetISTR(wRegValue); } /******************************************************************************* * @fn GetISTR * * @brief Returns the ISTR register value. * * @param None. * * @return ISTR register Value */ uint16_t GetISTR(void) { return(_GetISTR()); } /******************************************************************************* * @fn GetFNR * * @brief Returns the FNR register value. * * @param None. * * @return FNR register Value */ uint16_t GetFNR(void) { return(_GetFNR()); } /******************************************************************************* * @fn SetDADDR * * @brief Set the DADDR register value. * * @param wRegValue: new register value. * * @return None. */ void SetDADDR(uint16_t wRegValue) { _SetDADDR(wRegValue); } /******************************************************************************* * @fn GetDADDR * * @brief Returns the DADDR register value. * * @return DADDR register Value * */ uint16_t GetDADDR(void) { return(_GetDADDR()); } /******************************************************************************* * @fn SetBTABLE * * @brief Set the BTABLE. * * @param wRegValue: New register value. * * @return None. */ void SetBTABLE(uint16_t wRegValue) { _SetBTABLE(wRegValue); } /******************************************************************************* * @fn GetBTABLE. * * @param Returns the BTABLE register value. * * @return BTABLE address. */ uint16_t GetBTABLE(void) { return(_GetBTABLE()); } /******************************************************************************* * @fn SetENDPOINT * * @brief Set the Endpoint register value. * * @param bEpNum: Endpoint Number. * wRegValue. * * @return None. */ void SetENDPOINT(uint8_t bEpNum, uint16_t wRegValue) { _SetENDPOINT(bEpNum, wRegValue); } /******************************************************************************* * @fn GetENDPOINT * * @brief Return the Endpoint register value. * * @param bEpNum: Endpoint Number. * * @return Endpoint register value. */ uint16_t GetENDPOINT(uint8_t bEpNum) { return(_GetENDPOINT(bEpNum)); } /******************************************************************************* * @fn SetEPType * * @brief sets the type in the endpoint register. * * @param bEpNum: Endpoint Number. * wType: type definition. * * @return None. */ void SetEPType(uint8_t bEpNum, uint16_t wType) { _SetEPType(bEpNum, wType); } /******************************************************************************* * @fn GetEPType * * @brief Returns the endpoint type. * * @param bEpNum: Endpoint Number. * * @return Endpoint Type */ uint16_t GetEPType(uint8_t bEpNum) { return(_GetEPType(bEpNum)); } /******************************************************************************* * @fn SetEPTxStatus * * @brief Set the status of Tx endpoint. * * @param bEpNum: Endpoint Number. * wState: new state. * * @return None. */ void SetEPTxStatus(uint8_t bEpNum, uint16_t wState) { _SetEPTxStatus(bEpNum, wState); } /******************************************************************************* * @fn SetEPRxStatus * * @brief Set the status of Rx endpoint. * * @param bEpNum: Endpoint Number. * wState: new state. * * @return None. */ void SetEPRxStatus(uint8_t bEpNum, uint16_t wState) { _SetEPRxStatus(bEpNum, wState); } /******************************************************************************* * @fn SetDouBleBuffEPStall * * @brief sets the status for Double Buffer Endpoint to STALL * * @param bEpNum: Endpoint Number. * bDir: Endpoint direction. * * @return None. */ void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir) { uint16_t Endpoint_DTOG_Status; Endpoint_DTOG_Status = GetENDPOINT(bEpNum); if (bDir == EP_DBUF_OUT) { _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1); } else if (bDir == EP_DBUF_IN) { _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1); } } /******************************************************************************* * @fn GetEPTxStatus * * @brief Returns the endpoint Tx status. * * @param bEpNum: Endpoint Number. * * @return Endpoint TX Status */ uint16_t GetEPTxStatus(uint8_t bEpNum) { return(_GetEPTxStatus(bEpNum)); } /******************************************************************************* * @fn GetEPRxStatus * * @brief Returns the endpoint Rx status. * * @param bEpNum: Endpoint Number. * * @return Endpoint RX Status */ uint16_t GetEPRxStatus(uint8_t bEpNum) { return(_GetEPRxStatus(bEpNum)); } /******************************************************************************* * @fn SetEPTxValid * * @brief Valid the endpoint Tx Status. * * @param bEpNum: Endpoint Number. * * @return None. */ void SetEPTxValid(uint8_t bEpNum) { _SetEPTxStatus(bEpNum, EP_TX_VALID); } /******************************************************************************* * @fn SetEPRxValid * * @brief Valid the endpoint Rx Status. * * @param bEpNum: Endpoint Number. * * @return None. */ void SetEPRxValid(uint8_t bEpNum) { _SetEPRxStatus(bEpNum, EP_RX_VALID); } /******************************************************************************* * @fn SetEP_KIND * * @brief Clear the EP_KIND bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void SetEP_KIND(uint8_t bEpNum) { _SetEP_KIND(bEpNum); } /******************************************************************************* * @fn ClearEP_KIND * * @brief set the EP_KIND bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void ClearEP_KIND(uint8_t bEpNum) { _ClearEP_KIND(bEpNum); } /******************************************************************************* * @fn Clear_Status_Out * * @brief Clear the Status Out of the related Endpoint * * @param bEpNum: Endpoint Number. * * @return None. */ void Clear_Status_Out(uint8_t bEpNum) { _ClearEP_KIND(bEpNum); } /******************************************************************************* * @fn Set_Status_Out * * @brief Set the Status Out of the related Endpoint * * @param bEpNum: Endpoint Number. * * @return None. */ void Set_Status_Out(uint8_t bEpNum) { _SetEP_KIND(bEpNum); } /******************************************************************************* * @fn SetEPDoubleBuff * * @brief Enable the double buffer feature for the endpoint. * * @param bEpNum: Endpoint Number. * * @return None. */ void SetEPDoubleBuff(uint8_t bEpNum) { _SetEP_KIND(bEpNum); } /******************************************************************************* * @fn ClearEPDoubleBuff * * @brief Disable the double buffer feature for the endpoint. * * @param bEpNum: Endpoint Number. * * @return None. */ void ClearEPDoubleBuff(uint8_t bEpNum) { _ClearEP_KIND(bEpNum); } /******************************************************************************* * @fn GetTxStallStatus * * @brief Returns the Stall status of the Tx endpoint. * * @param bEpNum: Endpoint Number. * * @return Tx Stall status. */ uint16_t GetTxStallStatus(uint8_t bEpNum) { return(_GetTxStallStatus(bEpNum)); } /******************************************************************************* * @fn GetRxStallStatus * * @brief Returns the Stall status of the Rx endpoint. * * @param bEpNum: Endpoint Number. * * @return Rx Stall status. */ uint16_t GetRxStallStatus(uint8_t bEpNum) { return(_GetRxStallStatus(bEpNum)); } /******************************************************************************* * @fn ClearEP_CTR_RX * * @brief Clear the CTR_RX bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void ClearEP_CTR_RX(uint8_t bEpNum) { _ClearEP_CTR_RX(bEpNum); } /******************************************************************************* * @fn ClearEP_CTR_TX * * @brief Clear the CTR_TX bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void ClearEP_CTR_TX(uint8_t bEpNum) { _ClearEP_CTR_TX(bEpNum); } /******************************************************************************* * @fn ToggleDTOG_RX * * @brief Toggle the DTOG_RX bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void ToggleDTOG_RX(uint8_t bEpNum) { _ToggleDTOG_RX(bEpNum); } /******************************************************************************* * @fn ToggleDTOG_TX * * @brief Toggle the DTOG_TX bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void ToggleDTOG_TX(uint8_t bEpNum) { _ToggleDTOG_TX(bEpNum); } /******************************************************************************* * @fn ClearDTOG_RX. * * @brief Clear the DTOG_RX bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void ClearDTOG_RX(uint8_t bEpNum) { _ClearDTOG_RX(bEpNum); } /******************************************************************************* * @fn ClearDTOG_TX. * * @brief Clear the DTOG_TX bit. * * @param bEpNum: Endpoint Number. * * @return None. */ void ClearDTOG_TX(uint8_t bEpNum) { _ClearDTOG_TX(bEpNum); } /******************************************************************************* * @fn SetEPAddress * * @brief Set the endpoint address. * * @param bEpNum: Endpoint Number. * bAddr: New endpoint address. * * @return None. */ void SetEPAddress(uint8_t bEpNum, uint8_t bAddr) { _SetEPAddress(bEpNum, bAddr); } /******************************************************************************* * @fn GetEPAddress * * @brief Get the endpoint address. * * @param bEpNum: Endpoint Number. * * @return Endpoint address. */ uint8_t GetEPAddress(uint8_t bEpNum) { return(_GetEPAddress(bEpNum)); } /******************************************************************************* * @fn SetEPTxAddr * * @brief Set the endpoint Tx buffer address. * * @param bEpNum: Endpoint Number. * wAddr: new address. * * @return None. */ void SetEPTxAddr(uint8_t bEpNum, uint16_t wAddr) { _SetEPTxAddr(bEpNum, wAddr); } /******************************************************************************* * @fn SetEPRxAddr * * @brief Set the endpoint Rx buffer address. * * @param bEpNum: Endpoint Number. * wAddr: new address. * * @return None. */ void SetEPRxAddr(uint8_t bEpNum, uint16_t wAddr) { _SetEPRxAddr(bEpNum, wAddr); } /******************************************************************************* * @fn GetEPTxAddr * * @brief Returns the endpoint Tx buffer address. * * @param bEpNum: Endpoint Number. * * @return Rx buffer address. */ uint16_t GetEPTxAddr(uint8_t bEpNum) { return(_GetEPTxAddr(bEpNum)); } /******************************************************************************* * @fn GetEPRxAddr. * * @brief Returns the endpoint Rx buffer address. * * @param bEpNum: Endpoint Number. * * @returnRx buffer address. */ uint16_t GetEPRxAddr(uint8_t bEpNum) { return(_GetEPRxAddr(bEpNum)); } /******************************************************************************* * @fn SetEPTxCount. * * @brief Set the Tx count. * * @param bEpNum: Endpoint Number. * wCount: new count value. * * @return None. */ void SetEPTxCount(uint8_t bEpNum, uint16_t wCount) { _SetEPTxCount(bEpNum, wCount); } /******************************************************************************* * @fn SetEPCountRxReg. * * @brief Set the Count Rx Register value. * * @param *pdwReg: point to the register. * wCount: the new register value. * * @return None. */ void SetEPCountRxReg(uint32_t *pdwReg, uint16_t wCount) { _SetEPCountRxReg(dwReg, wCount); } /******************************************************************************* * @fn SetEPRxCount * * @brief Set the Rx count. * * @param bEpNum: Endpoint Number. * wCount: the new count value. * * @return None. */ void SetEPRxCount(uint8_t bEpNum, uint16_t wCount) { _SetEPRxCount(bEpNum, wCount); } /******************************************************************************* * @fn GetEPTxCount * * @brief Get the Tx count. * * @param bEpNum: Endpoint Number. * * @return Tx count value. */ uint16_t GetEPTxCount(uint8_t bEpNum) { return(_GetEPTxCount(bEpNum)); } /******************************************************************************* * @fn GetEPRxCount * * @brief Get the Rx count. * * @param bEpNum: Endpoint Number. * * @return Rx count value. */ uint16_t GetEPRxCount(uint8_t bEpNum) { return(_GetEPRxCount(bEpNum)); } /******************************************************************************* * @fn SetEPDblBuffAddr * * @brief Set the addresses of the buffer 0 and 1. * * @param bEpNum: Endpoint Number. * wBuf0Addr: new address of buffer 0. * wBuf1Addr: new address of buffer 1. * * @return None. */ void SetEPDblBuffAddr(uint8_t bEpNum, uint16_t wBuf0Addr, uint16_t wBuf1Addr) { _SetEPDblBuffAddr(bEpNum, wBuf0Addr, wBuf1Addr); } /******************************************************************************* * @fn SetEPDblBuf0Addr * * @brief Set the Buffer 1 address. * * @param bEpNum: Endpoint Number * wBuf0Addr: new address. * * @return None. */ void SetEPDblBuf0Addr(uint8_t bEpNum, uint16_t wBuf0Addr) { _SetEPDblBuf0Addr(bEpNum, wBuf0Addr); } /******************************************************************************* * @fn SetEPDblBuf1Addr * * @brief Set the Buffer 1 address. * * @param bEpNum: Endpoint Number * wBuf1Addr: new address. * * @return None. */ void SetEPDblBuf1Addr(uint8_t bEpNum, uint16_t wBuf1Addr) { _SetEPDblBuf1Addr(bEpNum, wBuf1Addr); } /******************************************************************************* * @fn GetEPDblBuf0Addr * * @brief Returns the address of the Buffer 0. * * @param bEpNum: Endpoint Number. * * @return None. */ uint16_t GetEPDblBuf0Addr(uint8_t bEpNum) { return(_GetEPDblBuf0Addr(bEpNum)); } /******************************************************************************* * @fn GetEPDblBuf1Addr * * @brief Returns the address of the Buffer 1. * * @param bEpNum: Endpoint Number. * * @return Address of the Buffer 1. */ uint16_t GetEPDblBuf1Addr(uint8_t bEpNum) { return(_GetEPDblBuf1Addr(bEpNum)); } /******************************************************************************* * @fn SetEPDblBuffCount * * @brief Set the number of bytes for a double Buffer * endpoint. * * @param bEpNum,bDir, wCount * * @return None. */ void SetEPDblBuffCount(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) { _SetEPDblBuffCount(bEpNum, bDir, wCount); } /******************************************************************************* * @fn SetEPDblBuf0Count * * @brief Set the number of bytes in the buffer 0 of a double Buffer * endpoint. * * @param bEpNum, bDir, wCount * * @return None. */ void SetEPDblBuf0Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) { _SetEPDblBuf0Count(bEpNum, bDir, wCount); } /******************************************************************************* * @fn SetEPDblBuf1Count * * @brief Set the number of bytes in the buffer 0 of a double Buffer * endpoint. * * @param bEpNum, bDir, wCount * * @return None. */ void SetEPDblBuf1Count(uint8_t bEpNum, uint8_t bDir, uint16_t wCount) { _SetEPDblBuf1Count(bEpNum, bDir, wCount); } /******************************************************************************* * @fn GetEPDblBuf0Count * * @brief Returns the number of byte received in the buffer 0 of a double * Buffer endpoint. * * @param bEpNum: Endpoint Number. * * @return Endpoint Buffer 0 count */ uint16_t GetEPDblBuf0Count(uint8_t bEpNum) { return(_GetEPDblBuf0Count(bEpNum)); } /******************************************************************************* * @fn GetEPDblBuf1Count * * @brief Returns the number of data received in the buffer 1 of a double * Buffer endpoint. * * @param bEpNum: Endpoint Number. * * @return Endpoint Buffer 1 count. */ uint16_t GetEPDblBuf1Count(uint8_t bEpNum) { return(_GetEPDblBuf1Count(bEpNum)); } /******************************************************************************* * @fn GetEPDblBufDir * * @brief gets direction of the double buffered endpoint * * @param bEpNum: Endpoint Number. * * @return EP_DBUF_OUT, EP_DBUF_IN, * EP_DBUF_ERR if the endpoint counter not yet programmed. */ EP_DBUF_DIR GetEPDblBufDir(uint8_t bEpNum) { if ((uint16_t)(*_pEPRxCount(bEpNum) & 0xFC00) != 0) return(EP_DBUF_OUT); else if (((uint16_t)(*_pEPTxCount(bEpNum)) & 0x03FF) != 0) return(EP_DBUF_IN); else return(EP_DBUF_ERR); } /******************************************************************************* * @fn FreeUserBuffer * * @brief free buffer used from the application realizing it to the line toggles bit SW_BUF in the double buffered endpoint register * * @param bEpNum, bDir * * @return None. */ void FreeUserBuffer(uint8_t bEpNum, uint8_t bDir) { if (bDir == EP_DBUF_OUT) { _ToggleDTOG_TX(bEpNum); } else if (bDir == EP_DBUF_IN) { _ToggleDTOG_RX(bEpNum); } } /******************************************************************************* * @fn ToWord * * @brief merge two byte in a word. * * @param bh: byte high, bl: bytes low. * * @return resulted word. */ uint16_t ToWord(uint8_t bh, uint8_t bl) { uint16_t wRet; wRet = (uint16_t)bl | ((uint16_t)bh << 8); return(wRet); } /******************************************************************************* * @fn ByteSwap * * @brief Swap two byte in a word. * * @param wSwW: word to Swap. * * @return resulted word. */ uint16_t ByteSwap(uint16_t wSwW) { uint8_t bTemp; uint16_t wRet; bTemp = (uint8_t)(wSwW & 0xff); wRet = (wSwW >> 8) | ((uint16_t)bTemp << 8); return(wRet); }