RabbitECUTeensyMCUXpresso/source/Peripherals/DACHA.c

132 lines
4.1 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 "CPUAbstract.h"
#include "regset.h"
#include "sys.h"
#include "declarations.h"
#include "os.h"
#include "IOAPI.h"
#include "DACAPI.h"
#include "DAC.h"
#include "types.h"
#include "SIM.h"
DACAPI_ttOutputVoltage DACHA_atQueue[DACHA_nDACCount][DAC_nQueueSize];
uint32 DACHA_au32QueueIDX[DACHA_nDACCount];
uint32 DACHA_u32PortClockRequested;
void DACHA_vStart(puint32 const pu32Stat)
{
}
void DACHA_vRun(puint32 const pu32Stat)
{
tstDACModule* pstDAC = NULL;
uint32 u32QueueIDX;
uint32 u32DACIDX;
uint32 u32ClockReq = 1;
for (u32DACIDX = 0; u32DACIDX < DACHA_nDACCount; u32DACIDX++)
{
if (u32ClockReq == (u32ClockReq & DACHA_u32PortClockRequested))
{
#if defined(BUILD_MK60) || defined(BUILD_MK64)
pstDAC = (0 == u32DACIDX) ? DAC0 : DAC1;
if ((pstDAC->C2 & DAC_C2_DACBFUP_MASK) < ++DACHA_au32QueueIDX[u32DACIDX])
{
for (u32QueueIDX = 0; u32QueueIDX <= (pstDAC->C2 & DAC_C2_DACBFUP_MASK); u32QueueIDX++)
{
pstDAC->DAT[u32QueueIDX].DATH = (DACHA_atQueue[u32DACIDX][u32QueueIDX] & 0x0f00) >> 8;
pstDAC->DAT[u32QueueIDX].DATL = DACHA_atQueue[u32DACIDX][u32QueueIDX] & 0xff;
}
DACHA_au32QueueIDX[u32DACIDX] = 0;
}
/* Set the read pointer */
pstDAC->C2 = (pstDAC->C2 & DAC_C2_DACBFUP_MASK) | DAC_C2_DACBFRP(DACHA_au32QueueIDX[u32DACIDX]);
#endif //BUILD_MK60
}
u32ClockReq *= 2;
}
}
void DACHA_vTerminate(puint32 const pu32Stat)
{
}
SYSAPI_tenSVCResult DACHA_vInitDACResource(IOAPI_tenEHIOResource enEHIOResource, DACAPI_tstDACCB* pstDACCB)
{
tstDACModule* pstDAC = NULL;
SYSAPI_tenSVCResult enResult = SYSAPI_enBadResource;
switch (enEHIOResource)
{
#if defined(BUILD_MK60) || defined(BUILD_MK64)
case EH_O_DAC1:
{
pstDAC = DAC0;
SIM_vSetReg32(SIM_SCGC2, SIM_SCGC2_DAC0_MASK);
DACHA_u32PortClockRequested |= 1;
break;
}
case EH_O_DAC2:
{
pstDAC = DAC1;
SIM_vSetReg32(SIM_SCGC2, SIM_SCGC2_DAC1_MASK);
DACHA_u32PortClockRequested |= 2;
break;
}
#endif //BUILD_MK60
default:
pstDAC = NULL;
break;
}
if (NULL != pstDAC)
{
enResult = SYSAPI_enOK;
#if defined(BUILD_MK60) || defined(BUILD_MK64)
pstDAC->C0 |= (DAC_C0_DACEN_MASK | DAC_C0_DACRFS_MASK);
if (DACAPI_enSoftwareTrigger == pstDACCB->enTriggerType) pstDAC->C0 |= DAC_C0_DACTRGSEL_MASK;
if (TRUE == pstDACCB->boWaterMarkEventEnable) pstDAC->C0 |= DAC_C0_DACBWIEN_MASK;
if (TRUE == pstDACCB->boPointerTopEventEnable) pstDAC->C0 |= DAC_C0_DACBTIEN_MASK;
if (TRUE == pstDACCB->boPointerBottomEventEnable) pstDAC->C0 |= DAC_C0_DACBBIEN_MASK;
pstDAC->C1 = DAC_C1_DACBFWM(pstDACCB->enWatermarkWords) | DAC_C1_DACBFEN_MASK;
pstDAC->C2 = DAC_C2_DACBFUP(pstDACCB->enQueueDepth);
#endif //BUILD_MK60
}
return enResult;
}
void DACHA_vWriteDACQueue(IOAPI_tenEHIOResource enEHIOResource, DACAPI_ttOutputVoltage* pOutputVoltage)
{
uint32 u32QueueIDX;
tstDACModule* pstDAC;
uint32 u32Queue;
#if defined(BUILD_MK60) || defined(BUILD_MK64)
pstDAC = (EH_O_DAC1 == enEHIOResource) ? DAC0 : DAC1;
u32Queue = (EH_O_DAC1 == enEHIOResource) ? 0 : 1;
for (u32QueueIDX = 0; u32QueueIDX <= (pstDAC->C2 & DAC_C2_DACBFUP_MASK); u32QueueIDX++)
{
DACHA_atQueue[u32Queue][u32QueueIDX] = *pOutputVoltage++;
}
#endif //BUILD_MK60
}