📄 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"
//tvout parameters of Vedio and system UI
static TVOUTPARA TvoutPara[2] = {
{TVVEDIO_DCLK, TVVEDIO_HBP, TVVEDIO_HFP, TVVEDIO_VBP, TVVEDIO_VFP},
{TVOUT_RGBIFDCLK, TVOUT_H_BP, TVOUT_H_FP, TVOUT_V_BP, TVOUT_V_FP}
};
/*---------------------------------------------------------
Name : Lcdctrl_GetStatus
Dec : 设置为MCU接口时,获取当前LCDC的刷屏状态
Params:
Return: BUSY -> 正在刷屏
IDLE -> 空闲时刻
Author: nzy
Date :
-----------------------------------------------------------*/
BOOLEAN Lcdctrl_GetStatus(void)
{
#ifdef MCU_PANEL
UINT32 temp;
if(Screen_GetType() == LCD)
{
temp = ReadReg32(LCDC_STA);
if((temp & b_MCU_IDLE) == 0)
return BUSY; //MCU interface busy
return IDLE;
}
else
#endif
return IDLE;
}
/*---------------------------------------------------------
Name : Lcdctrl_DisplayOff
Dec : 停止LCDC刷屏
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Lcdctrl_DisplayOff(void)
{
SetRegBits32(LCDC_CTRL, b_LCDC_STOP);
}
/*---------------------------------------------------------
Name : Lcdctrl_DisplayOn
Dec : 恢复LCDC刷屏
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void Lcdctrl_DisplayOn(void)
{
ClrRegBits32(LCDC_CTRL, b_LCDC_STOP);
}
/*---------------------------------------------------------
Name : Lcdctrl_McuBypassMode
Dec : LCDC设置为Bypass模式
Params: Mode -> MCU屏的刷屏模式
Return: TURE -> 设置成功
FALSE-> 设置失败
Author: nzy
Date :
-----------------------------------------------------------*/
BOOLEAN Lcdctrl_McuBypassMode(BOOLEAN Mode)
{
#ifdef MCU_PANEL
if(Screen_GetType() == LCD)
{
while(Lcdctrl_GetStatus() != IDLE);
if(Mode == BYPASS)
SetRegBits32(BUFF_CTRL, b_MCU_BYPASS);//ByPass mode
else
ClrRegBits32(BUFF_CTRL, b_MCU_BYPASS);//Buffer mode
}
else
#endif
return OK;
}
/*---------------------------------------------------------
Name : Lcdctrl_DisplayOn
Dec : 恢复LCDC刷屏
Params:
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_McuIFWaitTimeSet(UINT16 FreqMHZ)
{
#ifdef MCU_PANEL
UINT32 MixASTime;
UINT32 MixAHTime=2;
UINT32 wetime;
if(Screen_GetType() == TVOUT)
return;
MixASTime = (FreqMHZ>100)?3:2;
wetime = 11;
WriteReg32(LCD_WAIT, (MixASTime<<7)+(wetime<<3)+(MixAHTime<<0));
#endif
}
/*---------------------------------------------------------
Name : LcdCtrl_Init
Dec : LCDC上电初始化
Params: XSize -> 物理屏的宽度
YSize -> 物理屏的高度
TvoutType -> TVOUT显示分辨率类型
Return:
Author: nzy
Date :
-----------------------------------------------------------*/
void LcdCtrl_Init(UINT16 XSize, UINT16 YSize, TVOUTTYPE TvoutType)
{
#ifndef SETUP //080417,SETUP编译开关表示升级工程,在升级工程下不存在TVOUT 功能.
if(Screen_GetType() == TVOUT)
{
Rgbpanel_SetFreq(TvoutPara[TvoutType].DCLK);
WriteReg32(BUFF_CTRL, b_ALPHA_BASE(0x3f));
WriteReg32(LCDC_CTRL, b_ALPHA(7) |b_DCLK_INVERTED |b_RGB_DUMMY(TVOUT_RGB_DUMMY) |b_LCDC_STOP |b_RGB_24B);
delay_nops(300000);
WriteReg32(HOR_PW, TVOUT_H_PW);
WriteReg32(HOR_BP, TvoutPara[TvoutType].HBP-(TVOUT_RGB_DUMMY+1)*4);
WriteReg32(HOR_ACT, TvoutPara[TvoutType].HBP+(XSize+1)*(TVOUT_RGB_DUMMY+1));
WriteReg32(HOR_PERIOD, TvoutPara[TvoutType].HBP+TvoutPara[TvoutType].HFP+(XSize+1)*(TVOUT_RGB_DUMMY+1)-1);
WriteReg32(VERT_PW, TVOUT_V_PW);
WriteReg32(VERT_BP, TvoutPara[TvoutType].VBP);
WriteReg32(VERT_ACT, TvoutPara[TvoutType].VBP+YSize+2);
WriteReg32(VERT_PERIOD, TvoutPara[TvoutType].VBP+TvoutPara[TvoutType].VFP+YSize-1);
Tvout_Init(TvoutType);
}
else
#endif
{
#ifdef MCU_PANEL
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);
WriteReg32(HOR_ACT, XSize+3);
WriteReg32(VERT_ACT, YSize);
WriteReg32(LCD_WAIT, 0xfff);
Mcupanel_PowerOnInit();
ClrRegBits32(BUFF_CTRL, b_MCU_BYPASS);
#else
Rgbpanel_SetFreq(RGBIFDCLK);
WriteReg32(BUFF_CTRL, b_ALPHA_BASE(0x3f));
WriteReg32(LCDC_CTRL, b_ALPHA(7) |b_DCLK_INVERTED |b_RGB_DUMMY(RGB_DUMMY) |b_LCDC_STOP |b_RGB_24B);
delay_nops(300000);
WriteReg32(HOR_PW, H_PW);
WriteReg32(HOR_BP, H_BP-(RGB_DUMMY+1)*4);
WriteReg32(HOR_ACT, H_BP+(XSize+1)*(RGB_DUMMY+1));
WriteReg32(HOR_PERIOD, H_BP+H_FP+(XSize+1)*(RGB_DUMMY+1)-1);
WriteReg32(VERT_PW, V_PW);
WriteReg32(VERT_BP, V_BP);
WriteReg32(VERT_ACT, V_BP+(YSize+2));
WriteReg32(VERT_PERIOD, V_BP+V_FP+YSize-1);
IOMUX_SetI2CType(I2C_IOPORT);
Rgbpanel_PowerOnInit();
IOMUX_SetI2CType(I2C_Internal);
#endif
}
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);
#ifdef MCU_PANEL
if(Screen_GetType() == LCD)
SetRegBits32(BUFF_CTRL, b_RS_HIGH |b_BUFF_WRITE |b_BUFF_START);
else
#endif
{
ClrRegBits32(LCDC_CTRL, b_LCDC_STOP);
SetRegBits32(LCDC_CTRL, b_LCDC_EN);
}
}
/*---------------------------------------------------------
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);
//Alpha_Offset = (0x800-Width)/16-0x40;
//#define LCDCFIFO(Alpha_Offset) LCDCtrlBase+(Alpha_Offset+0x40)*64
//(Alpha_Offset<<8)|......
}
/*---------------------------------------------------------
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);
if(Config->YMIX ==1)
{
WriteReg32(LCDC_CTRL, ReadReg32(LCDC_CTRL) |b_Y_MIX);
}
else
{
WriteReg32(LCDC_CTRL, ReadReg32(LCDC_CTRL) &~b_Y_MIX);
}
}
/*---------------------------------------------------------
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); //align 4
WriteReg32(ALPHA_ATY, AlphaConfig->ATY); //align 4
WriteReg32(ALPHA_ARX, AlphaConfig->ARX); //align 4
WriteReg32(ALPHA_ABY, AlphaConfig->ABY); //align 4
WriteReg32(ALPHA_BLX, AlphaConfig->BLX); //align 4
WriteReg32(ALPHA_BTY, AlphaConfig->BTY); //align 4
WriteReg32(ALPHA_BRX, AlphaConfig->BRX); //align 4
WriteReg32(ALPHA_BBY, AlphaConfig->BBY); //align 4
WriteReg32(BUFF_CTRL, (ReadReg32(BUFF_CTRL)&0xff) |b_LCDC_FIFOEN |((AlphaConfig->FifoAddr<<4)&0x3f00)); //front data buffer address in LCDC
WriteReg32(LCDC_CTRL, (ReadReg32(LCDC_CTRL)&0xf1ff) |((AlphaConfig->AlphaLevel &0xe0)<<4));
}
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 + -