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