各位大神好!我的是DM368的板子,然后是裸板跑的程序,自己配置的寄存器值。
然后我用的显示屏是320*240的,使用的DCLK是6.75Mhz。源时钟是27Mhz的。通过设定寄存器VENC_DCLKCTL = 0x0003;VENC_DCLKPTN0 = 0x0003;将频率降为了1/4。那么问题来了,我的背景窗口width设定了240*4=960,height设定为320,此时的背景窗口才刚好铺满整个屏幕。而OSDWIN0 的width = 480*320才刚好铺满整个屏幕,然后我在内存中组织数据时,也是要在其中每放一个像素点然后放一个空的dummy数据,再放第二个像素点,而且行上面也是间隔的加入空行数据才刚好能正常显示。我翻遍了VPBE的资料也没有找到合适的参考,请问哪位大神能帮忙解答一下?
以下是我的寄存器设定:
if ( ntsc_pal_mode == NTSC )
{
basep_x = 0;
basep_y = 0;
// width = 720;
// width = 790;
// height = 600;
// width = 960;
// height = 320;
width = 960;
height = 320;
}
else
{
basep_x = 132;
basep_y = 22;
width = 320;
height = 240;
}
/*
* Setup clocking / DACs
*/
// VDAC_CONFIG = 0x081141CF; // Take DACs out of power down mode
// VPSS_CLKCTL = 0x00000038; // Enable DAC and VENC clock, both at 27 MHz
// VPSS_VPBE_CLK_CTRL = 0x00000011; // Select enc_clk*1, turn on VPBE clk
// VPSS_CLKCTL = 0x0000000B; // Enable DAC and VENC clock, both at 27 MHz
VPSS_CLKCTL = 0x00000018; // Enable DAC and VENC clock, both at 27 MHz
VPSS_VPBE_CLK_CTRL = 0x00000019; // Select enc_clk*1, turn on VPBE clk
// VENC_CLKCTL = 0x00000011; // Enable venc & digital LCD clock DAC相关设置
/*
* Setup OSD
*/
// OSD_MODE = 0x000000fc; // Blackground color blue using clut in ROM0
OSD_MODE = 0x000000ff; // Blackground color blue using clut in ROM0
OSD_EXTMODE = 0;
// OSD_MODE = 0x000083fc;
OSD_OSDWIN0MD = 0; // Disable both osd windows and cursor window
OSD_OSDWIN1MD = 0;
OSD_RECTCUR = 0;
OSD_VIDWIN0OFST= ((video_buffer>>19)&0x1E00) | (width >> 4); //bit 12~9 store high 4bit 31~28
OSD_VIDWINADH = (video_buffer >> 21)&0x7F; //bit 6~0 store hight 7bit 27~21
OSD_VIDWIN0ADL = (video_buffer >> 5)&0xFFFF; //bit 15~0 stor 16bit 20~5
OSD_BASEPX =0;//137;// HPulse+91;
OSD_BASEPY =0;//38; //VPulse+36;
OSD_VIDWIN0XP = 100;//55;//一个值动两个像数
OSD_VIDWIN0YP = 100;//35;50
OSD_VIDWIN0XL = 240;
OSD_VIDWIN0YL = 100;
// OSD_VIDWINMD = 0x0201;//0x00000001; // Disable vwindow 1 and enable vwindow 0
OSD_VIDWINMD = 0;
/*liyan's test for bitmap*/
OSD_OSDWIN0OFST= ((video_buffer>>19)&0x1E00) | (width >> 4); //bit 12~9 store high 4bit 31~28
OSD_OSDWINADH = (video_buffer >> 21)&0x7F; //bit 6~0 store hight 7bit 27~21
OSD_OSDWIN0ADL = (video_buffer >> 5)&0xFFFF; //bit 15~0 stor 16bit 20~5
OSD_BASEPX =0;//137;// HPulse+91;
OSD_BASEPY =0;//38; //VPulse+36;
OSD_OSDWIN0XP = 0;//55;//一个值动两个像数
OSD_OSDWIN0YP = 8;//35;
OSD_OSDWIN0XL = 480;
OSD_OSDWIN0YL = 320;
// OSD_OSDWIN0MD = 0x000000C1;
OSD_OSDWIN0MD = 0x000060C1;
// Frame mode with no up-scaling
/*
* Setup VENC
*/
if ( ntsc_pal_mode == NTSC )
// VENC_VMOD = 0x00000003; // Standard NTSC interlaced output
VENC_VMOD = 0x00002013; // liyan change to No stardar video mode 130203
else
VENC_VMOD = 0x00002043; // Standard PAL interlaced output
VENC_HSPLS = HPulse; //HDW
VENC_VSPLS = VPulse; //VDW
// VENC_HINTVL = width-1; //PPLN
#if 1
VENC_HVALID = width; //LNH
VENC_HSTART = HSTART; //144
VENC_HINTVL = 1099;//4; //PPLN
//SPH
VENC_VVALID = height; //LNV
// VENC_VSTART = VSTART; //SLV
VENC_VSTART = VSTART; //SLV
VENC_VINTVL = 340; //2; //LPFR
#endif
#if 0
VENC_DCLKHSTT = HSTART;
VENC_DCLKHVLD = width;
VENC_DCLKVSTT = VSTART;
VENC_DCLKVVLD = height;
#endif
VENC_HSDLY = 0;//40;
VENC_VSDLY = 0;//40;
// VENC_CMPNT |= 0x8000;
VENC_YCCCTL = 0x10;
// VENC_VDPRO = colorbar_loopback_mode << 8;
VENC_VDPRO |= 0x200; // 100% Color bars
// VENC_VDPRO |= 0x40; // liyan change that YUV change to RGB
// VENC_VIOCTL |= 0x6000; //VCLK output enable
// VPSS_VPBE_CLK_CTRL = 0x00000011; // Select enc_clk*1, turn on VPBE clk
VENC_CLKCTL = 0x11;
VENC_SYNCCTL = 0x0F;
/*
* Choose Output mode
*/
if ( output_mode == COMPOSITE_OUT )
VENC_DACSEL = 0x00000000;
else if ( output_mode == SVIDEO_OUT )
VENC_DACSEL = 0x00004210;
VENC_VIOCTL = 0x2000; // Enable VCLK (VIDCTL)
// VENC_DCLKCTL = 0x0800; // Enable DCLK (DCLKCTL)
VENC_DCLKCTL = 0x0003;
VENC_DCLKPTN0 = 0x0003; // Set DCLK pattern (DCLKPTN0)
Chris Meng:
你好,
你的屏是240×320的吧(宽240,高320)?
你现在的配置就是水平方向输出4个数据里面只要一个数据。所以我建议你内存的数据保持240×320,在OSDWIN0MD里面的OHZ0配置为3,也就是水平放大4倍。垂直方向应该是不需要变化的。
yong zhang11:
回复 Chris Meng:
你好,感谢您的回答。我的屏幕是个竖屏,240*320的,没有错。可是我的OSDWIN0的尺寸是设成了480*320,然后刚好占满了整个屏幕。请问那个寄存器的设定是关于水平方向4个数据取一个数据的呢?请帮忙指点,我会再仔细看的。是OSD的设定还是VENC 的DLCK改变了它的取数据的方式?
yong zhang11:
回复 Chris Meng:
明白了。然后按照您的说法,是横向4个数据里边取一个数据,然后然后其他三个数据虽然有输出但是因为没有dclok,所以屏并未显示。
所以我的背景是960*320时,刚好铺满了整个屏幕,这没有问题。
但是我的OSDwin0似乎又有不对的地方,我的OSDwin0是设置成480*320然后刚好满屏,而不是预料中的960*320.是不是在OSD中还有哪个寄存器是和宽高相关的?
而且我组织数据的方式也不是一行中放3个空数据一个实际的数据。我是用的YUV422的格式,然后4个字节代表一个数据,其中第一个字节是ycr,第二个字节是空字节,第三个字节是YCB,最高位是Y分量。排满一行后,再拍一行空数据(同样是4个字节代表一个数据,一共排240个数据。此处的数据改变对显示没有影响。)然后第三行又如第一行的排列方式,第四行又如第二行的排列方式。然后显示的图片是正常的。……能帮忙指指出哪个设定对其产生的影响吗?
yong zhang11:
回复 Chris Meng:
你好:
原来的时候OSDCLK0和OSDCLK1是没有设定的。经过您提醒过后,我看了这块的资料,然后设定了OSDCLK0 = 0;OSDCLK1 = 1;然后OSDWIN的尺寸与理论值就对上了。即预料中的设为960*320 ,刚好显示满屏。内存中的数据也设定为一行的4个数据中填写一个真实的数据(填在第三个时是有效的。),不用加空行,可以显示正常的图像。
但是如果将所有的图像数据直接排列进去,不加假数据,并将OHZ0的两个bit位设置成10,即4倍方大。图像并未按照预期的显示。感觉扩大4倍后它的取点方式并未发生变化。
Chris Meng:
回复 yong zhang11:
yong zhang11并将OHZ0的两个bit位设置成10,即4倍方大。图像并未按照预期的显示
请问内存数据为240×320,OSDwin配置为水平方向放大4被,显示是什么样的效果?