📄 osdtest.c
字号:
0x00, 0x00,
0x11, 0x11,
0x22, 0x22,
0x33, 0x33,
0x44, 0x44,
0x55, 0x55,
0x66, 0x66,
0x77, 0x77,
0x88, 0x88,
0x99, 0x99,
0xaa, 0xaa,
0xbb, 0xbb,
0xcc, 0xcc,
0xdd, 0xdd,
0xee, 0xee,
0xff, 0xff,
0x00, 0x00,
0x11, 0x11,
0x22, 0x22,
0x33, 0x33,
0x44, 0x44,
0x55, 0x55,
0x66, 0x66,
0x77, 0x77,
0x88, 0x88,
0x99, 0x99,
0xaa, 0xaa,
0xbb, 0xbb,
0xcc, 0xcc,
0xdd, 0xdd,
0xee, 0xee,
0xff, 0xff,
0x11, 0x11,
0x11, 0x11,
0x11, 0x11,
0x11, 0x11,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11
};
typedef struct OsdRegsStruct
{
WORD OSD_HSTART;
WORD OSD_VSTART;
WORD OSD_WIDTH;
WORD OSD_HEIGHT;
WORD OSD_YSTRIDE;
WORD OSD_FONT_SIZE;
WORD OSD_CHARMAP_CTRL;
WORD OSD_WIN_EN;
WORD OSD_WIN_INDEX;
struct
{
WORD OSD_W_HSTART;
WORD OSD_W_VSTART;
WORD OSD_W_HEND;
WORD OSD_W_VEND;
} OSD_WIN_COORD[4];
WORD OSD_1BIT_FONT_BA;
WORD OSD_1BITX_FONT_BA;
WORD OSD_2BIT_FONT_BA;
WORD OSD_4BIT_FONT_BA;
WORD OSD_ATTR_BA;
WORD OSD_CCF_BA;
} SOsdRegs;
// Registers specific to osd rectangle
SOsdRegs ROM OsdRegs[2] =
{
{
OSD_R1_HSTART_0,
OSD_R1_VSTART_0,
OSD_R1_WIDTH_0,
OSD_R1_HEIGHT_0,
OSD_R1_YSTRIDE,
OSD_R1_FONT_SIZE,
OSD_R1_CHARMAP_CTRL,
OSD_R1_WIN_EN,
OSD_R1_WIN_INDEX0,
{
{OSD_R1_W1_HSTART_0, OSD_R1_W1_VSTART_0, OSD_R1_W1_HEND_0, OSD_R1_W1_VEND_0},
{OSD_R1_W2_HSTART_0, OSD_R1_W2_VSTART_0, OSD_R1_W2_HEND_0, OSD_R1_W2_VEND_0},
{OSD_R1_W3_HSTART_0, OSD_R1_W3_VSTART_0, OSD_R1_W3_HEND_0, OSD_R1_W3_VEND_0},
{OSD_R1_W4_HSTART_0, OSD_R1_W4_VSTART_0, OSD_R1_W4_HEND_0, OSD_R1_W4_VEND_0},
},
OSD_R1_1BIT_FONT_BA_0,
OSD_R1_X1BIT_FONT_BA_0,
OSD_R1_2BIT_FONT_BA_0,
OSD_R1_4BIT_FONT_BA_0,
OSD_R1_ATTR_BA_0,
OSD_R1_CCF_BA_0
},
{
OSD_R2_HSTART_0,
OSD_R2_VSTART_0,
OSD_R2_WIDTH_0,
OSD_R2_HEIGHT_0,
OSD_R2_YSTRIDE,
OSD_R2_FONT_SIZE,
OSD_R2_CHARMAP_CTRL,
OSD_R2_WIN_EN,
OSD_R2_WIN_INDEX0,
{
{OSD_R2_W1_HSTART_0, OSD_R2_W1_VSTART_0, OSD_R2_W1_HEND_0, OSD_R2_W1_VEND_0},
{OSD_R2_W2_HSTART_0, OSD_R2_W2_VSTART_0, OSD_R2_W2_HEND_0, OSD_R2_W2_VEND_0},
{OSD_R2_W3_HSTART_0, OSD_R2_W3_VSTART_0, OSD_R2_W3_HEND_0, OSD_R2_W3_VEND_0},
{OSD_R2_W4_HSTART_0, OSD_R2_W4_VSTART_0, OSD_R2_W4_HEND_0, OSD_R2_W4_VEND_0},
},
OSD_R2_1BIT_FONT_BA_0,
OSD_R2_X1BIT_FONT_BA_0,
OSD_R2_2BIT_FONT_BA_0,
OSD_R2_4BIT_FONT_BA_0,
OSD_R2_ATTR_BA_0,
OSD_R2_CCF_BA_0
}
};
BYTE OSD_SIZE_X;
BYTE OSD_SIZE_Y;
BYTE FONT_X;
BYTE FONT_Y;
WORD AddrCCF;
WORD AddrFont1BPP;
WORD AddrFontX1BPP;
WORD AddrFont2BPP;
WORD AddrFont4BPP;
WORD AddrAttr;
BYTE RectangleID;
#define RegMaskOr(reg, mask, val) gm_WriteRegByte(reg, (gm_ReadRegByte(reg) & ~mask)|val)
#define RegOr(reg, val) gm_WriteRegByte(reg, gm_ReadRegByte(reg)|val)
#define RegMask(reg, mask) gm_WriteRegByte(reg, gm_ReadRegByte(reg)&mask)
#define updateHost() gm_WriteRegByte(HOST_CONTROL, BIT2 /*0x18*/)
#define OSDREG(reg) OsdRegs[RectangleID].reg
static void RectSetup (void)
{
// BYTE B_i; // index
// WORD *Wp_addr;
// set font size
gm_WriteRegByte( OSDREG(OSD_FONT_SIZE), ((FONT_X-6)>>1) | ((FONT_Y-8)<<4) );
// set ccf begin address
gm_WriteRegWord( OSDREG(OSD_CCF_BA), AddrCCF );
// set attribute table begin address
gm_WriteRegWord( OSDREG(OSD_ATTR_BA), AddrAttr );
// set 1bpp font table begin address
gm_WriteRegWord( OSDREG(OSD_1BIT_FONT_BA), AddrFont1BPP );
// set extended 1bpp font table begin address
gm_WriteRegWord( OSDREG(OSD_1BITX_FONT_BA), AddrFontX1BPP );
// set 2bpp font table begin address
gm_WriteRegWord( OSDREG(OSD_2BIT_FONT_BA), AddrFont2BPP );
// set 4bpp font table begin address
gm_WriteRegWord( OSDREG(OSD_4BIT_FONT_BA), AddrFont4BPP );
// disable hardware windows
gm_WriteRegByte( OSDREG(OSD_WIN_EN), 0 );
// set rectangle width
gm_WriteRegByte( OSDREG(OSD_YSTRIDE), OSD_SIZE_X - 1 );
updateHost();
}
// ZOOM: 0 - No zoom, 1 - 2x H, 2 - 2X V, 3 - 2X H&V
static void PositionOsd (WORD left, WORD top, BYTE Stretch)
{
//#define PanelWidth 1024
//#define PanelHeight 728
WORD W_osdWidth, W_osdHeight;
WORD W_hStart, W_vStart;
WORD W_temp;
RegMaskOr(OSDREG(OSD_CHARMAP_CTRL), 0xC0, (Stretch << 6) );
W_osdWidth = (WORD)OSD_SIZE_X * FONT_X ;
W_osdHeight = (WORD)OSD_SIZE_Y * FONT_Y;
W_temp = PanelWidth - W_osdWidth;
if (left < W_temp)
W_hStart = left;
else
W_hStart = W_temp;
W_temp = (PanelHeight - W_osdHeight);
if (top < W_temp)
W_vStart = top;
else
W_vStart = W_temp;
// set osd position
gm_WriteRegWord(OSDREG(OSD_HSTART), W_hStart);
gm_WriteRegWord(OSDREG(OSD_VSTART), W_vStart);
gm_WriteRegWord(OSDREG(OSD_WIDTH), W_osdWidth);
gm_WriteRegWord(OSDREG(OSD_HEIGHT), W_osdHeight);
updateHost();
}
static void ShowOsd(void)
{
if ( 0 == RectangleID )
RegOr(OSD_ENABLES, OSD_REC1_EN);
else
RegOr(OSD_ENABLES, OSD_REC2_EN);
updateHost();
}
static void HideOsd(void)
{
if ( 0 == RectangleID )
RegMask(OSD_ENABLES, ~OSD_REC1_EN);
else
RegMask(OSD_ENABLES, ~OSD_REC2_EN);
updateHost();
}
//static void LoadCCF ( WORD addr/*byte addr*/, BYTE ROM *dat, WORD size/*bytes*/ )
//{
// BYTE *ccfAddr = (BYTE*)addr;
// while (size--) { *ccfAddr = *dat; ccfAddr++; dat++; }
//}
static void FillCCF (WORD ccfAddr /*byte addr*/, WORD dat, WORD size /*words*/)
{
WORD *addr = (WORD*)ccfAddr;
while ( size-- ) *addr++ = dat;
}
static void PutChar (BYTE x, BYTE y, WORD charidx, WORD attrib, WORD bpp )
{
WORD *ccfAddr;
ccfAddr = (WORD*)AddrCCF + (y * OSD_SIZE_X + x);
*ccfAddr = (bpp<<14)|(attrib<<8)|charidx;
}
static void LoadColor(BYTE index_Table, BYTE size, BYTE ROM* pntTbl)
{
#define CLUT_ADDRESS 0x8400
WORD W_buflen;
BYTE *Bp_addr;
Bp_addr = (BYTE*)(CLUT_ADDRESS + index_Table * 4); // CLUT address
RegMaskOr(OCM_BUS_CONTROL_0, OCM_RAM_CTRL, 0x08 );
for(W_buflen = size; W_buflen != 0; W_buflen--)
{
Bp_addr[0] = pntTbl[0];
while ( (gm_ReadRegByte(OCM_WBUF_STATUS) & 0x02) != 0 ) { continue; }// wait for OSD CLUT write operation
Bp_addr[1] = pntTbl[1];
while ( (gm_ReadRegByte(OCM_WBUF_STATUS) & 0x02) != 0 ) { continue; }// wait for OSD CLUT write operation
Bp_addr[2] = pntTbl[2];
while ( (gm_ReadRegByte(OCM_WBUF_STATUS) & 0x02) != 0 ) { continue; }// wait for OSD CLUT write operation
pntTbl += 3;
Bp_addr += 4;
}
RegMaskOr(OCM_BUS_CONTROL_0, OCM_RAM_CTRL, 0x00 );
}
static void LoadAttribs(BYTE index, BYTE nentry, BYTE ROM* pntTbl)
{
WORD *Wp_attr;
// param rect needs to be removed
// Wp_attr = (BYTE *)AddrAttr;
Wp_attr = (WORD *)AddrAttr;
Wp_attr += index;
while(nentry--)
{
*Wp_attr++ = *pntTbl++;
}
}
#if 0
static void SetColorWin(BYTE idWindow, BYTE color, WORD xPixel, WORD yPixel, WORD width, WORD height)
{
BYTE shift = (idWindow << 2);
// set color window's start-col, end-col
if ( width ) width--;
width += xPixel;
gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_HSTART, xPixel );
gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_HEND, width );
// set color window's start-row, end-row
if ( height ) height--;
height += yPixel;
gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_VSTART, yPixel );
gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_VEND, height );
// update color index
gm_WriteRegWord ( OSDREG(OSD_WIN_INDEX),
(gm_ReadRegWord(OSDREG(OSD_WIN_INDEX)) & ~((WORD)0x000f << shift)) | ((WORD)color << shift));
// enable color window
RegOr( OSDREG(OSD_WIN_EN), (1<<idWindow) );
updateHost();
}
static void DelColorWIn(BYTE idWindow)
{
// disable color window
RegMask( OSDREG(OSD_WIN_EN), ~(1<<idWindow) );
updateHost();
}
#endif
////////////////////////////////////////////////////////////////////////////////
static WORD BYTES_PER_FONT( BYTE bpp )
{
WORD num;
if ((1 == bpp)) // 1bpp or x1bpp
{
num = ((FONT_X < 9)? (FONT_Y+1)/2 : (FONT_X < 17)? FONT_Y : 2 * FONT_Y);
}
else if (2 == bpp) // 2bpp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -