在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

你可能感兴趣的:(linux)