Newer
Older
mbed-os / targets / TARGET_Cypress / TARGET_PSOC6 / mtb-pdl-cat1 / drivers / source / cy_tdm.c
@Dustin Crossman Dustin Crossman on 4 Jun 2021 9 KB Fix file modes.
/***************************************************************************//**
* \file cy_tdm.c
* \version 1.0
*
* Provides an API implementation of the audio dac driver.
*
********************************************************************************
* \copyright
* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved.
* You may use this file only in accordance with the license, terms, conditions,
* disclaimers, and limitations in the end user license agreement accompanying
* the software package with which this file was provided.
*******************************************************************************/

#include "cy_device.h"

#if defined (CY_IP_MXTDM)

#include "cy_tdm.h"
#include <stdlib.h>

#if defined(__cplusplus)
extern "C" {
    
#endif /* __cplusplus */


cy_en_tdm_status_t Cy_AudioTDM_TX_Init( TDM_TX_STRUCT_Type * base, cy_stc_tdm_config_tx_t const * config);
void Cy_AudioTDM_TX_DeInit( TDM_TX_STRUCT_Type * base);

cy_en_tdm_status_t Cy_AudioTDM_RX_Init( TDM_RX_STRUCT_Type * base, cy_stc_tdm_config_rx_t const * config);
void Cy_AudioTDM_RX_DeInit( TDM_RX_STRUCT_Type * base);

/**
* \addtogroup group_tdm_functions
* \{
*/

/*******************************************************************************
* Function Name: Cy_AudioTDM_Init
****************************************************************************//**
*
* Initializes the TDM module in accordance with a configuration structure.
*
* \pre If the TDM module is initialized previously, the \ref Cy_AudioTDM_DeInit()
* must be called before calling this function.
*
* \param base The pointer to the TDM instance address.
*
* \param config The pointer to a configuration structure.
*
* \return error / status code. See \ref cy_en_tdm_status_t.
*
* \funcusage
* \
*
*******************************************************************************/
cy_en_tdm_status_t Cy_AudioTDM_Init( TDM_STRUCT_Type * base, cy_stc_tdm_config_t const * config)
{
    cy_en_tdm_status_t ret = CY_TDM_BAD_PARAM;
    
    if((NULL != base) && (NULL != config))
    {
       if(config->tx_config.enable)
       {
           ret = Cy_AudioTDM_TX_Init(&(base->TDM_TX_STRUCT),&(config->tx_config));
           if(ret == CY_TDM_BAD_PARAM)
           {
               return(ret);
           }
       }
       if(config->rx_config.enable)
       {
            ret = Cy_AudioTDM_RX_Init(&(base->TDM_RX_STRUCT),&(config->rx_config));
       }
    }
    return (ret);
}

/** \} group_tdm_functions */

/**************************************************************************/
/* Function Name: Cy_AudioTDM_TX_Init                                     */
/**************************************************************************/
/*
* Initializes the TDM Transmitter module in accordance with a configuration structure.
*
* \pre If the TDM TX module is initialized previously, the \ref Cy_AudioTX_Tx_DeInit()
* must be called before calling this function.
*
* \param base The pointer to the TDM->TX instance address.
*
* \param config The pointer to a configuration structure.
*
* \return error / status code. See \ref cy_en_tdm_status_t.
*
* \funcusage
*
****************************************************************************/
cy_en_tdm_status_t Cy_AudioTDM_TX_Init( TDM_TX_STRUCT_Type * base, cy_stc_tdm_config_tx_t const * config)
{

    cy_en_tdm_status_t          ret     = CY_TDM_SUCCESS;
    uint8_t clockDiv = config->clkDiv -1U;
    uint8_t channelNum = config->channelNUM - 1U;
    uint8_t channelSIZE = config->channelSize - 1U;
    CY_ASSERT_L2(base);
    CY_ASSERT_L2(config);
    CY_ASSERT_L2(CY_TDM_IS_CHANNELS_VALID(channelNum));
    CY_ASSERT_L2(CY_TDM_IS_CHANNEL_SIZE_VALID(channelSIZE));
    CY_ASSERT_L2(CY_I2S_TDM_IS_INPUT_SIGNAL_MODE_VALID(config->signalInput));

    /* Channnel Default */
    if((TDM_STRUCT_TX_CTL(base) & TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_CTL_ENABLED_Msk))
    {
        ret = CY_TDM_BAD_PARAM;
        return(ret);
    }
        
    /* The TX interface setting */
    TDM_STRUCT_TX_IF_CTL(base) =
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_CLOCK_DIV,         clockDiv)                     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_CLOCK_SEL,         config->clkSel)             |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_SCK_POLARITY,     config->sckPolarity)         |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_FSYNC_POLARITY, config->fsyncPolarity)     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_FSYNC_FORMAT,     config->fsyncFormat)         |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_CH_NR,             channelNum)                 |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_CH_SIZE,         channelSIZE)                |
        _BOOL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_IF_CTL_I2S_MODE,         config->i2sMode);

    if(!config->masterMode)
    {
        TDM_STRUCT_TX_ROUTE_CTL(base) = _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_ROUTE_CTL_MODE, config->signalInput);
    }

    /* Chanel Enable */
    TDM_STRUCT_TX_CH_CTL(base) = config->chEN;
    /* The FIFO setting */           
    TDM_STRUCT_TX_FIFO_CTL(base) = _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_FIFO_CTL_TRIGGER_LEVEL,config->fifoTriggerLevel);
    /* The TC Interface setting */      
    TDM_STRUCT_TX_CTL(base) =
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_CTL_WORD_SIZE,    config->wordSize) |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_CTL_FORMAT,     config->format)     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_CTL_MS, config->masterMode);
 
    return (ret);
}

/**************************************************************************/
/* Function Name: Cy_AudioTDM_RX_Init                                     */
/**************************************************************************/
cy_en_tdm_status_t Cy_AudioTDM_RX_Init( TDM_RX_STRUCT_Type * base, cy_stc_tdm_config_rx_t const * config)
{
    cy_en_tdm_status_t ret = CY_TDM_SUCCESS;
    uint16_t clockDiv   = (uint32_t)config->clkDiv - 1U;
    uint8_t channelSIZE = config->channelSize - 1U;
    uint8_t channelNum  = config->channelNUM - 1U;
    CY_ASSERT_L2(base);
    CY_ASSERT_L2(config);
    CY_ASSERT_L2(CY_TDM_IS_CLK_DIV_VALID(clockDiv));
    CY_ASSERT_L2(CY_TDM_IS_CHANNELS_VALID(channelNum));
    CY_ASSERT_L2(CY_TDM_IS_CHANNEL_SIZE_VALID(channelSIZE));
    CY_ASSERT_L2(CY_I2S_TDM_IS_INPUT_SIGNAL_MODE_VALID(config->signalInput));
    
    /* The RX interface setting */
    TDM_STRUCT_RX_IF_CTL(base) =
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_CLOCK_DIV,         clockDiv)                 |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_CLOCK_SEL,         config->clkSel)         |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_SCK_POLARITY,     config->sckPolarity)     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_FSYNC_POLARITY, config->fsyncPolarity)     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_LATE_SAMPLE,     config->lateSample)     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_FSYNC_FORMAT,     config->fsyncFormat)     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_CH_NR,             channelNum)             |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_CH_SIZE,         channelSIZE)            |
        _BOOL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_IF_CTL_I2S_MODE,         config->i2sMode);

    if(!config->masterMode)
    {
        TDM_STRUCT_RX_ROUTE_CTL(base) = _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_ROUTE_CTL_MODE, config->signalInput);
    }

    /* Chanel Enable */
    TDM_STRUCT_RX_CH_CTL(base) = config->chEN;
    /* The FIFO setting */           
    TDM_STRUCT_RX_FIFO_CTL(base) = _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_FIFO_CTL_TRIGGER_LEVEL,config->fifoTriggerLevel);
    /* The TC Interface setting */      
    TDM_STRUCT_RX_CTL(base) =
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_CTL_WORD_SIZE,            config->wordSize)   |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_CTL_WORD_SIGN_EXTEND,    config->signExtend) |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_RX_STRUCT_RX_CTL_FORMAT,             config->format)     |
        _VAL2FLD(TDM_TDM_STRUCT_TDM_TX_STRUCT_TX_CTL_MS, config->masterMode);

    return (ret);
}

/**
* \addtogroup group_tdm_functions
* \{
*/


/*******************************************************************************
* Function Name: Cy_AudioTDM_DeInit
****************************************************************************//**
*
*
* \param base base
*
*******************************************************************************/
void Cy_AudioTDM_DeInit( TDM_STRUCT_Type * base)
{
    Cy_AudioTDM_TX_DeInit(&(base->TDM_TX_STRUCT));
    Cy_AudioTDM_RX_DeInit(&(base->TDM_RX_STRUCT));
}

/** \} group_tdm_functions */

/**************************************************************************/
/* Function Name: Cy_AudioTDM_TX_DeInit                                   */
/**************************************************************************/
void Cy_AudioTDM_TX_DeInit( TDM_TX_STRUCT_Type * base)
{
    TDM_STRUCT_TX_INTR_TX_MASK(base)    = 0UL;
    TDM_STRUCT_TX_FIFO_CTL(base)        = 0UL;
    TDM_STRUCT_TX_IF_CTL(base)            = CY_TDM_TX_IF_CTL_DEFAULT;
    TDM_STRUCT_TX_CTL(base)                = CY_TDM_TX_CTL_DEFAULT;
}

/**************************************************************************/
/* Function Name: Cy_AudioTDM_RX_DeInit                                   */
/**************************************************************************/
void Cy_AudioTDM_RX_DeInit( TDM_RX_STRUCT_Type * base)
{
    TDM_STRUCT_RX_INTR_RX_MASK(base)    = 0UL;
    TDM_STRUCT_RX_FIFO_CTL(base)        = 0UL;
    TDM_STRUCT_RX_IF_CTL(base)            = CY_TDM_RX_IF_CTL_DEFAULT;
    TDM_STRUCT_RX_CTL(base)                = CY_TDM_RX_CTL_DEFAULT;
}

#if defined(__cplusplus)
}
#endif /* __cplusplus */


#endif /* CY_IP_MXTDM */
/******************************************************************************/
/* [] END OF FILE */
/******************************************************************************/