/*FUNCTION**********************************************************************
 *
 * Function Name : LPSCI_HAL_Init
 * Description   : This function initializes the module to a known state.
 *
 *END**************************************************************************/
void LPSCI_HAL_Init(uint32_t baseAddr)
{
    HW_UART0_BDH_WR(baseAddr, 0U);
    HW_UART0_BDL_WR(baseAddr, 4U);
    HW_UART0_C1_WR(baseAddr, 0U);
    HW_UART0_C2_WR(baseAddr, 0U);
    HW_UART0_S2_WR(baseAddr, 0U);
    HW_UART0_C3_WR(baseAddr, 0U);
    HW_UART0_D_WR(baseAddr, 0U);
#if FSL_FEATURE_LPSCI_HAS_ADDRESS_MATCHING
    HW_UART0_MA1_WR(baseAddr, 0U);
    HW_UART0_MA2_WR(baseAddr, 0U);
#endif
    HW_UART0_C4_WR(baseAddr, 0U);
#if FSL_FEATURE_LPSCI_HAS_DMA_ENABLE
    HW_UART0_C5_WR(baseAddr, 0U);
#endif
#if FSL_FEATURE_LPSCI_HAS_MODEM_SUPPORT
    HW_UART0_MODEM_WR(baseAddr, 0U);
#endif
#if FSL_FEATURE_LPSCI_HAS_IR_SUPPORT
    HW_UART0_IR_WR(baseAddr, 0U);
#endif
}
/*FUNCTION**********************************************************************
 *
 * Function Name : uart_hal_configure_interrupts
 * Description   : Configure the UART module interrupts to enable/disable various interrupt sources.
 * This function allows the user to configure all of the UART interrupts with one function call.
 * The user will first need to initialize and pass in a structure of type uart_interrupt_config_t
 * which sets the configuration of each interrupt.
 *
 *END**************************************************************************/
void uart_hal_configure_interrupts(uint32_t uartInstance,
                                   const uart_interrupt_config_t * interruptConfig)
{
    assert(uartInstance < UART_INSTANCE_COUNT);

    uint8_t temp;

    /* configure uart interrupt enables*/
#if FSL_FEATURE_UART_HAS_LOW_POWER_UART_SUPPORT
    if (uartInstance == 0)
    {
        /* 0 - disable interrupt, 1 - enable interrupt*/

        /* UART BDH register  */
        temp = HW_UART0_BDH_RD() & ~(BM_UART0_BDH_LBKDIE|BM_UART0_BDH_RXEDGIE);
        temp |= BF_UART0_BDH_LBKDIE(interruptConfig->linBreakDetect)
               |BF_UART0_BDH_RXEDGIE(interruptConfig->rxActiveEdge);
        HW_UART0_BDH_WR(temp);

        /* UART C2 register  */
        temp = HW_UART0_C2_RD() & ~(BM_UART0_C2_TIE|BM_UART0_C2_TCIE|BM_UART0_C2_RIE|
                                    BM_UART0_C2_ILIE);
        temp |= BF_UART0_C2_TIE(interruptConfig->transmitDataRegisterEmpty)
               |BF_UART0_C2_TCIE(interruptConfig->transmitComplete)
               |BF_UART0_C2_RIE(interruptConfig->receiverDataRegisterFull)
               |BF_UART0_C2_ILIE(interruptConfig->idleLine);
        HW_UART0_C2_WR(temp);

        /* UART C3 register  */
        temp = HW_UART0_C3_RD() & ~(BM_UART0_C3_ORIE|BM_UART0_C3_NEIE|BM_UART0_C3_FEIE|
                                    BM_UART0_C3_PEIE);
        temp |= BF_UART0_C3_ORIE(interruptConfig->receiverOverrun)
               |BF_UART0_C3_NEIE(interruptConfig->noiseErrorFlag)
               |BF_UART0_C3_FEIE(interruptConfig->frameErrorFlag)
               |BF_UART0_C3_PEIE(interruptConfig->parityErrorFlag);
        HW_UART0_C3_WR(temp);

    }
    else
#endif
    {
        /* 0 - disable interrupt, 1 - enable interrupt*/

        /* UART BDH register  */
        temp = HW_UART_BDH_RD(uartInstance) & ~(BM_UART_BDH_LBKDIE|BM_UART_BDH_RXEDGIE);
        temp |= BF_UART_BDH_LBKDIE(interruptConfig->linBreakDetect)
               |BF_UART_BDH_RXEDGIE(interruptConfig->rxActiveEdge);
        HW_UART_BDH_WR(uartInstance, temp);

        /* UART C2 register  */
        temp = HW_UART_C2_RD(uartInstance) & ~(BM_UART_C2_TIE|BM_UART_C2_TCIE|BM_UART_C2_RIE|
                                               BM_UART_C2_ILIE);
        temp |= BF_UART_C2_TIE(interruptConfig->transmitDataRegisterEmpty)
               |BF_UART_C2_TCIE(interruptConfig->transmitComplete)
               |BF_UART_C2_RIE(interruptConfig->receiverDataRegisterFull)
               |BF_UART_C2_ILIE(interruptConfig->idleLine);
        HW_UART_C2_WR(uartInstance, temp);

        /* UART C3 register  */
        temp = HW_UART_C3_RD(uartInstance) & ~(BM_UART_C3_ORIE|BM_UART_C3_NEIE|BM_UART_C3_FEIE|
                                               BM_UART_C3_PEIE);
        temp |= BF_UART_C3_ORIE(interruptConfig->receiverOverrun)
               |BF_UART_C3_NEIE(interruptConfig->noiseErrorFlag)
               |BF_UART_C3_FEIE(interruptConfig->frameErrorFlag)
               |BF_UART_C3_PEIE(interruptConfig->parityErrorFlag);
        HW_UART_C3_WR(uartInstance, temp);
#if FSL_FEATURE_UART_HAS_FIFO
        /* UART CFIFO register  */
        temp = HW_UART_CFIFO_RD(uartInstance) & ~(BM_UART_CFIFO_TXOFE|BM_UART_CFIFO_RXUFE);
        temp |= BF_UART_CFIFO_TXOFE(interruptConfig->txFifoOverflow)
               |BF_UART_CFIFO_RXUFE(interruptConfig->rxFifoUnderflow);
        HW_UART_CFIFO_WR(uartInstance, temp);
#endif
    }
}