⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm1300debug_audio.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -