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

📄 tmspdo.c

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