November 12, 2008

fbvncserver : 將 Linux framebuffer 作為輸出的 VNC server

日前在調整 LCD panel / controller 的 Linux device driver 時,因疑似 panel 硬體處理不善,導致無法釐清問題是發生於軟體層面,抑或潛在的硬體議題,於是需要觀察 /dev/fb* 的內容,將腦筋動到 VNC 上面,最後做了一個小工具 fbvncserver,將 Linux framebuffer 作為輸出的 VNC server。

參與 OpenEZX 專案時,Harald Welte 寫了一個小工具 [fbgrab-viewer],原理是透過在標的裝置 (target) 端執行 [fbgrab],不斷將從 Linux frambuffer 擷取的影像,經由轉換,傳輸到桌面 (host) 端的 viewer,即可監控裝置端的畫面,當然,實際上得考慮傳輸的間隔,所以大概是每五秒傳輸一張。這個小工具在我們早期進行 Openmoko 硬體驗證時,仍派上用場,不過,問題是間歇性的擷取與轉換影像為 PNG 圖檔,還是太沈重。而過去 Sharp Zaurus Linux PDA 上,有個 [fbVNCServer] 工具,則巧妙地建立一個 VNC server,將 Linux framebuffer 作為輸出,允許桌面端瀏覽與操控 PDA 的畫面,看似很理想,但這個軟體太依賴 Zaurus PDA 的硬體組態,本身也有點複雜,也沒有維護,所以乾脆弄個新專案。

同樣透過 [LibVNCServer] 來建構 VNC server,大幅減輕工作量,雛型實做可參考 [fbvncserver.c],授權方式為 GNU GPL,參考的執行畫面如下:

上圖主要的畫面是 TightVNC client,視窗標題列的 AG101 則為我的裝置端名稱,當 VNC server 啟動時,終端機會有以下輸出:
/tmp # ./fbvncserver
Initializing framebuffer device /dev/fb0...
xres=800, yres=480, xresv=800, yresv=480, xoffs=0, yoffs=0, bpp=16
Initializing Framebuffer VNC server:
        width:  800
        height: 480
        bpp:    16
        port:   5900
Initializing server...
07/11/2008 14:00:24 Listening for VNC connections on TCP port 5900
這裡裝置端的 IP 為 10.0.4.80,而桌面端為 10.0.4.78,現在後者的 VNC client 試圖連線到前者的 fbVNCserver,會看到以下的終端機訊息更新:
07/11/2008 14:00:31 Got connection from client 10.0.4.78
07/11/2008 14:00:31   other clients:
07/11/2008 14:00:31 Client Protocol Version 3.8
07/11/2008 14:00:31 Protocol version sent 3.8, using 3.8
Dirty page: 70x80+6+0...                                                                 
07/11/2008 14:00:31 rfbProcessClientSecurityType: executing handler for type 1
07/11/2008 14:00:31 rfbProcessClientSecurityType: returning securityResult for client rf8
07/11/2008 14:00:31 Pixel format for client 10.0.4.78:
07/11/2008 14:00:31   32 bpp, depth 24, little endian
07/11/2008 14:00:31   true colour: max r 255 g 255 b 255, shift r 16 g 8 b 0
07/11/2008 14:00:32 Using compression level 1 for client 10.0.4.78
07/11/2008 14:00:32 Using image quality level 6 for client 10.0.4.78
07/11/2008 14:00:32 Enabling X-style cursor updates for client 10.0.4.78
07/11/2008 14:00:32 Enabling full-color cursor updates for client 10.0.4.78
07/11/2008 14:00:32 Enabling cursor position updates for client 10.0.4.78
07/11/2008 14:00:32 Enabling LastRect protocol extension for client 10.0.4.78
... (略) ...
這些訊息是由 [LibVNCServer] 所輸出,表示 VNC/RFB session 已正確建立與運作。目前的實做假設裝置端的 bpp 為 16-bit (RGB565),在多數的硬體裝置應算堪用,當然,任何修改與 patch 都非常歡迎 :-)
由 jserv 發表於 November 12, 2008 11:37 AM
迴響
發表迴響









記住我的資訊?