RabbitECUTeensyMCUXpresso/source/Peripherals/PERUART.c

142 lines
3.8 KiB
C

/******************************************************************************/
/* Copyright (c) 2016 MD Automotive Controls. Original Work. */
/* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher */
/******************************************************************************/
/* CONTEXT:KERNEL */
/* PACKAGE TITLE: XXX */
/* DESCRIPTION: XXX */
/* FILE NAME: XXX.c */
/* REVISION HISTORY: 19-08-2016 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#include <string.h>
#include "CPUAbstract.h"
#include "CQUEUE.h"
#include "peruart.h"
#include "DLL.h"
#include "regset.h"
#include "sys.h"
#include "IRQ.h"
#include "declarations.h"
#include "os.h"
#include "DLL.h"
#include "types.h"
#include "SIM.h"
CQUEUE_tstQueue UART_astCBQueue[EH_LAST_UART - EH_FIRST_UART + 1];
uint8 UART_aau8ByteQueue[EH_LAST_UART - EH_FIRST_UART + 1][UART_nByteQueueSize];
void UART_vStart(uint32* const u32Stat)
{
OS_xModuleStartOK(*u32Stat);
CQUEUE_xInit(&UART_astCBQueue[0], UART_nByteQueueSize, &UART_aau8ByteQueue[0][0]);
CQUEUE_xInit(&UART_astCBQueue[1], UART_nByteQueueSize, &UART_aau8ByteQueue[1][0]);
}
void UART_vRun(uint32* const u32Stat)
{
}
void UART_vTerminate(uint32* const u32Stat)
{
}
SYSAPI_tenSVCResult UART_enInitBus(IOAPI_tenEHIOResource enEHIOResource, IOAPI_tstPortConfigCB* pstPortConfigCB)
{
SYSAPI_tenSVCResult enSVCResult;
enSVCResult = UARTHA_enInitBus(enEHIOResource, pstPortConfigCB);
return enSVCResult;
}
void UART_vSendChar(IOAPI_tenEHIOResource enEHIOResource, uint8 ucData)
{
UARTHA_vSendChar(enEHIOResource, ucData);
}
uint8 UART_u8GetChar(IOAPI_tenEHIOResource enEHIOResource)
{
return UARTHA_u8GetChar(enEHIOResource);
}
void UART_vDisableTXInterrupt(IOAPI_tenEHIOResource enEHIOResource)
{
UARTHA_vDisableTXInterrupt(enEHIOResource);
}
void UART_vEnableTXInterrupt(IOAPI_tenEHIOResource enEHIOResource)
{
UARTHA_vEnableTXInterrupt(enEHIOResource);
}
void UART_vDisableRXInterrupt(IOAPI_tenEHIOResource enEHIOResource)
{
UARTHA_vDisableRXInterrupt(enEHIOResource);
}
void UART_vEnableRXInterrupt(IOAPI_tenEHIOResource enEHIOResource)
{
UART_vEnableRXInterrupt(enEHIOResource);
}
void UART_vInterrupt(IOAPI_tenEHIOResource enEHIOResource, void* pvData)
{
uint32 u32UARTIDX = enEHIOResource - EH_VIO_UART1;
uint8 u8Data;
DLL_tstRXDLLData* pstRXDLLData = (DLL_tstRXDLLData*)pvData;
while (!CQUEUE_xIsFull(&UART_astCBQueue[u32UARTIDX]))
{
if (0 < pstRXDLLData->u8DataCount)
{
u8Data = pstRXDLLData->u8Data[pstRXDLLData->u8RXByteIDX];
UART_aau8ByteQueue[u32UARTIDX][UART_astCBQueue[u32UARTIDX].u32Tail] = u8Data;
CQUEUE_xAddItem(&UART_astCBQueue[u32UARTIDX]);
pstRXDLLData->u8DataCount--;
}
if (0 == pstRXDLLData->u8DataCount) break;
}
}
uint8 UART_u8GetQueuedChar(IOAPI_tenEHIOResource enEHIOResource)
{
uint8 u8Data;
uint32 u32UARTIDX = enEHIOResource - EH_VIO_UART1;
u8Data = UART_aau8ByteQueue[u32UARTIDX][UART_astCBQueue[u32UARTIDX].u32Head];
CQUEUE_xRemoveItem(&UART_astCBQueue[u32UARTIDX]);
return u8Data;
}
uint8* UART_pu8GetQueueBuffer(IOAPI_tenEHIOResource enEHIOResource)
{
uint8* pu8Data;
uint32 u32UARTIDX = enEHIOResource - EH_VIO_UART1;
pu8Data = &UART_aau8ByteQueue[u32UARTIDX][0];
return pu8Data;
}
CQUEUE_tstQueue* UART_pstGetQueue(IOAPI_tenEHIOResource enEHIOResource)
{
CQUEUE_tstQueue* pstQueue;
uint32 u32UARTIDX = enEHIOResource - EH_VIO_UART1;
pstQueue = &UART_astCBQueue[u32UARTIDX];
return pstQueue;
}