📄 tm1300debug_audio.c
字号:
ao_serial = MMIO(AO_SERIAL);
sckdiv = (Float) (aoExtractSCKDIV(ao_serial) + 1);
wsdiv = (Float) (aoExtractWSDIV(ao_serial) + 1);
sRate = sRate * sckdiv * wsdiv;
val = 0.5 + (477218588.0 * (sRate / tm1300DebugCPUClock)); /* 2**32 / 9 */
aoSetFREQM(AO_STATUS, ((UInt) val) | 0x80000000);
return TMLIBDEV_OK;
}
/*******************************************************/
extern tmLibdevErr_t tm1300Debug_AO_GetSRate(Float * sRate)
{
UInt serial = MMIO(AO_SERIAL);
UInt freq = MMIO(AO_FREQ);
UInt sckdiv = 1 + aoExtractSCKDIV(serial);
UInt wsdiv = 1 + aoExtractWSDIV(serial);
Float rate;
pprocCapabilities_t procCap;
Float tm1300DebugCPUClock;
Int err = TMLIBDEV_OK;
/* get the clock frequency of the TriMedia CPU */
err = procGetCapabilities(&procCap);
if (err) return err;
tm1300DebugCPUClock = (Float) procCap->cpuClockFrequency;
rate = (Float) (freq & 0x7fffffff) * tm1300DebugCPUClock / 477218588.0;
rate = rate / ((Float) sckdiv * (Float) wsdiv);
*sRate = rate;
return TMLIBDEV_OK;
}
/*******************************************************/
extern tmLibdevErr_t tm1300Debug_AO_Config(UInt32 subaddr, Pointer value)
{
return AIO_ERR_COMMAND_NOT_SUPPORTED;
}
/* Functions for the S/PDIF output */
extern tmLibdevErr_t tm1300Debug_SPDO_Init(boardSPDOParam_t * param)
{
Int err = TMLIBDEV_OK;
spdoRESETM(SPDO_STATUS);
if (! (param->audioTypeFormat & TM1300DEBUG_SUPPORTED_SPDO_TYPES) )
return AIO_ERR_UNSUPPORTED_FORMAT;
if (! (param->audioSubtypeFormat & TM1300DEBUG_SUPPORTED_SPDO_SUBTYPES) )
return AIO_ERR_UNSUPPORTED_FORMAT;
#ifdef __LITTLE_ENDIAN__
spdoEnableLITTLE_ENDIANM(SPDO_STATUS);
#else
spdoDisableLITTLE_ENDIANM(SPDO_STATUS);
#endif
spdoSetTRANS_MODEM(SPDO_STATUS, 0); /* S/PDIF mode */
spdoSetSIZEM(SPDO_STATUS, param->size);
err = tm1300Debug_SPDO_SetSRate(param->sRate);
return err;
}
extern tmLibdevErr_t tm1300Debug_SPDO_Term(void)
{
spdoRESETM(SPDO_STATUS);
return TMLIBDEV_OK;
}
extern tmLibdevErr_t tm1300Debug_SPDO_Start(void)
{
spdoEnableTRANS_ENABLEM(SPDO_STATUS);
return TMLIBDEV_OK;
}
extern tmLibdevErr_t tm1300Debug_SPDO_Stop(void)
{
spdoDisableTRANS_ENABLEM(SPDO_STATUS);
return TMLIBDEV_OK;
}
extern tmLibdevErr_t tm1300Debug_SPDO_SetSRate(Float sRate)
{
pprocCapabilities_t procCap;
Float tm1300DebugCPUClock;
Int err = TMLIBDEV_OK;
/* get the clock frequency of the TriMedia CPU */
err = procGetCapabilities(&procCap);
if (err) return err;
tm1300DebugCPUClock = (Float) procCap->cpuClockFrequency;
sRate *= 128;
sRate = 0.5 + (477218588.0 * (sRate / tm1300DebugCPUClock));
spdoSetFREQM(SPDO_STATUS, ((UInt) sRate) | 0x80000000);
return TMLIBDEV_OK;
}
extern tmLibdevErr_t tm1300Debug_SPDO_GetSRate(Float * sRate)
{
UInt freq = MMIO(SPDO_FREQ);
Float rate;
pprocCapabilities_t procCap;
Float tm1300DebugCPUClock;
Int err = TMLIBDEV_OK;
/* get the clock frequency of the TriMedia CPU */
err = procGetCapabilities(&procCap);
if (err) return err;
tm1300DebugCPUClock = (Float) procCap->cpuClockFrequency;
rate = (Float) (freq & 0x7fffffff) * tm1300DebugCPUClock / 477218588.0;
rate = rate / 128.0;
*sRate = rate;
return TMLIBDEV_OK;
}
/*******************************************************/
extern tmLibdevErr_t tm1300Debug_AI_Init(pboardAIParam_t param)
{
Int err = TMLIBDEV_OK;
tmAssert(param, TMLIBDEV_ERR_NULL_PARAMETER);
/* check if audio type is supported */
if (!(param->audioTypeFormat & TM1300DEBUG_SUPPORTED_AI_TYPES))
{
return AIO_ERR_UNSUPPORTED_FORMAT;
}
/* check if audio subtype is supported */
if (!(param->audioSubtypeFormat & TM1300DEBUG_SUPPORTED_AI_SUBTYPES))
{
return AIO_ERR_UNSUPPORTED_FORMAT;
}
/* do format specific setup */
switch (param->audioSubtypeFormat)
{
case apfStereo16:
break;
default:
return AIO_ERR_UNSUPPORTED_FORMAT;
/* no break ... statement unreachable */
}
aiSetCAP_MODE( 3); /* Stereo 16 bits per sample */
aiDisableSIGN_CONVERT();
aiMsbFirst(); /* MSB first */
aiSetFRAMEMODE(0); /* ignore valid bit */
aiSampleRisingCLOCK_EDGE(); /* sample on rising edge */
aiStartFallingEdgeWS();
aiSetSSPOS( 0);
aiSetLEFTPOS(0);
aiSetRIGHTPOS(32);
aiSetSIZE(param->size);
#ifdef __LITTLE_ENDIAN__
aiEnableLITTLE_ENDIAN();
#else
aiDisableLITTLE_ENDIAN();
#endif
err = tm1300Debug_AI_SetSRate(param->sRate);
if (err)
return err;
return TMLIBDEV_OK;
}
/*******************************************************/
extern tmLibdevErr_t tm1300Debug_AI_Term(void)
{
/* reset audio in */
aiRESET();
return TMLIBDEV_OK;
}
/*******************************************************/
extern tmLibdevErr_t tm1300Debug_AI_Start(void)
{
aiEnableCAP_ENABLE();
return TMLIBDEV_OK;
}
/*******************************************************/
extern tmLibdevErr_t tm1300Debug_AI_Stop(void)
{
aiDisableCAP_ENABLE();
return TMLIBDEV_OK;
}
/***********************************************************************
* Convert a floating point sample rate value
* to a 32 bit frequency control value for the DDS.
*
* NOTE: YOU MUST SET THE sckdiv and wsdiv FIELDS FOR THIS TO WORK!
*
* Accurate to .5 ppm.
* The DDS can do better than this, but 64 bit math is
* required to use this interface.
*/
extern tmLibdevErr_t tm1300Debug_AI_SetSRate(Float sRate)
{
Float val;
pprocCapabilities_t procCap;
Float tm1300DebugCPUClock;
Int err = TMLIBDEV_OK;
/* get the clock frequency of the TriMedia CPU */
err = procGetCapabilities(&procCap);
if (err) return err;
tm1300DebugCPUClock = (Float) procCap->cpuClockFrequency;
val = 0.5 + (477218588.0 * (sRate * 256.0 / tm1300DebugCPUClock));
aiSetFREQ(((UInt) val) | 0x80000000);
return TMLIBDEV_OK;
}
/* audio in runs at the same clock as audio out */
extern tmLibdevErr_t tm1300Debug_AI_GetSRate(Float * sRate)
{
UInt freq = MMIO(AI_FREQ);
Float rate;
pprocCapabilities_t procCap;
Float tm1300DebugCPUClock;
Int err = TMLIBDEV_OK;
/* get the clock frequency of the TriMedia CPU */
err = procGetCapabilities(&procCap);
if (err) return err;
tm1300DebugCPUClock = (Float) procCap->cpuClockFrequency;
tmAssert(sRate, TMLIBDEV_ERR_NULL_PARAMETER);
rate = (Float) (freq & 0x7fffffff) * tm1300DebugCPUClock / 477218588.0;
rate = rate / 256;
*sRate = rate;
return TMLIBDEV_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -