modedb 默认视频模式支持

目前,所有帧缓冲设备驱动程序都有自己的视频模式数据库,这既混乱又浪费资源。modedb 的主要思想是拥有

  • 一个用于探测视频模式的例程,可以被所有帧缓冲设备使用

  • 一个包含大量标准视频模式的通用视频模式数据库(取自 XFree86)

  • 为需要非标准模式的图形硬件提供您自己的模式数据库的可能性,例如 amifb 和 Mac 帧缓冲驱动程序(使用 macmodes.c)

当帧缓冲设备收到一个它不认识的 video= 选项时,它应该将其视为一个视频模式选项。如果 video= 选项中没有指定帧缓冲设备,则 fbmem 将其视为全局视频模式选项。

有效的模式说明符(mode_option 参数)

<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
<name>[-<bpp>][@<refresh>]

其中 <xres>、<yres>、<bpp> 和 <refresh> 是十进制数字,<name> 是一个字符串。方括号内的内容是可选的。

有效的名称是

- NSTC: 480i output, with the CCIR System-M TV mode and NTSC color encoding
- NTSC-J: 480i output, with the CCIR System-M TV mode, the NTSC color
  encoding, and a black level equal to the blanking level.
- PAL: 576i output, with the CCIR System-B TV mode and PAL color encoding
- PAL-M: 480i output, with the CCIR System-M TV mode and PAL color encoding

如果在 mode_option 参数中指定了 'M' (在 <yres> 之后和 <bpp> 和 <refresh> 之前,如果指定了),则将使用 VESA(TM) 协调视频时序计算时序,而不是从表中查找模式。如果指定了 'R',则对数字显示器进行“减少消隐”计算。如果指定了 'i',则计算隔行扫描模式。如果指定了 'm',则在计算中添加边距(xres 的 1.8% 向下舍入到 8 像素,以及 yres 的 1.8%)。

用法示例:1024x768M@60m - 带边距的 CVT 时序

DRM 驱动程序还添加了用于启用或禁用输出的选项

'e' 将强制启用显示器,即它将覆盖是否连接了显示器的检测。'D' 将强制启用显示器并使用数字输出。这对于同时具有模拟和数字信号的输出(例如 HDMI 和 DVI-I)很有用。对于其他输出,它的行为类似于 'e'。如果指定了 'd',则禁用输出。

您还可以指定选项与哪个输出匹配。要强制启用 VGA 输出并驱动特定的模式,请说

video=VGA-1:1280x1024@60me

可以为不同的端口多次指定该选项,例如

video=LVDS-1:d video=HDMI-1:D

选项也可以在模式之后传递,使用逗号作为分隔符。

用法示例:720x480,rotate=180 - 720x480 模式,旋转 180 度

有效的选项是

- margin_top, margin_bottom, margin_left, margin_right (integer):
  Number of pixels in the margins, typically to deal with overscan on TVs
- reflect_x (boolean): Perform an axial symmetry on the X axis
- reflect_y (boolean): Perform an axial symmetry on the Y axis
- rotate (integer): Rotate the initial framebuffer by x
  degrees. Valid values are 0, 90, 180 and 270.
- tv_mode: Analog TV mode. One of "NTSC", "NTSC-443", "NTSC-J", "PAL",
  "PAL-M", "PAL-N", or "SECAM".
- panel_orientation, one of "normal", "upside_down", "left_side_up", or
  "right_side_up". For KMS drivers only, this sets the "panel orientation"
  property on the kms connector as hint for kms users.

什么是 VESA(TM) 协调视频时序 (CVT)?

来自 VESA(TM) 网站

“CVT 的目的是提供一种生成一致的方法

和协调的一组标准格式、显示刷新率以及用于计算机显示产品的时序规范,包括那些使用 CRT 的产品,以及那些使用其他显示技术的产品。CVT 的目的是为源制造商和显示器制造商提供一套通用的工具,使新时序能够以一致的方式开发,从而确保更高的兼容性。”

这是 VESA(TM) 批准的关于视频时序的第三个标准。第一个是离散视频时序 (DVT),它是 VESA(TM) 批准的预定义模式的集合。第二个是广义时序公式 (GTF),它是一种根据像素时钟、水平同步频率或垂直刷新率来计算时序的算法。

GTF 的局限性在于它主要为 CRT 显示器而设计。由于其高消隐要求,它人为地增加了像素时钟。这不适合具有高数据速率的数字显示接口,它要求尽可能地保留像素时钟。此外,GTF 不考虑显示器的宽高比。

CVT 解决了这些限制。如果与 CRT 一起使用,则使用的公式是 GTF 的派生版本,并进行了一些修改。如果与数字显示器一起使用,则可以使用“减少消隐”计算。

从帧缓冲子系统的角度来看,每当显示器制造商发布新模式时,都无需将新格式添加到全局模式数据库中。指定 CVT 将适用于大多数(如果不是全部)相对较新的 CRT 显示器,并且如果指定了“减少消隐”计算,则可能适用于大多数平板显示器。(显示器的 CVT 兼容性可以从其 EDID 确定。EDID 的 1.3 版本具有额外的 128 字节块,其中放置了额外的时序信息。到目前为止,该层尚不支持解析这些额外的块。)

CVT 还引入了一种新的命名约定(应从 dmesg 输出中看到)

<pix>M<a>[-R]

where: pix = total amount of pixels in MB (xres x yres)
       M   = always present
       a   = aspect ratio (3 - 4:3; 4 - 5:4; 9 - 15:9, 16:9; A - 16:10)
      -R   = reduced blanking

      example:  .48M3-R - 800x600 with reduced blanking

注意:VESA(TM) 对什么是标准 CVT 时序有限制

  • 宽高比只能是上述值之一

  • 可接受的刷新率只有 50、60、70 或 85 Hz

  • 如果减少消隐,则刷新率必须为 60Hz

如果以上条件之一不满足,内核将打印警告,但仍将计算时序。


要查找合适的视频模式,您只需调用

int __init fb_find_mode(struct fb_var_screeninfo *var,
                        struct fb_info *info, const char *mode_option,
                        const struct fb_videomode *db, unsigned int dbsize,
                        const struct fb_videomode *default_mode,
                        unsigned int default_bpp)

其中 db/dbsize 是您的非标准视频模式数据库,或者 NULL 以使用标准视频模式数据库。

fb_find_mode() 首先尝试指定的视频模式(或任何匹配的模式,例如,可以有多个 640x480 模式,每个模式都会尝试)。如果失败,则尝试默认模式。如果失败,则遍历所有模式。

要在启动时指定视频模式,请使用以下启动选项

video=<driver>:<xres>x<yres>[-<bpp>][@refresh]

其中 <driver> 是下表中的名称。有效的默认模式可以在 drivers/video/fbdev/core/modedb.c 中找到。查看您的驱动程序文档。可能还有更多模式

Drivers that support modedb boot options
Boot Name     Cards Supported

amifb       - Amiga chipset frame buffer
aty128fb    - ATI Rage128 / Pro frame buffer
atyfb       - ATI Mach64 frame buffer
pm2fb       - Permedia 2/2V frame buffer
pm3fb       - Permedia 3 frame buffer
sstfb       - Voodoo 1/2 (SST1) chipset frame buffer
tdfxfb      - 3D Fx frame buffer
tridentfb   - Trident (Cyber)blade chipset frame buffer
vt8623fb    - VIA 8623 frame buffer

顺便说一句,目前只有少数 fb 驱动程序使用它。其他驱动程序将会跟进(欢迎发送补丁)。DRM 驱动程序也支持此功能。