📄 hw_tvout.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : hw_Tvout.c
Desc : Tvout寄存器初始化
Author : nzy
Date :
Notes :
$Log :
*********************************************************************/
#include "hw_include.h"
UINT8 RegAddrAdj[6] = {0x22, 0x23, 0x20, 0x21, 0x1f, 0x1e};
/************************************/
UINT8 RegAddrFirst[12] = {0x04, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
0x0f, 0x34, 0x35, 0x36, 0x37, 0x63
};
UINT8 DataFirst[3][12] = {{0x08, 0x13, CH7024_XTALSEL, 0x00, 0x02, 0x0c,
0x00, 0x01, 0x5e, 0x05, 0x3b, CH7024_TERMINATION}, //PAL50
{0x08, 0x17, CH7024_XTALSEL, 0x00, 0x02, 0x0c,
0x00, 0x01, 0x5e, 0x05, 0x3b, CH7024_TERMINATION},//PAL60
{0x08, 0x10, CH7024_XTALSEL, 0x00, 0x02, 0x0c,
0x00, 0x01, 0x19, 0xf5, 0x8d, CH7024_TERMINATION}
};//NTSCM
/************************************/
/************************************/
UINT8 RegAddr[22] = {0x11, 0x12, 0x13, 0x17, 0x18, 0x19, 0x1c, 0x28,
0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x30, 0x31,
0x1e, 0x1f, 0x23, 0x22, 0x21, 0x20
};
/*---Video 640x480---*/
/**************************PAL50*****/
UINT8 DataPV[3][22] = {{0x12, 0x80, 0xfd, 0x09, 0x90, 0x0b, 0x90, 0x1b,
0x99, 0x00, 0x41, 0xeb, 0x00, 0x2f, 0x1b, 0x12,
0x05, 0x76, 0x7d, 0x00, 0x80, 0x00},//Large
{0x12, 0x80, 0xc4, 0x09, 0xe0, 0x35, 0x90, 0x1b,
0x03, 0x00, 0x41, 0xeb, 0x00, 0x2f, 0x1b, 0x12,
0x04, 0xf8, 0x7b, 0x02, 0x80, 0x00},//Middle
{0x12, 0x80, 0x92, 0x09, 0xe0, 0x60, 0x90, 0x1b,
0x5b, 0x00, 0x41, 0xeb, 0x00, 0x2f, 0x1b, 0x12,
0x04, 0xa3, 0x7c, 0x03, 0x7d, 0x02}
};//Small
/************************************/
/*********************PAL60+NTSCM*****/
UINT8 DataNV[3][22] = {{0x12, 0x80, 0xf5, 0x09, 0xe0, 0x11, 0x90, 0x31,
0x4a, 0x80, 0x36, 0xfc, 0x90, 0x38, 0x1b, 0x12,
0x05, 0x50, 0x7e, 0x01, 0x80, 0x00},//Large
{0x12, 0x80, 0xc6, 0x09, 0xe0, 0x34, 0x90, 0x31,
0x30, 0x80, 0x36, 0xfc, 0x90, 0x38, 0x1b, 0x12,
0x04, 0xf2, 0x7e, 0x01, 0x7f, 0x00},//Middle
{0x12, 0x80, 0x97, 0x09, 0xe0, 0x5c, 0x90, 0x31,
0x48, 0x80, 0x36, 0xfc, 0x90, 0x38, 0x1b, 0x12,
0x04, 0xaa, 0x7e, 0x02, 0x7d, 0x01}
};//Small
/************************************/
/*---UI---*/
#if(TVOUTID == TVOUT_480X272)
/*480X272---Middle*/
UINT8 DataUI[2][22] = {{0x11, 0xe0, 0x2a, 0x05, 0x10, 0x45, 0x90, 0x05,
0xe2, 0x40, 0x10, 0x7a, 0xc0, 0x55, 0x09, 0x14,
0x05, 0x0b, 0x7c, 0x02, 0x80, 0x03},//PALL50
{0x11, 0xe0, 0x6a, 0x05, 0x10, 0x44, 0x90, 0x18,
0xb0, 0x40, 0x1b, 0x7e, 0x48, 0x38, 0x12, 0x13,
0x05, 0x0b, 0x7f, 0x01, 0x80, 0x00}
};//NTSCM+PAL60
#endif
/************************************/
#if(TVOUTID == TVOUT_400X240)
/*400X240---Middle*/
UINT8 DataUI[2][22] = {{0x11, 0x90, 0x24, 0x04, 0xf0, 0x24, 0x90, 0x0e,
0x29, 0xc0, 0x10, 0x7a, 0xc0, 0x4b, 0x09, 0x14,
0x05, 0x0b, 0x7d, 0x01, 0x81, 0x01},//PALL50
{0x11, 0x90, 0x0f, 0x04, 0xf0, 0x1d, 0x90, 0x04,
0xef, 0x0c, 0x0d, 0xbf, 0x24, 0x55, 0x09, 0x14,
0x05, 0x0b, 0x80, 0x00, 0x7f, 0x00}
};//NTSCM+PAL60
#endif
/************************************/
#if(TVOUTID == TVOUT_320X240)
/*320X240---Middle*/
UINT8 DataUI[2][22] = {{0x09, 0x40, 0xe8, 0x04, 0xf0, 0x1f, 0x90, 0x06,
0x8a, 0x80, 0x10, 0x7a, 0xc0, 0x42, 0x09, 0x14,
0x05, 0x0e, 0x7c, 0x12, 0x80, 0x00},//PALL50
{0x09, 0x40, 0xd6, 0x04, 0xf0, 0x1c, 0x90, 0x0b,
0xd0, 0x74, 0x0d, 0xbf, 0x24, 0x4b, 0x09, 0x14,
0x05, 0x12, 0x80, 0x01, 0x80, 0x00}
};//NTSCM+PAL60
#endif
/************************************/
/*---------------------------------------------------------
Name : Tvout_Read
Desc :
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_Read(UINT8 RegAddr, UINT8 *pData)
{
I2C_Init(TVOUT_IICAdr, TVOUT_IICSpd);
I2C_Read(RegAddr, pData, 1, NormalMode);
I2C_Deinit();
}
/*---------------------------------------------------------
Name : Tvout_Write
Desc :
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_Write(UINT8 RegAddr, UINT8 *pData)
{
I2C_Init(TVOUT_IICAdr, TVOUT_IICSpd);
I2C_Write(RegAddr, pData, 1, NormalMode);
I2C_Deinit();
}
/*---------------------------------------------------------
Name : Tvout_Configure
Desc : TVOUT驱动芯片CH7024配置
Params: TvoutType -> 视频或系统UI
TvoutSize -> TVOUT显示大小
TvoutMode -> TVOUT显示制式
TvoutSwit -> TVOUT切换模式
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_Configure(TVOUTPARA *pTVoutPara)
{
UINT8 i;
UINT8 *pData, *pUIData, *pVideoData;
TVOUTTYPE TvoutType = pTVoutPara->Type;
TVOUTSIZE TvoutSize = pTVoutPara->Size;
TVOUTMODE TvoutMode = pTVoutPara->Mode;
TVOUTSWIT TvoutSwit = pTVoutPara->Switch;
pVideoData = (TvoutMode == TV_PAL50) ? (&DataPV[TvoutSize][0]) : (&DataNV[TvoutSize][0]);
pUIData = (TvoutMode == TV_PAL50) ? (&DataUI[0][0]) : (&DataUI[1][0]);
pData = (TvoutType == TV_VEDIO) ? pVideoData : pUIData;
DataFirst[TvoutMode][1] = (TvoutSwit == LCD_TVOUT) ? (DataFirst[TvoutMode][1] & 0x0f) : (DataFirst[TvoutMode][1] | 0x10);
for (i = 0; i < 12; i++)
{
Tvout_Write(RegAddrFirst[i], &DataFirst[TvoutMode][i]);
}
for (i = 0; i < 22; i++, pData++)
{
Tvout_Write(RegAddr[i], pData);
}
}
/*---------------------------------------------------------
Name : Tvout_SizeSet
Desc : TVOUT驱动芯片CH7024输出画面大小设置
Params: TvoutSize -> TVOUT显示大小
TvoutMode -> TVOUT显示制式
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_SizeSet(TVOUTPARA *pTVoutPara)
{
UINT8 i;
UINT8 *pVideoData;
TVOUTSIZE TvoutSize = pTVoutPara->Size;
TVOUTMODE TvoutMode = pTVoutPara->Mode;
pVideoData = (TvoutMode == TV_PAL50) ? (&DataPV[TvoutSize][0]) : (&DataNV[TvoutSize][0]);
for (i = 0; i < 22; i++, pVideoData++)
{
Tvout_Write(RegAddr[i], pVideoData);
}
}
/*---------------------------------------------------------
Name : Tvout_PostAdjust
Desc : TV图像移动
Params: Shife -> 位置移动方向
Par -> 位置移动值
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_PostAdjust(TVOUTSHIFE Shife, UINT16 Par)
{
COORDINATIE HighID, LowID;
UINT8 HighTemp = 0, LowTemp = 0;
UINT16 Temp;
if ((Shife == TV_Right) || (Shife == TV_Left))
{
HighID = TV_HorPHID;
LowID = TV_HorPLID;
}
else
{
HighID = TV_VerPHID;
LowID = TV_VerPLID;
}
Tvout_Read(RegAddrAdj[HighID], &HighTemp);
Tvout_Read(RegAddrAdj[LowID], &LowTemp);
Temp = (((UINT16)HighTemp << 2) & 0xfffc) + ((UINT16)LowTemp & 0x0003);
if ((Shife == TV_Right) || (Shife == TV_Up))
Temp = (0x3ff - Temp < Par) ? 0x3ff : (Temp + Par);
else
Temp = (Temp < Par) ? 0x00 : (Temp - Par);
HighTemp = (UINT8)(Temp >> 2);
LowTemp = (UINT8)(Temp & 0x0003);
Tvout_Write(RegAddrAdj[HighID], &HighTemp);
Tvout_Write(RegAddrAdj[LowID], &LowTemp);
}
/*---------------------------------------------------------
Name : Tvout_ScalAdjust
Desc : TV水平位置的缩放
Params: Zoom -> 缩小活放大
Par -> 缩放值
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_ScalAdjust(TVOUTZOOM Zoom, UINT8 Par)
{
UINT8 HighTemp, LowTemp;
UINT16 Temp;
Tvout_Read(RegAddrAdj[TV_HORSHID], &HighTemp);
Tvout_Read(RegAddrAdj[TV_HORSLID], &LowTemp);
Temp = (UINT16)LowTemp + (((UINT16)HighTemp & 0x0007) << 8);
if (Zoom == TV_HorZoomIn)
Temp = (0x7ff - Temp < Par) ? 0x7ff : (Temp + Par);
else
Temp = (Temp < Par) ? 0x00 : (Temp - Par);
HighTemp = (UINT8)((Temp >> 8) & 0x07);
LowTemp = (UINT8)(Temp & 0x00ff);
Tvout_Write(RegAddrAdj[TV_HORSHID], &HighTemp);
Tvout_Write(RegAddrAdj[TV_HORSLID], &LowTemp);
}
/*---------------------------------------------------------
Name : Tvout_SetStatus
Desc : 设置TV驱动芯片输出状态
Params: TvoutStatus -> 使能CH7024电源输出
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_SetStatus(TVOUTSTATUS TvoutStatus)
{
UINT8 Data;
Data = (TvoutStatus == TV_Standby) ? 0x0d : 0x08;
I2C_Init(TVOUT_IICAdr, TVOUT_IICSpd);
I2C_Write(0x04, &Data, 1, NormalMode);
I2C_Deinit();
}
/*---------------------------------------------------------
Name : Tvout_Display
Desc : 设置TV输出
Params: TvoutMode -> TVOUT显示制式
DisStatus -> TVOUT转换DAC0输出使能
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_Display(TVOUTDISP DisStatus, TVOUTMODE TvoutMode)
{
UINT8 Data;
Data = (DisStatus == TV_ON) ? 0x10 : 0x00;
switch (TvoutMode)
{
case TV_PAL50:
Data |= 0x03;
break;
case TV_PAL60:
Data |= 0x07;
break;
case TV_NTSCM:
Data |= 0x00;
break;
default:
break;
}
I2C_Init(TVOUT_IICAdr, TVOUT_IICSpd);
I2C_Write(0x0a, &Data, 1, NormalMode);
I2C_Deinit();
}
/*---------------------------------------------------------
Name : Tvout_SetTest
Desc : 设置TV驱动芯片测试状态
Params: TvoutStatus -> 打开或关闭CH7024测试模式
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Tvout_SetTest(TVOUTSTATUS TvoutStatus)
{
UINT8 Data1 = 0x01, Data2, Data3 = 0x00;
Data2 = (TvoutStatus == TV_Test) ? 0x40 : 0x00;
I2C_Init(TVOUT_IICAdr, TVOUT_IICSpd);
I2C_Write(0x02, &Data1, 1, NormalMode);
I2C_Write(0x04, &Data2, 1, NormalMode);
I2C_Write(0x02, &Data3, 1, NormalMode);
I2C_Deinit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -