ARMv4移植簡單教程: 相信國內(nèi)很多朋友手上都有s3c2410/2440的片子,基于armv4t(arm920t)的指令架構(gòu)。在之前,因?yàn)?strong>android的一些底層代碼含有armv5t的指令,所以以前無法移植到這樣的平臺(tái)。在這里也放出移植教程和已經(jīng)編譯好的image。讓更多的朋友可以在自己的開發(fā)板上親身體驗(yàn)android。教程基于勤研qt2410以及揚(yáng)創(chuàng)utu2440完成。
注意,移植是到armv4而不是armv4t, 原因應(yīng)該是不開thumb支持會(huì)比較好移植一些(改動(dòng)未涉及的庫依然會(huì)用thumb代碼,所以kernel依然要開thumb支持)。
kernel移植及nfs配置的詳細(xì)部分等請(qǐng)自行查閱相關(guān)文檔,本文只做提點(diǎn),另外需要些git的操作。
目前的image只是臨時(shí)方案。主要是基于openmoko的benno一些尚未正式發(fā)布的patch,整體來說已經(jīng)比較完善和clean,我僅做了點(diǎn)小修改就能使用,由于部分庫用c實(shí)現(xiàn)替換掉了arm實(shí)現(xiàn),同時(shí)一些critical的armv5指令被armv4的替換,速度可能有點(diǎn)慢,尤其是2410上速度很慢。。對(duì)于嚴(yán)苛的android開發(fā)組來說,這些patch部分尚未提交,部分在reviewing,還需要一些周期才會(huì)被接受進(jìn)官方git。等這些patch被官方接受后,我會(huì)整理另一套正式一些的版本,同時(shí)可能會(huì)提供些優(yōu)化方案。
本文引用地址:http://m.butianyuan.cn/article/201611/318992.htmA. kernel的移植
1. 移植,兩個(gè)方案可以選。
1). 將android的官方kernel的補(bǔ)丁打到自己的kernel上,這個(gè)方法對(duì)于kernel版本比較新的朋友比較合適,也很簡單。比如2.6.24或以上。
a. 下載android kernel,執(zhí)行 git diff v2.6.25 HEAD > android.patch
b. 進(jìn)入你自己的kernl,執(zhí)行 git apply android.patch
c. 一般都會(huì)出error,手動(dòng)合并所有帶error的文件,如果你是2.6.25的話很簡單,2.6.24會(huì)費(fèi)點(diǎn)周折,因?yàn)閗object/kset的一些改動(dòng)造成android power/ipv4等驅(qū)動(dòng)不太好合。。
2). 將自己kernel上的bsp移植到android官方kernel。適用于kernel比較舊的朋友。
因?yàn)?410/2440是linux原生支持,所以基本上只需要移植lcd/touchpanel/網(wǎng)卡等等的驅(qū)動(dòng),并打開2410/2440支持選項(xiàng)即可。
2. 這些步驟完成后,檢查如下選項(xiàng)是否都已經(jīng)打開(make menuconfig):
顯示代碼打印
1 CONFIG_AEABI=y
2 CONFIG_SHMEM=y
3 CONFIG_ASHMEM=y
4 CONFIG_ARM_THUMB=y
5 CONFIG_ANDROID_BINDER_IPC=y
6 CONFIG_ANDROID_LOGGER=y
以下不一定重要, 但能開就開,除非移植有問題,比如power驅(qū)動(dòng):
顯示代碼打印
1 CONFIG_ANDROID_POWER=y
2 CONFIG_ANDROID_POWER_STAT=y
3 CONFIG_ANDROID_POWER_ALARM=y
4 CONFIG_ANDROID_RAM_CONSOLE=y
5 CONFIG_ANDROID_TIMED_GPIO=y
6 CONFIG_ANDROID_PARANOID_NETWORK=y
3. 按需要make zImage,再生成uImage,燒寫到nand。
B. 制作android nfs root
1. 下載我做好的android_armv4 image包,見帖子下方
2. 準(zhǔn)備好能啟動(dòng)的nfs root,設(shè)置好訪問權(quán)限(重要?。?
3. 拷貝包中的system目錄到nfs_root/system, data目錄到nfs_root/data, root目錄到nfs_root/ (其他.img文件可以模擬器使用,同時(shí)也可以做真實(shí)文件系統(tǒng),后話了)
4. 設(shè)置nfs啟動(dòng)參數(shù)中的init=/init,既指向nfs_root下的init
5. 刪除nfs_root/init.rc,去掉除mount tmpfs tmpfs /sqlite_stmt_journals size=4m之外所有的mount命令
C. 運(yùn)行!
跑跑看吧,進(jìn)入android console之后可以運(yùn)行l(wèi)ogcat查看log。第一次啟動(dòng)會(huì)創(chuàng)建很多的數(shù)據(jù),會(huì)比較慢,2410幾乎是折磨了。。平常的啟動(dòng)速度2440大概在1分多鐘,2410要5分鐘了??吹狡恋拇笫直?,你就搞定了??!
常見問題:
1. lcd不顯示, 檢查framebuffer..如果正常,查看nfs權(quán)限。
2. 非法指令,檢查thumb,eabi選項(xiàng)。
3. servicemanager異常退出,檢查binder & ashmem選項(xiàng)。
其他的看kernel log和logcat自己分析吧.
評(píng)論