什麼是 udlfb?¶
這是 DisplayLink USB 2.0 時代圖形晶片的驅動程式。
DisplayLink 晶片提供簡單的 hline/blit 操作和一些壓縮,並將其與 USB 線另一端的硬體幀緩衝區 (16MB) 配對。該硬體幀緩衝區能夠驅動 VGA、DVI 或 HDMI 監視器,無需 CPU 干預,直到像素髮生變化。
CPU 或其他本地資源執行所有渲染;可以選擇將結果與遠端硬體幀緩衝區的本地陰影進行比較,以識別已更改的最小畫素集;並透過 USB 批次傳輸逐行壓縮和傳送這些畫素。
由於批次傳輸的效率以及頂部不需要任何確認的協議,因此效果是非常低的延遲,可以支援非常高的解析度,並在非遊戲和非影片應用程式中具有良好的效能。
模式設定、EDID 讀取等是其他批次或控制傳輸。 模式設定非常靈活 - 能夠從任何時序設定幾乎任意模式。
通用 USB 圖形的優勢
能夠為任何支援 USB 2.0 的系統新增幾乎任意數量的顯示器。 在 Linux 上,顯示器數量受 fbdev 介面限制(FB_MAX 目前為 32)。 當然,同一主機控制器上的所有 USB 裝置共享相同的 480Mbs USB 2.0 介面。
使用核心幀緩衝區介面支援 DisplayLink 晶片的優勢
DisplayLink 晶片的實際硬體功能幾乎與 fbdev 介面一一對應,使得驅動程式相對於其提供的功能而言非常小巧緊湊。
X 伺服器和其他應用程式可以使用使用者模式下的標準 fbdev 介面與裝置通訊,而無需瞭解任何關於 USB 或 DisplayLink 協議的資訊。 “displaylink” X 驅動程式和略作修改的“fbdev”X 驅動程式都已在其中。
缺點
Fbdev 的 mmap 介面假設映射了真實的硬體幀緩衝區。 對於 USB 圖形,它只是一個分配的(虛擬)緩衝區。 寫入需要被 CPU 檢測並編碼為 USB 批次傳輸。 準確的損壞/更改區域通知可以解決此問題。 未來,希望 fbdev 能夠增強一個小型的標準介面,以允許 mmap 客戶端報告損壞,從而使虛擬或遠端幀緩衝區受益。
Fbdev 不能很好地仲裁客戶端對幀緩衝區的擁有權。
Fbcon 假設它找到的第一個幀緩衝區應該被控制檯佔用。
鑑於 KMS/DRM 的興起,目前尚不清楚 fbdev 的未來是什麼。
如何使用它?¶
Udlfb 作為模組載入時,將匹配所有 USB 2.0 代 DisplayLink 晶片(Alex 和 Ollie 系列)。 然後它將嘗試讀取監視器的 EDID,並在 DisplayLink 裝置和監視器的功能之間設定最佳通用模式。
如果 DisplayLink 裝置成功,它將繪製一個“綠屏”,這意味著從硬體和 fbdev 軟體的角度來看,一切都很好。
此時,將存在一個 /dev/fb? 介面,供使用者模式應用程式開啟並使用標準 fbdev 呼叫開始寫入 DisplayLink 裝置的幀緩衝區。 請注意,如果使用 mmap(),預設情況下,使用者模式應用程式必須傳送損壞通知才能觸發已更改區域的重繪。 或者,可以重新編譯 udlfb 並啟用實驗性 defio 支援,以支援基於頁面錯誤的檢測機制,該機制可以在沒有顯式通知的情況下工作。
udlfb 最常見的客戶端是 xf86-video-displaylink 或修改後的 xf86-video-fbdev X 伺服器。 這些伺服器沒有真正的 DisplayLink 特定程式碼。 它們寫入標準幀緩衝區介面,並依靠 udlfb 來完成其工作。 它們具有的一個額外功能是能夠透過 udlfb 的損壞介面(希望將其標準化為所有需要損壞資訊的虛擬幀緩衝區)將 X DAMAGE 協議擴充套件中的矩形報告給 udlfb。 這些損壞通知允許 udlfb 有效地處理已更改的畫素。
模組選項¶
通常不需要 udlfb 的特殊配置。 但是,有一些選項。
從命令列,將選項傳遞給 modprobe
modprobe udlfb fb_defio=0 console=1 shadow=1
或者透過編輯 /sys/module/udlfb/parameters/PARAMETER_NAME 動態更改選項
cd /sys/module/udlfb/parameters
ls # to see a list of parameter names
sudo nano PARAMETER_NAME
# change the parameter in place, and save the file.
拔下/重新插入 USB 裝置以應用新設定。
或者要永久應用選項,請建立一個 modprobe 配置檔案,例如帶有文字的 /etc/modprobe.d/udlfb.conf
options udlfb fb_defio=0 console=1 shadow=1
接受的布林選項
fb_defio |
使用 fb_defio (CONFIG_FB_DEFERRED_IO) 核心模組透過頁面錯誤跟蹤幀緩衝區的已更改區域。 使用 mmap 但不報告損壞的標準 fbdev 應用程式應該能夠啟用此功能。 當與支援透過 ioctl 報告已更改區域的 X 伺服器一起執行時停用,因為此方法更簡單、更穩定且效能更高。 預設值:fb_defio=1 |
控制檯 |
允許 fbcon 連線到 udlfb 提供的幀緩衝區。 如果 fbcon 和其他客戶端(例如帶有 --shared-vt 的 X)發生衝突,則可以停用。 預設值:console=1 |
陰影 |
分配第二個幀緩衝區來陰影當前透過 USB 匯流排在裝置記憶體中的內容。 如果任何畫素未更改,則不傳輸。 花費主機記憶體以節省 USB 傳輸。 預設啟用。 僅在極低記憶體系統上停用。 預設值:shadow=1 |
Sysfs 屬性¶
Udlfb 在 /sys/class/graphics/fb? 中建立多個檔案,其中 ? 是特定 DisplayLink 裝置的連續幀緩衝區 ID
edid |
如果將有效的 EDID blob 寫入此檔案(通常透過 udev 規則),則 udlfb 將使用此 EDID 作為備份,以防讀取連線到 DisplayLink 裝置的監視器的實際 EDID 失敗。 這對於無法透過 EDID 傳達其功能的固定面板等特別有用。 讀取此檔案將返回連線的監視器的當前 EDID(或最後寫入的備份值)。 這對於獲取連線的監視器的 EDID 非常有用,可以將其傳遞給諸如 parse-edid 之類的實用程式。 |
metrics_bytes_rendered |
呈現的畫素位元組的 32 位計數 |
metrics_bytes_identical |
基於陰影幀緩衝區檢查,發現有多少位元組未更改的 32 位計數 |
metrics_bytes_sent |
透過 USB 傳輸以將生成的已更改畫素傳達給硬體的位元組的 32 位計數。 包括壓縮和協議開銷 |
metrics_cpu_kcycles_used |
處理上述畫素使用的 CPU 週期(以千個週期為單位)的 32 位計數。 |
metrics_reset |
僅寫。 寫入此檔案的任何內容都會將上述所有指標重置為零。 請注意,上面的 32 位計數器會非常快速地翻轉。 要獲得可靠的結果,請設計效能測試以在非常短的時間內(一分鐘或更短時間是安全的)開始和結束。 |
Bernie Thompson <bernie@plugable.com>