PXA25x LCD 控制器驱动程序

该驱动程序支持以下选项,可以通过模块化时的 options=<选项> 或内置时的 video=pxafb:<选项> 来设置。

例如

modprobe pxafb options=vmem:2M,mode:640x480-8,passive

或在内核命令行上

video=pxafb:vmem:2M,mode:640x480-8,passive

vmem: VIDEO_MEM_SIZE

要分配的视频内存量(可以附加 K 或 M 表示千字节或兆字节)

mode:XRESxYRES[-BPP]

XRES == LCCR1_PPL + 1

YRES == LLCR2_LPP + 1

显示器的像素分辨率

BPP == 位深度。有效值为 1、2、4、8 和 16。

pixclock:PIXCLOCK

像素时钟,单位为皮秒

left:LEFT == LCCR1_BLW + 1

right:RIGHT == LCCR1_ELW + 1

hsynclen:HSYNC == LCCR1_HSW + 1

upper:UPPER == LCCR2_BFW

lower:LOWER == LCCR2_EFR

vsynclen:VSYNC == LCCR2_VSW + 1

显示边距和同步时间

color | mono => LCCR0_CMS

嗯...

active | passive => LCCR0_PAS

有源 (TFT) 或无源 (STN) 显示器

single | dual => LCCR0_SDS

单面板或双面板无源显示器

4pix | 8pix => LCCR0_DPD

4 或 8 像素单色单面板数据

hsync:HSYNC, vsync:VSYNC

水平和垂直同步。0 => 低电平有效,1 => 高电平有效。

dpc:DPC

双像素时钟。1 => true,0 => false

outputen:POLARITY

输出使能极性。0 => 低电平有效,1 => 高电平有效

pixclockpol:POLARITY

像素时钟极性 0 => 下降沿,1 => 上升沿

PXA27x 及更高版本 LCD 控制器的叠加支持

PXA27x 及更高版本的处理器支持在基本帧缓冲之上(尽管也可以在之下)叠加 overlay1 和 overlay2。它们支持调色板和非调色板 RGB 格式,以及 YUV 格式(仅在 overlay2 上可用)。这些叠加层具有专用的 DMA 通道,其行为与帧缓冲类似。

但是,这些叠加层帧缓冲和普通帧缓冲之间存在一些差异,如下所列

  1. 叠加层可以从基本帧缓冲中的 32 位字对齐位置开始,这意味着它们具有起始 (x, y)。此信息被编码到 var->nonstd 中(不,var->xoffset 和 var->yoffset 不用于此目的)。

  2. 叠加层帧缓冲是根据指定的“struct fb_var_screeninfo”动态分配的,其大小由以下决定

    var->xres_virtual * var->yres_virtual * bpp
    

    bpp = 16 -- 对于 RGB565 或 RGBT555

    bpp = 24 -- 对于 YUV444 打包格式

    bpp = 24 -- 对于 YUV444 平面格式

    bpp = 16 -- 对于 YUV422 平面格式(1 像素 = 1 Y + 1/2 Cb + 1/2 Cr)

    bpp = 12 -- 对于 YUV420 平面格式(1 像素 = 1 Y + 1/4 Cb + 1/4 Cr)

    注意

    1. 叠加层不支持在 x 方向上平移,因此 var->xres_virtual 将始终等于 var->xres

    2. 叠加层的行长度必须是 32 位字边界,对于 YUV 平面模式,它要求每个像素的位最少的组件,例如,对于 YUV420,一个像素的 Cr 组件实际上是 2 位,这意味着行长度应为 16 像素的倍数

    3. 起始水平位置 (XPOS) 应从 32 位字边界开始,否则 fb_check_var() 将会失败。

    4. 叠加层的矩形应位于基本平面内,否则将失败

    应用程序应按照以下顺序操作叠加层帧缓冲

    1. open(“/dev/fb[1-2]”, ...)

    2. ioctl(fd, FBIOGET_VSCREENINFO, ...)

    3. 使用所需的参数修改“var”

      1. var->xres 和 var->yres

      2. 如果需要更多内存,则使用更大的 var->yres_virtual,通常用于双缓冲

      3. var->nonstd 用于起始 (x, y) 和颜色格式

      4. var->{red, green, blue, transp} 如果要使用 RGB 模式

    4. ioctl(fd, FBIOPUT_VSCREENINFO, ...)

    5. ioctl(fd, FBIOGET_FSCREENINFO, ...)

    6. mmap

    7. ...

  3. 对于 YUV 平面格式,这些实际上在帧缓冲框架内不受支持,应用程序必须处理帧缓冲内每个组件的偏移量和长度。

  4. var->nonstd 用于传递起始 (x, y) 位置和颜色格式,详细的位字段如下所示

    31                23  20         10          0
     +-----------------+---+----------+----------+
     |  ... unused ... |FOR|   XPOS   |   YPOS   |
     +-----------------+---+----------+----------+
    

    对于 - 颜色格式,由 pxafb.h 中的 OVERLAY_FORMAT_* 定义

    • 0 - RGB

    • 1 - YUV444 打包格式

    • 2 - YUV444 平面格式

    • 3 - YUV422 平面格式

    • 4 - YUR420 平面格式

    XPOS - 起始水平位置

    YPOS - 起始垂直位置