本文转自ericlulu2012的博客http://ericlulu.blog.163.com/blog/static/177274068201022395220877/
1. Kernel的启动参数可以控制显示输出的通道:
a) DVI(LCD)
set bootargs 'console=ttyS2,115200n8 root=/dev/mmcblk0p2 rootfstype=ext3 rw rootwait vram=24M omapfb.vram=0:8M,1:8M,2:8M omapfb.mode=dvi:1024x640MR-16@60 omapdss.def_disp=dvi MEM=200M'
b) 或者是输出到TV(ntsc, PAL)
set bootargs 'console=ttyS2,115200n8 root=/dev/mmcblk0p2 rootfstype=ext3 rw rootwait vram=24M omapfb.vram=0:8M,1:8M,2:8M omapfb.mode=tv:pal omapdss.def_disp=tv MEM=200M '
2. 采用DVI输出时可以指定framebuffer的分辨率(上面是1024x640)和颜色深度(16bpp);采用TV输出时不同的制式(PAL,或者NTSC)有其固定的分辨率,在程序中已经写死,颜色深度目前也采用16bpp。
3. Framebuffer的参数最终可以体现在overlay的信息中
/sys/devices/platform/omapdss/overlay0/ 该目录下有overlay0对应的framebuffer的输入图像分辨率,输出图像分辨率,屏幕宽度,对应的输出通道名称,使用的管理器等。
4. Framebuffer和显存分辨率
Framebuffer中的图形数据显示器被更新到omap3530的显示控制器的显存中,该显存可以容纳2048x2048的32bpp的数据。通常情况下我们将显存的分辨率设置和framebuffer相同,这样可以让framebuffer中的数据显示到设备上后是整屏的。但在某些情况下,我们需要将多个显示通道(GFX,VIDEO1, Video2)的数据叠加显示,达到其他显示效果,有个可能是framebuffer的分辨率与显存的分辨率不一致。这就需要分别设置framebuffer的分辨率和显存的分辨率,以及framebuffer中的数据在显存中的位置。
5. Kernel启动参数中设置的分别率分别传给了framebuffer和显存。我们可以在这个参数传给framebuffer时修改为该framebuffer需要的值。
具体可以修改:
/drivers/video/omap2/omapfb/omapfb-main.c:omapfb_fb_init, 该函数调用get_resolution来获取显存的分辨率来作为framebuffer的分辨率:
display->get_resolution(display, &w, &h);
我们直接修改为不使用获取的分辨率,而使用我们想要的分辨率即可。
另外,为了支持opengl el的双缓冲机制,虚拟framebuffer大小高度是输出高度的3三倍:
var->yres_virtual = var->yres*3; // for double buffer: opengl flip mode
6. 我们可以在系统初始化完成之后调用系统接口来设置显存的分辨率
void dispc_set_lcd_timings(struct omap_video_timings *timings)
该接口需要指定输出图形的分辨率以及时序参数。
7. 调整framebuffer中的图形输出到显存中的位置
即:输出到设备上的位置:
直接调整overlay的显示位置即可:
> cd /sys/devices/platform/omapdss/overlay1 (调整fb1的输出位置)
> ls
enabled input_size name position
global_alpha manager output_size screen_width
> cat position
0,0
> echo 30,30 > position (这就调整了视频输出到显示设备上的位置)
> cat position
30,30
> cat output_size
720,576
> cat screen_width
720
> echo 640,480>output_size (将视频缩小到640X480的分辨率,采用此方法可以对图形进行放大缩小)