blob: 0cbc09fc17034241b328f2173a89df6d7be32f60 [file] [log] [blame]
/*------------------------------------------------------------------------------
* Module Name: SiIVidF ( Video Format )
* ---
* Module Description: Function of this module are used for setting up output
* format of receiver
*
* Copyright © 2002-2005, Silicon Image, Inc. All rights reserved.
*
* No part of this work may be reproduced, modified, distributed, transmitted,
* transcribed, or translated into any language or computer format, in any form
* or by any means without written permission of: Silicon Image, Inc.,
* 1060 East Arques Avenue, Sunnyvale, California 94085
*----------------------------------------------------------------------------
*/
#include "SiIVidF.h"
#include "SiIRXDefs.h"
#include "SiIRXAPIDefs.h"
#include "SiIRXIO.h"
#include "SiIGlob.h"
#include "SiIVidRes.h"
#include "SiIHDMIRX.h"
#include "SiITrace.h"
#include "../hdmirx_ext_drv.h"
/*------------------------------------------------------------------------------
* Function Name: siiGetVideoFormatData(...)
* Function Description: This function reads video format data from
* control registers
*
* Accepts: pointer on Video Format Data
* Returns: pointer on Video Format Data
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE siiGetVideoFormatData(BYTE *pbVidFormatData)
{
BYTE bECode = FALSE;
siiReadBlockHDMIRXP0(RX_VID_FORMAT_BASE_ADDR, 3, pbVidFormatData);
return bECode;
}
/*-----------------------------------------------------------------------------
* Function Name: siiSetVideoFormatData(...)
* Function Description: This function writes video format data into
* control registers
*
* Accepts: pointer on Video Format Data
* Returns: pointer on Video Format Data
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE siiSetVideoFormatData(BYTE *pbVidFormatData)
{
BYTE bECode = FALSE;
siiWriteBlockHDMIRXP0(RX_VID_FORMAT_BASE_ADDR, 3, pbVidFormatData);
return bECode;
}
/*------------------------------------------------------------------------------
* Function Name: siiSetVideoPathColorSpaceDependent
* Function Description:
*
* Accepts:
* Returns:
* Globals: none
*----------------------------------------------------------------------------
*/
void siiSetVideoPathColorSpaceDependent(BYTE bVideoPath, BYTE bInputColorSpace)
{
BYTE bVidFormatData[3];
siiGetVideoFormatData(bVidFormatData);
siiPrepVideoPathSelect(bVideoPath, bInputColorSpace, bVidFormatData);
siiSetVideoFormatData(bVidFormatData);
}
/*------------------------------------------------------------------------------
* Function Name: Check if Video DAC capable
* Function Description:
*----------------------------------------------------------------------------
*/
BOOL CheckVideoDAC_Cap(void)
{
BOOL qVidedDACCap = FALSE;
if ((SiI_Ctrl.bDevId == RX_SiI9021) || (SiI_Ctrl.bDevId == RX_SiI9031))
qVidedDACCap = TRUE;
return qVidedDACCap;
}
/*------------------------------------------------------------------------------
* Function Name: CheckVidPathForDevCap
* Function Description:
*----------------------------------------------------------------------------
*/
static void CheckVidPathForDevCap(BYTE bVideoPath)
{
BYTE bWCode = FALSE;
switch (bVideoPath) {
case SiI_RX_P_RGB_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr444_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr422_16B_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr422_20B_2PixClk: /* SiI9011 */
if (SiI_Ctrl.bDevId != RX_SiI9011)
bWCode = SiI_WC_ChipNoCap;
break;
case SiI_RX_P_RGB_48B: /* SiI9021/31 */
case SiI_RX_P_YCbCr444_48B: /* SiI9021/31 */
if (SiI_Ctrl.bDevId == RX_SiI9011)
bWCode = SiI_WC_ChipNoCap;
}
siiWarningHandler(bWCode);
}
/*------------------------------------------------------------------------------
* Function Name: PrepVideoPathCSCAnalogDAC
* Function Description: This function sets type of Video DAC (RGB vs. YCbCr)
*----------------------------------------------------------------------------
*/
static void PrepVideoPathCSCAnalogDAC(BYTE bVideoPath,
BYTE *pbVideoOutputFormat)
{
pbVideoOutputFormat[1] &= (~RX_BIT_RGBA_OUT);
pbVideoOutputFormat[2] |= RX_BIT_EN_INS_CSYNC;
switch (bVideoPath) {
case SiI_RX_P_RGB: /* Clear YCbCr Converter, DownScale, UpScale */
case SiI_RX_P_RGB_2PixClk: /* SiI9011 */
case SiI_RX_P_RGB_48B: /* SiI9021/31 */
pbVideoOutputFormat[1] |= RX_BIT_RGBA_OUT;
break;
}
}
/*******************************************************************************
*Transmitted color Space is ActiveColorSpace
*
*InputColorSpace == SiI_RX_ICP_RGB | InputColorSpace == SiI_RX_ICP_YCbCr444 |
* InputColorSpace == SiI_RX_ICP_YCbCr422
*
*In Out [4A:2]VID_M [4A:1]VID_M [4A:3]VID_M [49:2]VID_M2 [49:0]VID_M2
*Color Color UpScale Bit DownScale Bit RGB->YCbCr YCbCr->RGB RGBAout
*Space Space 422->444 444->422
*
*RGB RGB 0 0 0 0 1
* 444 0 0 1 0 0
* 422 0 1 1 0 0
*
*444 RGB 0 0 0 1 1
* 444 0 0 0 0 0
* 422 0 1 0 0 0
*
*422 RGB 1 0 0 1 1
* 444 1 0 0 0 0
* 422 0 0 0 0 0
******************************************************************************
*/
/*------------------------------------------------------------------------------
* Function Name: PrepVideoPathForRGBInput()
* Function Description: Preparing Video Path's bits of Video Output Format
* structure for RGB Input Color Space
* function sets Color Spase converters and Up or Down Sampling
*----------------------------------------------------------------------------
*/
static void PrepVideoPathForRGBInput(BYTE bVideoPath, BYTE *pbVideoOutputFormat)
{
/* pbVideoOutputFormat:
* | 7 | 6 | 5 | 4 |
* 3 | 2 | 1 | 0 |
* bit[0] 0x48 VID_CTRL |InvVSync|InvHSync|CSyncOnVSync|CSyncOnHSync |
* enSOG |YCbCr2RGB |BitMode |RGB2YCbCr |
* bit[1] 0x49 VID_MODE2 |Res |Res |Res |LE Pol |
* En YCbCr2RGB Rng|EnYCbCr2RGB|En Ped. |DAC RGB |
* bit[2] 0x4A VID_MODE |SyncCode|MuxYC |Dither |En RGB2YCbCr Rng |
* En RGB2YCbCr |UpSmpl |DownSmpl|EnImsCSync|
*/
pbVideoOutputFormat[2] &= (~(RX_BIT_444to422 | RX_BIT_422to444 |
RX_BIT_DITHER | RX_BIT_MUX_YC | RX_BIT_RGBToYCbCr));
pbVideoOutputFormat[1] &= (~RX_BIT_YCbCrToRGB);
pbVideoOutputFormat[0] &= (~RX_BIT_EXT_BIT_MODE);
switch (bVideoPath) {
case SiI_RX_P_RGB: /* Clear YCbCr Converter, DownScale, UpScale */
case SiI_RX_P_RGB_2PixClk: /* SiI9011 */
case SiI_RX_P_RGB_48B: /* SiI9021/31 */
break;
case SiI_RX_P_YCbCr444: /* Set YCbCr Converter */
case SiI_RX_P_YCbCr444_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr444_48B: /* SiI9021/31 */
pbVideoOutputFormat[2] |= RX_BIT_RGBToYCbCr;
break;
/* Set YCbCr Converter, set DownScale
* 4:2:2 mode is used with digital output only
*/
case SiI_RX_P_YCbCr422_MUX8B:
/* YCbCr 422 muxed 8 bit, used with digital output only */
pbVideoOutputFormat[2] |= (RX_BIT_RGBToYCbCr | RX_BIT_444to422 |
RX_BIT_MUX_YC | RX_BIT_DITHER);
break;
case SiI_RX_P_YCbCr422_MUX10B:
/* YCbCr 422 muxed 10 bit, used with digital output only */
pbVideoOutputFormat[2] |= (RX_BIT_RGBToYCbCr | RX_BIT_444to422 |
RX_BIT_MUX_YC);
break;
case SiI_RX_P_YCbCr422_16B:
pbVideoOutputFormat[2] |= (RX_BIT_RGBToYCbCr | RX_BIT_444to422 |
RX_BIT_DITHER);
break;
case SiI_RX_P_YCbCr422:
case SiI_RX_P_YCbCr422_20B:
pbVideoOutputFormat[2] |= (RX_BIT_RGBToYCbCr | RX_BIT_444to422);
break;
case SiI_RX_P_YCbCr422_16B_2PixClk: /* SiI9011 */
pbVideoOutputFormat[2] |= (RX_BIT_RGBToYCbCr | RX_BIT_444to422 |
RX_BIT_DITHER);
break;
case SiI_RX_P_YCbCr422_20B_2PixClk: /* SiI9011 */
pbVideoOutputFormat[2] |= (RX_BIT_RGBToYCbCr | RX_BIT_444to422);
break;
}
}
/*------------------------------------------------------------------------------
* Function Name: PrepVideoPathForYCbCr422Input()
* Function Description: Preparing Video Path for YCbCr 422 Input Color Space
*----------------------------------------------------------------------------
*/
static void PrepVideoPathForYCbCr422Input(BYTE bVideoPath,
BYTE *pbVideoOutputFormat)
{
/* pbVideoOutputFormat:
* | 7 | 6 | 5 | 4 |
* 3 | 2 | 1 | 0 |
* bit[0] 0x48 VID_CTRL |InvVSync|InvHSync|CSyncOnVSync|CSyncOnHSync |
* enSOG |YCbCr2RGB |BitMode |RGB2YCbCr |
* bit[1] 0x49 VID_MODE2 |Res |Res |Res |LE Pol |
* En YCbCr2RGB Rng|EnYCbCr2RGB|En Ped. |DAC RGB |
* bit[2] 0x4A VID_MODE |SyncCode|MuxYC |Dither |En RGB2YCbCr Rng |
* En RGB2YCbCr |UpSmpl |DownSmpl|EnImsCSync|
*/
pbVideoOutputFormat[2] &= (~(RX_BIT_444to422 | RX_BIT_422to444 |
RX_BIT_DITHER | RX_BIT_MUX_YC | RX_BIT_RGBToYCbCr));
pbVideoOutputFormat[1] &= (~RX_BIT_YCbCrToRGB);
/* YMA changed as JAPAN customer reported */
/* pbVideoOutputFormat[0]&=( ~RX_BIT_EXT_BIT_MODE ); */
pbVideoOutputFormat[0] |= RX_BIT_EXT_BIT_MODE;
switch (bVideoPath) {
/* Clear YCbCr Converter, DownScale, UpScale */
case SiI_RX_P_RGB:
case SiI_RX_P_RGB_2PixClk: /* SiI9011 */
case SiI_RX_P_RGB_48B: /* SiI9021/31 */
pbVideoOutputFormat[2] |= RX_BIT_422to444;
pbVideoOutputFormat[1] |= RX_BIT_YCbCrToRGB;
break;
/* Set YCbCr Converter, */
case SiI_RX_P_YCbCr444:
case SiI_RX_P_YCbCr444_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr444_48B: /* SiI9021/31 */
pbVideoOutputFormat[2] |= RX_BIT_422to444;
break;
/* Set YCbCr Converter, set DownScale
* 4:2:2 mode is used with digital output only
*/
case SiI_RX_P_YCbCr422_MUX8B:
/* YCbCr 422 muxed 8 bit, used with digital output only */
pbVideoOutputFormat[1] |= (RX_BIT_EN_PEDESTAL);
pbVideoOutputFormat[2] |= (RX_BIT_MUX_YC | RX_BIT_DITHER);
break;
case SiI_RX_P_YCbCr422_MUX10B:
/* YCbCr 422 muxed 10 bit, used with digital output only */
pbVideoOutputFormat[1] |= (RX_BIT_EN_PEDESTAL);
pbVideoOutputFormat[2] |= RX_BIT_MUX_YC;
break;
case SiI_RX_P_YCbCr422_16B:
pbVideoOutputFormat[2] |= RX_BIT_DITHER;
break;
case SiI_RX_P_YCbCr422:
case SiI_RX_P_YCbCr422_20B:
break;
case SiI_RX_P_YCbCr422_16B_2PixClk: /* SiI9011 */
pbVideoOutputFormat[2] |= RX_BIT_DITHER;
break;
case SiI_RX_P_YCbCr422_20B_2PixClk: /* SiI9011 */
break;
}
}
/*------------------------------------------------------------------------------
* Function Name: PrepVideoPathForYCbCr444Input()
* Function Description: Preparing Video Path for YCbCr 444 Input Color Space
*----------------------------------------------------------------------------
*/
static void PrepVideoPathForYCbCr444Input(BYTE bVideoPath,
BYTE *pbVideoOutputFormat)
{
/* pbVideoOutputFormat:
* | 7 | 6 | 5 | 4 |
* 3 | 2 | 1 | 0 |
* bit[0] 0x48 VID_CTRL |InvVSync|InvHSync|CSyncOnVSync|CSyncOnHSync |
* enSOG |YCbCr2RGB |BitMode |RGB2YCbCr |
* bit[1] 0x49 VID_MODE2 |Res |Res |Res |LE Pol |
* En YCbCr2RGB Rng|EnYCbCr2RGB|En Ped. |DAC RGB |
* bit[2] 0x4A VID_MODE |SyncCode|MuxYC |Dither |En RGB2YCbCr Rng |
* En RGB2YCbCr |UpSmpl |DownSmpl|EnImsCSync|
*/
pbVideoOutputFormat[2] &= (~(RX_BIT_422to444 | RX_BIT_DITHER |
RX_BIT_MUX_YC | RX_BIT_RGBToYCbCr));
pbVideoOutputFormat[1] &= (~RX_BIT_YCbCrToRGB);
pbVideoOutputFormat[0] &= (~RX_BIT_EXT_BIT_MODE);
switch (bVideoPath) {
/* Clear YCbCr Converter, DownScale, UpScale */
case SiI_RX_P_RGB:
case SiI_RX_P_RGB_2PixClk: /* SiI9011 */
case SiI_RX_P_RGB_48B: /* SiI9021/31 */
pbVideoOutputFormat[1] |= RX_BIT_YCbCrToRGB;
break;
/* Set YCbCr Converter, */
case SiI_RX_P_YCbCr444:
case SiI_RX_P_YCbCr444_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr444_48B: /* SiI9021/31 */
break;
/* Set YCbCr Converter, set DownScale
* 4:2:2 mode is used with digital output only
*/
case SiI_RX_P_YCbCr422_20B:
case SiI_RX_P_YCbCr422:
pbVideoOutputFormat[2] |= RX_BIT_444to422;
break;
case SiI_RX_P_YCbCr422_MUX8B:
/* YCbCr 422 muxed 8 bit, used with digital output only */
pbVideoOutputFormat[1] |= (RX_BIT_EN_PEDESTAL);
pbVideoOutputFormat[2] |= (RX_BIT_444to422 | RX_BIT_MUX_YC |
RX_BIT_DITHER);
break;
case SiI_RX_P_YCbCr422_MUX10B:
/* YCbCr 422 muxed 10 bit, used with digital output only */
pbVideoOutputFormat[1] |= (RX_BIT_EN_PEDESTAL);
pbVideoOutputFormat[2] |= (RX_BIT_444to422 | RX_BIT_MUX_YC);
break;
case SiI_RX_P_YCbCr422_16B:
pbVideoOutputFormat[2] |= (RX_BIT_444to422 | RX_BIT_DITHER);
break;
case SiI_RX_P_YCbCr422_16B_2PixClk: /* SiI9011 */
pbVideoOutputFormat[2] |= (RX_BIT_444to422 | RX_BIT_DITHER);
break;
case SiI_RX_P_YCbCr422_20B_2PixClk: /* SiI9011 */
break;
}
}
/*------------------------------------------------------------------------------
* Function Name: siiPrepVideoPathSelect()
* Function Description: prepares Video Format Data for selected Video Format
*
* Accepts: BYTE Video Path Select, pointer on Video Format Data
* Returns: Warning Byte, pointer on Video Format Data, Video Path Select Data
* can be modified
* Globals: bInputColorSpace (read only)
*----------------------------------------------------------------------------
*/
BYTE siiPrepVideoPathSelect(BYTE bVideoPathSelect, BYTE bInputColorSpace,
BYTE *pbVidFormatData)
{
BYTE bECode = FALSE;
RXEXTPR("%s: bInputColorSpace=%d\n", __func__, bInputColorSpace);
if (CheckVideoDAC_Cap()) {
PrepVideoPathCSCAnalogDAC(bVideoPathSelect & SiI_RX_P_Mask,
pbVidFormatData);
}
if (bInputColorSpace == SiI_RX_ICP_RGB) {
RXEXTPR("%s: bInputColorSpac as RGB\n", __func__);
PrepVideoPathForRGBInput(bVideoPathSelect & SiI_RX_P_Mask,
pbVidFormatData);
} else if (bInputColorSpace == SiI_RX_ICP_YCbCr422) {
RXEXTPR("%s: bInputColorSpace as YUV422\n", __func__);
PrepVideoPathForYCbCr422Input(bVideoPathSelect & SiI_RX_P_Mask,
pbVidFormatData);
} else if (bInputColorSpace == SiI_RX_ICP_YCbCr444) {
RXEXTPR("%s: bInputColorSpace as YUV444\n", __func__);
PrepVideoPathForYCbCr444Input(bVideoPathSelect & SiI_RX_P_Mask,
pbVidFormatData);
} else {
RXEXTERR("%s: bInputColorSpace error\n", __func__);
bECode = SiI_EC_InColorSpace;
}
CheckVidPathForDevCap(bVideoPathSelect);
return bECode;
}
/*------------------------------------------------------------------------------
* Function Name: siiPrepSyncSelect()
* Function Description: prepares Sync Select data
*
* Accepts: BYTE Sync Select, pointer on Video Format Data
* Returns: Warning byte, pointer on Video Format Data, sync select data can
* be modified
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE siiPrepSyncSelect(BYTE bSyncSelect, BYTE *pbVidFormatData)
{
BYTE bECode = FALSE;
BYTE bWCode = FALSE;
/* pbVideoOutputFormat:
* | 7 | 6 | 5 | 4 |
* 3 | 2 | 1 | 0 |
* bit[0] 0x48 VID_CTRL |InvVSync|InvHSync|CSyncOnVSync|CSyncOnHSync |
* enSOG |YCbCr2RGB |BitMode |RGB2YCbCr |
* bit[1] 0x49 VID_MODE2 |Res |Res |Res |LE Pol |
* En YCbCr2RGB Rng|EnYCbCr2RGB|En Ped. |DAC RGB |
* bit[2] 0x4A VID_MODE |SyncCode|MuxYC |Dither |En RGB2YCbCr Rng |
* En RGB2YCbCr |UpSmpl |DownSmpl|EnImsCSync|
*/
pbVidFormatData[0] &= (~(RX_BIT_ENCSYNC_ON_HSYNC |
RX_BIT_ENCSYNC_ON_VSYNC | RX_BIT_INSERT_CSYNC_ON_AOUT));
pbVidFormatData[2] &= (~RX_BIT_INS_SAVEAV);
switch (bSyncSelect) {
case SiI_RX_SS_SeparateSync:
break;
case SiI_RX_SS_CompOnH:
pbVidFormatData[0] |= RX_BIT_ENCSYNC_ON_HSYNC;
break;
case SiI_RX_SS_CompOnV:
pbVidFormatData[0] |= RX_BIT_ENCSYNC_ON_VSYNC;
break;
case SiI_RX_SS_EmbSync:
pbVidFormatData[2] |= RX_BIT_INS_SAVEAV;
break;
case SiI_RX_AVC_SOGY:
pbVidFormatData[0] |= RX_BIT_INSERT_CSYNC_ON_AOUT;
if (SiI_Ctrl.bDevId == RX_SiI9011)
bWCode = SiI_WC_ChipNoCap;
break;
}
siiWarningHandler(bWCode);
return bECode;
}
/*------------------------------------------------------------------------------
* Function Name: siiPrepSyncCtrl()
* Function Description: parepares control of sync
*
* Accepts: byte Sync. control, and Video Format Data
* Returns: Warning byte, pointer on Video Format Data, sync control data can
* be modified
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE siiPrepSyncCtrl(BYTE bSyncCtrl, BYTE *pbVidFormatData)
{
BYTE bECode = FALSE;
/* pbVidOutputFormat:
* | 7 | 6 | 5 | 4 |
* 3 | 2 | 1 | 0 |
* bit[0] 0x48 VID_CTRL |InvVSync|InvHSync|CSyncOnVSync|CSyncOnHSync |
* enSOG |YCbCr2RGB |BitMode |RGB2YCbCr |
* bit[1] 0x49 VID_MODE2 |Res |Res |Res |LE Pol |
* En YCbCr2RGB Rng|EnYCbCr2RGB|En Ped. |DAC RGB |
* bit[2] 0x4A VID_MODE |SyncCode|MuxYC |Dither |En RGB2YCbCr Rng |
* En RGB2YCbCr |UpSmpl |DownSmpl|EnImsCSync|
*/
pbVidFormatData[0] &= (~(RX_BIT_INVERT_HSYNC | RX_BIT_INVERT_VSYNC));
if (bSyncCtrl & SiI_RX_SC_InvH)
pbVidFormatData[0] |= RX_BIT_INVERT_HSYNC;
if (bSyncCtrl & SiI_RX_SC_InvV)
pbVidFormatData[0] |= RX_BIT_INVERT_VSYNC;
return bECode;
}
/*------------------------------------------------------------------------------
* Function Name: siiPrepVideoCtrl()
* Function Description: Sets Enable or Disable pedestal
*
* Accepts: pointer on Video Format Data
* Returns: Warning code, if wrong parameter, Modified Video Format Data
* Globals: none
*----------------------------------------------------------------------------
*/
BYTE siiPrepVideoCtrl(BYTE bVideoOutCtrl, BYTE *pbVidFormatData)
{
BYTE bECode = FALSE;
BYTE bWCode = FALSE;
/* pbVidOutputFormat:
* | 7 | 6 | 5 | 4 |
* 3 | 2 | 1 | 0 |
* bit[0] 0x48 VID_CTRL |InvVSync|InvHSync|CSyncOnVSync|CSyncOnHSync |
* enSOG |YCbCr2RGB |BitMode |RGB2YCbCr |
* bit[1] 0x49 VID_MODE2 |Res |Res |Res |LE Pol |
* En YCbCr2RGB Rng|EnYCbCr2RGB|En Ped. |DAC RGB |
* bit[2] 0x4A VID_MODE |SyncCode|MuxYC |Dither |En RGB2YCbCr Rng |
* En RGB2YCbCr |UpSmpl |DownSmpl|EnImsCSync|
*/
if (bVideoOutCtrl == SiI_RX_AVC_Pedestal)
pbVidFormatData[1] |= RX_BIT_EN_PEDESTAL;
else if (bVideoOutCtrl == SiI_RX_AVC_NoPedestal)
pbVidFormatData[1] &= (~RX_BIT_EN_PEDESTAL);
if ((SiI_Ctrl.bDevId == RX_SiI9011) &&
(bVideoOutCtrl != SiI_RX_AVC_Digital_Output))
bWCode = SiI_WC_ChipNoCap;
if (bVideoOutCtrl == SiI_RX_AVC_Digital_Output)
sii_SetVideoOutputPowerDown(SiI_RX_VidOutPD_Analog);
else
sii_SetVideoOutputPowerDown(SiI_RX_VidOutPD_Digital);
siiWarningHandler(bWCode);
return bECode;
}
/*------------------------------------------------------------------------------
* Function Name: Configure2PixPerClockMode()
* Function Description: Function turns on or off 2 Pixels per clock mode
*----------------------------------------------------------------------------
*/
static void Configure2PixPerClockMode(BOOL On)
{
if (On) {
RXEXTPR("%s: on\n", __func__);
siiIIC_RX_RWBitsInByteP0(RX_SYS_CTRL1_ADDR,
RX_BIT_2PIX_MODE, SET);
/* siiIIC_RX_RWBitsInByteP1(RX_PD_SYS2_ADDR,
* RX_BIT_PD_QE, SET);
*/
} else {
RXEXTPR("%s: off\n", __func__);
siiIIC_RX_RWBitsInByteP0(RX_SYS_CTRL1_ADDR,
RX_BIT_2PIX_MODE, CLR);
/* siiIIC_RX_RWBitsInByteP1(RX_PD_SYS2_ADDR,
* RX_BIT_PD_QE, CLR);
*/
}
}
/*------------------------------------------------------------------------------
* Function Name: SetInputOutputDivider
* Function Description: Function Sets Input and Output pixel clock divider
*----------------------------------------------------------------------------
*/
static void SetInputOutputDivider(BOOL qMode48BitOr2PixClk,
BOOL qRestoreOrigPixClock, BYTE PixRepl, BOOL mux_mode)
{
BYTE bRegVal;
SiI_Ctrl.bShadowPixRepl = PixRepl;
bRegVal = siiReadByteHDMIRXP0(RX_SYS_CTRL1_ADDR);
RXEXTPR("%s: RX_SYS_CTRL1_ADDR(0x%02x)=0x%02x\n",
__func__, RX_SYS_CTRL1_ADDR, bRegVal);
/* clear bits of input and output devider */
bRegVal &= RX_MSK_CLR_IN_OUT_DIV;
/* Set bits for input divider equal Pixel Replication */
bRegVal |= (PixRepl << 4);
/* in YCbCr422Mux mode output clock should be doubled */
if (mux_mode) {
PixRepl += 1;
PixRepl >>= 1; /* divide by 2 */
if (PixRepl)
PixRepl -= 1;
}
if ((!qRestoreOrigPixClock) && qMode48BitOr2PixClk) {
bRegVal |= RX_OUTPUT_DIV_BY_2;
} else if (qRestoreOrigPixClock && (!qMode48BitOr2PixClk)) {
/*Set bits for output divider to restore original pixel clock*/
bRegVal |= (PixRepl << 6);
} else if (qRestoreOrigPixClock && qMode48BitOr2PixClk) {
if (PixRepl == SiI_PixRepl1)
bRegVal |= RX_OUTPUT_DIV_BY_2;
else if (PixRepl == SiI_PixRepl2)
bRegVal |= RX_OUTPUT_DIV_BY_4;
else
siiWarningHandler(SiI_WC_ChipNoCap);
} else {
if ((PixRepl == 0) && mux_mode)
bRegVal |= 0x10;
}
siiWriteByteHDMIRXP0(RX_SYS_CTRL1_ADDR, bRegVal);
RXEXTPR("%s: RX_SYS_CTRL1_ADDR(0x%02x)=0x%02x\n",
__func__, RX_SYS_CTRL1_ADDR, bRegVal);
}
/*------------------------------------------------------------------------------
* Function Name: siiSetVidResDependentVidOutputVormat
* Function Description: Functions sets Video Resolution dependent parameters:
* Pix Replication Divider, Output Divider
* Accepts: BYTE Pixel Replication Rate, BYTE Video Path Select
* Returns: Warning code, if wrong parameter
* Globals: none
*----------------------------------------------------------------------------
*/
void siiSetVidResDependentVidPath(BYTE bPixRepl, BYTE bVideoPath)
{
BOOL qRestoreOrgPixClock = TRUE;
BYTE bRegVal;
if (bVideoPath & SiI_RX_P_S_PassReplicatedPixels)
qRestoreOrgPixClock = FALSE;
switch (bVideoPath) {
case SiI_RX_P_RGB_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr444_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr422_16B_2PixClk: /* SiI9011 */
case SiI_RX_P_YCbCr422_20B_2PixClk: /* SiI9011 */
if (SiI_Ctrl.bDevId == RX_SiI9011) {
Configure2PixPerClockMode(ON);
SetInputOutputDivider(ON/*On 48bit(LE) or 2Pix*/,
qRestoreOrgPixClock, bPixRepl, false);
} else
siiWarningHandler(SiI_WC_ChipNoCap);
break;
case SiI_RX_P_YCbCr422_MUX8B: /* RX_SiI9135 */
case SiI_RX_P_YCbCr422_MUX10B:
if (SiI_Ctrl.bDevId == RX_SiI9135) {
/* Configure2PixPerClockMode(ON); */
SetInputOutputDivider(OFF/*On 48bit(LE) or 2Pix*/,
FALSE, bPixRepl, true);
if ((0 == bPixRepl || 1 == bPixRepl)) {
/* ITU 601 YC MUX */
siiWriteByteHDMIRXP0(0x5F, 0xE0);
/* siiWriteByteHDMIRXP0(0x81, 0x02); */
bRegVal = siiReadByteHDMIRXP0(0x81);
bRegVal = (bRegVal & ~(0xf)) | 0x02;
siiWriteByteHDMIRXP0(0x81, bRegVal);
RXEXTPR("%s: write 0x81\n", __func__);
}
/* modified by zhangyue for debug YC Mux end */
RXEXTPR("%s: bPixRepl=%d\n", __func__, bPixRepl);
} else {
siiWarningHandler(SiI_WC_ChipNoCap);
}
break;
case SiI_RX_P_RGB_48B: /* SiI9021/31 */
case SiI_RX_P_YCbCr444_48B: /* SiI9021/31 */
SetInputOutputDivider(ON/*On 48bit(LE) or 2Pix*/,
qRestoreOrgPixClock, bPixRepl, false);
if (SiI_Ctrl.bDevId == RX_SiI9011)
siiWarningHandler(SiI_WC_ChipNoCap);
break;
default:
SetInputOutputDivider(OFF/*Off 48bit (LE) and 2Pix*/,
qRestoreOrgPixClock, bPixRepl, false);
if (SiI_Ctrl.bDevId == RX_SiI9011)
Configure2PixPerClockMode(OFF);
break;
}
}
/*------------------------------------------------------------------------------
* Function Name: siiMuteVideo
* Function Description: Reads Audio Path, modifys Video Mute bit
*
* Accepts: BYTE Video Mute Control
* Returns: Err or Warning code
* Globals: none
*----------------------------------------------------------------------------
*/
void siiMuteVideo(BYTE On)
{
if (On) {
siiIIC_RX_RWBitsInByteP1(RX_AUDP_MUTE_ADDR,
RX_BIT_VIDEO_MUTE, SET);
SiI_Inf.bGlobStatus |= SiI_RX_Global_VMute;
} else {
siiIIC_RX_RWBitsInByteP1(RX_AUDP_MUTE_ADDR,
RX_BIT_VIDEO_MUTE, CLR);
SiI_Inf.bGlobStatus &= (~SiI_RX_Global_VMute);
}
}