📄 tmao.c
字号:
{
rval = AIO_ERR_UNSUPPORTED_DATA_SUBTYPE;
goto aoInstanceSetupExit;
}
if (!(param.output & boardAOConfig->audioAdapters))
{
rval = AIO_ERR_UNSUPPORTED_ADAPTER;
goto aoInstanceSetupExit;
}
if (param.sRate > boardAOConfig->maxSRate)
{
rval = AIO_ERR_SRATE_TOO_HIGH;
goto aoInstanceSetupExit;
}
if (param.sRate < boardAOConfig->minSRate)
{
rval = AIO_ERR_SRATE_TOO_LOW;
goto aoInstanceSetupExit;
}
if (instVars->boardAOConfig->initFunc)
{
rval = instVars->boardAOConfig->initFunc(¶m);
if (rval != TMLIBDEV_OK)
goto aoInstanceSetupExit;
}
else
{
rval = BOARD_ERR_NULL_FUNCTION;
goto aoInstanceSetupExit;
}
/* clear all interrupt sources to be sure */
MMIO(mmioBase + AO_CTL_OFFSET) |= AO_ACK_UDR | AO_ACK_HBE | AO_ACK_HBE | AO_ACK2 | AO_ACK1;
instVars->setup = *pSetup; /* Last possible error past, so copy to
* static storage */
aoSetBASE1M(mmioBase, pSetup->base1);
aoSetBASE2M(mmioBase, pSetup->base2);
MMIO(mmioBase + AO_CTL_OFFSET) = (MMIO(mmioBase + AO_CTL_OFFSET) &
~(AO_BUF1_INTEN | AO_BUF2_INTEN | AO_UDR_INTEN | AO_HBE_INTEN))
| (pSetup->buf1emptyEnable ? AO_BUF1_INTEN : 0)
| (pSetup->buf2emptyEnable ? AO_BUF2_INTEN : 0)
| (pSetup->underrunEnable ? AO_UDR_INTEN : 0)
| (pSetup->hbeEnable ? AO_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->boardAOConfig->intNumber, &setup);
if (rval != TMLIBDEV_OK)
goto aoInstanceSetupExit;
}
instVars->initialized = True;
aoInstanceSetupExit:
AppModel_resume_scheduling();
return rval;
}
/**************************************************************************************/
extern tmLibdevErr_t aoClose(Int instance)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmLibdevErr_t rval = TMLIBDEV_OK;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
AppModel_suspend_scheduling();
if (instVars->gpioInstance != 0)
{
gpioClose(instVars->gpioInstance);
}
/* shutdown driver */
if (instVars->boardAOConfig->termFunc)
{
rval = instVars->boardAOConfig->termFunc();
if (rval != TMLIBDEV_OK)
goto aoCloseExit;
}
else
{
rval = BOARD_ERR_NULL_FUNCTION;
}
/* shut down interupt service, but don't reset */
MMIO(AO_CTL) &= ~(AO_BUF1_INTEN | AO_BUF2_INTEN |
AO_UDR_INTEN | AO_HBE_INTEN | AO_TRANS_ENABLE);
rval |= intClose(instVars->boardAOConfig->intNumber);
aoCaps.unitCapabilities[instVars->unitName].numCurrentInstances--;
instVars->magic = 0;
aoCloseExit:
AppModel_resume_scheduling();
free(instVars);
return rval;
}
/**************************************************************************************/
extern tmLibdevErr_t aoStop(Int instance)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmLibdevErr_t rval = TMLIBDEV_OK;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardAOConfig->stopFunc)
{
rval = instVars->boardAOConfig->stopFunc();
}
else
{
rval = BOARD_ERR_NULL_FUNCTION;
}
return rval;
}
/**************************************************************************************/
extern tmLibdevErr_t aoStart(Int instance)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmLibdevErr_t rval = TMLIBDEV_OK;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardAOConfig->startFunc)
{
rval = instVars->boardAOConfig->startFunc();
}
else
{
rval = BOARD_ERR_NULL_FUNCTION;
}
return rval;
}
/**************************************************************************************/
extern tmLibdevErr_t aoSetOutput(Int instance, tmAudioAnalogAdapter_t output)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardAOConfig->setOutput)
{
return instVars->boardAOConfig->setOutput(output);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t aoGetOutput(Int instance, tmAudioAnalogAdapter_t * output)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardAOConfig->getOutput)
{
return instVars->boardAOConfig->getOutput(output);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t aoSetVolume(Int instance, Int lGain, Int rGain)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardAOConfig->setVolume)
{
return instVars->boardAOConfig->setVolume(lGain, rGain);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t aoGetVolume(Int instance, Int * lGain, Int * rGain)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
tmAssert(lGain, TMLIBDEV_ERR_NULL_PARAMETER);
tmAssert(rGain, TMLIBDEV_ERR_NULL_PARAMETER);
if (instVars->boardAOConfig->getVolume)
{
return instVars->boardAOConfig->getVolume(lGain, rGain);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t aoSetSampleRate(Int instance, Float sRate)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
boardAOConfig_t *boardAOConfig = instVars->boardAOConfig;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
/* check validity of requested sample rate */
if (sRate > boardAOConfig->maxSRate)
return AIO_ERR_SRATE_TOO_HIGH;
if (sRate < boardAOConfig->minSRate)
return AIO_ERR_SRATE_TOO_LOW;
instVars->setup.sRate = sRate;
if (boardAOConfig->setSRate)
{
return boardAOConfig->setSRate(sRate);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t aoGetSampleRate(Int instance, Float * sRate)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
tmAssert(sRate, TMLIBDEV_ERR_NULL_PARAMETER);
if (instVars->boardAOConfig->getSRate)
{
return instVars->boardAOConfig->getSRate(sRate);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
/**************************************************************************************/
extern tmLibdevErr_t aoConfig(Int instance, UInt32 subAddr, Pointer value)
{
paoInstVars_t instVars = (paoInstVars_t) instance;
tmAssert(instance, TMLIBDEV_ERR_NOT_OWNER);
if (instVars->magic != AO_MAGIC)
return TMLIBDEV_ERR_NOT_OWNER;
if (!instVars->initialized)
{
return AIO_ERR_INIT_REQUIRED;
}
if (instVars->boardAOConfig->configFunc)
{
return instVars->boardAOConfig->configFunc(subAddr, value);
}
else
{
return BOARD_ERR_NULL_FUNCTION;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -