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

📄 philips_dtv_ref2.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    tmAssert(data, FLASH_ERR_NULL_POINTER);
    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);
    
    *data = flashBaseAddress[address];
    return TMLIBDEV_OK;
}

static tmLibdevErr_t ref2FlashWriteWord(UInt32 address, UInt32 data)
{
    UInt32        i = 0;

    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);

    flashBaseAddress[0x5555]  = 0xAAAAAAAA;
    flashBaseAddress[0x2AAA]  = 0x55555555;
    flashBaseAddress[0x5555]  = 0xA0A0A0A0;
    flashBaseAddress[address] = data;

    while (flashBaseAddress[address] != data)
    {
        if (i++ > 1000000)
        {
           return FLASH_ERR_WRITE;
        }
    }
    return TMLIBDEV_OK;
}

static tmLibdevErr_t ref2FlashReadBlock(UInt32 address, UInt32 * data, UInt32 numberOfWords)
{
    Int i;
    
    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);

    for (i = 0; i < numberOfWords; i++)
    {
        data[i] = flashBaseAddress[address + i];
    }

    return TMLIBDEV_OK;
}

static tmLibdevErr_t ref2FlashWriteBlock(UInt32 address, UInt32 * data, UInt32 numberOfWords)
{
    UInt32        i = 0, j;

    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);

    for (j = 0; j < numberOfWords; j++)
    {
        flashBaseAddress[0x5555]  = 0xAAAAAAAA;
        flashBaseAddress[0x2AAA]  = 0x55555555;
        flashBaseAddress[0x5555]  = 0xA0A0A0A0;
        flashBaseAddress[address + j] = data[j];

        while (flashBaseAddress[address + j] != data[j])
        {
            if (i++ > 1000000)
            {
               return FLASH_ERR_WRITE;
            }
        }
        
        i = 0;
    }
    return TMLIBDEV_OK;
}

static tmLibdevErr_t ref2FlashEraseSector(UInt32 sector)
{
    UInt32        i = 0;
    UInt32        sectorSize = DTV_REF2_FLASH_SECTOR_SIZE;

    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);

    flashBaseAddress[0x5555] = 0xAAAAAAAA;
    flashBaseAddress[0x2AAA] = 0x55555555;
    flashBaseAddress[0x5555] = 0x80808080;
    flashBaseAddress[0x5555] = 0xAAAAAAAA;
    flashBaseAddress[0x2AAA] = 0x55555555;
    flashBaseAddress[sector * sectorSize] = 0x30303030;

    while (flashBaseAddress[sector * sectorSize] != 0xffffffff)
    {
        if (i++ > 20000000)
            return FLASH_ERR_ERASE_TIMEOUT;
        microsleep(1);
    }

    return TMLIBDEV_OK;
}

static tmLibdevErr_t ref2FlashEraseAll(void)
{
    UInt32        i = 0;

    tmAssert(flashInitialized, FLASH_ERR_NOT_INITIALIZED);

    flashBaseAddress[0x5555] = 0xAAAAAAAA;
    flashBaseAddress[0x2AAA] = 0x55555555;
    flashBaseAddress[0x5555] = 0x80808080;
    flashBaseAddress[0x5555] = 0xAAAAAAAA;
    flashBaseAddress[0x2AAA] = 0x55555555;
    flashBaseAddress[0x5555] = 0x10101010;
 
    while (flashBaseAddress[0] != 0xffffffff)
    {
        if (i++ > 200000000)
            return FLASH_ERR_ERASE_TIMEOUT;
        microsleep(1);
    }

    return TMLIBDEV_OK;
}

/* VO + SAA 7125 init */
static tmLibdevErr_t 
boardVOInit(pboardVOParam_t param)
{
    tmLibdevErr_t       rval;
    pprocCapabilities_t procCap;
    
    rval = procGetCapabilities(&procCap);
    if (rval) return rval;

#if 0
    rval = saa7125Init(param);
#endif
    
    voSetFREQUENCY__CHECK(param->ddsFrequency);
    voSetPLL_S__CHECK(1);
    voSetPLL_T__CHECK(1);
    voSetCLKOUT__CHECK(1);
    voSetSYNC_MASTER__CHECK(1);

    switch (param->videoStandard)
    {
    case vasNTSC:
        voSupportNTSC();
        break;
    case vasPAL:
        voSupportPAL();
        break;
    case vas960x540p: /* 1080i overlay for DTV */
        voSetCLKOUT__CHECK(0);
        voSetSYNC_MASTER__CHECK(0);
        voSetIO1_POS__CHECK(1);
        voSetIO2_POS__CHECK(1);

        /* TM1100 specific code (ifdef tm1100 removed) */
        if (procCap->deviceID != PROC_DEVICE_TM1000)
        {
            MMIO(EVO_SLVDLY) = 2200 - 10; /* genlock delay  */
	    MMIO(EVO_CTL) = 0x10000041; /* genlock enable */
        }
        voSupport960x540p();
        break;
    case vasNone:
        break;
    default:
        return BOARD_ERR_UNSUPPORTED_STANDARD;
    }
    
    return rval;
}


/* Describe video out. */
static boardVOConfig_t dtv_vo =
{
    "SAA 7125",                   /* encoder name */
    boardVOInit,                  /* init */
    Null,                         /* term */
    Null,                         /* Hue  */
    Null,                         /* Saturation   */
    saa7125SetBrightness,
    Null,                         /* Contrast */
    saa7125Configure,             /* config */
    
    SAA7125_SUPPORTED_STANDARDS | vas960x540p,  /* supported color standards */
    SAA7125_SUPPORTED_ADAPTERS | vaaNone,   /* supported adapters */
    intVIDEOOUT,                  /* interrupt number */
    VO_STATUS,                    /* mmioBase */
    0,                      /* gpio first pin */
    0                       /* gpio last pin */

};

/* describe telecom's Analog Front End (AFE) */
static boardSSIConfig_t dtv_afe =
{
    "none",
    Null,                    /* setup */
    Null,                    /* term */
    Null,                    /* hook */
    Null,                    /* config */
    sacNoConnection,         /* connection flags */
    Null,                    /* reserved */
    intINT_15,               /* interrupt number */
    0,                      /* gpio first pin */
    0                       /* gpio last pin */
};


static tmLibdevErr_t dtv_ref2_board_activate(pcomponent_t comp)
{
    tmLibdevErr_t err;
    
    L1_DP(("dtv_ref2_activate\n"));
    err = dtv_ref2_board_detect();
    
    if (err != TMLIBDEV_OK) 
    {
        L2_DP(("Board not recognized\n"));
        return err;
    }
    
    L2_DP(("Board recognized\n"));
    /* At this point, we call the init function of the board */
    /* This function cannot fail according to the prototypes */
    /* Therefore, there is no error propagation */
    TRY(dtv_ref2_board_init());
    
    /* This is time to register the component outputs. */
    /* This will be used by all the devices to check */
    /* whether they can work with this board or not */
    TRY(dtv_ref2_board_register(comp));

    return TMLIBDEV_OK;
}
/******************** dtv_board_init *******************************
 *  The dtv board comes up with peripherals reset.
 *  This function takes the board out of reset and leaves
 *  it in a good state.
 */
static tmLibdevErr_t
dtv_ref2_board_init(void)
{
    pprocCapabilities_t procCap;
    pc16552DParams_t    p;
    
    procGetCapabilities(&procCap);

    /* make sure VO clock is running at 27MHz! */
    MMIO(VO_CLOCK) = (UInt) (0.5 +
          (1431655765.0 * VO_INIT_FREQ / (Float) procCap->cpuClockFrequency));
    MMIO(VO_CTL) = 0x02700000;

    MMIO(SSI_CTL) = 0x00040000;     /* V34IO2 goes high to stay on hook! */
    
    /* IIC expander
       address 0x70
       bit 0    SRESET
       bit 1    Afe reset
       bit 2    audio mode 1
       bit 3    audio mode 2
       bit 4    input mode for color key
       bit 5    audio mode 3
       bit 6    audio mode 4
       bit 7    audio mode 5
    */
    TRY(iicWriteReg(IIC_EXPANDER_ADDRESS, -1, 0xFE));    /* lower reset */
    TRY(iicWriteReg(IIC_EXPANDER_ADDRESS, -1, 0xFF));    /* raise reset */


    /* L3 IIC expander:
     address: 0x74
     bit 0  Dout L3 mode
     bit 1  Dout L3 clock
     bit 2  Dout L3 data
     bit 3  Dout L3 strobe
     bit 4  Din L3 mode
     bit 5  Din L3 clock
     bit 6  Din L3 data
     bit 7  Din L3 strobe
    */
    TRY(iicWriteReg(L3_IIC_EXPANDER_ADDRESS, -1, 0xFF));

    /* The IIC expander at VIDMUX_IIC_EXPANDER_ADDRESS:
     * Bit 0 secondary PCI reset (lower this to reboot)
     * Bit 1 spare
     * Bit 2 spare
     * Bit 3 spare
     * Bits 4 and 5 are 27MHz mux, but not currently used.  Connect to U59
     * Bits 7 and 6 are Video in Mux Select (U168):
     *      00: VSB  
     *      10: saa7111a
     *      01: MTS  (ECL to TTL digital input)  (use 0x7F)
     *      11: saa7111a    (default powerup)
     */
    TRY(iicWriteReg(VIDMUX_IIC_EXPANDER_ADDRESS, -1, 0x3F));    

    /* Don't want TriMedia to drive VO clock and sync since st7000
     * is also doing it. Without this, we have lift 3 pins on TriMedia
     * in the DTV reference board 1 and C1_1 board
     */
 
    MMIO(VO_CTL) = 0x32400000;  /* The hardware default value after reset */

    /* initialize UART */
    p.readRegisterFunc  = dtvRef2ReadUartRegister;
    p.writeRegisterFunc = dtvRef2WriteUartRegister;
    p.crystalType       = PC16552D_CRYSTAL_1_8432;
    TRY(pc16552DInit(&p));

    /* MMIO(VO_CLOCK) = 0; Leave it running for testing */
    return TMLIBDEV_OK;
}                /* end of dtv_board_init() */

/******************** dtv_board_detect *******************************
 * Returns non zero if the hardware appears to be a Philips dtv board.
 */

static      tmLibdevErr_t
dtv_ref2_board_detect(void)
{
    Int         line;
    UInt32      d1, boardID, mfgID;
    UInt8       eepromData[8];
    
    L1_DP(("dtv_ref2_board_detect\n"));

    for (line = 0; line < 8; line++) {
        TRY(iicReadReg(IIC_EEPROM_ADDRESS, line, &d1));
        eepromData[line] = d1;
    }
    mfgID   = (eepromData[3] << 8) + eepromData[4];
    boardID = (eepromData[1] << 8) + eepromData[2];

    if (mfgID != BOARD_ID_PHILIPS_MFG_ID)
    {
        return BOARD_ERR_UNKNOWN_BOARD;
    }

    if (boardID == BOARD_VERSION_PHILIPS_DTV_REF2)
    {
        return TMLIBDEV_OK;
    }
    return BOARD_ERR_UNKNOWN_BOARD;
}


static tmLibdevErr_t dtv_ref2_board_register(pcomponent_t comp)
{
    UInt32 ID = BOARD_VERSION_PHILIPS_DTV_REF2;
    
    L1_DP(("dtv_ref_board_register\n"));
    /* the board is  "Philips DTV Ref 2 (NAB98)", but for compatibility */
    /* reasons with old code, the maximum size for a board is 16 characters */
    /* therefore, we have to truncate it */
    TRY(tsaBoardRegisterBoard(ID, "Philips DTVRef2"));

    TRY(tsaBoardRegisterAO(0, &dtv_ao));

    TRY(tsaBoardRegisterAI(0, &dtv_ai));

    TRY(tsaBoardRegisterVO(0, &dtv_vo));

    TRY(tsaBoardRegisterVI(0, &dtv_vi));

    TRY(tsaBoardRegisterSSI(0, &dtv_afe));

    TRY(tsaBoardRegisterFlash(0, &ref2Flash));

    TRY(tsaBoardRegisterPIC(0, &dtvRef2PIC));

    TRY(tsaBoardRegisterUart(0, &dtvRef2Uart1));

    TRY(tsaBoardRegisterUart(1, &dtvRef2Uart2));

    return TMLIBDEV_OK;
}


TSA_COMP_DEF_O_COMPONENT( Philips_dtv_ref2, 
                          TSA_COMP_BUILD_ARG_LIST_2("bsp/boardID", "bsp/uart"), 
                          dtv_ref2_board_activate);
                          











⌨️ 快捷键说明

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