Newer
Older
mbed-os / targets / TARGET_NUVOTON / TARGET_M460 / device / StdDriver / src / m460_hbi.c
@Jay Sridharan Jay Sridharan on 31 Dec 2022 7 KB Merge upstream changes into mbed-ce (#117)
/**************************************************************************//**
 * @file     hbi.c
 * @version  V3.00
 * @brief    HyperBus Interface (HBI) driver source file
 *
 * @copyright SPDX-License-Identifier: Apache-2.0
 * @copyright Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include "NuMicro.h"


/** @addtogroup Standard_Driver Standard Driver
  @{
*/

/** @addtogroup HBI_Driver HBI Driver
  @{
*/

int32_t g_HBI_i32ErrCode = 0;       /*!< HBI global error code */

/** @addtogroup HBI_EXPORTED_FUNCTIONS HBI Exported Functions
  @{
*/


/**
  * @brief      Reset HBI function
  * @return     None
  * @note       This function sets g_HBI_i32ErrCode to HBI_TIMEOUT_ERR if waiting Hyper RAM time-out.
  */
void HBI_ResetHyperRAM(void)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->CMD = HBI_CMD_RESET_HRAM;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
}

/**
  * @brief      Exit from Hybrid sleep and deep Power down function
  * @return     None
  * @note       This function sets g_HBI_i32ErrCode to HBI_TIMEOUT_ERR if waiting Hyper RAM time-out.
  */
void HBI_ExitHSAndDPD(void)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->CMD = HBI_CMD_EXIT_HS_PD;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
}

/**
  * @brief      Read HyperRAM register space
  * @param[in]  u32Addr  Address of HyperRAM register space
  *                 - \ref HYPERRAM_ID_REG0       : 0x0000_0000 = Identification Register 0
  *                 - \ref HYPERRAM_ID_REG1       : 0x0000_0002 = Identification Register 1
  *                 - \ref HYPERRAM_CONFIG_REG0   : 0x0000_1000 = Configuration Register 0
  *                 - \ref HYPERRAM_CONFIG_REG1   : 0x0000_1002 = Configuration Register 1
  * @return   The data of HyperRAM register.
  * @return   -1  An illeagal register space
  * @return   -2  Wait Hyper RAM time-out
  */
int32_t HBI_ReadHyperRAMReg(uint32_t u32Addr)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    if( (u32Addr == HYPERRAM_ID_REG0) || (u32Addr == HYPERRAM_ID_REG1) || (u32Addr == HYPERRAM_CONFIG_REG0) || (u32Addr == HYPERRAM_CONFIG_REG1) )
    {
        HBI->ADR = u32Addr;
        HBI->CMD = HBI_CMD_READ_HRAM_REGISTER;

        while(HBI->CMD != HBI_CMD_HRAM_IDLE)
        {
            if( i32TimeOutCnt-- <= 0)
            {
                return HBI_TIMEOUT_ERR;
            }
        }
        return HBI->RDATA;
    }
    else
    {
        return -1;
    }
}

/**
  * @brief      Write HyperRAM register space
  * @param[in]  u32Addr  Address of HyperRAM register space
  *                 - \ref HYPERRAM_ID_REG0       : 0x0000_0000 = Identification Register 0
  *                 - \ref HYPERRAM_ID_REG1       : 0x0000_0002 = Identification Register 1
  *                 - \ref HYPERRAM_CONFIG_REG0   : 0x0000_1000 = Configuration Register 0
  *                 - \ref HYPERRAM_CONFIG_REG1   : 0x0000_1002 = Configuration Register 1
  * @param[in]
  * @return   0   success.
  * @return   -1  An illeagal register space
  * @return   -2  Wait Hyper RAM time-out
  */
int32_t HBI_WriteHyperRAMReg(uint32_t u32Addr, uint32_t u32Value)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    if( (u32Addr == HYPERRAM_ID_REG0) || (u32Addr == HYPERRAM_ID_REG1) || (u32Addr == HYPERRAM_CONFIG_REG0) || (u32Addr == HYPERRAM_CONFIG_REG1) )
    {
        HBI->ADR = u32Addr;
        HBI->WDATA = u32Value;
        HBI->CMD = HBI_CMD_WRITE_HRAM_REGISTER;

        while(HBI->CMD != HBI_CMD_HRAM_IDLE)
        {
            if( i32TimeOutCnt-- <= 0)
            {
                return HBI_TIMEOUT_ERR;
            }
        }
        return 0;
    }
    else
    {
        return -1;
    }
}

/**
  * @brief      Read 1 word from HyperRAM space
  * @param[in]  u32Addr  Address of HyperRAM space
  * @return     The 16 bit data of HyperRAM space.
  * @note       This function sets g_HBI_i32ErrCode to HBI_TIMEOUT_ERR if waiting Hyper RAM time-out.
  */
uint32_t HBI_Read1Word(uint32_t u32Addr)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->ADR = u32Addr;
    HBI->CMD = HBI_CMD_READ_HRAM_1_WORD;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
    return HBI->RDATA;
}

/**
  * @brief      Read 2 word from HyperRAM space
  * @param[in]  u32Addr  Address of HyperRAM space
  * @return     The 32bit data of HyperRAM space.
  */
uint32_t HBI_Read2Word(uint32_t u32Addr)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->ADR = u32Addr;
    HBI->CMD = HBI_CMD_READ_HRAM_2_WORD;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
    return HBI->RDATA;
}

/**
  * @brief      Write 1 byte to HyperRAM space
  * @param[in]  u32Addr  Address of HyperRAM space
  * @param[in]  u8Data   8 bits data to be written to HyperRAM space
  * @return     None.
  * @note       This function sets g_HBI_i32ErrCode to HBI_TIMEOUT_ERR if waiting Hyper RAM time-out.
  */
void HBI_Write1Byte(uint32_t u32Addr, uint8_t u8Data)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->ADR = u32Addr;
    HBI->WDATA = u8Data;
    HBI->CMD = HBI_CMD_WRITE_HRAM_1_BYTE;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
}

/**
  * @brief      Write 2 bytes to HyperRAM space
  * @param[in]  u32Addr  Address of HyperRAM space
  * @param[in]  u16Data  16 bits data to be written to HyperRAM space
  * @return     None.
  * @note       This function sets g_HBI_i32ErrCode to HBI_TIMEOUT_ERR if waiting Hyper RAM time-out.
  */
void HBI_Write2Byte(uint32_t u32Addr, uint16_t u16Data)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->ADR = u32Addr;
    HBI->WDATA = u16Data;
    HBI->CMD = HBI_CMD_WRITE_HRAM_2_BYTE;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
}

/**
  * @brief      Write 3 bytes to HyperRAM space
  * @param[in]  u32Addr  Address of HyperRAM space
  * @param[in]  u32Data  24 bits data to be written to HyperRAM space
  * @return     None.
  * @note       This function sets g_HBI_i32ErrCode to HBI_TIMEOUT_ERR if waiting Hyper RAM time-out.
  */
void HBI_Write3Byte(uint32_t u32Addr, uint32_t u32Data)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->ADR = u32Addr;
    HBI->WDATA = u32Data;
    HBI->CMD = HBI_CMD_WRITE_HRAM_3_BYTE;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
}

/**
  * @brief      Write 4 byte to HyperRAM space
  * @param[in]  u32Addr  Address of HyperRAM space
  * @param[in]  u32Data  32 bits data to be written to HyperRAM space
  * @return     None.
  * @note       This function sets g_HBI_i32ErrCode to HBI_TIMEOUT_ERR if waiting Hyper RAM time-out.
  */
void HBI_Write4Byte(uint32_t u32Addr, uint32_t u32Data)
{
    int32_t i32TimeOutCnt = HBI_TIMEOUT;

    HBI->ADR = u32Addr;
    HBI->WDATA = u32Data;
    HBI->CMD = HBI_CMD_WRITE_HRAM_4_BYTE;

    g_HBI_i32ErrCode = 0;
    while(HBI->CMD != HBI_CMD_HRAM_IDLE)
    {
        if( i32TimeOutCnt-- <= 0)
        {
            g_HBI_i32ErrCode = HBI_TIMEOUT_ERR;
            break;
        }
    }
}


/*@}*/ /* end of group HBI_EXPORTED_FUNCTIONS */

/*@}*/ /* end of group HBI_Driver */

/*@}*/ /* end of group Standard_Driver */