2012年10月13日 星期六

把玩"魔術師" -- 編譯 HTC Kernel 原始碼


把玩"魔術師" -- 編譯 HTC Kernel 原始碼

This document is provided as is. You are welcomed to use it for non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

請勿轉貼
看其他教材

在編譯 AOSP 的原始碼過程中,我們可以清楚的知道,其編譯主要分成 kernel 的編譯以及 AOSP 平台的編譯;而 kernel 的編譯需要取得適當的 kernel 原始碼, 否則就算編譯成功,可能也會無法正常使用;而編譯 AOSP 的過程中,我們也需要 一些從之前的 ROM 中解出來的 .so 檔。(疑問:這些 .so 檔究竟在架構中是屬於 哪一塊?應該不是 device drivers,因為驅動程式的副檔名應該是 .ko 才對,那麼 這些 .so 檔究竟是架構圖中綠色的 libraries 還是 Android Runtime 系統的 藍色 Core Libraries?)


  • 從 logcat 來看,以 libGLES_qcom.so 為例,它是在 啟動 Android Runtime 時必定要載入的,所以好像是藍色的 core library;可是 libGLES_qcom.so 似乎又是綠色的 OpenGL ES 的 library。
kernel 的原始碼有許多版本,本文件以 HTC 釋出的 kernel 原始碼為主。 本文假設你懂一些 Linux 的基本概念,編譯 kernel 的過程都是在 Ubuntu/Linux 上執行 的,其步驟為:
  1. 你需要幫自己安裝一部執行 Linux 的電腦,AOSP 的文件建議使用 Ubuntu,而我安裝的是 Ubuntu 10.04 x86 32 bit 版。為了不影響平常的 使用,我是將 Ubuntu 安裝在一個名為 VirtualBox 的虛擬機器上;VirtualBox 是一套 Windows 的免費軟體,當在 VirtualBox 內執行 Ubuntu 的時候,電腦 基本上就同時執行 Windows 和 Ubuntu。當你將 Ubuntu 安裝完後,記得先用 "更新管理員"將所有軟體進行更新。
  2. 在編譯 kernel 原始碼之前,我們必須先安裝一些套件。這些步驟主要是參考 dferreira 發表的 [HOW-TO] Compile AOSP Froyo + [ROM] Latest AOSP Froyo for Sapphire
    1. /etc/apt/sources.list 檔案的最後加上下列兩行:
        deb http://pl.archive.ubuntu.com/ubuntu/ jaunty multiverse
        deb http://pl.archive.ubuntu.com/ubuntu/ jaunty universe
        
    2. 檔案修改完後,請執行下列指令來該新 apt 的資料庫:
        sudo apt-get update
        
    3. 請執行下列指令(只有一行)來安裝必要的軟體:
        sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev valgrind libreadline5-dev gcc-multilib g++-multilib libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline5-dev libz-dev
        
    4. 請在自己的家目錄($HOME)底下新增一個 bin 目錄,並將 repo 安裝到 bin 內。安裝後可以登出然後登入,剛安裝的 repo 就可以開始使用。
        cd ~
        mkdir bin
        curl http://android.git.kernel.org/repo >~/bin/repo
        chmod a+x ~/bin/repo
        
    5. 取得 AOSP,本文以 Android 2.2.1 為例,指令為:
        cd ~
        mkdir froyo
        repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2.1_r1
        repo sync
        
  3. 取得 kernel 的原始碼:HTC 的 kernel 原始碼都發佈於 HTC Developer Center。本文以 HTC Magic (Rogers) - Ecliar - 2.6.29 kernel source code 為範例,下載之後的檔案名稱為 sapphire-2.6.29-9cfb347e.tar.gz;請將該檔案 複製於 $HOME,並解壓縮;於解壓縮完成後,將目錄名稱更改為 kernel。指令如下所示:
      cd ~
      tar zxvf sapphire-2.6.29-9cfb347e.tar.gz
      mv sapphire-2.6.29-9cfb347e kernel
      
  4. 編譯 kernel 以及無線網路的驅動程式:這部分主要參考 編譯在G1上運行的android 2.2(froyo)代碼_正規版
    1. 先到 ~/kernel 目錄:cd ~/kernel
    2. 產生設定檔:make ARCH=arm CROSS_COMPILE=~/froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- sapphire_defconfig
      • 請注意: 依據 sapphire_defconfig





的設定所編繹出來的 zImage,在我測試的所有 AOSP Froyo 都會造成觸控螢幕無法正常運作;如果你也有 這樣的情形,請在本步驟完成後,修改 ~/kernel/.config 檔案內容(該檔案就是 這個步驟所產生的設定檔)。請將以下設定:
  CONFIG_TOUCHSCREEN_CONCATENATE_REPORT=y
  
改成
  #CONFIG_TOUCHSCREEN_CONCATENATE_REPORT is not set
  


  • 編譯 kernel:make ARCH=arm CROSS_COMPILE=~/froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
  • 到 ~/froyo/system/wlan/ti/sta_dk_4_0_4_32 編譯無線網路的驅動程式,指令為
      cd ~/froyo/system/wlan/ti/sta_dk_4_0_4_32
      make ARCH=arm CROSS_COMPILE=~/froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- KERNEL_DIR=~/kernel
      
  • 把新編譯的 kernel 和無線網路的驅動程式複製到適當的位置 -- ~/froyo/device/htc/sapphire/。指令為
      cp ~/froyo/kernel/arch/arm/boot/zImage ~/froyo/device/htc/sapphire/kernel
      cp ~/froyo/system/wlan/ti/sta_dk_4_0_4_32/wlan.ko ~/froyo/device/htc/sapphire/wlan.ko
      




  • Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

    沒有留言:

    張貼留言