📄 tmspdo.c
字号:
/* Get the default instance setup */
gpioGetInstanceSetup(instVars->gpioInstance, &gpioSetup);
for (i = spdoBoardConfig->gpioFirstPin; i <= spdoBoardConfig->gpioLastPin; i++)
{
gpioInsertMode(gpioSetup.pinMode[i >> 4], i - (spdoBoardConfig->gpioFirstPin & 0xfffffff0), gpioRegularMode);
gpioInsertPin(gpioSetup.pinMask[i >> 5], i - (spdoBoardConfig->gpioFirstPin & 0xffffffe0), 1);
}
rVal = gpioInstanceSetup(instVars->gpioInstance, &gpioSetup);
if (rVal != TMLIBDEV_OK)
{
gpioClose(instVars->gpioInstance);
free(instVars);
intClose(spdoBoardConfig->intNumber);
goto spdoOpenExit;
}
}
else
{
instVars->gpioInstance = 0;
}
*instance = (Int) instVars;
spdoOpenExit:
AppModel_resume_scheduling();
return rVal;
}
/**************************************************************************************/
extern tmLibdevErr_t spdoInstanceSetup(Int instance, pspdoInstanceSetup_t pSetup)
{
pspdoInstVars_t instVars = (pspdoInstVars_t) instance;
tmLibdevErr_t rval;
boardSPDOParam_t param;
intInstanceSetup_t setup;
UInt32 mmioBase = instVars->boardSPDOConfig->mmioBase;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
tmAssert(pSetup, TMLIBDEV_ERR_NULL_PARAMETER);
tmAssert((pSetup->size % SPDO_SIZE_GRANULARITY) == 0, AIO_ERR_INVALID_SIZE);
tmAssert(((UInt) pSetup->base1 % SPDO_BASE_GRANULARITY) == 0, AIO_ERR_INVALID_BASE);
tmAssert(((UInt) pSetup->base2 % SPDO_BASE_GRANULARITY) == 0, AIO_ERR_INVALID_BASE);
if (instVars->magic != SPDO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
param.audioTypeFormat = pSetup->audioTypeFormat;
param.audioSubtypeFormat = pSetup->audioSubtypeFormat;
param.sRate = pSetup->sRate;
param.size = pSetup->size;
param.output = pSetup->output;
if (instVars->boardSPDOConfig->initFunc)
{
rval = instVars->boardSPDOConfig->initFunc(¶m);
if (rval != TMLIBDEV_OK)
return rval;
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
/* clear all interrupt sources to be sure */
MMIO(mmioBase + SPDO_CTL_OFFSET) |= SPDO_ACK_UDR | SPDO_ACK_HBE | SPDO_ACK_HBE | SPDO_ACK2 | SPDO_ACK1;
instVars->setup = *pSetup; /* Last possible error past, so copy to
* static storage */
spdoSetBASE1M(mmioBase, pSetup->base1);
spdoSetBASE2M(mmioBase, pSetup->base2);
MMIO(mmioBase + SPDO_CTL_OFFSET) = (MMIO(mmioBase + SPDO_CTL_OFFSET) &
~(SPDO_BUF1_INTEN | SPDO_BUF2_INTEN | SPDO_UDR_INTEN | SPDO_HBE_INTEN))
| (instVars->setup.buf1emptyEnable ? SPDO_BUF1_INTEN : 0)
| (instVars->setup.buf2emptyEnable ? SPDO_BUF2_INTEN : 0)
| (instVars->setup.underrunEnable ? SPDO_UDR_INTEN : 0)
| (instVars->setup.hbeEnable ? SPDO_HBE_INTEN : 0);
if (pSetup->isr) /* Null means poll - no ISR */
{
setup.enabled = True;
setup.level_triggered = True;
setup.handler = pSetup->isr;
setup.priority = pSetup->interruptPriority;
rval = intInstanceSetup(instVars->boardSPDOConfig->intNumber, &setup);
if (rval != TMLIBDEV_OK)
return rval;
}
instVars->initialized = True;
return TMLIBDEV_OK;
}
/**************************************************************************************/
extern tmLibdevErr_t spdoClose(Int instance)
{
pspdoInstVars_t instVars = (pspdoInstVars_t) instance;
tmLibdevErr_t rval = TMLIBDEV_OK;
UInt32 mmioBase = instVars->boardSPDOConfig->mmioBase;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != SPDO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
AppModel_suspend_scheduling();
if (instVars->gpioInstance != 0)
{
gpioClose(instVars->gpioInstance);
}
/* shutdown driver */
if (instVars->boardSPDOConfig->termFunc)
{
rval = instVars->boardSPDOConfig->termFunc();
}
else
{
rval = BOARD_ERR_NULL_FUNCTION;
}
/* shut down interrupts. Usually the BSP does a spdoReset. But because the device library
sets those values in the audio out control register it also clears them.*/
MMIO(mmioBase + SPDO_CTL_OFFSET) &= ~(SPDO_BUF1_INTEN | SPDO_BUF2_INTEN |
SPDO_UDR_INTEN | SPDO_HBE_INTEN | SPDO_TRANS_ENABLE);
rval |= intClose(instVars->boardSPDOConfig->intNumber);
spdoCaps.unitCapabilities[instVars->unitName].numCurrentInstances--;
instVars->magic = 0;
AppModel_resume_scheduling();
return rval;
}
/**************************************************************************************/
extern tmLibdevErr_t spdoStop(Int instance)
{
pspdoInstVars_t instVars = (pspdoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != SPDO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardSPDOConfig->stopFunc)
{
return instVars->boardSPDOConfig->stopFunc();
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t spdoStart(Int instance)
{
pspdoInstVars_t instVars = (pspdoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != SPDO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardSPDOConfig->startFunc != Null)
{
return instVars->boardSPDOConfig->startFunc();
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t spdoSetSampleRate(Int instance, Float sRate)
{
pspdoInstVars_t instVars = (pspdoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != SPDO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
/* check validity of requested sample rate */
if (sRate > instVars->boardSPDOConfig->maxSRate)
return AIO_ERR_SRATE_TOO_HIGH;
if (sRate < instVars->boardSPDOConfig->minSRate)
return AIO_ERR_SRATE_TOO_LOW;
instVars->setup.sRate = sRate;
if (instVars->boardSPDOConfig->setSRate)
{
return instVars->boardSPDOConfig->setSRate(sRate);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t spdoGetSampleRate(Int instance, Float * sRate)
{
pspdoInstVars_t instVars = (pspdoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
tmAssert(sRate, TMLIBDEV_ERR_NULL_PARAMETER);
if (instVars->magic != SPDO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardSPDOConfig->getSRate)
{
return instVars->boardSPDOConfig->getSRate(sRate);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t spdoConfig(Int instance, UInt32 subAddr, Pointer value)
{
pspdoInstVars_t instVars = (pspdoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != SPDO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardSPDOConfig->configFunc)
{
return instVars->boardSPDOConfig->configFunc(subAddr, value);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -