4

我必须将 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

我还尝试使用我在网上找到的“saFbdevRotation.c”上的 fb 旋转功能,该功能使用 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 中没有错误。

将感谢您的建议。

4

3 回答 3

0

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

通常,分配视频缓冲区的标准方法是在启动时预先分配一个大的视频缓冲区(基于您支持的最大视频分辨率),将 men= 参数传递给内核,这样内核就不会占用它最初。

然后稍后,视频驱动程序可以做

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

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

你可以通过做检查它cat /proc/iomen

因此,视频驱动程序内存是预先分配的,并且不同于 linux 内核系统内存(如 kmalloc() 或 get_free_pages() 或 vmalloc()),您所关心的被排除在外。

于 2015-05-04T22:28:31.470 回答
0

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

问题是,您应该尝试使用 LCD 硬件、处理器硬件或纯软件进行旋转。我不知道 Linux 帧缓冲区是否可能使用纯软件或您的处理器硬件,这可能取决于您的驱动程序。

于 2016-08-08T13:31:56.487 回答
0

您是否尝试通过在 config.txt(在 DOS 引导分区上)中添加一行来旋转显示器?

您需要的行是:

display_rotate=0..3 

(其中 0 是默认值,1 是顺时针 90 度,2 180 度等)

还有一个 lcd_rotate 命令,但我不确定有什么区别。

于 2021-10-17T18:26:07.647 回答