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

📄 rtd2553v_osdfunc.c

📁 Realtek LCD monitor chip RTD25xx source code
💻 C
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------------------------------------------------------
// ID Code      : OsdFunc.c No.0000
// Update Note  : 
//
//----------------------------------------------------------------------------------------------------

#define __RTD2553V_OSDFX__

#include "Common\Header\Include.h"

#if((_SCALER_TYPE == _RTD2553V) || (_SCALER_TYPE == _RTD2546N) || (_SCALER_TYPE == _RTD2525L)) 


//----------------------------------------------------------------------------------------------------
// OSD Basic Functions
//----------------------------------------------------------------------------------------------------

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxApplyMapSetting(BYTE ucOsdmaptype)
{
    switch(ucOsdmaptype)
    {
        case _OSD_MAP0:
            COsdFxCodeWrite(tOSD_ROW_COMMAND0);
            ucOsdMap = _OSD_MAP0;
            break;

        case _OSD_MAP1:
            COsdFxCodeWrite(tOSD_ROW_COMMAND1);
            ucOsdMap = _OSD_MAP1;
            break;

        case _OSD_MAP2:
            COsdFxCodeWrite(tOSD_ROW_COMMAND2);
            ucOsdMap = _OSD_MAP2;
            break;

        case _OSD_MAP3:
            ucOsdMap = _OSD_MAP3;
            break;

        case _OSD_MAP4:
            ucOsdMap = _OSD_MAP4;
            break;

        case _OSD_MAP5:
	     
            ucOsdMap = _OSD_MAP5;
            break;
    }

    COsdFxSetFrameCtrlCommand();
    COsdFxSetCharCommandMap();
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxSetFrameCtrlCommand(void)
{
    pData[0] = 0xc0;
    pData[1] = 0x04;
    CScalerWrite(0x90, 2, pData, _AUTOINC);
    pData[0] = ((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x00ff);
    pData[1] = (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 4) | (_OSD_FONT_START_POSITION & 0x000f);
    pData[2] = (_OSD_FONT_START_POSITION & 0x0ff0) >> 4;
    CScalerWrite(0x92, 3, pData, _NON_AUTOINC);
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxSetCharCommandMap(void)
{
    CScalerSetByte(_OSD_ADDR_MSB_90, 0x50 | (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 8));
    CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)(tOSD_OSDMAP_INF[ucOsdMap][0] + 1));
    CScalerWriteAmount(_OSD_DATA_PORT_92, tOSD_OSDMAP_INF[ucOsdMap][0] * tOSD_OSDMAP_INF[ucOsdMap][1], 0x00, _NON_AUTOINC);

    CScalerSetByte(_OSD_ADDR_MSB_90, 0x90 | (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 8));
    CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)(tOSD_OSDMAP_INF[ucOsdMap][0] + 1));
    CScalerWriteAmount(_OSD_DATA_PORT_92, tOSD_OSDMAP_INF[ucOsdMap][0] * tOSD_OSDMAP_INF[ucOsdMap][1], 0x10, _NON_AUTOINC);

    CScalerSetByte(_OSD_ADDR_MSB_90, 0x10 | (((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x0f00) >> 8));
    CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)(tOSD_OSDMAP_INF[ucOsdMap][0] + 1));
    CScalerWriteAmount(_OSD_DATA_PORT_92, tOSD_OSDMAP_INF[ucOsdMap][0] * tOSD_OSDMAP_INF[ucOsdMap][1], 0x8c, _NON_AUTOINC);
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxEnableOsd(void)
{
    CTimerWaitForEvent(_EVENT_DEN_STOP);
    CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, _BIT0);
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxDisableOsd(void)
{
    CTimerWaitForEvent(_EVENT_DEN_STOP);
    CScalerSetBit(_OVERLAY_CTRL_6C, ~_BIT0, 0x00);
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxChangeWindowColor(BYTE ucWindowColor, BYTE *pStyle)
{
    pData[0]    = 0x41;
    pData[1]    = ((*(pStyle)) * 4) + (3);
    CScalerWrite(_OSD_ADDR_MSB_90, 2, pData, _AUTOINC);

    pData[0]    = ((*(pStyle + ((3) + 1) + 1)) & 0xf0) | (ucWindowColor & 0x0f);
    CScalerWrite(_OSD_DATA_PORT_92, 1, pData, _NON_AUTOINC);
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxCloseWindow(BYTE ucWinNumber)
{
    pData[0]    = 0x81;
    pData[1]    = (BYTE)(ucWinNumber * 4+3);
    pData[2]    = 0x00;
    CScalerWrite(_OSD_ADDR_MSB_90, 3, pData, _AUTOINC);
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxSlider(BYTE ucRow, BYTE ucCol, BYTE ucLength, WORD usValue, WORD usMax, WORD usMin)
{
    BYTE cnt;

    usValue  = usValue - usMin;
    pData[0] = _L_BAR;

    for(cnt=1;cnt<(ucLength - 1);cnt++)
        pData[cnt] = _0_BAR;

    pData[ucLength - 1] = _R_BAR;

    if(usMax > usMin)
    {
        cnt =((WORD)(usValue * (ucLength - 2))) / (usMax - usMin);

        if(cnt < (ucLength - 2))
            pData[cnt + 1] = (_0_BAR) + (((((WORD)(usValue * (ucLength - 2))) * _SLIDER_RESOLUTION) / (usMax - usMin)) % _SLIDER_RESOLUTION);

        for(;cnt>0;cnt--)
            pData[cnt] = _0_BAR + _SLIDER_RESOLUTION - 1;
    }

    COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE1);
    CScalerWrite(_OSD_DATA_PORT_92, ucLength, pData, _NON_AUTOINC);
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
//                ucPar:
//                bit 0 (Align left or right)   [ 0: Align left     1: Align right	      ]
//                bit 1 (Force to show number)  [ 0: Disable        1: Enable             ]
//                bit 4 ~ 6 (Show numbers)      [ 0 ~ 7: Show 1 ~ 8 numbers               ]
// Output Value : 
//--------------------------------------------------
void COsdFxShowNumber(BYTE ucRow, BYTE ucCol, WORD usValue, BYTE ucPar)
{
    BYTE index, temp, i;

    pData[4] = (_0_ + (usValue/10000));
    pData[3] = (_0_ + (usValue%10000)/1000);
    pData[2] = (_0_ + (usValue%1000)/100);
    pData[1] = (_0_ + (usValue%100)/10);
    pData[0] = (_0_ + (usValue%10));

	for(index=0;index<5;index++)
	{
		if(pData[4 - index] != ((bit)(ucPar & _BIT1) ? 0x00 : _0_))
		{
			index = 4 - index;
			break;
		}
	}

	if(usValue == 0 && !((bit)(ucPar & 0x02)) )
		index = 0;

	if((bit)(ucPar & _BIT1))
    {
        temp = (ucPar & 0x70) >> 4;
		index = (ucPar & 0x70) >> 4;
    }
    else
    {
        temp = (ucPar & 0x70) >> 4;
        if(temp < index)
            temp = index;
    }

	if((bit)(ucPar & 0x01))		// Align Right
		COsdFxCalcStartAddress(ucRow, ucCol - temp, _WRITE_BYTE1);
	else						// Align Left
		COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE1);

	for(i=0;i<=temp;i++)
    {
        if(index >= temp)
        {
    		pData[i + 8] = pData[index - i];
        }
        else
        {
            if(i < (temp - index))
                pData[i + 8] = 0x00;
            else
        		pData[i + 8] = pData[index - (i - (temp - index))];
        }
    }

    CScalerWrite(_OSD_DATA_PORT_92, (temp + 1), &pData[8], _NON_AUTOINC);

    //return temp + 1;
}
/*
//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxShowNorm100Number(BYTE ucRow, BYTE ucCol, WORD usValue, WORD usMax, WORD usMin, BYTE ucPar)
{
    usValue = ((DWORD)(usValue - usMin) * 100) / (usMax - usMin);

    COsdFxShowNumber(ucRow, ucCol, usValue, ucPar);
}
*/
//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxCodeWrite(BYTE code *pArray)
{
    BYTE cnt, temp;

    CScalerWrite(_OSD_ADDR_MSB_90, 2, pArray, _AUTOINC);
    pArray += 2;

    cnt = 0;

    while(_TRUE)
    {
        if(*pArray == _EXT_)
        {
            CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
            cnt = 0;

            if(*(pArray + 1) > 3)
                return;

            temp = _EXT_ + *(pArray + 1);

            if(*(pArray + 2) == _REPEAT_)
            {
                CScalerWriteAmount(_OSD_DATA_PORT_92, *(pArray + 3), temp, _NON_AUTOINC);
                pArray += 4;
            }
            else
            {
                CScalerWrite(_OSD_DATA_PORT_92, 1, &temp, _NON_AUTOINC);
                pArray += 2;
            }
        }
        else if(*pArray == _REPEAT_)
        {
            CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);

            CScalerWriteAmount(_OSD_DATA_PORT_92, *(pArray + 1) - 1, *(pArray - 1), _NON_AUTOINC);

            pArray += 2;
            cnt = 0;
        }
        else if(*pArray == _NEXT_)
        {
            CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
            pArray++;
            cnt = 0;

            if(*(pArray) != _END_)
            {
                CScalerWrite(_OSD_ADDR_MSB_90, 2, pArray, _AUTOINC);
                pArray += 2;
            }
            else
            {
                break;
            }
        }
        else if(*(pArray) == _END_)
        {
            CScalerWrite(_OSD_DATA_PORT_92, cnt, pArray - cnt, _NON_AUTOINC);
            break;
        }
        else
        {
            pArray++;
            cnt++;
        }
    }
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxCalcStartAddress(BYTE ucRow, BYTE ucCol, BYTE ucIndicate)
{
	WORD startaddress;
	BYTE temp;

	startaddress = tOSD_OSDMAP_INF[ucOsdMap][0] + 1;

	for(temp=0;temp<ucRow;temp++)
		startaddress += tOSD_OSDMAP_INF[ucOsdMap][1];

    CScalerSetByte(_OSD_ADDR_MSB_90, (BYTE)(((startaddress + ucCol)  & 0x0fff) >> 8 ) | (((ucIndicate << 2) + 1) << 4));
    CScalerSetByte(_OSD_ADDR_LSB_91, (BYTE)((startaddress + ucCol) & 0x00ff));
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxLoadText(BYTE ucRow, BYTE ucCol, BYTE ucSelect, BYTE code *pArray)
{
    BYTE cnt, cnt1, cnt2, ss, temp, temp1, temp2, temp3;
    WORD length;

    length = cnt = cnt1 = cnt2 = ss = temp = temp1 = 0;

    while(_TRUE)
    {
        if(*(pArray + cnt) == _END_)
        {
            if(temp == ucSelect)
                break;
            else
            {
                pArray += (cnt + 1);
                cnt = 0;
            }
            temp++;
        }
        cnt++;
    }

    cnt = cnt1 = cnt2 = temp1 = 0;
    temp3 = ucRow;
    COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE0);
    while(*(pArray + cnt) != _END_)
    {
        switch(*(pArray + cnt))
        {
            case _EXT_:
                if(*(pArray + cnt + 1) > 3)
                    return;
                temp = _EXT_ + *(pArray + cnt + 1);
                cnt += 2;
                break;

            case _REPEAT_:
                if(temp1 < (*(pArray + cnt + 1) - 1))
                    temp1++;                
                else
                {
                    cnt += 2;
                    temp1 = 0;
                    continue;
                }
                break;

            case _NEXT_:
                if(length%12)
                {
                    COsdFxCalcStartAddress(ucRow, ucCol + cnt1, _WRITE_BYTEALL);
                    pData[0] = 0x00;
                    pData[1] = ((12 - length%12) < 4) ? (12 - length%12) + 12 : (12 - length%12);
                    pData[2] = 0x00;
                    CScalerWrite(_OSD_DATA_PORT_92, 3, pData, _NON_AUTOINC);
                }
                cnt++;
                COsdFxCalcStartAddress(++ucRow, ucCol, _WRITE_BYTE0);
                length = 0;
                cnt1 = 0;
                continue;

            default:
                temp = *(pArray + cnt);
                cnt++;
                break;
        }

        cnt1++;
        ss = 0;
        temp2 = 0;
        while(_TRUE)
        {
            if((temp == (tOSD_CHARWIDTH_TABLE[0])[ss*2]) && ((tOSD_CHARWIDTH_TABLE[0])[ss*2+1] != _END_))
            {
                pData[0] = (tOSD_CHARWIDTH_TABLE[0])[ss*2+1];
                length += ((tOSD_CHARWIDTH_TABLE[0])[ss*2+1] & 0x0f);
                CScalerWrite(_OSD_DATA_PORT_92, 1, pData, _NON_AUTOINC);
                break;
            }
            else
            {
                if(((tOSD_CHARWIDTH_TABLE[0])[ss*2] == _END_) && ((tOSD_CHARWIDTH_TABLE[0])[ss*2+1] == _END_))
                {
                    temp2 = 1;
                    break;
                }
            }
            ss++;
        }

        ss = 0;
        while(temp2 == 1)
        {
            if((temp == (tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2]) && ((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1] != _END_))
            {
                pData[0] = (tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1];
                length += ((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1] & 0x0f);
                CScalerWrite(_OSD_DATA_PORT_92, 1, pData, _NON_AUTOINC);
                break;
            }
            else
            {
                if(((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2] == _END_) && ((tOSD_CHARWIDTH_TABLE[ucSelect+1])[ss*2+1] == _END_))
                {
                    COsdFxCalcStartAddress(ucRow, ucCol + cnt1, _WRITE_BYTE0);
                    length += 12;
                    break;
                }
            }
            ss++;
        }
    }

    if(length%12)
    {
        COsdFxCalcStartAddress(ucRow, ucCol + cnt1, _WRITE_BYTEALL);
        pData[0] = 0x00;
        pData[1] = ((12 - length%12) < 4) ? (12 - length%12) + 12 : (12 - length%12);
        pData[2] = 0x00;

        CScalerWrite(_OSD_DATA_PORT_92, 3, pData, _NON_AUTOINC);
    }

    ucRow = temp3;
    cnt = 0;
    temp1 = 0;
    COsdFxCalcStartAddress(ucRow, ucCol, _WRITE_BYTE1);
    while(*(pArray + cnt) != _END_)

⌨️ 快捷键说明

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