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

📄 hw_lcdctrl.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -