📄 dispthread.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 + -