📄 osdfunc.c
字号:
}
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 + -