RabbitECUTeensyMCUXpresso/source/Peripherals/SRLTFR.c

114 lines
3.4 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: SRLTFR */
/* DESCRIPTION: Serial Transfer file */
/* FILE NAME: SRLTFR.c */
/* REVISION HISTORY: 19-08-2016 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#define _SRLTFR_C
#include <string.h>
#include "IIC.h"
#include "IOAPI.h"
#include "PERSPI.h"
#include "SYSAPI.h"
#include "types.h"
#include "CQUEUE.h"
#include "SRLTFR.h"
#include "declarations.h"
IOAPI_tenEHIOResource SRLTFR_enActiveEHIOResource;
void SRLTFR_vStart(puint32 const pu32Arg)
{
CQUEUE_xInit(&SRLTFR_stTransferQueue, SRLTFR_nTransfersMax, SRLTFR_astTransferInfo);
SRLTFR_enActiveEHIOResource = EH_IO_Invalid;
}
void SRLTFR_vRun(puint32 const pu32Arg)
{
if (!CQUEUE_xIsEmpty(&SRLTFR_stTransferQueue))
{
switch (SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].enEHIOResource)
{
case EH_VIO_IIC1:
case EH_VIO_IIC2:
{
IIC_vInitTransfer(&SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head]);
SRLTFR_enActiveEHIOResource = SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].enEHIOResource;
}
case EH_VIO_SPI1:
case EH_VIO_SPI2:
{
SPI_vInitTransfer(&SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head]);
SRLTFR_enActiveEHIOResource = SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].enEHIOResource;
}
default:
{
}
}
}
}
void SRLTFR_vTerminate(puint32 const pu32Arg)
{
}
SYSAPI_tenSVCResult SRLTFR_enEnqueue(IOAPI_tstTransferCB* pstTransferCB)
{
SYSAPI_tenSVCResult enSVCResult = SYSAPI_enQueueFull;
uint32 u32Flag;
if (!CQUEUE_xIsFull(&SRLTFR_stTransferQueue))
{
memcpy((void*)&SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head],
(void*)pstTransferCB,
sizeof(IOAPI_tstTransferCB));
enSVCResult = SYSAPI_enOK;
CQUEUE_xAddItem(&SRLTFR_stTransferQueue);
if (TRUE == pstTransferCB->boBlockingMode)
{
SRLTFR_vRun(&u32Flag);
enSVCResult = SYSAPI_enOK;
/* Clear the queue because it was all sent in blocking mode */
CQUEUE_xRemoveItem(&SRLTFR_stTransferQueue);
}
}
return enSVCResult;
}
void SRLTFR_vNotifyCB(IOAPI_tenEHIOResource enEHIOResource)
{
IOAPI_enTransferType enTransferType;
IOAPI_tpfTransferCB pfCB;
if (SRLTFR_enActiveEHIOResource == enEHIOResource)
{
enTransferType = SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].enTransferType;
pfCB = SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].pfCB;
if ((NULL != pfCB) && (IOAPI_IO_TX == enTransferType))
{
(*pfCB)(enEHIOResource,
SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].pvData,
SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].u32ByteCount,
SRLTFR_astTransferInfo[SRLTFR_stTransferQueue.u32Head].enTransferType);
}
CQUEUE_xRemoveItem(&SRLTFR_stTransferQueue);
}
}