移植Andorid4.0.4 - 步驟及問題匯總


+  華清遠見 -  MichaelTang

--------------------------------------------------------------------------------------------------------------------------------

開發板: FS100

  CPU:  S5PC100,800Mhz,A8

  MEM:256Mb

  NAND: 256Mb

  LCD:4.3

Android4.0.4源碼:

 linaro-android-12.06-release for origen

由於s5pc100官方只給出Android2.1的release版本,沒有最新版本的,所以只能自己移植。

--------------------------------------------------------------------------------------------------------------------------------

1. 通過git下載源碼

2. 設置編譯環境為origen-eng

3. 修改device里的BoardConfig.mk

    # 不編譯內核和Uboot(默認編譯會將Uboot和zImage一起編譯出來)

    # 去掉支持SMP(A8是單核)

    # 去掉硬件加速和Gator的arm調試服務

4. 編譯

  由於android4.0.4 for origen是使用的CPUExynos 4210的獵戶座CPU,該CPU是A9的,支持SMP和Mali-400 GPU,所以內核我們要自己進行重新編譯針對S5PC100。

5. 編譯內核

  使用s5pc100的默認配置,編譯內核,注意加上android的必要驅動。

  Android驅動:
  # Android Binder:基於openBinder框架的驅動,進程間通信底層主要驅動,沒有了它,android無法工作。
  # Andorid Logger:是一個輕量級的日志系統,在內核里是misc設備驅動,它與logcat配合實現調試。
代碼:driver/staging/android/logger.c
  # Andorid Lowmemorykiller:低內存管理器,是linux標准OOM(Out Of Memory)改進版,當系統內存不足時,會殺掉一些不重要的進程,釋放空間。
代碼:driver/staging/android/lowmemorykiller.c
  # Android Ram Console ram_console:輔助調試的內核機制,它用一段物理內存虛擬一個console設備,這樣printk的時候會把調試信息寫一份到這塊ram,最后通過/proc文件系統輸出。
  #Android Timed Device timed_gpio:基於platform driver 實現的一個增強的gpio驅動,它與內核定時器綁定在了一起,實現了一種時鍾控制的gpio
通過sysfs操作gpio,可以讓gpio輸出高、低電平,同時也可以指定一個定時器過期時間,當超時的時候,會去執行一個callback函數。目前支持vibrator和LED設備
對應代碼:driver/staging/android/timed_gpio, time_output,對應文件系統(sys/class/timed_output/<dev_name>/enable)
  # Androd Switch:它是android新引進的驅動,用於檢查一些開關量,如耳機插入,USB設備插入,在sysfs里創建對應的entry(sys/class/switch/<dev_name>/stat),用戶通過sysfs與之進行交互,同時,也可以使用uevent機制與其交互。
  設備文件沒有讀寫權限,沒有加載對應的uevent.rc啟動腳本文件(該腳本 文件為android的設備進行權限設置的)
對應代碼:driver/switch/*
  # Android Power Manager:基於標准linux電源管理系統的輕量級電源管理驅動
代碼:kernel/power/*
  # Android Ashmem:匿名共享內存,為進程間提供大塊共享內存,同時為內核提供回收和管理這些內存的機制。
代碼:mm/ashmem.c
  # Android PMEM:用於向用戶空間提供連續的物理內存,DSP和其它需要連續物理內存的設備需要它的提供服務。
代碼:driver/misc/pmem.c
  # Android alarm:提供一個定時器用於把設備從睡眠狀態喚醒,同時它也提供了一個即使在設備睡眠時也會運行的時鍾基准。
代碼:driver/rtc/alarm.c
  # USB Gadget:一個基於標准Linux USB gadget驅動框架的設備驅動,Android的USB驅動是基於gadget框架的。
代碼:driver/usb/gadget/   
  # Yaffs2文件系統:Android采用Yaffs2作為 MTD Nandflash文件系統。

 平台設備

  網卡:dm9000

      http://www.cnblogs.com/mr-raptor/archive/2012/07/08/2581716.html

  LCD:顯示

編譯出內核來,將其放到tftp目錄下,等待使用。

6. 制件根文件系統

   使用nfs掛載

       # 將out/target/product/origen/root里的內容拷貝到 nfs_root(根文件系統目錄)

       # 將out/target/product/origen/system拷貝到 nfs_root下

7. 測試文件系統:
  # 能否掛上nfs ?不能的話,看下內核配置,網絡, nfs root等
  # 將init.rc的loglevel改為最低級7,目的是為了查看輸出信息
  # 能否啟動init進程,如果看到常見的: Kernel panic no syncing kill init,很有可能是內核配置有錯誤。這個時候,先將自己編譯的內核掛一個裸文件系統(只有busybox命令和基本庫和命令行的fs),通過chroot掛我們的android文件系統,如果出錯,可以通過strace來跟蹤,查看原因。
  # 能否出現sh console?不能的話:在init.rc里將要跟蹤的服務加上strace 查看,如:
    serice sh /system/bin/strace -f -F -o log /system/bin/sh
    注: 一般strace在android里是沒有這個命令的,要自己交叉編譯出來,見xx章節,-f -F是指,strace命令跟蹤當前程序創建出來的子進程,-o log,是指將跟蹤信息輸出到log文件里。

  # 在sh里輸入logcat ,來查看打印出來的log,分析android的本地服務是否正常啟動?

    注:
本地服務全部段錯誤異常退出,通過strace來跟蹤查看什么原因造成的段錯誤  (最難調試的錯誤之一)
常見原因:
  > NEON沒有開啟
init執行時,顯示非法指令。
  > 必要驅動沒有安裝,設備文件不存在,不能打開指定的設備,不能提供服務,如:binder等android必須依賴的驅動沒有安裝(見前面列出的android必要驅動)
  > surfaceflinger自動重啟
  通常,硬件加速的代碼是廠商提供的,一般是不開源的,所以你如果能拿到指定版本的硬件加速代碼,可以開啟硬件加速,如果沒有對應版本的硬件加速代碼,則只能使用超慢的軟加速。
而Android系統默認會去system/lib/egl下去讀取egl.cfg配置文件,里面0 0 android是使用軟件加速,  0 1 xxx是表示硬件加速。如果沒有硬件加速代碼,將 0 1 xxx這行注釋掉,雖然我有android2.1硬件代碼庫,但是不能用在Android4.0.4上面。

  > 沒有Android字樣顯示
在ANDROID_SRC/system/core/init/init.rc里,查找load_565rle_image函數,將其后面注釋的代碼去掉,然后在mmm編譯init,拷貝到nfs_root中。

  > 沒有Android動畫
確認init.rc里有沒有關閉bootanim本地服務

  > 看不到Android桌面
通過logcat查看surfaceflinger,看其是否正常啟動,查看ActivityManger有沒有啟動Launcher


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM