Acer Stream Kernel on Github
Posted by tjwei on 星期一, 12月 05, 2011 with 5 comments
https://github.com/tjwei/acer-stream-minimal-kernel
時間回到我寫 Porting custom rom to Acer Stream 的時候,由 Acer 的官方 Stream 的 kernel source 來看, Acer 的 kernel 像是從 msm-eclair_chocolate 改來的,但不確定是哪個 commit 改來的。我大致上比較了一下,看起和 msm-57e7a9f 差不多,外加一些 patch。
所以如果你只是要自行編譯 stream 的 kernel,只需抓回並解開 msm-57e7a9f,然後把 acer 的 source 覆蓋上去,然後執行
make acer-q8k-a3-dvt_defconfig && make -j12 即可。
當時 msm-eclair_chocolate 最新的 master 版本是 eea0918,我試著把 57e7a9f 和 acer 官方 kernel 的差異補回 eea0918,功能似乎完全也正常。現在放在 github 上的 fullpatch 這個 branch 上。
由於這次的成功,所以我如法泡製,修改某 msm-froyo 版本。但由於版本差異過大,無法成功開機。
所以我退回比較安全的策略:先試著找出關鍵的差異,我把 fullpatch 這版本的 patch 慢慢還原退回到原版的 eea0918,但仍然要保持 stream 能開機到 recovery mode,只保留顯示和 adb usb driver。
最後得到一個 diff 只和 eea0918 差 1000 行左右的版本。這個版本目前放到 github 的 master branch 上。
我的下一步是將這 1000 行差異 merge 到新一點的 kernel,先從 2.6.32 開始,然後到 gingerbread 的 kernel 上。
可惜小孩出生之後,幾乎沒有可以連續專心兩小時以上的閒暇時間了。事實上我希望差異能比 1000 行更少,但是當時已經沒有時間了,更不要說補回 新 kernel 上。
先把 kernel 放上,有需要的人可以自行取用。
當然也可以用已經可開機的 2.6.29 kernel, 然後想辦法補回 gingerbread 需要的功能。這樣可能比較簡單。不過因為我想對 android kernel 有一些比較深刻的了解,而且我當時不曉得時間會這麼少,所以選擇了上面的方式。
當你手上有 kernel 之後,有哪些可以改的地方?第一個是改 vmsplit_2g 的選項。因為標準的 AOSP 或者 cm rom,這個選項要關閉。
第二個是改顯示設定。stream kernel 預設的 bpp 是 32,而且 frame buffer 的 api 也不正常,要呼叫特別的 hdmi 相關 api。要用普通 bpp=16 的 rom,你要改 drivers//video/msm/lcdc_samsung.h
只要改兩個地方,一個是
#define FB_XRES 改成 480
一個是
#define VINFO_BPP 改成 16
當你編譯好 vmlinuz 後,可以在 bootloader 模式下用下面的指令試試看
最後附上解開 acer 官方 bin firmware 的 python 程式碼。
時間回到我寫 Porting custom rom to Acer Stream 的時候,由 Acer 的官方 Stream 的 kernel source 來看, Acer 的 kernel 像是從 msm-eclair_chocolate 改來的,但不確定是哪個 commit 改來的。我大致上比較了一下,看起和 msm-57e7a9f 差不多,外加一些 patch。
所以如果你只是要自行編譯 stream 的 kernel,只需抓回並解開 msm-57e7a9f,然後把 acer 的 source 覆蓋上去,然後執行
make acer-q8k-a3-dvt_defconfig && make -j12 即可。
當時 msm-eclair_chocolate 最新的 master 版本是 eea0918,我試著把 57e7a9f 和 acer 官方 kernel 的差異補回 eea0918,功能似乎完全也正常。現在放在 github 上的 fullpatch 這個 branch 上。
由於這次的成功,所以我如法泡製,修改某 msm-froyo 版本。但由於版本差異過大,無法成功開機。
所以我退回比較安全的策略:先試著找出關鍵的差異,我把 fullpatch 這版本的 patch 慢慢還原退回到原版的 eea0918,但仍然要保持 stream 能開機到 recovery mode,只保留顯示和 adb usb driver。
最後得到一個 diff 只和 eea0918 差 1000 行左右的版本。這個版本目前放到 github 的 master branch 上。
我的下一步是將這 1000 行差異 merge 到新一點的 kernel,先從 2.6.32 開始,然後到 gingerbread 的 kernel 上。
可惜小孩出生之後,幾乎沒有可以連續專心兩小時以上的閒暇時間了。事實上我希望差異能比 1000 行更少,但是當時已經沒有時間了,更不要說補回 新 kernel 上。
先把 kernel 放上,有需要的人可以自行取用。
當然也可以用已經可開機的 2.6.29 kernel, 然後想辦法補回 gingerbread 需要的功能。這樣可能比較簡單。不過因為我想對 android kernel 有一些比較深刻的了解,而且我當時不曉得時間會這麼少,所以選擇了上面的方式。
當你手上有 kernel 之後,有哪些可以改的地方?第一個是改 vmsplit_2g 的選項。因為標準的 AOSP 或者 cm rom,這個選項要關閉。
第二個是改顯示設定。stream kernel 預設的 bpp 是 32,而且 frame buffer 的 api 也不正常,要呼叫特別的 hdmi 相關 api。要用普通 bpp=16 的 rom,你要改 drivers//video/msm/lcdc_samsung.h
只要改兩個地方,一個是
#define FB_XRES 改成 480
一個是
#define VINFO_BPP 改成 16
當你編譯好 vmlinuz 後,可以在 bootloader 模式下用下面的指令試試看
fastboot -n 4096 -b 20000000 -c "console=null hw_ver=4 amss_ver=A3-01.00.01 androidboot.serialno=JB0831B00130 g_android.serial_number=JB0831B00130 androidboot.baseband=A3-01.00.01 androidboot.bootloader=1.5.0 movinand=true sdcard=true hw_512mb=true" boot vmlinuz ramdiskboot.img 可以是 recovery 或者標準的 boot image。
最後附上解開 acer 官方 bin firmware 的 python 程式碼。
from struct import unpack_from, calcsize import sys buf=open(sys.argv[1],"rb").read() action= "extract" if len(sys.argv)<3 else sys.argv[2] buf=open(sys.argv[1],"rb").read() magic, kernel_size, kernel_addr, ramdisk_size, ramdisk_addr, second_size, second_addr, \ tags_addr, page_size, = \ unpack_from("8sIIIIIIII",buf) if magic!="ANDROID!": print "invalid magic" sys.exit(1) offset=calcsize("8sIIIIIIII") unused=list(unpack_from("2I",buf,offset)) offset+=calcsize("2I") name, cmdline = unpack_from("6s512s",buf, offset) offset+=calcsize("6s512s") ids=list(unpack_from("8I",buf,offset)) print "magic", magic print "kernel", kernel_size, kernel_addr print "ramdisk", ramdisk_size, ramdisk_addr print "second", second_size, second_addr print "tags_addr", tags_addr print "page_size", page_size print "unused", unused print "name", name print "cmdline", cmdline print "ids", ids def showhex(b): for x in b: print "%2x"%ord(x), print n = (kernel_size + page_size - 1) / page_size m = (ramdisk_size + page_size - 1) / page_size o = (second_size + page_size - 1) / page_size print n,m,o if action=="strip": size0=(m+n+o+2)*page_size size1=(size0+page_size+64-1)/(page_size+64)*(page_size+64) size2=min(size1,len(buf)) open("stripped.img","wb").write(buf[:size2]) print "stripped" sys.exit(0) # kernel header_size=page_size*3 offset=header_size size=kernel_size with open("kernel", "wb") as f: for i in range(n): f.write(buf[offset:offset+ min(size, page_size)]) offset = offset+page_size size-=page_size # ramdisk offset=page_size*n+header_size size=ramdisk_size with open("ramdisk","wb") as f: for i in range(m): f.write(buf[offset:offset+ min(size, page_size)]) offset = offset+page_size size-=page_size print len(buf)-offset
更新:
一些事先編譯過的 kernel 和 ramdisk
https://sites.google.com/site/xmktjw/Home/files/acer_kernel_bootimages.tgz?attredirects=0&d=1
zImage16 是 bpp 16 的 kernel。 zImage16_3G 是 bpp 16 split 3G。
zImage32 是 bpp 32,不曉得是 split 3g 還是 2g。
zImage.min 是 minmal kernel 只能 boot clockwork recovery mode, 然後連進去。
ramdisk* 是各式各樣的 ramdisk,正常版是 ramdisk.boot.default。
img.py 是將 acer bin firmware 解開的 python 程式。
Categories: android
5 意見:
加油加油!!希望能弄出ANDROID2.3!!我曾經也有想去試試看自己製作,可是礙於沒有這方面的背景,所以就放棄了。這隻手機在沒有2.3大概沒人要用了吧!連我女朋友便宜的GT540都有很多不同的ROM。另外當時我有打電話給森海賽爾(一開始送的耳機的品牌),他們說這一隻賣的還不錯阿!也賣了好幾萬隻(或許比較起來還是很少?),但這樣子廣大的用戶就對ACER再也沒有一點信心了ˊˋ
松鼠人:
我也想試試你的原代可是不知道什麽理由,我每次編譯就出錯,你能不能提供你能跑GUI的2.2文件?我不管怎麼改還是沒法完成……
你要是沒有時間我們也許可以在那個基礎上繼續開發,你的想法如何?謝謝~
我很高興有人可以繼續發展。
是編譯出錯嗎?還是編譯出來的東西不能跑?
我今天稍後會將我的幾個 bootimage 上傳。
不好意思我才看到你的回覆……
我是編譯出錯,所以還沒能跑什麽……我在網上看了很多相關的文章等論壇可是沒找到錯誤來自哪一部份。
你覺得用你的bootimage可以啟動一個2.3的ROM嗎
我最近比較忙沒那麼多時間看這方面的東西,大概兩周都沒啟動linux,呵呵,估計過節后應該會好一點。
再次非常感謝你的幫助!!
我剛才抓了 github 上的 zip 編譯看看,fullpatch 這個 branch 有出現 Werror 的問題,我把相關的修正補上去了。
至於直接 boot gb rom,我想是不行。
張貼留言