⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_lcdctrl.c

📁 RK27驱动
💻 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 + -