2011年7月30日土曜日

[HOWTO] Galaxy S2 SC-02C BLN を使うには

そもそもBLNって何だ?って人はこんなページ見ないかもしれないですが、BLNの導入についてです。BLNをつかうには、対応kernelと、対応lights.SC-02C.so、それと制御用のアプリが必要になります。はじめにkernelは自分でビルドするか、面倒であれば、

https://github.com/creams/SGS2-SC02C-BLN-Kernel
git clone git://github.com/creams/SGS2-SC02C-BLN-Kernel.git
このあたりから、対応kernelをダウンロードしてheimdallなどのツールで本体に焼きこみます。(このあたりは説明省略w)

その後lights.SC-02C.soを、

https://github.com/creams/SGS2-liblights-binary
git clone git://github.com/creams/SGS2-liblights-binary.git
からダウンロードして、名前をlights.SC-02C.soにリネームし本体に配置します。必ず現在のlightsはバックアップを取ること
adb remount
adb pull /system/lib/hw/lights.SC-02C.so .
adb push lights.SC-02C.so /system/lib/hw
adb reboot
リブートしたら準備OK。あとはMarketからBLN Appをダウンロードして、Enableにして、メールなど送ってみて試します。neldar氏に金もらってるわけじゃないけど、Pro版をお勧めしておきますw。

全部の端末で動作するかどうかはわかりませんので、動かなくても泣かない。
それでは自分のリスクで楽しみましょう!

Galaxy S2 SC-02C BLN バッテリ消費について

昨日UPしたBLN対応cypress-touchkey.cですが、Notify通知が無い場合には、基本的にはdeep sleepに入るのを妨げたりはしないようになっています。そのため、Notifyがなければ、バッテリ消費はBLNを搭載していないものと変わらないはずです。

1.端末がdeep sleepしているときにメールとかがくる
2.Notifyがliblights経由でBLNのsysfsに通知される
3.このタイミングでwake_lockしてtouchkeyデバイスの電源をON(ldo11,ldo18)
4.以後はwake_lockで、電源を確保

この状態は画面もOFFになってますし、見た目はsleep状態。それから、HOMEボタンなどで復帰させるタイミングでlare_resumeがシステムからコールされます。モディファイしたcypress-touchkey.cでは、lare_resumeのタイミングでwake_lockをunlockかけます。

という流れなので、LEDの通知に気がつかないで放置するとバッテリはdeep sleep時よりも減っていきます。まぁそもそもが、LEDが光ってたら確認しますよね。たぶん。問題は寝ているときとか、端末に触れられないときなんですが、このような状況にはBLN AppのProバージョンで細かく設定することである程度回避できると思います。(BLN AppはWidgetでBLNのon/offとかできます)

まぁ、使い方は人それぞれなんで、これじゃ使えねぇってこともあると思いますけど。

2011年7月29日金曜日

[KERNEL] Galaxy S2 Backlight Notification (BLN) support kernel #1

なんとか実用くらいまで持ってこれたかと思っていたら、某掲示板ですでに動作させちゃった方が現れましたね。githubにもソースを公開してくださっているので、早速参考にさせていただくことに。気になるひとはsakuramilkさんのgithubをwatchするといいかも。おそらく、neldar氏(BLN App作者さん)もforkしているakent氏のBLN for i9100をforkしてベースにされたのかと思います。akent氏のコードじゃ動かないんですけどね。。自分はcypress-touchkey.cのみいじる方向でいきたいと思います。やることはほぼ同じです。

さて、USB給電なしで動作させるためには、sleepモードに入ったSGS2のtouchkeyデバイスへの電力の供給を確保するのが問題になりますが、sakuramilkさんはwakelockでそれを行っています。wakelockはsuspend状態になるのを防ぐためのもので、連続した電力供給が必要な場合等に使いますが、その分バッテリを多く消費します。ですので使いどころを間違えるとすぐにバッテリが切れてしまうことになります。Androidではアプリもこのモードを実行することができるため行儀の悪いアプリを入れるとすぐにバッテリが切れたりということがよくあります。
adb shell
#cat /proc/wakelocks
で、現在wakelockを使う可能性のあるタスクの一覧が見えます。

本質的にはtouchkeyにだけ給電して動作させることができれば、一番省電力と思うのですが、ソースを眺めてみた感じだとPowerManagement系のコードに手を入れるのは、修正ポイントが多そうです。というわけで、あっちをいじって、こっちをいじってとやっていたわけですが、もう、wakelockでいいんじゃない?、sakuramilkさん正しいよ!、というわけでw。バッサリ今までのコードは捨ててwakelock使って書くとどうなるかやってみました。なるべく必要なときだけにwakelockする方針でやってみました。

結果的にはうまく動作するようになりました、とりあえず半日程度つかってみて、そんなにおかしな動きもしないのでしばらくはこれで、バッテリ消費等に着目して改善していきたいと思います。

ちなみに、テストしたアプリは
k9 (IMAP-IDLE)
SP-mode mail
です、基本的にはNotificationオブジェクトでFLAG_SHOW_LIGHTSかDEFAULT_LIGHTSを使う実装しているアプリは全部いけるはずです。自分のビルドしたliblightsではそのあたりをDDMSで見れるようにログにだして確認しました。

コードはgithubにあげときました、以前アップしたliblightsをあわせて使うと、Neldar氏のBLN Appで動作させることができます。ちなみにPro版をおすすめしておきます。寝ている時間は動作させないとか、そういった設定ができるので正しくつかえば、バッテリ消費を抑えられるでしょう。既存のcypress-toucheky.cをまるまる入れ替えてビルドするだけです

git clone git://github.com/creams/SGS2-BLN-cypress-touchkey.git
cp cypress-touchkey.c /somewhere/android/kernel/drivers/input/keyboard/cypress/
make -j2
出来上がったzImageをheimdallで焼きます。
cd /somewhere/android/kernel/arch/arm/boot
cp zImage  どっか
heimdall-frontend.exeが便利なのでそれを使ったほうがいいですね。winの人は。なおgithubに一緒にあげといた、kernelはサンプルです、ほぼノーマルですけど自分にはこれで十分。

git clone git://github.com/creams/SGS2-SC02C-BLN-Kernel.git

1.最低動作周波数を200MhzからUV (100Mhz 850mv/900mv)
2.オリジナルbootロゴw
3.BLN
4.secure=0
5.カメラの音を抑制
だけです。つか、SGS2はいじるとこがないですねぇ。Launcherとかで遊んでみるかなぁ。

というわけで、自己責任でよろしく。

2011年7月16日土曜日

Galaxy S2 BLN .. lights.SC02C.so とりあえずgithubへ

kernel側はまだまだ苦戦しておりますが。とりあえず現状のlights.cと、ビルドしたライブラリをgithubへあげときました。まぁ、なにもたいしたことしてないですが、BLN_testappでちゃんと認識されます。

binary
https://github.com/creams/SGS2-liblights-binary

source
https://github.com/creams/Galaxy-S2-liblights-for-BLN


kernelはPMまわりを中心に眺めてますが、これだ!という対応してみてもboot-loopしたりと、、やるからにはtouchkeyだけを生かして、電力消費を抑えたいですが、だめならPM切ってやってみるかなぁ。。。暑くて外に出る気にならないのでちょうどいいか。

2011年7月10日日曜日

[MOVIE] BLN for Galaxy S2 (SC-02C)

現状のkernelとあわせて動作させてみました。lights.SC-02C.soは問題ないのだけど、kernelはまだいろいろありそうです。USBで給電した状態だと問題ないのですが、ケーブルをはずすとtouchkeyデバイスにステートの書き込みができなくなり、kernel内部でループが発生してしまいます。このあたりの処理がなんとかならないと実用はできないですね。SGS2からはPowerManagementが高度になっているようで、デバイスへの電力供給制御のロジック等がここからの鬼門ですかね。




i2cバスへの書き込みエラー、dmesgではこんな感じ。こいつがループ始めるとkernelが重くなって再起動です。i2c-BUS関連とかGPIOとかregulatorとか追っかけないとですかねぇ。

<7>[ 1238.882765] [TouchKey] i2c_touchkey_write 285 i2c transfer error
<3>[ 1239.722756] [TouchKey] i2c_touchkey_read 248 i2c transfer error
<7>[ 1240.562765] [TouchKey] i2c_touchkey_write 285 i2c transfer error
<3>[ 1241.392773] [TouchKey] i2c_touchkey_read 248 i2c transfer error
<3>[ 1242.242760] [TouchKey] i2c_touchkey_read 248 i2c transfer error


あ、neldarさんがGT-9100のリポジトリをforkしたみたいなので、本家がもうすぐ出るかもよ?

[KERNEL] Galaxy S2 BLN support kernel *TEST* version part-3

手元ではUSB接続下ではBLNは動作してますが。。もうちょっとkernel見ないと完全じゃないです。というわけで、今回はlightsの修正ポイントについて。基本方針のところで述べたように、neldarさんのAPPがそのまま使えるように、ソースを修正してみます。

そのまえに、初回に懸念していた、TEMPERATURE_READ関連ですが、SGS2のシステム側がどのようなコールバック関数を登録しようとしているか、debug-logを出すことで確認してみたところ、特に必要なさそうことがわかりました。lightsは初期化時に、システム側から、LEDやバックライトなどの調節をするための関数の登録を求められますが、システムがどのような関数の登録を求めているか実際にログに出し、確認しただけです。以下、そのときのDDMSの画面キャプチャ。



これによると、TEMPERATURE_READは必要なさそうです。さて、前回取得したfroyoのソースディレクトリに移動します。
cd ./froyo/hardware/msm7k/liblights
バックアップは取っときましょう。
cp lights.c lights.c.org
で、今回のコード
creams@nexus:~/android/froyo/hardware/msm7k/liblights$ diff -cNr lights.c.orig lights.c
*** lights.c.orig 2011-07-09 19:15:56.496289937 +0900
--- lights.c 2011-07-10 21:19:07.012133668 +0900
***************
*** 61,67 ****
          = "/sys/class/leds/amber/brightness";
 
  char const*const LCD_FILE
!         = "/sys/class/leds/lcd-backlight/brightness";
 
  char const*const RED_FREQ_FILE
          = "/sys/class/leds/red/device/grpfreq";
--- 61,67 ----
          = "/sys/class/leds/amber/brightness";
 
  char const*const LCD_FILE
!         = "/sys/class/backlight/pwm-backlight/brightness";
 
  char const*const RED_FREQ_FILE
          = "/sys/class/leds/red/device/grpfreq";
***************
*** 79,85 ****
          = "/sys/class/leds/keyboard-backlight/brightness";
 
  char const*const BUTTON_FILE
!         = "/sys/class/leds/button-backlight/brightness";
 
  /**
   * device methods
--- 79,89 ----
          = "/sys/class/leds/keyboard-backlight/brightness";
 
  char const*const BUTTON_FILE
!         = "/sys/devices/virtual/misc/melfas_touchkey/brightness";
!
! // sysfs file for BLN
! char const*const NOTIFICATION_FILE
!         = "/sys/class/misc/backlightnotification/notification_led";
 
  /**
   * device methods
***************
*** 108,113 ****
--- 112,118 ----
      if (fd >= 0) {
          char buffer[20];
          int bytes = sprintf(buffer, "%d\n", value);
+         LOGE("write_int : %s %d\n", path, value);
          int amt = write(fd, buffer, bytes);
          close(fd);
          return amt == -1 ? -errno : 0;
***************
*** 190,196 ****
      int on = is_lit(state);
      pthread_mutex_lock(&g_lock);
      g_buttons = on;
!     err = write_int(BUTTON_FILE, on?255:0);
      pthread_mutex_unlock(&g_lock);
      return err;
  }
--- 195,202 ----
      int on = is_lit(state);
      pthread_mutex_lock(&g_lock);
      g_buttons = on;
!     /* for BLN 1(on) or 2(off) */
!     err = write_int(BUTTON_FILE, on?1:2);
      pthread_mutex_unlock(&g_lock);
      return err;
  }
***************
*** 313,323 ****
      g_notification = *state;
      LOGV("set_light_notifications g_trackball=%d color=0x%08x",
              g_trackball, state->color);
!     if (g_haveTrackballLight) {
!         handle_trackball_light_locked(dev);
!     }
!     handle_speaker_battery_locked(dev);
      pthread_mutex_unlock(&g_lock);
      return 0;
  }
 
--- 319,331 ----
      g_notification = *state;
      LOGV("set_light_notifications g_trackball=%d color=0x%08x",
              g_trackball, state->color);
!
!     /* for BLN */
!     int on = is_lit(state);
!     int err = write_int( NOTIFICATION_FILE, on?1:0 );
!
      pthread_mutex_unlock(&g_lock);
+
      return 0;
  }
 
***************
*** 365,388 ****
      int (*set_light)(struct light_device_t* dev,
              struct light_state_t const* state);
 
      if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
          set_light = set_light_backlight;
      }
-     else if (0 == strcmp(LIGHT_ID_KEYBOARD, name)) {
-         set_light = set_light_keyboard;
-     }
      else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
          set_light = set_light_buttons;
      }
-     else if (0 == strcmp(LIGHT_ID_BATTERY, name)) {
-         set_light = set_light_battery;
-     }
      else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
          set_light = set_light_notifications;
      }
-     else if (0 == strcmp(LIGHT_ID_ATTENTION, name)) {
-         set_light = set_light_attention;
-     }
      else {
          return -EINVAL;
      }
--- 373,390 ----
      int (*set_light)(struct light_device_t* dev,
              struct light_state_t const* state);
 
+     /* for BLN test */
+     LOGE("CMD name =>%s\n", name);
+
      if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
          set_light = set_light_backlight;
      }
      else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
          set_light = set_light_buttons;
      }
      else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
          set_light = set_light_notifications;
      }
      else {
          return -EINVAL;
      }
***************
*** 415,421 ****
      .version_major = 1,
      .version_minor = 0,
      .id = LIGHTS_HARDWARE_MODULE_ID,
!     .name = "QCT MSM7K lights Module",
!     .author = "Google, Inc.",
      .methods = &lights_module_methods,
  };
--- 417,423 ----
      .version_major = 1,
      .version_minor = 0,
      .id = LIGHTS_HARDWARE_MODULE_ID,
!     .name = "Modified QCT MSM7K lights Module",
!     .author = "creams@nexus",
      .methods = &lights_module_methods,
  };
今回はあっても必要なさそうな、処理はさっくりはぶいて、必要な部分だけに絞ってみました。基本的にはLCD_FILE,BUTTON_FILE,を変更してNOTIFICATION_FILEを加えただけですね。あとはこれを適用してみます。lights.msm7k.soをlights.SC-02C.so にリネームしてから入れ替えます。バックアップも忘れずに。
バックアップ
adb pull /system/lib/hw/lights.SC-02C.so .
..
.

入れ替え
cp lights.msm7k.so lights.SC-02C.so
adb remount
adb push lights.SC-02C.so /system/lib/hw/
adb reboot
そのうちgithubあたりにソースとバイナリアップしておきます。以下はMarktにあるneldarさん作のBLN Test Appでの結果です、ちゃんと認識してますね。



次回kernel話かけたらいいなぁ。。(安定せず。。)

[KERNEL] Galaxy S2 BLN support kernel *TEST* version part-2

kernelについては、まだまだかかりそうなので、先にBLNに必要なliblightsのビルドについて。とにかくビルドできる環境を作るところまで。前回も書いたとおりmsm7kのソースそのままでいけそうなので、SGS2は2.3.3(Gingerbread)ということもあるので64bitのUbuntuを導入して、ビルドすることにした。基本的にVMWare Playerなので気軽に、サイトからisoを落としてそこからインストールする。
http://www.ubuntu.com/download/ubuntu/download
ここから64bit版をおとして、VMWare Playerでインスタンスをつくり、isoからインストールを選んでインストールしておく。ちなみにJavaはopen-javaなので、sun-javaがいい人はapt-getしておく、それからsun-java5も入れておく。Ubuntu 11.04 でJDK5を入れるには以下のようにするべし、jaunty(Ubuntu 9.04)が既にサポートを終了のため普通にはaptで落とせない
sudo vi /etc/apt/sources.list

追加
deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse
deb http://us.archive.ubuntu.com/ubuntu/ hardy-updates multiverse

sudo apt-get update
sudo apt-get install sun-java5-jdk

切り替え
sudo update-alternatives --config java
sudo update-alternatives --config javac
さて、lightsはmsm7kに含まれるので、一番簡単にビルドするのはHTC dream用?としてビルドすることでそうなるとfroyoのソースが必要となる。gingerbreadだけのソースを取得するとdevice/htc/dreamが存在しないので注意。

余談だが、2.3(gingerbread)のビルドに64bitOSが必要だったのは過去の話のようで、現在は32bitでもビルドできるパッチが導入されているので普通に32bit UbuntuでもOK。64bit推奨なのは変わらないようですが。

それじゃ、64bitのAndroidビルド環境を整える方法は、別のサイトかGoogleさんに頼るとして、lightsの楽なビルド方法は。
mkdir froyo
cd froyo
repo -u init git://android.git.kernel.org/platform/manifest.git -b froyo
でFroyo指定でソースをチェックアウトする。かなり時間かかります。ダウンロードが完了したら
環境のセットアップ
source ./build/envsetup.sh
これでlunchやmなどのコマンドが使えるようになる。ここでは下記のように選択。
creams@nexus:~/android/froyo$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. generic-eng
     2. simulator
     3. full_dream-userdebug
     4. full_passion-userdebug
     5. full_sapphire-userdebug

Which would you like? [generic-eng] full_dream-user
そしてビルド。(VMWare playerに割り当てたCPU Core数に応じて)
make -j4
しばらく待ちます。うまくいけば下記にshared-libが作成される。
./target/product/dream/system/lib/hw/lights.msm7k.so
ダメだって人はlunchでdreamがちゃんと選ばれてるかどうか確認して。それでもダメなら
cd ./hardware/msm7k/liblights
mm
でターゲットだけビルドはじめるはずです。足りないものがあればエラーがでるので、足りないものをmmでビルドしていけばできると思う。

次回は。lightsの修正とビルド。基本的にはlights.cを修正してmakeするだけの簡単なお仕事。。

2011年7月9日土曜日

[KERNEL] Galaxy S2 BLN support kernel *TEST* version part-1

週末の時間の取れるときしか、がっつりいじれませんが、すこしづつ進めてまして、neldarさんのGalaxy S用BLN関連ソースを参考に、自分のkernelソースに組み込んでみてます。本来はlights.*******.soを入れ替えないでkernel側だけで何とかできないものかと、LEDのsysfsを作ったりしてみましたが、neldarさんの取ってるアプローチが最適だと思われます。基本方針としては。

1.kernel側のドライバにBLN用のsysfsファイルを用意して基本はここで制御。
2.lights.*****.soをこのsysfsを呼び出すように変更したものに置き換える。
3.アプリでenable/disableの切り替えやblinkの設定などが行える。

今回はあくまでもテストで実装しているので、Marketにあるneldarさん作のBLN Appがそのまま使えるようにBLNのsysfsとlights.*****.soが準備できるかとうことろですね。
#blinkを試すには有料版買う必要があるか。。

まず、SC-02Cのliblightsですが、
/system/lib/hw/lights.SC-02C.so
がそれです、まずこれをadbで抜き出してバックアップしておきます。
adb pull /system/lib/hw/lights.SC-02C.so
ちなみにこのファイルをstringsとかobjdumpでながめてみると、下記のようなsysfsを呼び出しているのがわかります。DDMSなどでログをながめているとlightsのライブラリのデバッグログが出てますが、下記のsysfsのうち/sys/class/leds以下のものは、そもそもS2には/sys/class/ledsのファイルエントリ自体が存在していないので、無意味な呼び出しになってます。有効なのはmelfas_touchkeyとpwm-backlightだけっぽいです。
strins lights.SC-02C.so
...
..
.
/sys/class/leds/jogball-backlight/brightness
/sys/class/leds/red/brightness
/sys/class/leds/green/brightness
/sys/class/leds/blue/brightness
/sys/class/leds/amber/brightness
/sys/class/leds/red/device/grpfreq
/sys/class/leds/red/device/grppwm
/sys/class/leds/red/device/blink
/sys/class/leds/amber/blink
/sys/devices/virtual/misc/melfas_touchkey/brightness
/sys/class/leds/keyboard-backlight/brightness
/sys/class/backlight/pwm-backlight/brightness
/sys/class/power_supply/battery/temp
QCT MSM7K lights Module
Google, Inc.
...
..
.
lightsをダンプしてみた結果とDDMSのログからわかるのは、このshared-libraryはmsm7kのもので、ほとんど手が加えられていなそうだということです。じっさいAndroidのソースをrepo syncしてmsm7k以下のliblights/lights.cを見ればだいたい推測できます(完全にカンですけどね)。ただ1点だけ、これがわからない。
/sys/class/power_supply/battery/temp
バッテリの温度を読み取れるsysfsで、S2にも存在しているファイルなんですが、lightsからこれをreadする意味がわからない。既存のlights.cをいろいろあたってみてもTEMPERATURE_READを処理してるのは皆無。。lightsの役割を考えると、通知LEDがそもそも存在しないS2には必要なしと考えwこいつはサポートしない方向で。とはいえ時間に余裕ができたら、disassembleしてみますわ。

というわけで、msm7kのものをBLNのsysfsがコールできるように、それからneldarさんのBLN Appが認識可能なように手を入れる方針でいきます。

あーそれにしても、repo syncおわんね。

Galaxy S2 The "SKORPN" JIG 到着

いわゆるJIGです。自分でつくるのもいいんですが、eBayあさってると、ストラップつきのを発見。まぁ、意味無いけどw。ぽちってみました。モノと配送料で結局すげぇ高かったという。。ちゃんとDownloadモードにはいってSAMSUNG OFFICIALになったので良しとしますか。

ちょっとしたインストラクションの紙がはいってて、ボールペンでThank youとか書かれてて、なんとなく手作り感がいいですねw。

Galaxy Tab Camera

次はケースでも探すかな?なるべく薄くて、フィットした感じのを探してます。だれかいいケースしりませんかね?

2011年7月6日水曜日

[INFO] sysfsから読み取るMALI-400MP & CPU0 Galaxy S2でのパラメータ

Galaxy S2のGPUであるMALI400MPのモジュールパラメータです。267MhzのFixedを試すとか、100Mhz/750mvのステップを試すとか。パラメータいじりの最中はtry&errorになりがちです。sysfsがサポートされているモジュールであればある程度の状態はそこから読み取れますので、確認しつついじりたおしますw。MALIの場合は下記のような感じ。
adb shell
cd /sys/module/mali/parameters
# ls -l
ls -l
-r--r--r-- root     root         4096 2011-07-05 23:54 gpu_power_state
-r--r--r-- root     root         4096 2011-07-05 23:54 mali_gpu_vol
-r--r--r-- root     root         4096 2011-07-05 23:54 mali_gpu_clk
-rw-rw-r-- root     root         4096 2011-07-05 23:54 mali_dvfs_control
-rw-rw-r-- root     root         4096 2011-07-05 23:54 mali_max_job_runtime
-rw-rw-r-- root     root         4096 2011-07-05 23:54 mali_hang_check_interval
-rw-rw-r-- root     root         4096 2011-07-05 23:54 mali_benchmark
-r--r--r-- root     root         4096 2011-07-05 23:54 mali_major
-rw-rw-r-- root     root         4096 2011-07-05 23:54 mali_debug_level
# cat mali_gpu_clk
cat mali_gpu_clk
160
# cat mali_gpu_vol
cat mali_gpu_vol
950000
前回のエントリでも書いたけど、reguratorの設定範囲をちゃんとしてあげないと、実際のクロックはkernelのコードに従ってくれませんので、設定値を変更したkernelを適用したら、上記の手段などで、現在値を確認するのがいいと思います。ちなみに上記はデフォルトのIDLE状態。Quadrantなどを実行しながらこの値をチェックすると、kernelによりこの値がstepするのがわかります。

ちなみにreguratorの範囲の設定をミスるとvoltageは1000000に固定されちゃいます。

次にCPU関連。
adb shell
cd /sys/devices/system/cpu/cpu0/cpufreq
# ls -l
ls -l
-rw-rw-rw- root     root         4096 2011-07-05 20:22 cpuinfo_min_freq
-rw-rw-rw- root     root         4096 2011-07-05 20:22 cpuinfo_max_freq
-rw-rw-rw- root     root         4096 2011-07-05 20:22 cpuinfo_transition_latency
-rw-rw-rw- root     root         4096 2011-07-05 20:22 scaling_min_freq
-rw-rw-rw- root     root         4096 2011-07-05 20:22 scaling_max_freq
-rw-rw-rw- root     root         4096 2011-07-05 20:22 affected_cpus
-rw-rw-rw- root     root         4096 2011-07-05 20:22 related_cpus
-rw-rw-rw- root     root         4096 2011-07-05 20:22 scaling_governor
-rw-rw-rw- root     root         4096 2011-07-05 20:22 scaling_driver
-rw-rw-rw- root     root         4096 2011-07-05 20:22 scaling_available_governors
-rw-rw-rw- root     root         4096 2011-07-05 20:22 scaling_setspeed
-rw-rw-rw- root     root         4096 2011-07-05 20:22 cpuinfo_cur_freq
-rw-rw-rw- root     root         4096 2011-07-05 20:22 scaling_cur_freq
drwxr-xr-x root     root              2011-07-05 20:22 stats
drw-rw-rw- root     root              2011-07-05 20:22 ondemand

# cat cpuinfo_cur_freq
cat cpuinfo_cur_freq
100000
上記は100Mhzのステップを追加したときの状態ですが、注目すべきはcpuinfo_cur_freq。APLLの設定がちゃんと入ってないと、実際のクロックは変化しないようで200Mhzあたりになります。というわけで、みなさんSetCPUの表示にだまされるわけですね。コードと注意深くみていくと100MhzのAPLLの設定値が存在してるのがわかります。昔は100Mhz - 1.0Ghzだったような感じですね。そのAPLLの設定値をそのままいただけばOKですね。

手元のSGS2はこの設定で動作してますが、CPU時間の50%程度を占める周波数が今回設定した100Mhzなので、多少の効果は認められます、絶大とまではいかないのですがね。


それにしても、だれかExynosのドキュメントとか持ってないですかねぇ。みなさん手探り上等なんでしょうか。。

えー。次回はたぶんBLN。手元では動いたかも!

2011年7月5日火曜日

Galaxy S2 バッテリ消費と対策?

1.2Ghzのdual-core CPUのおかげでほとんどスペック的に不満のないGalaxy S2ですが、やっぱりバッテリの消費はいかんともしがたいものがありますな。sleep時もさることながら、普通にいじってるだけで、こんだけ減ってくのはイラっときますねw。

で、やってみたことは。

1.同期系をなるべくとめる。
それでもやっぱりとめられないのがあったり、とめたらAndroidのいみねぇよ、というのもあったり。
2.GPUであるMALI-400MPのClockと電圧のUC/UV
2ステップの切り替えのうち、下のclock/volを100/750程度にしてみた。
3.CPUのmin_scalingが200Mhzのところを100に落としてみる。
SetCPUでclock別のプロファイルとってみると、ほとんどの時間が200Mhzでの駆動だったから。

んで、どれもほとんど効かないです。多少変化はあるのですが、CPUの100Mhz駆動は今晩あたりテストしますが、大して変わらんような気がしますな。。

自分の試した100Mhz code。ポイントだけ。

/arch/arm/mach-s5pv310/cpufreq.c

#if 0
        {L4, 200*1000},
#else
        {L4, 100*1000},
#endif
#if 0
        /* APLL FOUT L4: 200MHz */
        ((200<<16)|(6<<8)|(0x3)),
#else
        /* APLL FOUT L4: 100MHz */
        ((200<<16)|(6<<8)|(0x4)),
#endif
#if 0
        .arm_volt       = 975000,
#else
        .arm_volt       = 950000,
#endif

見落としあんのかもしれないんで、気がついた人はtweetでもしてくださいな。
MALI400のほうは、

drivers/media/video/samsung/mali/platform/orion-m400/mali_platform_dvfs.c
mali_dvfs_table mali_dvfs[MALI_DVFS_STEPS]={
..
.

このあたりで。mali_dvfs_table_updateでasv_numにしたがってstepする部分のvolもわすれずに。自分的にはidle時の設定を100/750000でやってみてる。

あと、この辺もか。
arch/arm/mach-s5pv310/mach-c1.c
static struct regulator_init_data buck3_init_data = {
        .constraints    = {
                .name           = "G3D_1.1V",
#if 0
                .min_uV         = 700000,
#else
                .min_uV         = 900000,
#endif


このあたりの作業全般、sysfsで確認&printkあたりでチェック忘れずに。じゃないとSetCPUの表示にだまされるかも?

まぁ、この作業はこの辺にしておいて、次はVoodoo sound系かBLNだな。