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 驅動程式也支援此功能。