嵌入式linux framebuffer旋转

时间:2013-01-11 04:41:23

标签: rotation embedded orientation framebuffer lcd

我必须将LCD屏幕集成到我的嵌入式Linux(ARM9)系统中。液晶显示器是纵向320x480,我需要以横向方向480x320运行屏幕。 使用LCD配置寄存器我可以用硬件旋转它,使(x,y)(0,0)旋转90度。 这里开始我的问题,屏幕的宽边从480像素缩小到320,并且图片的长边不在屏幕之外。这应该通过更改帧缓冲区尺寸AFAIK来修复,但我尝试了几种方法来做到这一点但还没有成功。 使用fbset,下面是肖像的设置:

mode "480x320-55"
    # D: 9.091 MHz, H: 18.182 kHz, V: 55.096 Hz
    geometry 480 320 480 320 16
    timings 110000 4 4 4 4 12 2
    rgba 5/0,6/5,5/11,0/0
endmode

发送命令:

fbset --geometry 480 320 480 320 16

结果:

mode "480x320-55"
    # D: 9.091 MHz, H: 18.182 kHz, V: 55.096 Hz
    geometry 480 320 480 320 16
    timings 110000 4 4 4 4 12 2
    rgba 5/0,6/5,5/11,0/0
endmode

这使得图片显示几次并重叠,但屏幕宽度仍然太窄。

我试图为虚拟xres和yres提供双倍的屏幕大小,但没有变化。

fbset --geometry 480 320 960 640 16

我还尝试使用我在网络上找到的fb rotate功能“saFbdevRotation.c”,它使用FB IOCTL,但活动屏幕尺寸仍然不正确。

旋转90度,见输出

$> ./fb_rotate -r 90
## Before rotation
### Fix Screen Info:
Line Length - 640
Physical Address = 81a00000
Buffer Length = 1048576

### Var Screen Info:
Xres - 320
Yres - 480
Xres Virtual - 320
Yres Virtual - 480
Bits Per Pixel - 16
Pixel Clk - 110000
Rotation - 0
## after rotation
###  Fix Screen Info:
Line Length - 960
Physical Address = 81a00000
Buffer Length = 1048576

### Var Screen Info:
Xres - 480
Yres - 320
Xres Virtual - 480
Yres Virtual - 320
Bits Per Pixel - 16
Pixel Clk - 110000
Rotation - 90

我还可以补充一点,系统的可用内存非常有限,这会导致fb不能分配新的缓冲区吗?然而,dmesg没有错误。

非常感谢您的建议。

2 个答案:

答案 0 :(得分:0)

  

我还可以补充说,系统非常有限,可以使用空闲内存   这导致fb没有分配新的缓冲区?但是没有   dmesg中的错误。

通常,分配视频缓冲区的标准方法是在引导时预先分配一个大的视频缓冲区(基于你支持的最大视频分辨率),这会将men =参数传递给内核,以便内核赢得' t最初占据它。

然后,视频驱动程序可以

void *ioremap(unsigned long phys_addr, unsigned long size)

将为驱动程序创建一个mmap区域,直接操作帧缓冲区。

您可以通过cat /proc/iomen

进行检查

因此,视频驱动程序内存是预先分配的,与linux内核系统内存不同(如kmalloc()或get_free_pages()或vmalloc()),您所关注的内容将被排除。

答案 1 :(得分:0)

我认为您的问题与您正在使用的LCD有关。我见过几款声称支持90度旋转的嵌入式液晶显示器,但结果完全如您所述。 使用RGB显示界面总是遇到我的问题。我怀疑旋转可能使用CPU接口。 我看过只有一个嵌入式显示器能够正确地为RGB接口进行旋转。

问题是,您应该尝试使用旋转 LCD硬件,处理器硬件或纯软件。 我不知道Linux framebuffer是否可能使用纯SW或你的处理器硬件,它可能取决于你的驱动程序。