Loading...

一般在成功移植 Linux kernel 且可以正常開機的情況下,執行 Android 會看不到 LCD 的顯示畫面,原因是 Android 需要 Double Framebuffer,所以我們必須先修改 Framebuffer driver 以獲得兩倍 Framebuffer 的記憶體,接著針對不同平台解決可能發生的問題。我們在 LCD 的部份遇到兩個問題:

  1. Double Framebuffer
  2. LCD 畫面閃爍

Double Framebuffer:
一般在 Embedded Linux System 下是透過 Framebuffer 的機制來控制 LCD 的顯示畫面,簡單地說 LCD 的顯示畫面即為 Framebuffer 的內容,Framebuffer 對記憶體的使用量如下:

Android 使用 Double Framebuffer,也就是在記憶體中存放兩倍 LCD 大小的畫面,我們猜測如此的設計不外乎是為了畫面的滑動、pre-draw 的機制、Swap Framebuffer 等效能上的考量,再加上 Framebuffer 對記憶體的使用量不大,所以Double Framebuffer 並不會對系統資源造成太大影響。以我們的實驗平台為例,原本Framebuffer 使用 320×240×16÷8B=153600B≒0.15MB 的記憶體,使用 Double Framebuffer 後約使用 0.3MB 的記憶體,但我們的 PXA270 是 2006~2007 年的產品,以目前的智慧型手機而言,0.3MB 的需求不會對系統資源造成太大影響。

針對 LCD 在 Android 的環境下無法顯示畫面的問題,Framebuffer Driver 必須向Linux kernel 要求兩倍 Framebuffer 的記憶體,如果一開始不知道從何修改且毫無頭緒,可以參考 Android Emulator 所使用的 Framebuffer Driver:linux-2.6.25-android-1.0_r1/drivers/video/goldfishfb.c。

LCD 畫面閃爍:
LCD 畫面閃爍的問題如下圖,由左至右每張圖像拍攝的時間間隔為 1 秒。LCD 畫面閃爍是因為 LCD controller 不斷重複地開關所造成,而其不斷重複地開關是因為 Framebuffer driver 中的 LCCR0(暫存器)設定值沒有同步,所以 LCD 的狀態不斷地切換所造成。

我們的解決方法是增加 fb_pan_display 函式以更改 LCD 的狀態。

PXA270 的 Framebuffer driver 為 linux-2.6.25-android-1.0_r1/drivers/video/pxafb.c。

Loading...