我必须将 LCD 屏幕集成到我的嵌入式 linux (ARM9) 系统中。 LCD 为纵向 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旋转功能“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 中没有错误。
感谢您的建议。
我还可以补充一点,系统的可用内存非常有限,可以 这导致 fb 不分配新缓冲区?然而没有 dmesg 中的错误。
通常,分配视频缓冲区的标准方法是在启动时预先分配一个大的视频缓冲区(基于您支持的最大视频分辨率),它传递一个 men= 参数给内核,这样内核就不会占用它最初。
然后,视频驱动程序可以做
void *ioremap(unsigned long phys_addr, unsigned long size)
这将为驱动程序直接操作帧缓冲区创建一个 mmap 区域。
你可以通过做
cat /proc/iomen
来检查它
因此,视频驱动内存是预先分配的,不同于linux内核系统内存(如kmalloc()或get_free_pages()或vmalloc()),你关心的被排除了。
我认为您的问题与您使用的液晶显示器有关。我见过几个声称支持 90 度旋转的嵌入式 LCD,但结果与您描述的完全一样。 我的问题总是在使用 RGB 显示界面时遇到。我怀疑旋转可能使用 CPU 接口起作用。 我只见过一个嵌入式显示器能够为 RGB 接口正确旋转。
问题是,你应该尝试用 LCD 硬件、您的处理器硬件或纯软件。 我不知道 Linux framebuffer 是使用纯软件还是你的处理器硬件,这可能取决于你的驱动程序。
您是否尝试通过在 config.txt(在 DOS 引导分区上)中添加一行来旋转显示?
您需要的线路是:
display_rotate=0..3
(其中 0 是默认值,1 是顺时针 90 度,2 180 度等)
还有一个 lcd_rotate 命令,但我不确定有什么区别。