/********************************************************************************************************//**
* @brief The function is used disable UART clock, disable ISR and close UART function.
* @param[in] Port : UART Channel: UART_PORT0 / UART_PORT1
* @return None
************************************************************************************************************/
void DrvUART_Close(UART_PORT Port)
{
if(Port == UART_PORT1)
{
while(!UART1->FSR.TX_EMPTY);
REG32WRITE(SYSCLK->APBCLK, UART1_EN, 0);
REG32WRITE(SYSCLK->APBCLK, UART1_EN, 0);
g_pfnUART1callback = NULL;
NVIC_DisableIRQ (UART1_IRQn);
}
else if(Port == UART_PORT2)
{
while(!UART2->FSR.TX_EMPTY);
REG32WRITE(SYSCLK->APBCLK, UART2_EN, 0);
REG32WRITE(SYSCLK->APBCLK, UART2_EN, 0);
g_pfnUART2callback = NULL;
NVIC_DisableIRQ (UART0_IRQn);
}
else
{
while(!UART0->FSR.TX_EMPTY);
REG32WRITE(SYSCLK->APBCLK, UART0_EN, 0);
g_pfnUART0callback = NULL;
NVIC_DisableIRQ(UART0_IRQn);
}
}
/********************************************************************************************************//**
* @brief The function is used to enable UART Interrupt and Install the call back function
* @param[in] Port : UART Channel: UART_PORT0 / UART_PORT1
* @param[in] u32InterruptFlag: DRVUART_LININT/DRVUART_WAKEUPINT/DRVUART_BUFERRINT/DRVUART_RLSNT
* DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT
* @param[in] pfncallback : A function pointer for callback function
* @return
************************************************************************************************************/
int32_t DrvUART_EnableInt(UART_PORT port, uint32_t u32InterruptFlag, PFN_DRVUART_CALLBACK pfncallback)
{
if((port != UART_PORT0) && (port != UART_PORT1)&& (port != UART_PORT2))
{
return E_DRVUART_ARGUMENT;
}
if(port == UART_PORT0) /* Set Specified Interrupt */
{
REG32WRITE(UART0->IER, RDA_IEN, (u32InterruptFlag & DRVUART_RDAINT)?1:0 );
REG32WRITE(UART0->IER, THRE_IEN, (u32InterruptFlag & DRVUART_THREINT)?1:0);
REG32WRITE(UART0->IER, RLS_IEN, (u32InterruptFlag & DRVUART_RLSNT)?1:0);
REG32WRITE(UART0->IER, MS_IEN, (u32InterruptFlag & DRVUART_MOSINT)?1:0);
REG32WRITE(UART0->IER, TOC_EN, (u32InterruptFlag & DRVUART_TOUTINT)?1:0); /* Time-out count enable */
REG32WRITE(UART0->IER, RTO_IEN, (u32InterruptFlag & DRVUART_TOUTINT)?1:0); /* Time-out INT enable */
REG32WRITE(UART0->IER, BUF_ERR_IEN, (u32InterruptFlag & DRVUART_BUFERRINT)?1:0);
REG32WRITE(UART0->IER, WAKE_IEN, (u32InterruptFlag & DRVUART_WAKEUPINT)?1:0);
REG32WRITE(UART0->IER, LIN_RX_BRK_IEN, (u32InterruptFlag & DRVUART_LININT)?1:0);
}
else if(port == UART_PORT1)
{
REG32WRITE(UART1->IER, RDA_IEN, (u32InterruptFlag & DRVUART_RDAINT)?1:0 );
REG32WRITE(UART1->IER, THRE_IEN, (u32InterruptFlag & DRVUART_THREINT)?1:0);
REG32WRITE(UART1->IER, RLS_IEN, (u32InterruptFlag & DRVUART_RLSNT)?1:0);
REG32WRITE(UART1->IER, MS_IEN, (u32InterruptFlag & DRVUART_MOSINT)?1:0);
REG32WRITE(UART1->IER, TOC_EN, (u32InterruptFlag & DRVUART_TOUTINT)?1:0); /* Time-out count enable */
REG32WRITE(UART1->IER, RTO_IEN, (u32InterruptFlag & DRVUART_TOUTINT)?1:0); /* Time-out INT enable */
REG32WRITE(UART1->IER, BUF_ERR_IEN, (u32InterruptFlag & DRVUART_BUFERRINT)?1:0);
REG32WRITE(UART1->IER, WAKE_IEN, (u32InterruptFlag & DRVUART_WAKEUPINT)?1:0);
REG32WRITE(UART1->IER, LIN_RX_BRK_IEN, (u32InterruptFlag & DRVUART_LININT)?1:0);
}
else
{
REG32WRITE(UART2->IER, RDA_IEN, (u32InterruptFlag & DRVUART_RDAINT)?1:0 );
REG32WRITE(UART2->IER, THRE_IEN, (u32InterruptFlag & DRVUART_THREINT)?1:0);
REG32WRITE(UART2->IER, RLS_IEN, (u32InterruptFlag & DRVUART_RLSNT)?1:0);
REG32WRITE(UART2->IER, MS_IEN, (u32InterruptFlag & DRVUART_MOSINT)?1:0);
REG32WRITE(UART2->IER, TOC_EN, (u32InterruptFlag & DRVUART_TOUTINT)?1:0); /* Time-out count enable */
REG32WRITE(UART2->IER, RTO_IEN, (u32InterruptFlag & DRVUART_TOUTINT)?1:0); /* Time-out INT enable */
REG32WRITE(UART2->IER, BUF_ERR_IEN, (u32InterruptFlag & DRVUART_BUFERRINT)?1:0);
REG32WRITE(UART2->IER, WAKE_IEN, (u32InterruptFlag & DRVUART_WAKEUPINT)?1:0);
REG32WRITE(UART2->IER, LIN_RX_BRK_IEN, (u32InterruptFlag & DRVUART_LININT)?1:0);
}
if(port == UART_PORT0) /* Install Callback function */
{
g_pfnUART0callback = pfncallback;
NVIC_EnableIRQ(UART0_IRQn);
}
else if(port == UART_PORT1) /* Install Callback function */
{
g_pfnUART1callback = pfncallback;
NVIC_EnableIRQ(UART1_IRQn);
}
else /* Install Callback function */
{
g_pfnUART2callback = pfncallback;
NVIC_EnableIRQ(UART0_IRQn);
}
return E_SUCCESS;
}
/********************************************************************************************************//**
* @brief The function is used to get the interrupt enable status
* @param[in] Port : UART Channel: UART_PORT0 / UART_PORT1
* @param[in] u32InterruptFlag: DRVUART_LININT/DRVUART_WAKEUPINT/DRVUART_BUFERRINT/DRVUART_RLSNT
* DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT
* @return Specified Interrupt Flag Set or clear
************************************************************************************************************/
uint32_t DrvUART_IsIntEnabled(UART_PORT u16Port,uint32_t u32InterruptFlag)
{
if(u16Port == UART_PORT0) /* Read IER Register and check specified flag is enable */
return ((inpw(&UART0->IER) &
(u32InterruptFlag & (DRVUART_LININT | DRVUART_WAKEUPINT | DRVUART_BUFERRINT |
DRVUART_TOUTINT | DRVUART_MOSINT | DRVUART_RLSNT | DRVUART_THREINT | DRVUART_RDAINT))))?1:0;
else if(u16Port == UART_PORT1)
return ((inpw(&UART1->IER) &
(u32InterruptFlag & (DRVUART_LININT | DRVUART_WAKEUPINT | DRVUART_BUFERRINT |
DRVUART_TOUTINT | DRVUART_MOSINT | DRVUART_RLSNT | DRVUART_THREINT | DRVUART_RDAINT))))?1:0;
else
return ((inpw(&UART2->IER) &
(u32InterruptFlag & (DRVUART_LININT | DRVUART_WAKEUPINT | DRVUART_BUFERRINT |
DRVUART_TOUTINT | DRVUART_MOSINT | DRVUART_RLSNT | DRVUART_THREINT | DRVUART_RDAINT))))?1:0;
}
/********************************************************************************************************//**
* @brief The function is used to disable UART Interrupt and uninstall the call back function
* @param[in] Port :] UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2
* @param[in] u32InterruptFlag: DRVUART_LININT/DRVUART_WAKEUPINT/DRVUART_BUFERRINT/DRVUART_RLSNT
* DRVUART_MOSINT/DRVUART_THREINT/DRVUART_RDAINT/DRVUART_TOUTINT
* @return None
************************************************************************************************************/
void DrvUART_DisableInt(UART_PORT u16Port,uint32_t u32InterruptFlag)
{
if(u16Port == UART_PORT0)
{
outpw(&UART0->IER + u16Port,inpw(&UART0->IER + u16Port) &~u32InterruptFlag); /* Disable INT */
}
if(u32InterruptFlag & DRVUART_TOUTINT) /* Disable Counter Enable */
{
if(u16Port == DRVUART_PORT0)
REG32WRITE(UART0->IER, RTO_IEN, 0);
else
REG32WRITE(UART1->IER, RTO_IEN, 0);
}
switch (u16Port) /* Disable Callback function and NVIC */
{
case UART_PORT0:
g_pfnUART0callback = NULL;
NVIC_DisableIRQ(UART0_IRQn);
break;
case UART_PORT1:
g_pfnUART1callback = NULL;
NVIC_DisableIRQ(UART1_IRQn);
break;
case UART_PORT2:
g_pfnUART2callback = NULL;
NVIC_DisableIRQ(UART0_IRQn);
break;
default:
break;
}
}
/********************************************************************************************************//**
* @brief The function is used to clear UART Interrupt
* @param[in] u16Por : UART Channel: UART_PORT0 / UART_PORT1 /UART_PORT2
* @param[in] u32InterruptFlag : DRVUART_MOSINT/DRVUART_RLSNT/DRVUART_THREINT
* DRVUART_RDAINT/DRVUART_TOUTINT
* @return None
************************************************************************************************************/
uint32_t DrvUART_ClearInt(UART_PORT u16Port,uint32_t u32InterruptFlag)
{
if((u32InterruptFlag & DRVUART_RDAINT) == DRVUART_RDAINT) /* clear Rx read Interrupt */
inpw(&UART0->DATA + u16Port);
if((u32InterruptFlag & DRVUART_RLSNT) == DRVUART_RLSNT) /* clear Receive Line Status Interrupt */
outpw(&UART0->FSR + u16Port , inpw(&UART0->FSR + u16Port) | 0x70);
if((u32InterruptFlag & DRVUART_MOSINT) == DRVUART_MOSINT) /* clear Modem Interrupt */
outpw(&UART0->MSR + u16Port,inpw(&UART0->MSR + u16Port) | 0x1);
if((u32InterruptFlag & DRVUART_TOUTINT) == DRVUART_TOUTINT) /* clear Time-out Interrupt */
{
inpw(&UART0->DATA + u16Port);
}
return E_SUCCESS;
}
/********************************************************************************************************//**
* @brief The function is used to get the interrupt status
* @param[in] u16Por : UART Channel: UART_PORT0 / UART_PORT1
* @param[in] u32InterruptFlag : DRVUART_MOSINT/DRVUART_RLSNT/DRVUART_THREINT
* DRVUART_RDAINT/DRVUART_TOUTINT
* @return
* 0: None
* 1: Interrupt occurs
************************************************************************************************************/
int8_t DrvUART_GetIntStatus(UART_PORT u16Port,uint32_t u32InterruptFlag)
{
switch(u32InterruptFlag)
{
case DRVUART_MOSINT: /* MODEM Status Interrupt */
return (inpw(&UART0->ISR + u16Port) & DRVUART_MOSINT)?TRUE:FALSE;
case DRVUART_RLSNT: /* Receive Line Status Interrupt */
return (inpw(&UART0->ISR + u16Port) & DRVUART_RLSNT)?TRUE:FALSE;
case DRVUART_THREINT: /* Transmit Holding Register Empty Interrupt */
return (inpw(&UART0->ISR + u16Port) & DRVUART_THREINT)?TRUE:FALSE;
case DRVUART_RDAINT: /* Receive Data Available Interrupt */
return (inpw(&UART0->ISR + u16Port) & DRVUART_RDAINT)?TRUE:FALSE;
case DRVUART_TOUTINT: /* Time-out Interrupt */
return (inpw(&UART0->ISR + u16Port) & DRVUART_TOUTINT)?TRUE:FALSE;
default:
return FALSE;
}
}
/********************************************************************************************************//**
* @brief The function is used to set Rx FIFO Trigger Level
* @param[in] u16Port : UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2
* @param[in] 32TriggerLevel : FIFO Trigger Level :LEVEL_1_BYTE to LEVEL_62_BYTES
* @return None
************************************************************************************************************/
void DrvUART_SetFIFOTriggerLevel(UART_PORT u16Port,uint16_t u32TriggerLevel)
{
if(u16Port == UART_PORT0)
REG32WRITE(UART0->FCR, RFITL, u32TriggerLevel);
else if(u16Port == UART_PORT1)
REG32WRITE(UART1->FCR, RFITL, u32TriggerLevel);
else
REG32WRITE(UART2->FCR, RFITL, u32TriggerLevel);
}
/********************************************************************************************************//**
* @brief The function is used to get CTS value and change state
* @param[in] UART_PORT : UART Channel: UART_PORT0 / UART_PORT1
* @param[in] pu8CTSValue : Buffer to store the CTS Value
* @param[in] pu8CTSChangeState : Buffer to store the CTS Change State
* @return None
************************************************************************************************************/
void DrvUART_GetCTS(UART_PORT u16Port,uint8_t *pu8CTSValue, uint8_t *pu8CTSChangeState)
{
if(u16Port == UART_PORT0)
{
*pu8CTSValue = UART0->MSR.CTS;
*pu8CTSChangeState = UART0->MSR.DCTS;
}
else if(u16Port == UART_PORT1)
{
*pu8CTSValue = UART1->MSR.CTS;
*pu8CTSChangeState = UART1->MSR.DCTS;
}
else
return; /* CTS */
}
/********************************************************************************************************//**
* @brief The function is used to set Rx Time Out Value
* @param[in] u16Port : UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2
* @param[in] u8TimeOut : Time out value
* @return None
************************************************************************************************************/
void DrvUART_SetRxTimeOut(UART_PORT u16Port, uint8_t u8TimeOut)
{
if(u16Port == UART_PORT0)
{
UART0->TOR = u8TimeOut; /* Set Time out value */
REG32WRITE(UART0->IER, TOC_EN, 1); /* Enable Time-out count */
}
else if(u16Port == UART_PORT1)
{
UART1->TOR = u8TimeOut;
REG32WRITE(UART1->IER, TOC_EN, 1);
}
else
{
UART2->TOR = u8TimeOut;
REG32WRITE(UART2->IER, TOC_EN, 1);
}
}
/********************************************************************************************************//**
* @brief The function is used to read Rx data from RX buffer
* @param[in] u16Port : UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2
* @param[in] pu8RxBuf : Specify the buffer to receive the data of receive FIFO
* @param[in] u32ReadBytes : Specify the bytes number of data.
* @return E_SUCCESS
************************************************************************************************************/
int32_t DrvUART_Read(UART_PORT u16Port,uint8_t *pu8RxBuf, uint32_t u32ReadBytes)
{
uint32_t u32Count, u32delayno;
if(u16Port == UART_PORT0)
{
for (u32Count=0; u32Count < u32ReadBytes; u32Count++)
{
u32delayno = 0;
while (UART0->FSR.RX_EMPTY ==1) /* Check RX empty => failed */
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;
}
pu8RxBuf[u32Count] = UART0->DATA; /* Get Data from UART RX */
}
}
else if(u16Port == UART_PORT1)
{
for (u32Count=0; u32Count < u32ReadBytes; u32Count++)
{
u32delayno = 0;
while (UART1->FSR.RX_EMPTY ==1)
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;
}
pu8RxBuf[u32Count] = UART1->DATA;
}
}
else
{
for (u32Count=0; u32Count < u32ReadBytes; u32Count++)
{
u32delayno = 0;
while (UART2->FSR.RX_EMPTY ==1)
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;
}
pu8RxBuf[u32Count] = UART2->DATA;
}
}
return E_SUCCESS;
}
/********************************************************************************************************//**
* @brief The function is to write data to TX buffer to transmit data by uart
* @param[in] u16Port : UART Channel: UART_PORT0 / UART_PORT1 / UART_PORT2
* @param[in] pu8RxBuf : Specify the buffer to send the data of receive FIFO
* @param[in] u32ReadBytes : Specify the bytes number of data.
* @return E_SUCCESS
************************************************************************************************************/
int32_t DrvUART_Write(UART_PORT u16Port,uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{
uint32_t u32Count, u32delayno;
if(u16Port == UART_PORT0)
{
for (u32Count=0; u32Count<u32WriteBytes; u32Count++)
{
u32delayno = 0;
while (UART0->FSR.TX_EMPTY !=1) /* Wait Tx empty and Time-out manner */
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;
}
UART0->DATA = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
}
}
else if(u16Port == UART_PORT1)
{
for (u32Count=0; u32Count<u32WriteBytes; u32Count++)
{
u32delayno = 0;
while (UART1->FSR.TX_EMPTY !=1)
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;
}
UART1->DATA = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
}
}
else
{
for (u32Count=0; u32Count<u32WriteBytes; u32Count++)
{
u32delayno = 0;
while (UART2->FSR.TX_EMPTY !=1)
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;
}
UART2->DATA = pu8TxBuf[u32Count]; /* Send UART Data from buffer */
}
}
return E_SUCCESS;
}
/********************************************************************************************************//**
* @brief he function is to Set IRCR Control Register
* @param[in] u16Port : UART Channel: UART_PORT0 / UART_PORT1 /UART_PORT2
* @param[in] STR_IRCR_T : Ther stucture of IRCR
* It includes of
* u8cTXSelect: Tx select TRUE or FALSE
* u8cRXSelect: Rx select TRUE or FALSE
* u8cInvTX: Inverse TX signal
* u8cInvRX: Inverse RX signal
* @return E_SUCCESS
************************************************************************************************************/
void DrvUART_OpenIRCR(UART_PORT u16Port,STR_IRCR_T str_IRCR )
{
if(u16Port == UART_PORT0)
{
REG32WRITE(UART0->FUNSEL, LIN_EN, 0);
REG32WRITE(UART0->FUNSEL, IrDA_EN, 1);
REG32WRITE(UART0->IRCR, RX_EN, str_IRCR.u8cRXSelect);
REG32WRITE(UART0->IRCR, TX_EN, str_IRCR.u8cTXSelect);
REG32WRITE(UART0->IRCR, TX_INV_EN, str_IRCR.u8cInvTX);
REG32WRITE(UART0->IRCR, RX_INV_EN, str_IRCR.u8cInvRX);
}
else if(u16Port == UART_PORT1)
{
REG32WRITE(UART1->FUNSEL, LIN_EN, 0);
REG32WRITE(UART1->FUNSEL, IrDA_EN, 1);
REG32WRITE(UART1->IRCR, RX_EN, str_IRCR.u8cRXSelect);
REG32WRITE(UART1->IRCR, TX_EN, str_IRCR.u8cTXSelect);
REG32WRITE(UART1->IRCR, TX_INV_EN, str_IRCR.u8cInvTX);
REG32WRITE(UART1->IRCR, RX_INV_EN, str_IRCR.u8cInvRX);
}
else
{
REG32WRITE(UART2->FUNSEL, LIN_EN,0);
REG32WRITE(UART2->FUNSEL, IrDA_EN , 1);
REG32WRITE(UART2->IRCR, RX_EN, str_IRCR.u8cRXSelect);
REG32WRITE(UART2->IRCR, TX_EN, str_IRCR.u8cTXSelect);
REG32WRITE(UART2->IRCR, TX_INV_EN, str_IRCR.u8cInvTX);
REG32WRITE(UART2->IRCR, RX_INV_EN, str_IRCR.u8cInvRX);
}
}
/********************************************************************************************************//**
* @brief The function is used to set LIN relative setting
* @param[in] u16Port : UART Channel: UART_PORT0 / UART_PORT1 /UART_PORT2
* @param[in] DIRECTION : MODE_TX or MODE_RX
* @param[in] BCNT : Break Count
* @return E_SUCCESS
************************************************************************************************************/
void DrvUART_OpenLIN(UART_PORT u16Port,uint16_t DIRECTION,uint16_t BCNT)
{
if(u16Port == UART_PORT0)
{
REG32WRITE(UART0->FUNSEL, LIN_EN, 1);
REG32WRITE(UART0->FUNSEL, IrDA_EN, 0);
if(DIRECTION ==MODE_TX )
{
REG32WRITE(UART0->LINCON, LINTX_EN, 1);
REG32WRITE(UART0->LINCON, LINRX_EN, 0);
}else
{
REG32WRITE(UART0->LINCON, LINTX_EN, 0);
REG32WRITE(UART0->LINCON, LINRX_EN, 1);
}
REG32WRITE(UART0->LINCON, LINBCNT, BCNT);
}
else if(u16Port == UART_PORT1)
{
REG32WRITE(UART1->FUNSEL, LIN_EN, 1);
REG32WRITE(UART1->FUNSEL, IrDA_EN, 0);
if(DIRECTION ==MODE_TX )
{
REG32WRITE(UART1->LINCON, LINTX_EN, 1);
REG32WRITE(UART1->LINCON, LINRX_EN, 0);
}else
{
REG32WRITE(UART1->LINCON, LINTX_EN, 0);
REG32WRITE(UART1->LINCON, LINRX_EN, 1);
}
REG32WRITE(UART1->LINCON, LINBCNT, BCNT);
}
else if(u16Port == UART_PORT2)
{
REG32WRITE(UART2->FUNSEL, LIN_EN, 1);
REG32WRITE(UART2->FUNSEL, IrDA_EN, 0);
if(DIRECTION ==MODE_TX )
{
REG32WRITE(UART2->LINCON, LINTX_EN, 1);
REG32WRITE(UART2->LINCON, LINRX_EN, 0);
}else
{
REG32WRITE(UART2->LINCON, LINTX_EN, 0);
REG32WRITE(UART2->LINCON, LINRX_EN, 1);
}
}
}
/********************************************************************************************************//**
* @brief This function returns TRUE when UART get any character.Default use UART0
* @param[in] None
* @return None
************************************************************************************************************/
int32_t DrvUART_kbhit(void)
{
if(UART0->ISR.RDA_IF ==1)
{
return TRUE;
}
return FALSE;
}
/********************************************************************************************************//**
* @brief The function is to Enable/Disable PDMA Channel
* @param[in] u16Port : UART Channel: UART_PORT0 / UART_PORT0
* @param[in] IsEnable : Enable TX/RX PDMA TRUE or FASLE
* @return E_SUCCESS
************************************************************************************************************/
void DrvUART_SetPDMA(UART_PORT u16Port,uint16_t IsEnable)
{
if(u16Port == UART_PORT0)
{
REG32WRITE(UART0->IER, DMA_TX_EN, IsEnable ?1:0);
REG32WRITE(UART0->IER ,DMA_RX_EN, IsEnable ?1:0);
}
else if(u16Port == UART_PORT1)
{
REG32WRITE(UART1->IER, DMA_TX_EN, IsEnable ?1:0);
REG32WRITE(UART1->IER, DMA_RX_EN, IsEnable ?1:0);
}
else
return; /* UART2 can not support PDMA mode */
}
/********************************************************************************************************//**
* @brief The function is used to get DrvUART Version Number
* @param[in] None
* @return Version Number
************************************************************************************************************/
int32_t DrvUART_GetVersion(void)
{
return DRVUART_VERSION_NUM;
} |