PXA25x LCD 控制器驱动

该驱动支持以下选项,可以通过模块方式的 options=<OPTIONS> 或者内置方式的 video=pxafb:<OPTIONS> 指定。

例如

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 控制器的 Overlay 支持

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

但是,这些 overlay 帧缓冲和普通帧缓冲之间存在一些差异,如下所示

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

  2. overlay 帧缓冲是根据指定的 '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. overlay 不支持在 x 方向上平移,因此 var->xres_virtual 将始终等于 var->xres

    2. overlay 的行长度必须是 32 位字的边界,对于 YUV 平面模式,这是每个像素具有最小比特数的组件的要求,例如,对于 YUV420,一个像素的 Cr 分量实际上是 2 位,这意味着行长度应该是 16 像素的倍数

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

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

    应用程序应按照以下顺序操作 overlay 帧缓冲

    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. 如果要使用 RGB 模式,则为 var->{red, green, blue, transp}

    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   |
     +-----------------+---+----------+----------+
    

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

    • 0 - RGB

    • 1 - YUV444 PACKED

    • 2 - YUV444 PLANAR

    • 3 - YUV422 PLANAR

    • 4 - YUR420 PLANAR

    XPOS - 起始水平位置

    YPOS - 起始垂直位置