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

📄 dispthread.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/* Copyright (C) 2006 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*
File    : base\system\tasks\dispTask.c
Desc    : 定义 lcd 显示相关 TASK.

Author  : huangsl
Date             : 2007-08-01
Notes   :


$Log: DispThread.c,v $
Revision 1.5  2008/07/01 12:02:02  HSL
修改 刷屏标志 gScreenUpdating 错误置位的BUG.

Revision 1.4  2008/06/19 04:43:27  Administrator
代码整理!

Revision 1.3  2008/06/06 09:42:10  HJK
增加TVOUT功能

Revision 1.2  2008/05/26 03:33:51  HSL
修改 DISPtask,兼容 RGB屏和MCU屏.

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.2  2008/03/07 11:58:49  Hanjiang
加入tvout

Revision 1.16  2007/12/11 13:00:08  Huangshilin
no message

Revision 1.15  2007/12/06 05:16:21  Huangshilin
增加 视频静态buffer和GUI 复用.修改窗口系统.

Revision 1.14  2007/11/27 14:01:35  Huangshilin
修改 音频刷屏噪音,系统反应慢的 BUG.

Revision 1.13  2007/11/23 07:32:09  Huangshilin
no message

Revision 1.12  2007/11/10 04:17:14  Huangxinyu
更新zcs的lcd

Revision 1.11  2007/11/09 02:21:33  Huangshilin
修改 长按键 BUG,增加 应用的扩展功能(无输入应用等).

Revision 1.10  2007/10/25 11:13:31  Huangshilin
修改 支持 TOUCH_MOVE 消息以及GUI BUG.

Revision 1.9  2007/10/24 07:26:11  Hanjiang
no message

Revision 1.8  2007/10/23 03:31:32  Huangshilin
按键 BUG 修改

Revision 1.7  2007/10/22 08:05:26  Huangshilin
no message

Revision 1.6  2007/10/20 04:46:31  Huangshilin
for RK2700

Revision 1.5  2007/10/13 02:34:18  Huangshilin
System

Revision 1.4  2007/10/12 03:56:57  Huangshilin
ADD LCD_TRACE

Revision 1.3  2007/10/11 04:08:11  Huangshilin
System\os

Revision 1.2  2007/10/08 02:55:50  Lingzhaojun
添加版本自动注释脚本

* huangsl          2006/04/10   根据统一格式 建立文件,专门用于实现资源的 显示。
*
* huangsl          2006/04/12   增加函数测试 DRAM2SDRAM,SDRAM2DRAM , SDRAM2LCD 的 DMA 测试。
*
* dengxj           2006/09/20   修改为x,y方向都支持局部送屏,并进行MP3的移植修改
*
* huangsl          2007/08/01   移植到 RK27, 并根据仿真需求修改。
*
*/

/**************************************************************************************/
#include "include.h"

#if defined( BOARD )
#include "hw_include.h"
#endif
/***************************************************************************/
#if defined( BOARD )
extern BACKGRND     gScreen[ ];             // LCD刷屏接口用
extern DWDMALLP     gLLPList[ ][480];       // LCD刷屏接口用
#endif

/***************************************************************************/
#define DISP_INCLUDED                   1
/**************************************************************************/

/*
    1. 渐变,2 灰度化
    3 拖动
*/
/**************************************************************************/
#if defined( _DEBUG_ ) && defined( TR_LCD )
extern LCD_RGBDATA *gTrLcdBuffer;
#endif


void LCDC_UpDate(void)   //LCDC_UpDate
{
#if defined( BOARD )
    Screen_MCUUpDate();
#endif
}
/**************************************************************************/
/*---------------------------------------------------------------------*/
/**********************************************************************************/
void LcdPositionReset(void)
{
    gScreenUpdateY0 = gLcdH;
    gScreenUpdateY1 = 0;
    gScreenUpdateX0 = gLcdW;
    gScreenUpdateX1 = 0;

    //在外部设置.
//    DISPUPDATE_ENABLE();//一次送屏未完成,防止第二次启动刷屏

}


#if defined( _MSC_VER )

void DoLcdFlush(LCD_RGBDATA *pLcdBuffer)
{
    gScreenUpdating = 1;
    Lcdctrl_UpDate(pLcdBuffer);
    gGuiDspCurrentLcdTransScreen = pLcdBuffer;
    LcdPositionReset();
}

#else

/**********************************************************************************/

/***********************************************************************************/
BOOLEAN Lcdctrl_UpDate(void* pLcdLogicBuffer)
{
    if (gGuiDspCurrentLcdTransScreen != pLcdLogicBuffer)
    {
        if (pLcdLogicBuffer == gGuiDspLcdTransScreen0)
        {
            Screen_Change(&gScreen[0]);
        }
        else if (pLcdLogicBuffer == gGuiDspLcdTransScreen1)
        {
            Screen_Change(&gScreen[1]);
        }
        gGuiDspCurrentLcdTransScreen = pLcdLogicBuffer;
    }
    LCDC_UpDate();
}

void DoLcdFlush(LCD_RGBDATA *pLcdBuffer)
{
#if 0
    UHRECT      rect;
    rect.x = gScreenUpdateX0;
    rect.y = gScreenUpdateY0;
    rect.w = gScreenUpdateX1 - gScreenUpdateX0;
    rect.h = gScreenUpdateY1 - gScreenUpdateY0;
    gScreenUpdating = 1;
#endif

#ifdef BOARD
    Lcdctrl_UpDate(pLcdBuffer);
    LcdPositionReset();
#else   //仿真情况.
    RockOSSendMsg(MBDISP , MS_DIDI_LCDUpdateInd , NULL);
#endif
}

/******************************************************************************/
#endif /* #if LCDUPDATE_TASK */

/******************************************************************************/
#include "MoveWin.c"   // 特效处理函数接口.
/**********************************************************************************************/
//逻辑屏和物理屏的地址切换
void SwitchLcdBuffer(void)
{
    if (Screen_GetType() != MCULCD)
    {
        LCD_RGBDATA * p = gGuiDspLcdLogic;
        gGuiDspLcdLogic = gDspRGBLcdLogicBake ;
        gDspRGBLcdLogicBake = p;
    }

}
/*----------------------------------------------------------------------------*/
/*
Name    :   RockDispUpdating
Desc    :   定时进行屏幕刷新
Param   :
Return  :
Global  :
Note    :   刷屏时需要设置参数,如果屏幕没有修改,则不用更新。
            刷屏时间目前暂时定为 100 ms 每次。
Author  :   HUANGSL
Log     :

* huangsl          2006/04/25   create。
*


*/
/*----------------------------------------------------------------------------*/

/*
*********************************************************************************************************
*                                      dispTask
*
* Description : 系统刷屏 TASK,用于显示 LCD 的各个元素--包括位图和文本。
*
* Arguments   :  none
*
* Returns     : none
*
* Note(s)    : 必须防止 OVERRUM,即上一次中断服务还没有完成,下一次中断已经来了。
*********************************************************************************************************
*/

BOOLEAN DispTaskMsgHandle(ROCK_MSG_ID id, void *msg)
{

    switch (id)
    {
        case MS_ISRDI_TickInd: /*   开始刷屏 的消息 */
            {
                LCD_RGBDATA * p;
                if (gDispUpdateFlag & DISPF_LOGICUPDATEDISABLE)
                    break;

                if (!(gDispUpdateFlag&DISPF_WINDOWDIRTY))
                    break;

                if (gScreenUpdating != 0)   // 防止 消息队列里面堆积的消息造成的影响.
                    break;

                //防止此时继续发送 ISRDI_TickInd消息
                //只能防止定时器,不能防止 GUI 发送的刷屏.所以需要 gScreenUpdating 保护.
                DISPUPDATE_DISABLE();

                if (Screen_GetType() == MCULCD)
                {
                    //如果 此时还在刷屏,立即操作逻辑屏会出现 花屏现象.
#ifdef BOARD
                    while (Lcdctrl_GetStatus() == 1);
#endif
                }
                else   //RGB_PANEL
                {
#if 0
                    if (gGuiDspCurrentLcdTransScreen != gDspRGBLcdLogicBake)
                    {
                        p = gGuiDspLcdLogic;
                        gGuiDspLcdLogic = gDspRGBLcdLogicBake ;
                        gDspRGBLcdLogicBake = p;
                        gGuiDspCurrentLcdTransScreen = gDspRGBLcdLogicBake;
                    }
#endif
                }
                p = gGuiDspLcdLogic;
                if ((gDspTskSpecalCnf&DTSC_HMASK) != 0 /* && (gDspTskSpecalCnf&DTSC_HMASK) != DTSC_FRAMETRANS*/)
                {
                    // 080125,huangsl,直接使用 gDspTskLcdLogicBake 指针,免除 两次 memcpy.
                    //此处 gGuiDspLcdLogic 还没有赋值,特效的情况下需要保证送屏的两个逻辑屏数据
                    //同步,否则会闪屏.
#ifdef RGB_PANEL
                    memcpy(gGuiDspLcdLogic , gDspRGBLcdLogicBake , gLcdLogicBytes);
#endif

                    gGuiDspLcdLogic = gDspTskLcdLogicBake;
                }

                if (Screen_GetType() != MCULCD)//RGB屏
                {
                    // 在窗口更新之前,底图更新为当前正在刷屏的数据,否则刷屏的时候会有错误.
                    // 原因:刷屏的过程中肯能需要和原来的坐标点进行运算.
                    memcpy(gGuiDspLcdLogic , gDspRGBLcdLogicBake , gLcdLogicBytes);
                }
                RockSemObtain(&gGuiDispSem);
                WindowUpdate();
                RockSemRelease(&gGuiDispSem);

                gGuiDspLcdLogic = p;

                if (gScreenUpdateY1 > gLcdH)
                    gScreenUpdateY1 = gLcdH;
                if (gScreenUpdateX1 > gLcdW)
                    gScreenUpdateX1 = gLcdW;

                //没有更新内容
                if (gScreenUpdateY1 <=  gScreenUpdateY0 ||  gScreenUpdateX1 <=  gScreenUpdateX0)
                {
                    LcdPositionReset();
                    DISPUPDATE_ENABLE();
                    break;
                }

                if (Screen_GetType() == MCULCD)//MCU屏
                {
                    if (gDspTskSpecalCnf == 0)
                    {
                        DoLcdFlush(gGuiDspLcdLogic);
                        DISPUPDATE_ENABLE();
                    }
                    else
                    {
                        IDspTskUpdateStart();
                    }
                }
                else//RGB屏
                {
                    if (gDspTskSpecalCnf == 0)
                    {
                        SwitchLcdBuffer();  //切换双屏
                        DoLcdFlush(gDspRGBLcdLogicBake/*gGuiDspLcdLogic*/);
                        DISPUPDATE_ENABLE();
                    }
                    else
                    {
                        //080523,huangsl,因为特效 里面的 目标屏是 gGuiDspLcdLogic , 所以不能进行
                        // SwitchLcdBuffer 切换,否则当前正在送屏的 gDspRGBLcdLogicBake 会被修改.
                        IDspTskUpdateStart();
                    }
                }
            }
            break;

        case MS_DIDI_LCDUpdateInd:
            {
                LcdPositionReset();

                //如果没有进行特殊处理送屏
                if (fWinMoveTimeId == NULL)
                {
                    gScreenUpdating = 0;

                    DISPUPDATE_ENABLE();
                }
            }
            break;


        case MS_ISRDI_FlushInd:
            {
                if (gDispUpdateFlag & DISPF_LOGICUPDATEDISABLE)
                    break;

//            DISPUPDATE_DISABLE();
                //默认是 全屏刷新。
                gScreenUpdateY0 = 0;
                gScreenUpdateY1 = gLcdH;
                gScreenUpdateX0 = 0;
                gScreenUpdateX1 = gLcdW;

                if (Screen_GetType() == MCULCD)
                {
                    DoLcdFlush(gGuiDspLcdLogic);
                }
                else
                {
                    SwitchLcdBuffer();
                    DoLcdFlush(gDspRGBLcdLogicBake /*gGuiDspLcdLogic*/);   //gDspRGBLcdLogicBake
                }
            }
            break;

        case MS_DIDI_LCDFrameInd:
            {
                //     TR("LCD FRAME,MODE=%d",gDspTskDspMode);
                DspTskLcdUpdate();
            }
            break;

        default:
            return FALSE;
    }
    return TRUE;
}

void LCD_Update(void)
{
    RockOSSendMsg(MBDISP , MS_ISRDI_TickInd , NULL);

}

void LCD_Update_WT(void)
{
    RockOSSendMsg(MBDISP , MS_ISRDI_TickInd , NULL);
    RockSemObtain(&gGuiDispSem);
    RockSemRelease(&gGuiDispSem);

    while (gScreenUpdating == 1);

    if (Screen_GetType() == MCULCD)
    {
        while (Lcdctrl_GetStatus() == 1);
    }
}
void LCD_FLUSH(void)
{
    RockOSSendMsg(MBDISP, MS_ISRDI_FlushInd, NULL);
}



void LCD_HWUPDATE()
{
    if (Screen_GetType() == MCULCD)
    {
        while (Lcdctrl_GetStatus() == 1);
        LCDC_UpDate();
    }
    else
        RockOSSendMsg(MBDISP, MS_ISRDI_FlushInd, NULL);
}

/*------------------------END OF FILE ----------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -