2011年11月19日 星期六

Android 4 ICS 硬上 Devkit 8000 無硬體加速

本文在 2011/11/19 08:29 發表於 Yahoo!奇摩部落格
因Yahoo!奇摩部落格將於2013年12月26日終止服務故遷移至此


離上次發文已經半年了XD
一個東西卡住, 然後一堆因工作做了不能發XD
這次放個簡單的小東西
算是嘗鮮性質的
那就是幾天前才剛開放下載的 Android 4

在 Google 和三爽的發表會上示範了很多新功能
癮科技有一堆 : 報導
自行檢閱XD
不過這一定要有晶片廠動作才行
所以, 我們只能用軟體模擬跑個自 High 的XD
於是拿了前篇 在 devkit8000 上安裝 android froyo (rowboat) 的 Devkit 8000 來玩玩
首先到 Google 網站下載原始碼

http://source.android.com/

接著按照步驟編譯
平台就選模擬器的即可, 反正沒加速可用
千萬不要看到 OMAP4xxx 有支援就想說版本差一號應該能用XD
OMAP3 和 4 差很大
不過如果真有人無聊試了麻煩提供心得, 感謝XD



編譯前我們需要先動些手腳
首先, 超頻XD
Kernel 用前篇 rowboat 附的即可, 也就是 2.6.32
前文有專家回應寫特定暫存器可以修改頻率
不過我發現...programming manual 看了老半天看不懂值怎麼填...
參考 u-boot 裡的設了 M2, M3...一堆, 都 assembly 很難懂
於是換去 kernel 裡找, 沒多久就找到了

找到這檔案:
kernel/arch/arm/mach-omap2/clock34xx.c

這樣修改:
  /*
   * Set MPU frequency
   */
- mpurate = mpu_opps [vdd1_opp].rate;
+ mpurate = mpu_opps [vdd1_opp].rate = 700000000;
  if (clk_set_rate(dpll1_ck, mpurate)){
    pr_err("Unable to set MPU frequency (%u)\n", mpurate);
  }else{
    printk("__CLK: set MPU frequency (%u).\n", mpurate);
  }

  /*
   * Set DSP frequency
   */
  if (omap3_has_iva()) {
    omap2_clk_iva_init_to_idle();

-   dsprate = dsp_opps [vdd1_opp].rate;
+   dsprate = dsp_opps [vdd1_opp].rate = 500000000;
    if (clk_set_rate(dpll2_ck, dsprate)){
      pr_err("Unable to set DSP frequency (%lu)\n", dsprate);
    }
  }

上面的 code 是類似 patch 方式表示
已經改了直接存, 無法給真的 patch, 所以用模擬的XD
這樣可以把 CPU 超到 700MHz
DSP 超到 500MHz
嘗試填入奇怪的數值會當機XD
這裡有些 beagleboard 的資料:

http://elinux.org/BeagleBoard

重點節錄:

ARM DSP core voltage
720 MHz 520 MHz 1.35V
600 MHz 430 MHz 1.35V
550 MHz 400 MHz 1.27V
500 MHz 360 MHz 1.2V

以上是建議的工作頻率和電壓
600MHz 是最大建議值
在往上會導致不穩或是壽命減短
而只有 beagleboard 附的是高規格(grade)可達 720MHz 板
晶片廠常常會用不同速度來區分價錢
我試了一下對岸廠的跑到 700MHz 還行
若設到不正確的值, 就算是在 700MHz 內也是會不穩
例如我設了個 650MHz
開機時就出現:

...
------------[ cut here ]------------                                                                
WARNING: at arch/arm/mach-omap2/dpll.c:439 omap3_noncore_dpll_set_rate+0x220/0x264()                
Modules linked in:                                                                                  
[<c00399d8>] (unwind_backtrace+0x0/0xd8) from [<c005f840>] (warn_slowpath_common+0x48/0x60)          
[<c005f840>] (warn_slowpath_common+0x48/0x60) from [<c00438b0>] (omap3_noncore_dpll_set_rate+0x220/0x2)
[<c00438b0>] (omap3_noncore_dpll_set_rate+0x220/0x264) from [<c0041ec0>] (omap2_clk_set_rate+0x20/0x2c)
[<c0041ec0>] (omap2_clk_set_rate+0x20/0x2c) from [<c004881c>] (clk_set_rate+0x38/0x88)              
[<c004881c>] (clk_set_rate+0x38/0x88) from [<c00103a0>] (omap2_clk_set_freq+0x220/0x498)            
[<c00103a0>] (omap2_clk_set_freq+0x220/0x498) from [<c000fd6c>] (omap3_sr_init+0xd4/0x154)          
[<c000fd6c>] (omap3_sr_init+0xd4/0x154) from [<c0033344>] (do_one_initcall+0x5c/0x1b4)              
[<c0033344>] (do_one_initcall+0x5c/0x1b4) from [<c0008578>] (kernel_init+0x98/0x110)                
[<c0008578>] (kernel_init+0x98/0x110) from [<c0034ecc>] (kernel_thread_exit+0x0/0x8)                
(kernel_thread_exit+0x0/0x8)                
---[ end trace 13165f06c5eacb10 ]---                                                                
Unable to set L3 frequency (332000000)                                                              
Switched to new clocking rate (Crystal/Core/MPU): 26.0/266/650 MHz                                  
IVA2 clocking rate: 450 MHz                                                                          
...

然後進 Android 時就莫名其妙的當機了
所以不要惡搞它XD
若成功, 開機會看到這樣:

...
Memory: 128MB 128MB = 256MB total
Memory: 249600KB available (4816K code, 833K data, 176K init, 0K highmem)
Hierarchical RCU implementation.
NR_IRQS:402
Clocking rate (Crystal/Core/MPU): 26.0/266/500 MHz
Reprogramming SDRC clock to 266000000 Hz
dpll3_m2_clk rate change failed: -22
GPMC revision 5.0
IRQ: Found an INTC at 0xfa200000 (revision 4.0) with 96 interrupts
.
.
.
Power Management for TI OMAP3.
Unable to set L3 frequency (332000000)
Switched to new clocking rate (Crystal/Core/MPU): 26.0/266/700 MHz
IVA2 clocking rate: 500 MHz
SmartReflex driver initialized
VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 1
...

一開機先 500MHz 跑
初始化後跳至 700MHz
在 Android 2.2 上測試可以撥 480P 的 MPEG4
有超有差

接著修改 Android 4
rowboat 的 kernel 並無電源管理
也有可能是 Devkit 8000 用的是 TPS65930 所以沒有
TPS65950 就有支援, 不過那不重要, 反正我們沒有XD
所以要繞路避開它, 以免當機
改這個:

frameworks/base/services/java/com/android/server/BatteryService.java

    private synchronized final void update() {
-        native_update();
+        //native_update();
+        mAcOnline = true;
+        mUsbOnline = false;
+        mBatteryPresent = true;
+        mBatteryLevel = 100;
+        mBatteryVoltage = 4700;
+        mBatteryTemperature = 80;
        processValues();
    }

native_update 是 JNI 發現有電源管理節點時才會註冊的 native function
沒註冊卻去調用就會丟出例外, 要避開呼叫它
填假資料進去即可

接著開始編譯, 完成後和前篇一樣複製 system 和 root 目錄去 SD 卡
只是複製後 SD 卡上這些檔案要刪除

sd/system/lib/egl/lib*_emulation.so

它們會連線模擬器, 一樣是必定失敗的
然後這檔案這樣改:

sd/system/lib/egl/egl.cfg

-0 1 emulation
-0 0 android
+0 1 android

這如果有問題再改, 實際上應該不用
最後用這參數開機

setenv bootargs console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext3 init=/init rootwait omap_vout.vid1_static_vrfb_alloc=y omap-dss.def_disp=dvi omapfb.mode=dvi:800x480MR-16@60 mpurate=1000
setenv bootcmd 'mmcinit; fatload mmc 0 0x82000000 uImage; bootm 0x82000000;'

配置共享記憶體就免了
kernel module 也不用加載
反正都軟體模擬

demo:

全部的樣子, 配置和前篇同


解鎖畫面


桌面


和 Android 3.x 相同的 3D 桌面


APP


工作列拉下來半透明


系統資訊


我的 256MB 版 Devkit 8000 啟動後記憶體只剩 3MB
我想 DSP, 繪圖加速也不用試了XD
連開個計算機都會記憶體耗盡而重開
難怪 OMAP3530 rowboat 只移植到 2.2 就沒了
再加上去也跑不動啦

Android 4 做了些最佳化
目前已知是 LLVM 和 pre-dexopt
以往第一次開機會做 dexopt, 現在改在編譯時先做掉
在 700MHz 的速度下這東西開機也才 30 秒多
若沒有記憶體問題, 其實它還是夠力的
只是記憶體沒法換, 沒輒

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。