Acer Stream Kernel on Github

Posted by TJ Wei 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 模式下用下面的指令試試看
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 ramdisk
boot.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: