📄 hw_lcdctrl.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : hw_Lcdctrl.c
Desc : LCD控制器驱动
Author : nzy
Date :
Notes :
$Log :
*********************************************************************/
#include "hw_include.h"
#include "hw_Lcdctrl.h"
#include "hwapi_Dwdma.h"
#include "hwapi_Mcupanel.h"
#include "hwapi_Rgbpanel.h"
#include "hwapi_Lcdctrl.h"
//parameters of RGBLCD
#ifdef RGB_PANEL
static RGBIFPARA RGBLCDPara = {RGB_DUMMY, H_PW, V_PW, RGBIFDCLK, H_BP, H_FP, V_BP, V_FP};
#else
static RGBIFPARA RGBLCDPara;
#endif
//tvout parameters of Vedio and system UI
static RGBIFPARA TvoutPVPara[3] =
{{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVVIDEOPL_DCLK, TVVIDEOPL_H_BP, TVVIDEOPL_H_FP, TVVIDEOPL_V_BP, TVVIDEOPL_V_FP},
{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVVIDEOPM_DCLK, TVVIDEOPM_H_BP, TVVIDEOPM_H_FP, TVVIDEOPM_V_BP, TVVIDEOPM_V_FP},
{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVVIDEOPS_DCLK, TVVIDEOPS_H_BP, TVVIDEOPS_H_FP, TVVIDEOPS_V_BP, TVVIDEOPS_V_FP}
};
static RGBIFPARA TvoutNVPara[3] =
{{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVVIDEONL_DCLK, TVVIDEONL_H_BP, TVVIDEONL_H_FP, TVVIDEONL_V_BP, TVVIDEONL_V_FP},
{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVVIDEONM_DCLK, TVVIDEONM_H_BP, TVVIDEONM_H_FP, TVVIDEONM_V_BP, TVVIDEONM_V_FP},
{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVVIDEONS_DCLK, TVVIDEONS_H_BP, TVVIDEONS_H_FP, TVVIDEONS_V_BP, TVVIDEONS_V_FP}
};
static RGBIFPARA TvoutUIPara[2] =
{{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVOUTP_DCLK, TVOUTP_H_BP, TVOUTP_H_FP, TVOUTP_V_BP, TVOUTP_V_FP},
{TVOUT_RGB_DUMMY, TVOUT_H_PW, TVOUT_V_PW, TVOUTN_DCLK, TVOUTN_H_BP, TVOUTN_H_FP, TVOUTN_V_BP, TVOUTN_V_FP}
};
/*---------------------------------------------------------
Name : Lcdctrl_GetStatus
Dec : 设置为MCU接口时,获取当前LCDC的刷屏状态
Params:
Return: BUSY -> 正在刷屏
IDLE -> 空闲时刻
Author: nzy
Date :
-----------------------------------------------------------*/
MCUIFSTATUS Lcdctrl_GetStatus(void)
{
UINT32 temp;
temp = ReadReg32(LCDC_STA);
if ((temp & b_MCU_IDLE) == 0)
return BUSY; //MCU interface busy
else
return IDLE;
}
/*---------------------------------------------------------
Name : Lcdctrl_Display
Dec : 设置LCDC刷屏
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Lcdctrl_Display(DISSTATUS Status)
{
if (Status == ON)
ClrRegBits32(LCDC_CTRL, b_LCDC_STOP);
else
SetRegBits32(LCDC_CTRL, b_LCDC_STOP);
}
/*---------------------------------------------------------
Name : Lcdctrl_McuBypassMode
Dec : LCDC设置为Bypass模式
Params: Mode -> MCU屏的刷屏模式
Return: TURE -> 设置成功
FALSE-> 设置失败
Author: nzy
Date :
-----------------------------------------------------------*/
void Lcdctrl_McuBypassMode(LCDCSTATUS Mode)
{
if (Screen_GetType() != MCULCD)
return;
while (Lcdctrl_GetStatus() != IDLE);
if (Mode == BYPASS)
SetRegBits32(BUFF_CTRL, b_MCU_BYPASS);//ByPass mode
else
ClrRegBits32(BUFF_CTRL, b_MCU_BYPASS);//Buffer mode
}
/*---------------------------------------------------------
Name : LcdCtrl_RGBIFPulseSet
Dec : TV画片大小LCDC设置
Params: Pulse -> 设置DCLK的相位
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_RGBIFPulseSet(RGBIFPULSE Pulse)
{
if (Pulse == NEGATIVE)
SetRegBits32(LCDC_CTRL, b_DCLK_INVERTED);
else
ClrRegBits32(LCDC_CTRL, b_DCLK_INVERTED);
}
/*---------------------------------------------------------
Name : LcdCtrl_SetMcuIFWaitTime
Dec : 设置MCU屏刷屏速率
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_SetMcuIFWaitTime(UINT32 MCUIFWait)
{
if (Screen_GetType() != MCULCD)
return;
WriteReg32(LCD_WAIT, MCUIFWait);
}
/*---------------------------------------------------------
Name : LcdCtrl_MCUIFparaSet
Dec : 设置MCU屏接口参数
Params: XSize -> X方向宽度
YSize -> Y方向高度
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_MCUIFparaSet(UINT16 XSize, UINT16 YSize)
{
if (Screen_GetType() != MCULCD)
return;
WriteReg32(HOR_ACT, XSize + 3);
WriteReg32(VERT_ACT, YSize);
WriteReg32(LCD_WAIT, 0xfff);
}
/*---------------------------------------------------------
Name : LcdCtrl_RGBIFSyncSet
Dec : TV画片大小LCDC设置
Params: XSize -> 物理屏的宽度
YSize -> 物理屏的高度
pLCDCPara -> RGB接口同步信号的参数
TvoutType -> 视频或系统UI
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_RGBIFSyncSet(UINT16 XSize, UINT16 YSize , RGBIFPARA *pLCDCPara, TVOUTTYPE TvoutType)
{
UINT32 Temp;
if (Screen_GetType() == MCULCD)
return;
if (Screen_GetType() == TVOUT)
Temp = (TvoutType == TV_VEDIO) ? 2 : 0;
else
Temp = 2;
Rgbpanel_SetFreq(pLCDCPara->DCLK);
WriteReg32(HOR_PW, pLCDCPara->HPW);
WriteReg32(HOR_BP, pLCDCPara->HBP - (pLCDCPara->LCDCDUMMY + 1)*4);
WriteReg32(HOR_ACT, pLCDCPara->HBP + (XSize + 1)*(pLCDCPara->LCDCDUMMY + 1));
WriteReg32(HOR_PERIOD, pLCDCPara->HBP + pLCDCPara->HFP + (XSize + 1)*(pLCDCPara->LCDCDUMMY + 1) - 1);
WriteReg32(VERT_PW, pLCDCPara->VPW);
WriteReg32(VERT_BP, pLCDCPara->VBP);
WriteReg32(VERT_ACT, pLCDCPara->VBP + YSize + Temp);
WriteReg32(VERT_PERIOD, pLCDCPara->VBP + pLCDCPara->VFP + YSize - 1);
}
/*---------------------------------------------------------
Name : LcdCtrl_SetTvImageSize
Dec : 设置TV画片大小
Params: XSize -> 物理屏的宽度
YSize -> 物理屏的高度
TvoutSize -> TVOUT显示大小
TvoutMode -> TVOUT显示制式
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_SetTvImageSize(UINT16 XSize, UINT16 YSize, TVOUTPARA *pTVoutPara)
{
RGBIFPARA *pLCDCPara;
TVOUTTYPE TvoutType = pTVoutPara->Type;
TVOUTSIZE TvoutSize = pTVoutPara->Size;
TVOUTMODE TvoutMode = pTVoutPara->Mode;
pLCDCPara = (TvoutMode == TV_PAL50) ? &TvoutPVPara[TvoutSize] : &TvoutNVPara[TvoutSize];
LcdCtrl_RGBIFSyncSet(XSize, YSize, pLCDCPara, TvoutType);
Tvout_SizeSet(pTVoutPara);
}
/*---------------------------------------------------------
Name : LcdCtrl_Configure
Dec : LCDC配置
Params: XSize -> 物理屏的宽度
YSize -> 物理屏的高度
TvoutType -> 视频或系统UI
TvoutSize -> TVOUT显示大小
TvoutMode -> TVOUT显示制式
TvoutSwit -> TVOUT切换模式
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_Configure(UINT16 XSize, UINT16 YSize, TVOUTPARA *pTVoutPara)
{
RGBIFPARA *pLCDCPara;
TVOUTTYPE TvoutType = pTVoutPara->Type;
TVOUTSIZE TvoutSize = pTVoutPara->Size;
TVOUTMODE TvoutMode = pTVoutPara->Mode;
if (Screen_GetType() != MCULCD)
{
if (Screen_GetType() == TVOUT)
{
if (TvoutType == TV_VEDIO)
pLCDCPara = (TvoutMode == TV_PAL50) ? &TvoutPVPara[TvoutSize] : &TvoutNVPara[TvoutSize];
else
pLCDCPara = (TvoutMode == TV_PAL50) ? &TvoutUIPara[0] : &TvoutUIPara[1];
}
else
pLCDCPara = &RGBLCDPara;
WriteReg32(BUFF_CTRL, b_ALPHA_BASE(0x3f));
WriteReg32(LCDC_CTRL, b_ALPHA(7) | b_RGB_DUMMY(pLCDCPara->LCDCDUMMY) | b_LCDC_STOP | b_RGB_24B);
LcdCtrl_RGBIFPulseSet(NEGATIVE); //Set DCLK pulse
LcdCtrl_RGBIFSyncSet(XSize, YSize, pLCDCPara, TvoutType); //Set h&v sync signal
if (Screen_GetType() == RGBLCD)
{
IOMUX_SetI2CType(I2C_IOPORT);
Rgbpanel_PowerOnInit();
IOMUX_SetI2CType(I2C_Internal);
}
else
Tvout_Configure(pTVoutPara);
}
else
{
WriteReg32(LCDC_CTRL, b_ALPHA(7) | b_LCDC_STOP | b_MCU_MODE | b_RGB_24B);
WriteReg32(BUFF_CTRL, b_ALPHA_BASE(0x3f) | b_MCU_BYPASS);
LcdCtrl_MCUIFparaSet(XSize, YSize);
Mcupanel_PowerOnInit();
ClrRegBits32(BUFF_CTRL, b_MCU_BYPASS);
}
WriteReg32(LINE0_YADDR, 0x7fe | b_ALPHA_EN);
WriteReg32(LINE1_YADDR, (XSize - 2) | b_ALPHA_EN);
WriteReg32(LINE0_UVADDR, 0x7ff);
WriteReg32(LINE1_UVADDR, (XSize - 1));
if (XSize > 448)
{
WriteReg32(LINE2_YADDR, 0x7fe | b_ALPHA_EN);
WriteReg32(LINE3_YADDR, (XSize - 2) | b_ALPHA_EN);
WriteReg32(LINE2_UVADDR, 0x7ff);
WriteReg32(LINE3_UVADDR, (XSize - 1));
}
else
{
WriteReg32(LINE2_YADDR, (2*XSize - 2) | b_ALPHA_EN);
WriteReg32(LINE3_YADDR, (3*XSize - 2) | b_ALPHA_EN);
WriteReg32(LINE2_UVADDR, (2*XSize - 1));
WriteReg32(LINE3_UVADDR, (3*XSize - 1));
}
WriteReg32(DELTA_X, 0x200);
WriteReg32(DELTA_Y, 0x200);
WriteReg32(ALPHA_ALX, XSize - 16);
WriteReg32(ALPHA_ATY, 0x0);
WriteReg32(ALPHA_ARX, XSize - 1);
WriteReg32(ALPHA_ABY, YSize);
WriteReg32(INTR_MASK, b_INTR_PERLINE | b_VERT_INTR);
Lcdctrl_Display(ON);
if (Screen_GetType() != MCULCD)
SetRegBits32(LCDC_CTRL, b_LCDC_EN);
else
SetRegBits32(BUFF_CTRL, b_RS_HIGH | b_BUFF_WRITE | b_BUFF_START);
}
/*---------------------------------------------------------
Name : LcdCtrl_PowerOnInit
Dec : LCDC上电初始化
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_PowerOnInit(void)
{
WriteReg32(BUFF_CTRL, 0x00);
WriteReg32(LCDC_BUFFER - 8, 0x0);
WriteReg32(LCDC_BUFFER - 7, 0x0);
WriteReg32(LCDC_BUFFER - 6, 0x0);
WriteReg32(LCDC_BUFFER - 5, 0x0);
WriteReg32(LCDC_BUFFER - 4, 0x0);
WriteReg32(LCDC_BUFFER - 3, 0x0);
WriteReg32(LCDC_BUFFER - 2, 0x0);
WriteReg32(LCDC_BUFFER - 1, 0x0);
WriteReg32(START_X, 0x0);
WriteReg32(START_Y, 0x0);
WriteReg32(ALPHA_BLX, 0x3ff);
WriteReg32(ALPHA_BTY, 0x3ff);
WriteReg32(ALPHA_BRX, 0x3ff);
WriteReg32(ALPHA_BBY, 0x3ff);
}
/*---------------------------------------------------------
Name : LcdCtrl_BackGroundSet
Dec : 设置背景的相关LCDC
Params: Config -> 背景的相关LCDC配置参数
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_BackGroundSet(LCDCCONFIG *Config)
{
WriteReg32(LINE0_YADDR, Config->LineYAddr[0] | b_ALPHA_EN);
WriteReg32(LINE1_YADDR, Config->LineYAddr[1] | b_ALPHA_EN);
WriteReg32(LINE2_YADDR, Config->LineYAddr[2] | b_ALPHA_EN);
WriteReg32(LINE3_YADDR, Config->LineYAddr[3] | b_ALPHA_EN);
WriteReg32(LINE0_UVADDR, Config->LineUVAddr[0]);
WriteReg32(LINE1_UVADDR, Config->LineUVAddr[1]);
WriteReg32(LINE2_UVADDR, Config->LineUVAddr[2]);
WriteReg32(LINE3_UVADDR, Config->LineUVAddr[3]);
WriteReg32(START_X, Config->StartX);
WriteReg32(START_Y, Config->StartY);
WriteReg32(DELTA_X, Config->ScaleX);
WriteReg32(DELTA_Y, Config->ScaleY);
WriteReg32(INTR_MASK, Config->IntrMask);
if (Config->YMIX == 1)
WriteReg32(LCDC_CTRL, ReadReg32(LCDC_CTRL) | b_Y_MIX);
else
WriteReg32(LCDC_CTRL, ReadReg32(LCDC_CTRL) &~b_Y_MIX);
if(Config->Rgb565 ==1)
WriteReg32(LCDC_CTRL, ReadReg32(LCDC_CTRL) & ~b_RGB_24B);
else
WriteReg32(LCDC_CTRL, ReadReg32(LCDC_CTRL) | b_RGB_24B);
}
/*---------------------------------------------------------
Name : LcdCtrl_FrontGroundSet
Dec : 设置前景的相关LCDC
Params: AlphaConfig -> 前景的相关LCDC配置参数
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_FrontGroundSet(ALPHACONFIG *AlphaConfig)
{
if (AlphaConfig->AlphaLevel < 0x100)
{
WriteReg32(ALPHA_ALX, AlphaConfig->ALX);
WriteReg32(ALPHA_ATY, AlphaConfig->ATY);
WriteReg32(ALPHA_ARX, AlphaConfig->ARX);
WriteReg32(ALPHA_ABY, AlphaConfig->ABY);
WriteReg32(ALPHA_BLX, AlphaConfig->BLX);
WriteReg32(ALPHA_BTY, AlphaConfig->BTY);
WriteReg32(ALPHA_BRX, AlphaConfig->BRX);
WriteReg32(ALPHA_BBY, AlphaConfig->BBY);
WriteReg32(BUFF_CTRL, (ReadReg32(BUFF_CTRL)&0xff) | ((AlphaConfig->FifoAddr << 4)&0x3f00)); //front data buffer address in LCDC
WriteReg32(LCDC_CTRL, (ReadReg32(LCDC_CTRL)&0xf1ff) | ((AlphaConfig->AlphaLevel &0xe0) << 4));
WriteReg32(BUFF_CTRL, (ReadReg32(BUFF_CTRL) | b_LCDC_FIFOEN));
}
else
{
WriteReg32(BUFF_CTRL, (ReadReg32(BUFF_CTRL)&(~b_LCDC_FIFOEN))); //front data buffer address in LCDC
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -