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

📄 philips_dtv_ref4.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    UInt32      irqNum;
    UInt8       data8;
    Int         i;

    DP_R4((" dtvRef4PICSourceDetect()\n"));
    /* we also need to check the state of the pin since the event is edge triggered */
    if (gpioGetEV_OCCUR(REF4_GPIO_SIO_EVENT) || !(MMIO(GPIOJ_IN) & 0x00008000))
    {
        DP_R4(("REF4_GPIO_SIO_EVENT occurred\n"));
        if (w83977atfPICSourceDetect(&irqNum))
        {
            *source = ref4Irq2SrcArray[irqNum];
            DP_R4((" found dtvRef4PICSourceDetect(%d)\n", *source));
            return True;
        }
        DP_R4(("REF4_GPIO_SIO_EVENT not claimed.\n"));
        gpioEV_ACK(REF4_GPIO_SIO_EVENT);
        gpioEV_ACKM(REF4_GPIO_SIO_EVENT);
    }

    if (gpioGetEV_OCCUR(REF4_GPIO_PLD_EVENT) )
    {
        DP_R4(("REF4_GPIO_PLD_EVENT occurred\n"));
        xioRegReadByte (0x04, &data8);
        DP_R4(("read %x from 04\n", data8));
    
        if (!(data8 & 0x8))
        {
            *source = DTV_REF4_PIC_SOURCE_AUDIO1;
            DP_R4(("Detected NIM 1 IRQ\n"));
            return True;
        }
        if (!(data8 & 0x10))
        {
            *source = DTV_REF4_PIC_SOURCE_AUDIO2;
            DP_R4(("Detected NIM 2 IRQ\n"));
            return True;
        }
        if (!(data8 & 0x80))
        {
            *source = DTV_REF4_PIC_SOURCE_1394;
            DP_R4(("Detected 1394 IRQ\n"));
            return True;
        }
        DP_R4(("REF4_GPIO_PLD_EVENT not claimed.\n"));
        gpioEV_ACK(REF4_GPIO_PLD_EVENT);
        gpioEV_ACKM(REF4_GPIO_PLD_EVENT);
    }
    /* check which GPIO event brought us here */
    for (i=2; i<8; i++)
    {
        if (gpioGetEV_INTEN(i) )  DP_R4(("gpio event %d enabled\n", i));
        if (gpioGetEV_OCCUR(i) )  
        {
            DP_R4(("gpio event %d occurred\n", i));
            gpioEV_ACK(i);
            gpioEV_ACKM(i);
        }
    }
    return False;

}

static tmLibdevErr_t dtvRef4PICStart(UInt32 source)
{
    DP_R4((" dtvRef4PICStart(%d)\n", source));

    switch (source)
    {
        case DTV_REF4_PIC_SOURCE_COMM1:
        case DTV_REF4_PIC_SOURCE_COMM2:
        case DTV_REF4_PIC_SOURCE_IR_IN0:
            return TMLIBDEV_OK;

        case DTV_REF4_PIC_SOURCE_AUDIO1:
        {
            DP_R4(("enable audio1\n"));
            xioRegWriteBit(0x0A, 0x08, 1);
            return TMLIBDEV_OK;
        }
        case DTV_REF4_PIC_SOURCE_AUDIO2:
        {
            DP_R4(("enable audio2\n"));
            xioRegWriteBit(0x0A, 0x10, 1);  /* raise bit 4 to enable */
            return TMLIBDEV_OK;
        }
        case DTV_REF4_PIC_SOURCE_1394:
        {
            DP_R4(("enable 1394 interrupt\n"));
            xioRegWriteBit(0x0A, 0x80, 1);  /* raise bit 7 to enable */
            return TMLIBDEV_OK;
        }
        default:
            DP_R4(("source %d not available\n", source));
            return PIC_ERR_SOURCE_NOT_AVAILABLE;
    }
}

static tmLibdevErr_t dtvRef4PICStop(UInt32 source)
{
    DP_R4((" dtvRef4PICStop (%d)\n", source));

    switch (source)
    {
        case DTV_REF4_PIC_SOURCE_COMM1:
        case DTV_REF4_PIC_SOURCE_COMM2:
        case DTV_REF4_PIC_SOURCE_IR_IN0:
            return TMLIBDEV_OK;

        case DTV_REF4_PIC_SOURCE_AUDIO1:
        {
            DP_R4(("disable audio1\n"));
            xioRegWriteBit(0x0A, 0x08, 0);  /* lower bit 3 to disable */
            return TMLIBDEV_OK;
        }
        case DTV_REF4_PIC_SOURCE_AUDIO2:
        {
            DP_R4(("disable audio2\n"));
            xioRegWriteBit(0x0A, 0x10, 0);  /* lower bit 4 to disable */
            return TMLIBDEV_OK;
        }
        case DTV_REF4_PIC_SOURCE_1394:
        {
            DP_R4(("disable 1394 interrupt\n"));
            xioRegWriteBit(0x0A, 0x80, 0);  /* lower bit 7 to disable */
            return TMLIBDEV_OK;
        }
        default:
            DP_R4(("source %d not available\n", source));
            return PIC_ERR_SOURCE_NOT_AVAILABLE;
    }
}

static void unmaskNimIrq( piicRequest_t req)
{
    DP_R4(("unmaskNimIrq 0x%x\n", iicData));
#if 0    
/* INPUT_IIC_EXPANDER_ADDRESS
   address 0x72     : Input IIC expander is in NIM board 
   
   bit 0    Tuner audio (1= enable, 0 = disable)
   bit 1    Analog audio (1 = enable, 0 = disable)
   bit 2    copyprotection
   bit 3    powerdown
   bit 4    lock/unlock
   bit 5    48.0 kHz
   bit 6    44.1 kHz
   bit 7    32.0 kHz
*/
    if (iicData & 1) DP_R4(("Tuner enabled, "));
    else DP_R4(("Tuner disabled, "));
    if (iicData & 2) DP_R4(("Ana enabled, "));
    else DP_R4(("Ana disabled, "));
    if (iicData & 4) DP_R4(("copy high, "));
    else DP_R4(("copy low, "));
    if (iicData & 8) DP_R4(("PD "));
    else DP_R4((""));
    /* note: when 1315 is running in standalone mode, we mask locked to zero
     * to supress the flurry of unlock interrupts that otherwise
     * bury us under interrupts.
     */
    if (iicData & 0x10) DP_R4(("locked "));
    else DP_R4(("not locked "));
    if (iicData & 0x20) DP_R4((""));
    else DP_R4(("48k "));
    if (iicData & 0x40) DP_R4((""));
    else DP_R4(("44k "));
    if (iicData & 0x80) DP_R4((""));
    else DP_R4(("32k "));
#endif    
    switch (req->userData)
    {
        case DTV_REF4_PIC_SOURCE_AUDIO1:
        {
            DP_R4(("enable audio1\n"));
            xioRegWriteBit(0x0A, 0x08, 1);
            return ;
        }
        case DTV_REF4_PIC_SOURCE_AUDIO2:
        {
            DP_R4(("enable audio2\n"));
            xioRegWriteBit(0x0A, 0x10, 1);  /* raise bit 4 to enable */
            return ;
        }
        default:
            DP_R4(("source %d not available\n", req->userData));
            return;
    }
}

static tmLibdevErr_t dtvRef4PICAck(UInt32 source)
{
    DP_R4((" dtvRef4PICAck (%d)\n", source));
    switch (source)
    {
    case DTV_REF4_PIC_SOURCE_COMM1:
    case DTV_REF4_PIC_SOURCE_COMM2:
    case DTV_REF4_PIC_SOURCE_IR_IN0:
        gpioEV_ACK(REF4_GPIO_SIO_EVENT);
        gpioEV_ACKM(REF4_GPIO_SIO_EVENT);
        break;

    case DTV_REF4_PIC_SOURCE_AUDIO1:
    case DTV_REF4_PIC_SOURCE_AUDIO2:
    {
        /* mask the pending peripheral int at the PLD */
        if (source == DTV_REF4_PIC_SOURCE_AUDIO1) {
            DP_R4(("disable audio1\n"));
            xioRegWriteBit(0x0A, 0x08, 0);  /* lower bit 3 to disable */
        } else {
            DP_R4(("disable audio2\n"));
            xioRegWriteBit(0x0A, 0x10, 0);  /* lower bit 4 to disable */
        }
        /* ACK the GPIO interrupt */
        gpioEV_ACK(REF4_GPIO_PLD_EVENT);
        gpioEV_ACKM(REF4_GPIO_PLD_EVENT);
        
        if (NimInstalled)
        {
            if (IicInstance == 0) 
                iicOpen(&IicInstance);
                
            /* dispatch an IIC event just to clear the interrupt line on the IIC expander */
            DP_R4(("Dispatch IIC to clear ISR\n"));
            req.direction  = IIC_READ;
            req.byteCount  = 1;
            req.address    = NIM_SPDIF_STATUS_ADDRESS;
            req.numRetries = 0;
            req.data       = &iicData;
            req.mode       = IIC_Asynchronous;
            req.type       = IIC_SIMPLE;
            req.userData   = source;
            req.completion_function = unmaskNimIrq;
            iicDispatch(IicInstance, &req);
        }
        return TMLIBDEV_OK;
    }
    case DTV_REF4_PIC_SOURCE_1394:
        /* ACK the GPIO interrupt */
        gpioEV_ACK(REF4_GPIO_PLD_EVENT);
        gpioEV_ACKM(REF4_GPIO_PLD_EVENT);
        return TMLIBDEV_OK;

    default:
        return PIC_ERR_SOURCE_NOT_AVAILABLE;
    }

    return TMLIBDEV_OK;
}

/* Declaration of UART functions. */
static tmLibdevErr_t dtvRef4UARTInit(unitSelect_t portID, pboardUartParam_t params)
{
    UInt32 tmp;

    if (portID == unit0)
    {
        /* Set GPIO pin J10 to be an output. */
        tmp = MMIO(GPIOJ_MODE);
        tmp &= 0xfffcffff;
        MMIO(GPIOJ_MODE) = tmp;
    }
    else
    {
        /* Set GPIO pin J10 to be an output. */
        tmp = MMIO(GPIOJ_MODE);
        tmp &= 0xfff3ffff;
        MMIO(GPIOJ_MODE) = tmp;
    }

    return w83977atfUartInitPort(portID, params);
}

static tmLibdevErr_t dtvRef4UARTTerm(unitSelect_t portID)
{
    UInt32 tmp;

    if (portID == unit0)
    {
        /* Set GPIO pin J10 to be an output. */
        tmp = MMIO(GPIOJ_MODE);
        tmp |= 0x00020000;
        MMIO(GPIOJ_MODE) = tmp;
    }
    else
    {
        /* Set GPIO pin J10 to be an output. */
        tmp = MMIO(GPIOJ_MODE);
        tmp |= 0x00080000;
        MMIO(GPIOJ_MODE) = tmp;
    }

    return w83977atfUartTermPort(portID);
}

/* declaration of IR functions */
static tmLibdevErr_t dtvRef4IRInit(pboardIRParam_t params)
{
    tmLibdevErr_t       err;
    w83977atfIRParams_t sioIrParams;
    UInt32              tmp;

    /* initialize IR input on the SIO chip */
    sioIrParams.irDevice = irdRC5;
    err = w83977atfIRInit(&sioIrParams);

    /* Set GPIO pin J10 to be an input. */
    tmp = MMIO(GPIOJ_MODE);
    tmp &= 0xffcfffff;
    MMIO(GPIOJ_MODE) = tmp;

    return err;
}

static tmLibdevErr_t dtvRef4IRTerm(void)
{
    UInt32 tmp;

    /* Set GPIO pin J10 to be an output. */
    tmp = MMIO(GPIOJ_MODE);
    tmp |= 0x00200000;
    MMIO(GPIOJ_MODE) = tmp;

    return TMLIBDEV_OK;
}

static tmLibdevErr_t dtvRef4IRStart(void)
{
    return TMLIBDEV_OK;
}

static tmLibdevErr_t dtvRef4IRStop(void)
{
    return TMLIBDEV_OK;
}

static void dtvRef4IRGetEvent(tsaIREvent_t *event, UInt32 *value)
{
    w83977atfIRGetEvent(event, value);
}


/* static variables for flash functions */
volatile static UInt32 * flashBaseAddress;
static Bool              flashInitialized = False;

/***********************************************************************/
static UInt32 findFlashBank(UInt32 address)
{
    UInt32 i;
    UInt32 b;
    
    for (i = 0; i < 4; i ++)
    {
        b = i * DTV_REF4_FLASH_BANK_SIZE;
        if ((b <= address) && (address < (b + DTV_REF4_FLASH_BANK_SIZE)))
            return i;
    }
    
    return i;
}
/***********************************************************************/
static tmLibdevErr_t dtvRef4FlashInit(void)
{
    /* check if bankswitch works */
    TRY(dtvRef4_bankSwitch(DTV_REF4_XIO_FLASH_BANK));
    /* switch back to super I/O bank, this is the default bank */
    TRY(dtvRef4_bankSwitch(DTV_REF4_XIO_SIO_BANK));
    
    flashBaseAddress = (UInt32 *) DTV_REF4_XIO_BASE;

    flashInitialized = True;
    
    return TMLIBDEV_OK;
}

/***********************************************************************/
static tmLibdevErr_t dtvRef4FlashReadWord(UInt32 address, UInt32 * data)
{
    tmLibdevErr_t err;
    UInt32        d = 0;
    UInt32        a = address << 2;
    Int           j;

    tmAssert(data, FLASH_ERR_NULL_POINTER);
    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);

    err = dtvRef4_bankSwitch(DTV_REF4_XIO_FLASH_BANK);
    if (err != TMLIBDEV_OK)
        return err;

#ifdef __BIG_ENDIAN__
    for (j = 3; j >= 1; j--)
#else
    for (j = 0; j < 3; j++)
#endif
    {
        d |= flashBaseAddress[a + j] & 0xff000000;
        d >>= 8;
    }
    d |= flashBaseAddress[a + j] & 0xff000000;
    
    *data = d;

    /* switch back to super I/O bank, this is the default bank */
    TRY(dtvRef4_bankSwitch(DTV_REF4_XIO_SIO_BANK));

    return TMLIBDEV_OK;
}

/***********************************************************************/
static tmLibdevErr_t dtvRef4FlashWriteWord(UInt32 address, UInt32 data)
{
    tmLibdevErr_t err;
    UInt32        d = data;
    UInt32        b, a;
    UInt32        i = 0;
    Int           j;
    
    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);

    err = dtvRef4_bankSwitch(DTV_REF4_XIO_FLASH_BANK);
    if (err != TMLIBDEV_OK)
        return err;

    a = address << 2;
    b = findFlashBank(a) * DTV_REF4_FLASH_BANK_SIZE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -