133 lines
4.2 KiB
C
133 lines
4.2 KiB
C
/*
|
|
* Copyright 2018-2022 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "fsl_powerquad.h"
|
|
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
/* Component ID definition, used by tools. */
|
|
#ifndef FSL_COMPONENT_ID
|
|
#define FSL_COMPONENT_ID "platform.drivers.powerquad_basic"
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
void PQ_GetDefaultConfig(pq_config_t *config)
|
|
{
|
|
config->inputAFormat = kPQ_Float;
|
|
config->inputAPrescale = 0;
|
|
config->inputBFormat = kPQ_Float;
|
|
config->inputBPrescale = 0;
|
|
config->outputFormat = kPQ_Float;
|
|
config->outputPrescale = 0;
|
|
config->tmpFormat = kPQ_Float;
|
|
config->tmpPrescale = 0;
|
|
config->machineFormat = kPQ_Float;
|
|
config->tmpBase = (uint32_t *)0xE0000000U;
|
|
}
|
|
|
|
void PQ_SetConfig(POWERQUAD_Type *base, const pq_config_t *config)
|
|
{
|
|
assert(NULL != config);
|
|
|
|
base->TMPBASE = (uint32_t)config->tmpBase;
|
|
base->INAFORMAT = ((uint32_t)config->inputAPrescale << 8U) | ((uint32_t)config->inputAFormat << 4U) |
|
|
(uint32_t)config->machineFormat;
|
|
base->INBFORMAT = ((uint32_t)config->inputBPrescale << 8U) | ((uint32_t)config->inputBFormat << 4U) |
|
|
(uint32_t)config->machineFormat;
|
|
base->TMPFORMAT =
|
|
((uint32_t)config->tmpPrescale << 8U) | ((uint32_t)config->tmpFormat << 4U) | (uint32_t)config->machineFormat;
|
|
base->OUTFORMAT = ((uint32_t)config->outputPrescale << 8U) | ((uint32_t)config->outputFormat << 4U) |
|
|
(uint32_t)config->machineFormat;
|
|
}
|
|
|
|
void PQ_Init(POWERQUAD_Type *base)
|
|
{
|
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
|
#if defined(POWERQUAD_CLOCKS)
|
|
CLOCK_EnableClock(kCLOCK_PowerQuad);
|
|
#endif
|
|
#endif
|
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_RESET_CONTROL) && FSL_SDK_DISABLE_DRIVER_RESET_CONTROL)
|
|
#if defined(POWERQUAD_RSTS)
|
|
RESET_PeripheralReset(kPOWERQUAD_RST_SHIFT_RSTn);
|
|
#endif
|
|
#endif
|
|
|
|
/* Enable event used for WFE. */
|
|
base->EVENTEN = POWERQUAD_EVENTEN_EVENT_OFLOW_MASK | POWERQUAD_EVENTEN_EVENT_NAN_MASK |
|
|
POWERQUAD_EVENTEN_EVENT_FIXED_MASK | POWERQUAD_EVENTEN_EVENT_UFLOW_MASK |
|
|
POWERQUAD_EVENTEN_EVENT_BERR_MASK | POWERQUAD_EVENTEN_EVENT_COMP_MASK;
|
|
}
|
|
|
|
void PQ_Deinit(POWERQUAD_Type *base)
|
|
{
|
|
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
|
#if defined(POWERQUAD_CLOCKS)
|
|
CLOCK_DisableClock(kCLOCK_PowerQuad);
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void PQ_SetFormat(POWERQUAD_Type *base, pq_computationengine_t engine, pq_format_t format)
|
|
{
|
|
pq_config_t config;
|
|
|
|
PQ_GetDefaultConfig(&config);
|
|
|
|
/* 32-bit Float point */
|
|
if (kPQ_Float == format)
|
|
{
|
|
config.inputAFormat = kPQ_Float;
|
|
config.inputAPrescale = 0;
|
|
config.inputBFormat = kPQ_Float;
|
|
config.inputBPrescale = 0;
|
|
config.outputFormat = kPQ_Float;
|
|
config.outputPrescale = 0;
|
|
config.tmpFormat = kPQ_Float;
|
|
config.tmpPrescale = 0;
|
|
}
|
|
/* 32-bit Fixed point */
|
|
if (kPQ_32Bit == format)
|
|
{
|
|
config.inputAFormat = kPQ_32Bit;
|
|
config.inputAPrescale = 0;
|
|
config.inputBFormat = kPQ_32Bit;
|
|
config.inputBPrescale = 0;
|
|
config.outputFormat = kPQ_32Bit;
|
|
config.outputPrescale = 0;
|
|
config.tmpFormat = kPQ_Float;
|
|
config.tmpPrescale = 0;
|
|
}
|
|
/* 16-bit Fixed point */
|
|
if (kPQ_16Bit == format)
|
|
{
|
|
config.inputAFormat = kPQ_16Bit;
|
|
config.inputAPrescale = 0;
|
|
config.inputBFormat = kPQ_16Bit;
|
|
config.inputBPrescale = 0;
|
|
config.outputFormat = kPQ_16Bit;
|
|
config.outputPrescale = 0;
|
|
config.tmpFormat = kPQ_Float;
|
|
config.tmpPrescale = 0;
|
|
}
|
|
|
|
if (CP_FFT == (uint8_t)engine)
|
|
{
|
|
config.machineFormat = kPQ_32Bit;
|
|
}
|
|
else
|
|
{
|
|
config.machineFormat = kPQ_Float;
|
|
}
|
|
|
|
PQ_SetConfig(base, &config);
|
|
}
|