在linux上移植xserver、tslib、gtk和桌面系統(用buildroot)

一、首先先說下framebuffer、xserver、tslib、gtk和桌面這五者之間的聯繫,
1、framebuffer 即linux系統的一塊內存區域,往這塊區域寫東西屏幕就會有所顯示。對應的設備文件是dev/fb0 。

2、xserver 一般所在目錄叫X11,對應的可執行程序叫Xorg,是作爲服務器,圖形界面相當於客戶端,上層圖形程序運行時會先告訴
xserver,xserver再告訴framebuffer。frambuffer纔是最終的畫圖的。其中gtk界面既可以依賴xserver也可以不依賴(直接基於directfb),(buildroot默認是依賴配置)QT不依賴xserver,但是桌面程序必須要用xserver。

3、tslib 通常作爲觸摸屏驅動的適配層,爲上層的應用提供了一個統一的接口。,介於xserver和屏幕驅動之間,有了這個庫xserver才能和內核驅動交互。

4、gtk 是一種圖形用戶界面(GUI)工具包。也就是說,它是一個庫(或者,實際上是若干個密切相關的庫的集合)

5、桌面系統
kde與gnome項目擁有相同的目標,就是爲Linux開發一套高價值的圖形操作環境,不同之處在於kde基於雙重授權的Qt,而GNOME採用遵循 GPL的gtk庫開發—後者擁有更廣泛的支持。KDE包含大量的應用軟件、項目規模龐大,因爲沒有太多的第三方開發者爲 KDE開發重量級軟件;由於自帶軟件衆多,KDE比GNOME豐富多彩。但KDE的毛病在於運行速度 相對較慢,且部分程序容易崩潰(當然整個KDE崩潰的情況極少出現)。GNOME項目專注於桌面環境本身,由於軟件較少、運行速度快,且穩定性相當出色,GNOME已經成爲Novell、RedHat企業發行版的默認桌面,更偏向於商 務領域;而豐富多彩的KDE有朝向家用和娛樂方向發展的趨勢,它比GNOME顯然更有趣味性一些。

綜合所述:從底層到上層各個調用關係爲
cpu——>(GPU2d/3d加速(幾個庫))——>framebuffer ——>tslib ——>xserver ——>gtk /qt——>gnome/kde

二、xserver移植流程
在buildroot中執行make xconfig
按Ctrl + F 搜索並選上以下10項
1、X.org X Window System
2、xorg-server
3、Modular X.org
4、Xvfb server
5、xterm
6、xvkbd
7、xinit
8、xhost
9、xset
10、libXcomposite
保存並退出,開始編譯。
啓動xserver進程的命令是在文件系統usr/bin/下的Xorg,
在終端終端上執行Xorg &(後臺運行) 即可。

三、tslib移植
tslib 分爲QT的tslib和directfb的tslib以及xf86-input-tslib。
其中xf86-input-tslib既是xserver要用的庫,我們選上它就行。
編譯,文件系統起來後還是執行Xorg & 命令,執行這個命令的過程中會去加載tslib這個模塊。
在/var/log/Xorg.0.log 中會看到具體的打印信息,

LoadModule: "tslib"
Loading /usr/lib/xorg/modules/input/tslib_drv.so
Module tslib: vendor="X.Org Foundation"
compiled for 1.10.0, module version = 0.0.1
Module class: X.Org XInput Driver
ABI class: X.Org XInput driver, version 12.2

如果失敗是打印如下信息

(II)UnloadModule: "tslib"
(II) Unloading tslib
(EE) Failed to load module "tslib" (module does not exist, 0)
(EE) No input driver matching `tslib'

(EE) module ABI major version (12) doesn't match the server's version (20)

由於我用的buildroot裏的自帶的庫,發現xserver的庫的版本是
xorg-server-1.15.1.tar.bz2 而tslib是xf86-input-tslib-0.0.6.tar.bz2 經過百度tslib的庫2009年就不再更新,0.06已經是最新的版本,而xserver卻一直更新,並且在以後的更新中把有關tslib的一些接口函數在xserver中去掉了
(這點可以在xserver_xorg-server-1.15.1/ChangeLog 中可以找到記錄改動的信息),導致我一直報Unloading tslib。百度補丁移植沒找到,乾脆就把xserver的版本降低,百度下降到1.10版本即可。下載網址爲
http://lists.freedesktop.org/archives/xorg-announce/2011-February/001612.html
這樣和tslib的接口就對應上了,把下下來的壓縮包放在/dl下並改名爲xorg-server-1.15.1.tar.bz2,(buildroot配置是編譯1.15版的包,由於不會改配置就將就把1.10的包名改爲1.15)在編譯過程中會報錯

 sdksyms.c:1037:15: error: 'screenSaverSuspended' undeclared here (not in a function)
  sdksyms.c:1056:15: error: 'noGlxExtension' undeclared here (not in a function)
  sdksyms.c:1057:15: error: 'noScreenSaverExtension' undeclared here (not in a function)
  sdksyms.c:1063:15: error: 'noXFree86DRIExtension' undeclared here (not in a function)
 sdksyms.c:1068:15: error: 'noDRI2Extension' undeclared here (not in a function)

解決辦法在output/build/xserver_xorg-server-1.15.1/ 下
find -name sdksyms.c 把函數都註釋掉即可。
接着編譯報錯:

  make: *** [/home/snmu/buildroot/buildroot/output/build/xserver_xorg-server-1.15.1/.stamp_built] Error 2
 make: *** [/home/snmu/buildroot/buildroot/output/build/xserver_xorg-server-1.15.1/.stamp_staging_installed] Error 2
 make: *** [/home/snmu/buildroot/buildroot/output/build/xserver_xorg-server-1.15.1/.stamp_target_installed] Error 2 

缺少一些隱藏文件,怎麼辦呢?從原來buildroot編好的xserver_xorg-server-1.15.1/ 中拷貝過來即可(注意把之前默認的配置編譯出的build目錄改名保存好)。之後再報類似,缺什麼拷貝什麼就行。至於爲什麼這些文件出錯,可能還是跟buildroot的一些默認配置有關。
編譯成功後,把buildroot/output/images/rootfs.ext2 燒錄到板子上。接着執行Xorg & 命令,會報fbdev的錯誤

(II)UnloadModule: "fbdev"
 module ABI major version (12) doesn't match the server's version (20)

原因是fbdev的庫接口與xserver對不上,也就是說fbdev也得降低版本,原來是xdriver_xf86-video-fbdev-0.4.4,去網上下載
xf86-video-fbdev-0.3.0.tar.bz2,接下來改名編譯。因爲我只用到觸屏,而執行Xorg 只默認是加載mouse(鼠標)和kbd(鍵盤),慢慢淡化了觸屏功能,
所以需要在output/target/etc/X11/下 添加一個自己自定義的xorg.conf 配置文件,至於怎麼寫需要根據自己的硬件環境,下面給出參考鏈接

http://wenku.baidu.com/link?url=3wWq6B6-rawMIM4kpUc_tpPFLRlzFLNAkkBIl324Du-ZbKJXT5anmMsvjGqpj1sKI6-pn-RNwD8M5OPZDz742Q0571DdscPIOEgpNBk6UpC

我自己的xorg.conf,僅供參考

  1 Section "Device"                                                                                                                         
  2  Identifier "Framebuffer"
  3  Driver  "fbdev"
  4  Option  "fbdev"  "/dev/fb0"
  5 EndSection
  6 
  7 Section "Monitor"
  8  Identifier "Generic Monitor"
  9  ModelName    "Monitor Model"
 10 DisplaySize 480 800
 11 EndSection
 12 
 13 Section "Screen"
 14  Identifier "Default Screen"
 15  Device  "Framebuffer"
 16  Monitor  "Generic Monitor"
 17 EndSection
 18 
 19 Section "InputDevice"
 20        Identifier  "Touchpad0"
 21        Driver      "tslib"
 22        Option "CorePointer"
 23        Option "Protocol" "Auto"
 24        Option "Device" "/dev/input/event0"
 25 EndSection
 26 
 27 Section "ServerLayout"
 28  Identifier "Default Layout"
 29  Screen  "Default Screen"
 30  InputDevice  "Touchpad0"  
 31 EndSection
 32 
 33 Section "Module" 
 34 Load    "tslib"
 35 EndSection 

下面還有一個錯誤信息,具體原因沒查出來。

 (EE) FBDEV(0): FBIOPUT_VSCREENINFO succeeded but modified mode
 (EE) FBDEV(0): mode initialization failed                                                                                                
 Fatal server error:AddScreen/ScreenInit failed for driver 0

在buildroot/output/build/xserver_xorg-server-1.15.1/
執行

 grep "FBIOPUT_VSCREENINFO succeeded" -rn .

會找到信息出處
./hw/xfree86/fbdevhw/fbdevhw.c:486
把下面的return false 註釋掉即可。
如果報這樣的錯誤信息:

tslib: Selected device is not a touchscreen (must support ABS and KEY event types)

原因是kernel 的配置問題

四、gtk 移植
buildroot需要選的有
(1)gtk engines
(2)hicolor
(3)libgtk2
(4)Install libgtk2 demo program
選上編譯即可,這步需要聲明環境變量 export DISPLAY=:0
否則會報 錯誤 Gtk-WARNING **: cannot open display:
(報這個錯誤一般是兩種情況,一是環境變量,二是xserver進程沒起來)
運行gtk-demo 可以測試gtk環境是否搭建好。這時gtk例子界面不太正常,字體是框框,界面只顯示一半,下面給出解決方法。

五、桌面
在buildroot中選上
(1)MatchBox Window Manager
(2)Matchbox session common files
(3)PDA style desktop folders
(4)Matchbox Desktop
(5)Matchbox Panel
編譯燒錄,執行matchbox-window-manager & 命令,
有了這個程序,gtk界面就可以正常顯示了,執行matchbox-desktop 可以顯示buildroot提供的桌面例子。
在/buildroot/system/ingenic/dorado/etc/init.d/rcS 中添加以下兩行命令,在system/ingenic/dorado/etc/profile 中添加
export DISPLAY=:0 即可。這兩個文件最終會被編譯到target中。

/usr/bin/gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
/usr/bin/pango-querymodules > /etc/pango/pango.modules

開機啓動後先執行 ts_calibrate命令,進行屏幕五點校準。否則觸屏會不準,校準完後重新啓動系統,再執行Xorg & ,matchbox-window-manager &,gtk-demo

發佈了35 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章