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) 协调视频时序 (Coordinated Video Timings) 进行计算,而不是从表中查找模式。如果指定了“R”,则对数字显示器进行“减少消隐”(reduced blanking) 计算。如果指定了“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) 批准的关于视频时序的第三个标准。第一个是离散视频时序 (Discrete Video Timings, DVT),它是由 VESA(TM) 批准的一系列预定义模式。第二个是通用时序公式 (Generalized Timing Formula, 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 赫兹

  • 如果采用减少消隐,刷新率必须为 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 驱动程序也支持此功能。