📄 philips_dtv_ref2.c
字号:
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 + -