DM6437 VPBE中的OSD学习记录,记录OSD模块看下来的大致感受。
下图为整体框图
在window 0 下面还有一层background 定义寄存器为:VPBE_OSD_MODE
最后的8位为颜色索引,对应ROM CLUT中的256种颜色。我用的是LCD屏显示,分辨率为800*480;
配置过的代码参考`
void vpbe_init( Uint32 buffer0, Uint32 buffer1, Uint32 width, Uint32 height, Uint32 cb_enable )
{
VPSS_CLK_CTRL = 0x000000019;
// Enable DAC and VENC clock, both at 27 MHz
VPBE_PCR = 0;
// No clock div, clock enable
/*
* Setup OSD
*/
VPBE_OSD_TRANSPVAL = 0;
/*****************************************************/
VPBE_OSD_MODE = 0x00000000+104;
// Blackground color blue using clut in ROM0
VPBE_OSD_OSDWIN0MD = 0;
// Disable both osd windows and cursor window
VPBE_OSD_OSDWIN1MD = 0;
VPBE_OSD_RECTCUR = 0;
VPBE_OSD_VIDWIN0OFST = width >> 4;
VPBE_OSD_VIDWIN0ADR = buffer0;
VPBE_OSD_BASEPX = BASEP_X;
VPBE_OSD_BASEPY = BASEP_Y;
VPBE_OSD_VIDWIN0XP = 0;
VPBE_OSD_VIDWIN0YP = 0;
VPBE_OSD_VIDWIN0XL = width;
VPBE_OSD_VIDWIN0YL = height;
VPBE_OSD_MISCCTL = 0;
//change the color if set bit 7 ,but don't know the principle
VPBE_OSD_OSDWIN0ADR = (Uint32)resizer_degree;
VPBE_OSD_OSDWIN0OFST = 40;
VPBE_OSD_OSDWIN0XP = 100;
VPBE_OSD_OSDWIN0YP = 100;
VPBE_OSD_OSDWIN0XL = 20*32;
VPBE_OSD_OSDWIN0YL = 240;
VPBE_OSD_OSDWIN0MD = 0x20c5;
VPBE_OSD_OSDWIN1MD = 0;
VPBE_OSD_VIDWINMD = 0x00000001;
// Disable vwindow 1 and enable vwindow 0
// Field mode with no up-scaling
//VPBE_VENC_VMOD = 0x00000043;
// Standard PAL interlaced output
VPBE_VENC_VMOD = 0x00002053|(0 << 4);
// Standard PAL interlaced output
VPBE_VENC_VIDCTL = 0x00002000|(0 << 4);
VPBE_VENC_LCDOUT = 0x00000001;
VPBE_VENC_DCLKCTL = 0x0000001;
VPBE_VENC_DCLKPTN0 = 0x1; //
VPBE_VENC_HSPLS = 1*2;// 40*2
VPBE_VENC_HINT = 862*2-1;// 1056*2 - 1
VPBE_VENC_HSTART = 46*2; // (40 + 4)*2
VPBE_VENC_HVALID = 800*2; // 800*2
VPBE_VENC_VSPLS = 1;// 10
VPBE_VENC_VINT = 522-1;//0x20C; // 525 - 1
VPBE_VENC_VSTART = 23;//0xc; // 10 + 2
VPBE_VENC_VVALID = 480;//0x1E0; // 480
// VPBE_VENC_HSDLY = 1;
// VPBE_VENC_VSDLY = 1;
VPBE_VENC_SYNCCTL = 0xf|(0 << 11);
//Set HSYNC, VSYNC as active low
VPBE_VENC_RGBCTL = 0x0|(1 << 10);
VPBE_VENC_VDPRO = 0 << 8|(0 << 9)|(0 << 11);
VPBE_VENC_DACTST = 0|(0xf << 12);
//DAC Power-down mode
VPBE_VENC_DACSEL = 0x000000;
}
上面除了OSD模块还有VENC模块的一些代码。对于OSD来讲,需要设定好整个画布的基准地址,才有参照。这里需要注意的,不能为0有范围寄存器说明有写。预计和HS、VS的脉冲时间有关。
接下来除了默认的缺省值,下面几个寄存器进行配置:
VPBE_OSD_VIDWIN0OFST //偏移地址
VPBE_OSD_VIDWIN0ADR //起始地址
VPBE_OSD_VIDWIN0XP //X方向起点
VPBE_OSD_VIDWIN0YP //Y方向起点
VPBE_OSD_VIDWIN0XL //X方向像素点长度
VPBE_OSD_VIDWIN0YL //Y方向像素点长度
对于OSD0两种不同模式:
在bitmap模式下(bit8):
VPBE_OSD_OSDWIN0XL、VPBE_OSD_OSDWIN0OFST 关系记录
VPBE_OSD_OSDWIN0XL表示有多少个像素点,一个像素点为8bit
VPBE_OSD_OSDWIN0OFST则为第一行地址和次行地址偏移。只知道地址偏移
单位为32,若其值为1则表示为1*32byte个偏移量
例:
VPBE_OSD_OSDWIN0OFST = 1;
VPBE_OSD_OSDWIN0XL = 1*32;
在RGB565 模式下:
VPBE_OSD_OSDWIN0XL表示有多少个像素点,一个像素点为16bit
则对于上例需要修改如下:
VPBE_OSD_OSDWIN0OFST = 2;
VPBE_OSD_OSDWIN0XL = 1*32;
可以看到VPBE_OSD_OSDWIN0OFST 的值增加了一倍,是由于一行为1*32个像素点、占用1*32*2byte;