Monday, March 23, 2009

Android on x86

因為之後的需要,這兩天開始看起 android,尤其是在 x86 的情境。不過手邊沒有硬體可以用,打算先用模擬器測試。可能是 cupcake 在我動工的前兩天 merge 到 master 時的部份變更,雖然很快就編好 image,可以進到 console,但是 UI 起不來。又多花了一天時間才順利完工。



在 android 的 Get source 頁面有編譯 ARM 版本的方式。關於 android on x86,最重要的參考資料則是 這個討論串,利用 google 也可以找到更詳細的步驟。前面提到的 cupcake merge 同時造成了 opencore 的編譯問題,解法一樣要去看最開頭提到的 merge 到 master 討論串。不過我在 Debian testing (AMD64) 上做的時候,還需要先找到 build/core/combo/linux-x86.mk 的這兩行
$(combo_target)GLOBAL_CFLAGS := $($(combo_target)GLOBAL_CFLAGS) -m32
$(combo_target)GLOBAL_LDFLAGS := $($(combo_target)GLOBAL_LDFLAGS) -m32

把 -m32 參數拿掉,然後再多安裝 {gcc,g++}-multilib 套件。前者是說不要把 host binary 預設編成 32bit,後者則是讓某些在 Android.mk 又加上 -m32 的模組可以編譯成功。

一開始我是用 VirtualBox 2.1.4,不過因為 UI 起不來,想要用 adb 來除錯,所以後來改用 QEMU 0.10.0 (x86 版),並利用它的 -redir 功能讓 host 可以 adb 進去模擬出來的機器。給 QEMU 用的 kernel 有幾件事要注意一下:為方便起見,最好把
CONFIG_NE2K_PCI=y
CONFIG_FB_VESA=y
CONFIG_FRAMEBUFFER_CONSOLE=y

直接編進 kernel,並設定 vga=xxx。如果 kernel 跑到一半停住,並且在倒數幾行出現
MP-BIOS bug: 8254 timer not connected to IO-APIC

訊息,可以在 cmdline 加上 noapic 參數解決。

前面一直提到的 UI 問題可以參考這個 dirty patch 做修改。這樣應該就完成了。

Sunday, March 1, 2009

編譯 Wayland

Wayland 是一個極精簡的 display server。它是由 Kristian Høgsberg 在工作之餘所進行的實驗性計畫。與 X server 不同,Wayland client 要負責所有的繪圖動作,server 只處理最後的合成與顯示。這邊的繪圖動作還包含視窗邊框,這在 X 的世界裡是由 window manager 完成。

client 必須把它想顯示的畫面畫在 GEM buffer 上。GEM buffer 是 kernel 在管理的資源,它在不同的時間點可能會存在於不同的地方,例如它可能在系統記憶體或者是顯示卡的記憶體上。client 想要繪圖時可以利用 mmap 取得 GEM buffer 的指標,直接對它進行操作。client 與 server 的資料交換,圖形以外的部份是透過 unix socket;圖形部份因為使用 GEM buffer,server 可以直接取得。server 最後再透過 compositor 把 client 的畫面合成並顯示到螢幕上。

Wayland 還在早期的階段,這邊提到的編譯方法可能很快就不適用 (或被簡化)。編譯 Wayland 之所以困難,主要原因在於它用到的 git repository 不好找。先讓我們找到 DRM 並且安裝起來
$ git clone git://anongit.freedesktop.org/git/mesa/drm
$ cd drm
$ ./autogen.sh --prefix=/opt/gfx
$ make
$ make install
$ export PKG_CONFIG_PATH=/opt/gfx/lib/pkgconfig
$ export LD_LIBRARY_PATH=/opt/gfx/lib


再來安裝 Mesa 跟 DRI driver (這邊選用 i915)
$ git clone git://anongit.freedesktop.org/git/mesa/mesa
$ cd mesa
$ git remote add krh git://people.freedesktop.org/~krh/mesa
$ git fetch krh
$ git checkout -b eagle krh/eagle
$ ./autogen.sh --prefix=/opt/gfx --with-dri-drivers=i915 \
--disable-gallium --disable-glw --disable-glut --disable-glu \
--without-demos
$ make
$ make install


Wayland 會用到 udev 136 之後提供的 libudev,雖然這邊只安裝 libudev,但要注意它可能會覆蓋系統上本來的檔案
$ git clone git://git.kernel.org/pub/scm/linux/hotplug/udev.git
$ cd udev
$ ./autogen.sh
$ cd udev/lib
$ make
$ make install


Wayland 目前的 compositor 是採用 eagle 這個 EGL 實作
$ git clone git://anongit.freedesktop.org/~krh/eagle
$ cd eagle
$ autoreconf -vif
$ ./configure --prefix=/opt/gfx
$ make
$ make install
$ export EAGLE_DRIVER_PATH=/opt/gfx/lib/dri


大部份的 example client 用到了 cairo-drm,這是一個直接以 GEM buffer 為 surface backend 的 cairo 分支
$ git clone git://anongit.freedesktop.org/git/cairo
$ cd cairo
$ git remote add ickle git://anongit.freedesktop.org/~ickle/cairo
$ git fetch ickle
$ git checkout -b drm ickle/drm
$ ./autogen.sh --prefix=/opt/gfx --disable-xlib
$ make
$ make install


最後,Wayland
$ git clone git://people.freedesktop.org/~krh/wayland.git
$ cd wayland
$ autoreconf -vif
$ ./configure --prefix=/opt/gfx
$ make
$ make install


Wayland 需要 kernel modesetting 的支援 (linux kernel >= 2.6.29)。再克服這一關,一個晚上折騰的結果