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

📄 osdfunc.c

📁 很难得的最好的rtd3523系列原厂源码LCD驱动开发
💻 C
📖 第 1 页 / 共 3 页
字号:
        }
        else
        {
            pArray++;
            cnt++;
        }
    }
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxCalcStartAddress(BYTE ucRow, BYTE ucCol, BYTE ucIndicate)	//ucindicate: byte select.note by zhang_dc
{
	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_)
    {
        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_:
                cnt++;
                COsdFxCalcStartAddress(++ucRow, ucCol, _WRITE_BYTE1);
                continue;

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

        CScalerWrite(_OSD_DATA_PORT_92, 1, &temp, _NON_AUTOINC);
    }
}


//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxApplyMapSetting(BYTE ucOsdmaptype)
{
    	switch(ucOsdmaptype)
    	{
        	case _OSD_MAP0:	//for main page.  note by zhang_dc
            		COsdFxCodeWrite(tOSD_ROW_COMMAND0);
            		ucOsdMap = _OSD_MAP0;
            		break;

        	case _OSD_MAP1:	//for factory page. note by zhang_dc
            		COsdFxCodeWrite(tOSD_ROW_COMMAND1);
            		ucOsdMap = _OSD_MAP1;
            		break;

        	case _OSD_MAP2:	//for hint & auto & shortcut page. note by zhang_dc
            		COsdFxCodeWrite(tOSD_ROW_COMMAND2);
            		ucOsdMap = _OSD_MAP2;
            		break;

        	case _OSD_MAP3:	//no use. note by zhang_dc
        			COsdFxCodeWrite(tOSD_ROW_COMMAND3);
            		ucOsdMap = _OSD_MAP3;
            		break;

        	case _OSD_MAP4:	
				#if (_VIDEO_SUPPORT == _ON)
				#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
				#if (_OSD_SM_ENABLE)
        		COsdFxCodeWrite(tOSD_ROW_COMMAND4);
				#endif
				#endif
				#endif
            	ucOsdMap = _OSD_MAP4;
            	break;

        	case _OSD_MAP5:	
        		COsdFxCodeWrite(tOSD_ROW_COMMAND5);
            	ucOsdMap = _OSD_MAP5;
            	break;
        	case _OSD_MAP6:	
				// for source hint using window0
        		COsdFxCodeWrite(tOSD_ROW_COMMAND6);
            	ucOsdMap = _OSD_MAP6;
            	break;
    	}

    	COsdFxSetFrameCtrlCommand();
    	COsdFxSetCharCommandMap();
}

//--------------------------------------------------
// Description  : 
// Input Value  : 
// Output Value : 
//--------------------------------------------------
void COsdFxSetFrameCtrlCommand(void)	//send 2 base address. note by zhang_dc
{
    pData[0] = 0xc0;
    pData[1] = 0x04;
    CScalerWrite(0x90, 2, pData, _AUTOINC);
    pData[0] = ((tOSD_OSDMAP_INF[ucOsdMap][0] + 1) & 0x00ff);	//font select base address. note by zhang_dc
    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)
{
	//byte0.  select char type and size. note by zhang_dc
    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);
	//byte1.   clear font. note by zhang_dc
    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);
	//byte2.  set color.note by zhang_dc
    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);
}

//--------------------------------------------------
// by zhang_dc	Notice, only show 0~999
//--------------------------------------------------
void COsdFxShowNumber2(BYTE ucRow, BYTE ucCol, WORD usValue, BYTE ucPar, BIT ucZeroOn)
{
	//BYTE temp0, temp1, temp2;
	BYTE temp[3];
	BYTE i;

	temp[1] = usValue / 10;
	temp[0] = usValue - temp[1]*10;		// x1
	temp[2] = temp[1] /10;				// x100
	temp[1] = temp[1] - temp[2] *10;		// x10

	temp[0] = temp[0] + _0_;
	if(!ucZeroOn)
	{
		temp[1] = (temp[1] ||temp[2]) ? temp[1]+_0_ : 0x00;
		temp[2] = (temp[2]) ? temp[2]+_0_ : 0x00;
	}
	else
	{
		temp[1] = temp[1] + _0_;
		temp[2] = temp[2] + _0_;
	}
	
	switch(ucPar)
	{
		case _SHOW_3:
			i = 3;
			pData[0] = temp[2];	// x100
			pData[1] = temp[1];	// x10
			pData[2] = temp[0];	// x1
			break;
		case _SHOW_2:
			i = 2;
			pData[0] = temp[1];	// x10
			pData[1] = temp[0];	// x1
			break;
		case _SHOW_1:
			i = 1;
			pData[0] = temp[0];	// x1
			break;
	}

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

//----------------------------------------------------
// Description :	Set OSD double 
// Input Value :	None
// Output Value :	None
//----------------------------------------------------
void COsdFxSetOsdSizeDouble(BYTE ucSize)
{
	if(_MISC_ZOOM_X2 == ucSize)
	{
		COsdFxPWMCtlCommand(ADDRESS(3), _WRITE_BYTE1, 0x07);
		COsdFxSetPosition(WIDTH(_OSD_MAIN_DH_END*2), HEIGHT(_OSD_MAIN_DV_END*2), stOsdUserData.OsdHPos/2, stOsdUserData.OsdVPos*2, 0x01);
	}
	else if(_MISC_ZOOM_X1 == ucSize)
	{
		COsdFxPWMCtlCommand(ADDRESS(3), _WRITE_BYTE1, 0x04);
		COsdFxSetPosition(WIDTH(_OSD_MAIN_DH_END), HEIGHT(_OSD_MAIN_DV_END), stOsdUserData.OsdHPos, stOsdUserData.OsdVPos, 0x01);
	}
}

//----------------------------------------------------
// Description : Set OSD Alpha Blending level. Add by zhang_dc
//----------------------------------------------------
void COsdFxAlphaBlendingLevel(BYTE ucLevel)
{
	CScalerSetBit(_OVERLAY_CTRL_6C, 0xe3, (ucLevel & 0x07) << 2);
}

//----------------------------------------------------

⌨️ 快捷键说明

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