+ 華清遠見 - 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文件系統。
平台設備:
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