2011年3月19日土曜日

[DEV] SCH-i909 Chine telecom version Galaxy S Kernel build

これまた自分のためのメモ。

今日はSCH-i909のkernelビルドと入れ替えについて。前のエントリにも書いたとおり、およそAndroid端末とは思えない仕様のSCH-i909であるが、OpenSourceなモノの宿命でフツーにkernelが手に入る。ちなみに、日本が地震に揺れている現在、何故か以前より海外線のトラフィックが非常に細くなってて時間がかかります。
http://opensource.samsung.com/
でSCH-i909で検索。CN版のソースをwget等でダウンロードしておく。ちなみにビルドの環境は以下のとおり。
Ubuntu10.04 (32bit)
androidのサイトからおとしたSDK(toolchain)類。
SCH-I909_CN_OpenSource.zipをダウンロードしたら、適当なディレクトリにてんかいします。中にはいくつかのアーカイブがさらに含まれている。以下のとおり。
3d_module_GPL.tar.gz
SCH-i909_eclair.tar.gz
SCH-i909_Kernel.tar.gz
今回使うのはKernel。tarを展開したら、生成されるGalaxySディレクトリにcd

build_kernel.shをそのまま叩いてもkernelはできません。ちょっと調整が必要です。README.txtにいくらか解説があるけど、適当臭いので参考程度に。トライアンドエラーでもできると思うけどね。build_kenerl.shをemacs等でひらいて、ちょっと修正します。主にTOOLCHAINへのパス。一応Androidのtoolchainでもいけるかとおもうけど、README.txtにcodesourceryから落とせってかいてあるから、落とします。
wget http://www.codesourcery.com/sgpp/lite/arm/portal/package5353/public/arm-none-eabi/arm-2009q3-68-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
おとしたら、GalaxySと同じ階層に展開しておくと楽。でbuild_kernel.shを下記に修正。
vi build_kernel.sh

--

TOOLCHAIN=`pwd`/../arm-2009q3/bin
TOOLCHAIN_PREFIX=arm-none-eabi-

--
さて、ここでいきなりbuild_kernel.shをぶったたくのもいいけど、準備はまだこれから。initramfsの中身を準備しておく必要がある。kernelソースには付属してこないので、DL10のzImageから抽出して、kernelのビルドディレクトリに展開しておいておこう。そのために、kernelソースを展開するとrootというディレクトリがデフォで作成される。(DL10の入手については別エントリをみてちょ)

zImageからinitramfsの抜くにはXDAの下記のエントリを参照するといい。このページの最初のスクリプトがinitramfsを抜き出すためのスクリプト。
http://forum.xda-developers.com/wiki/index.php?title=Extract_initramfs_from_zImage
で、このスクリプトにzImage食わせて展開してinitramfsが抜けたら、それを展開する。cpioで展開するけど、カレントに展開されるので、先程のrootディレクトリ等に移動してやっとくと楽。
cpio -v -i --no-absolute-filenames < path-to-initramfs.img
ここまできたら一回build_kernel.shを実行してみるが、下記のエラーで止まるはず。
fs/binfmt_aout.c: In function 'load_aout_binary':
fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared (first use in this function)
fs/binfmt_aout.c:270: error: (Each undeclared identifier is reported only once
fs/binfmt_aout.c:270: error: for each function it appears in.)
make[1]: *** [fs/binfmt_aout.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [fs] Error 2
これを回避するためにkernelソースのてっぺんにあるMakefileを
NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) -Dlinux
と修正しておく。それから、initramfsの中身を展開したrootのディレクトリもそのままだとzImageの中身に取り込まれる様子がまったくみられなかったので、configを修正してrootディレクトリまでの絶対パスを書いておく。修正するconfigは下記のモノ。
~/android_dev/china/SCH-i909_OpenSource/GalaxyS/kernel/linux-2.6.29/arch/arm/configs/ariesct_rev00_defconfig

--
CONFIG_INITRAMFS_SOURCE="/home/somewhere/android_dev/GalaxyS/root"
--
ここまで準備したら気兼ねなくbuild_kerne.shを実行。気長に待ってOUTPUTディレクトリにzImageが出来上がってればOK。build_kernel.shを実行すると、kernel -> module の順番でビルドされるが、DL10なROMのzImageを入れ替えるだけであればモジュールは入れ替えなくてもいい。

出来上がったzImageはheimdallを使って、書きこむ。heimdallはGUIのフロントエンドが追加されてて、使いやすくなった。SCH-i909をダウンロードモードで起動して、PCに接続、heimdallのGUIを起動してzImageのところに、今回ビルドしたイメージを指定してstartするだけ。しくじっても、DL10のROMがあれば一発でもとに戻せるだろうし。fastbootなくて不安という人もいるかと思うけど。やっちゃってください、自己責任でw。

余談だけど、地震の当日というか次の日もAndroidいじくって遊んでたわけだけど。そのときは、えらいネットワーク遅かった。まぁ、こんだけの事がおこれば、みんな情報とりたくて必死になるのも分かるけど、S/Nの悪いネットの情報に踊らされてる人のなんと多いことか。そこにネットの良さもあるわけだが、なんとも。。

以上。

2011年3月16日水曜日

Galaxy S SCH-i909 China Telecom version libjavacore hack.

Droid Xも日本じゃレアだけど、これほどじゃないよって端末のSCH-i909、中身はGalaxyS。
Google関連には一切アクセス不可!!な、CDMA2000端末。
しかもdalvikのlibcoreに仕掛けがあって、IPv6なhostnameのresolvができない。AF_INET固定になっとる。
これは確実に故意に修正されているので、kernelはv6喋れても、名前解決はv4しかできない。

まずSamsungのOpensourceサイトからi909のGPLコードを全部ダウンロードする。zipで1つにまとまって
いるので楽。
#生のエクレアのライブラリと入れ替えるので、おとさなくてもいいけど、kernelビルドしたいとか
#必ずそうなるw。
http://opensource.samsung.com/
SCH-I909_CN_OpenSource.zip
ダウンロード後、libjavacore構成要素である
./dalvik/libcore/luni/src/main/native/java_net_InetAddress.cpp
を見てみる。
static jobjectArray getAllByNameUsingDns(JNIEnv* env, const char* name,
                                         jboolean preferIPv4Stack)
{
    struct addrinfo hints, *addressList = NULL, *addrInfo;
    jobjectArray addressArray = NULL;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_flags = AI_ADDRCONFIG;

モロに、AF_INET指定しとります。Eclairの素のコードではちゃんとAF_UNSPECが指定されている。
これではlibjavacoreを利用するjavaのネットコードからはipv6にアクセスできない。
Eclairのソースをダウンロードして、普通にビルドしたlibjavacoreと入れ替えることにする。
#実際はlibnativehelper.soの入れ替えとなる。
Android 2.1 Eclair
build with jdk1.5
build env  Ubuntu 10.04

repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair

sudo vi /etc/apt/sources.list
以下を追加する

deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

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

jdk1.6をつかっているのなら、下記のコマンドでjdk1.5へ変更しておく。

sudo update-alternatives --config java
sudo update-alternatives --config javac
ほしいのは下記のスタティックライブラリだが
out/target/product/generic/obj/STATIC_LIBRARIES/libjavacore_intermediates/libjavacore.a
これをつかってビルドされている、shared-libをさがす。
find . -name Android.mk | xargs grep libjavacore
find: `./lost+found': Permission denied
./dalvik/libcore/Android.mk:LOCAL_MODULE := libjavacore
./dalvik/libnativehelper/Android.mk:# Any shared/static libs required by libjavacore
./dalvik/libnativehelper/Android.mk: libjavacore \
というわけで、libnativehelper.so があやしいw.これを単独でビルドできればして
入れ替えてみることにする。といってもjavaにちゃんとパスが通っていれば、Eclairの
ディレクトリでmakeするだけです。

入れ替え手順。
はじめにrootありき。/systemパーティションのなかを入れ替えるので、/systemパーティションを
Read/Writeでマウントしなおす。それからコピー、再起動という感じ。
adb shell
su
mount -o remount,rw /dev/block/stl9 /system
exit
exit

adb push libnativehelper.so /sdcard/
adb shell
su
cd /system/lib
cp /sdcard/libnativehelper.so .
reboot
再起動後にはブラウザでアクセスチェックを行う。pre-installのemaliアプリもサーバアドレスの部分
にIPv6を直接指定してアクセスが可能だった。単純な入れ替えでうまくいったようにみえるが、テストは
ほとんどやってないので、この方法をやって見る人は自己責任でよろしく。

ipv6の環境は、たとえば、feel6等で自宅でトンネル掘ってGlobl V6に接続している人じゃないと
なかなか他にいい方法がない。NTTの光NEXTのv6は外に出れないしね。

次回はkernelビルドと入れ替えまで。

[HOWTO] Galaxy S SCH-i909 China Telecom version upgrade to DL10 ROM and rooting.

China Telecom 向けのGalaxy SはCDMA2000。Marketなし、GMAILなし、GoogleMapもなし。
Androidらしくない端末。中国のgoogle規制のもとでAndroid端末つくるとこうなる。SamsungAppsは
数がすくなくて、楽しめない。

公式のROMはおそらくDL10というバージョンで、Android2.1(Eclair)である。
アップグレードの手順はDoCoMoなどのGalaxy Sと同様で行けると思う。自分は
Odin3かheimdallを使う。

DL10のROMを一気にアップデートする場合はOdin3で。zImage等kernelをいじるときはheimdallという
感じで切り分けるといいと思う。

ちなみにgoogle先生にきいても、返事はほとんどが中国語なので覚悟することw。DL10のダウンロード
については、いくら探しても特定のサイトしかみつからなかった。Odin3も見つけづらいので下記のURL
から落とすといいかも。
DL10
http://u.115.com/file/f165ab463a

Odin3
http://u.115.com/file/f14af75e12
DL10のzipを展開して、PHONE.tarとPDA.tarを取り出しておく。
Odin3をインストールしたらi909をダウンロードモードにする。電源OFFの状態から
Power+Vol(-)+Homeの同時押しだ。黄色いAndroid君とdownloading...の文字が表示される。
そしたら、PCに接続。Odin3のアーカイブを展開して、Odin3を起動する。一番左のフィールド
にID:COMとかかれたエリアがあるがそのあたりが黄色くなって、COMポートの番号が表示されたら
準備OK。

PDAボタンを押してPDAのファイルを選択。
PHONEボタンを押してPHONEのファイルを選択。

スタートをクリックする。うまく行けば左上部のフィールドにプログレスバーが描画され
進捗がわかる。全部適用されるとPASS!が表示される。FAILが表示されたら、i909の再起動から
やること。じゃないとうまくOdin3に認識されなかったりする。ファームがアップデートされると
自動的に再起動され、初期の状態になる。端末の情報をみてDL10になっていればOK。

いじりたおして、最悪通常起動不可能になったとしても、downloadモードに入れればなんとか
この手順で復旧できると思う。

次にroot取得。これは簡単。z4rootの1.3.0で行ける。さくっとrootにしたらいい。
z4rootはXDAにあるからそれを使うこと。

GRI40なNexusOneのカーネルビルド方法。

いまさら感はありますが、自分のために。GRI40でkernelのバージョンが2.6.35.7となり
Nexus Sと同じになりました。そのためデバイスドライバ等も入れ替えることにします。

まずkernelのソースをダウンロード。
git clone git://android.git.kernel.org/kernel/msm.git
branchを切らないとデフォルトで2.6.35なので、そのままビルド。以下の方法でkernelをconfigしておく。
make mahimahi_defconfig ARCH=arm
make menuconfig ARCH=arm
(このへんでTUNとかをEnableにしてもいい)
 コンパイル。
make -j2 ARCH=arm CROSS_COMPILE=/home/somewhere/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
GRI40のboot.imgからramdiskのイメージを予め抜き出しておくといいかも。
当然rootが必要ですが。
adb shell
su
cat /dev/mtd/mtd2 > /sdcard/nexusoneboot.img
exit
exit
adb pull /sdcard/nexusoneboot.img .
で、切り分けます。Command lineの部分はコピペしてとっておいてmkbootimgで指定する。
#このへんの各種ツールは以前のエントリ参考にしてくださいね。
split_bootimg.pl nexusoneboot.img
Page size: 2048 (0x00000800)
Kernel size: 2227684 (0x0021fde4)
Ramdisk size: 281360 (0x00044b10)
Second size: 0 (0x00000000)
Board name: 
Command line: no_console_suspend=1 msmsdcc_sdioirq=1 wire.search_count=5
Writing nexusoneboot.img-kernel ... complete.
Writing nexusoneboot.img-ramdisk.gz ... complete.
作成されたzImageをbootイメージ作成ディレクトリにコピーしてmkbootimgを実行する。
Nexus Sのときとは少しパラメータが違うので注意すること。
cp ~/android/dev/msm/arch/arm/boot/zImage .
mkbootimg --cmdline 'no_console_suspend=1 msmsdcc_sdioirq=1 wire.search_count=5' --kernel zImage --ramdisk nexusoneboot.img-ramdisk.gz --base 0x20000000 -o mybootN1.img
最後にbcm4329.koを入れ替えないとWIFIがつかえないので、これを入れ替えて完了。
/system/lib/modules/に書きこむからRead/Writeでremountする。
adb shell
su
mount -o remount,rw /dev/block/mtdblock2 /system
exit
exit
adb push bcm4329.ko /system/lib/modules/
以上で再起動してWIFIが使えたらOK。GRI40にするには、いろんなROM経由したりする人もいるけど
自分は上記の方法が一番簡単かな?OTA来るのも面白いし。ま、GRI40直ならもっと楽だね。

NexusOneのGRI40なOTAを受けるための方法とroot取得

例によって、忘れっぽい自分のために。
まずFRG83に戻します。下記のzipをネットから探してきてzipの展開をします。
signed-passion-img-FRG83_0923.zip
http://loadbalancing.modaco.com/download.php?url=paul/nexusone/signed-passion-img-FRG83_0923.zip
userdata.img
boot.img
system.img
recovery.img
の4つをfastbootで適用します。userdataとcacheはeraseした方がいいでしょう
fastboot erase userdata
fastboot erase cache
fastboot flash userdata userdata.img
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash recovery recovery.img
問題が発生しなければreboot

fastboot reboot

次にNexusOneにGoogleアカウントを設定します。普通にセットアップですね。
Wifiをonにしておくといいでしょう。

その後

menu -> 設定 -> 端末情報 -> システムアップデート

をタップします。すぐにアップデートがある旨が通知領域に通知されますので
タップしてインストール。その後再起動します。

端末情報でGRI40になっていればOKです。2.1とはちがって軽い動作ですので
期待していいと思います。


続いてrootの取得。
SuperbootがGRI40に対応していますので、XDAの該当フォーラムからSuperbootのGRI40用を
ダウンロードして
fastboot flash boot boot.superboot.img
fastboot reboot
するだけです。このままだとbusyboxがはいらないので、別途busyboxをインストールします。
はじめにbusyboxを/sdcard/にコピーしておいて
/systemパーティションをRead/Writeでマウントしなおします。
#busyboxはz4rootに付属のを抜き出しておくといいかも。v6対応です。
こだわらない人はbusybox installerをMarketでみつけてインストールしてもいいですね。
adb push busybox /sdcard/

adb shell
su
mount -o remount,rw /dev/block/mtdblock3 /system

cd /system/bin
cat /sdcard/busybox > ./busybox
chmod 755 busybox
シンボリックリンクを作る場合は
busybox --install -s /system/bin 
などどする。これでsuが上書きされる場合は、も一回boot.superboot.imgを適用すればOK。
#superbootは/system/xbin/にsuを入れる模様。/system/binのsuへのリンクを単純にけしてもOKですね。
fastboot flash boot boot.superboot.img
以上。

東日本大震災

日本では今、いろんなことが試されている。そう思うしかこの状況を受け入れられない。いろんな立場の人々がいろんな思いで生きて、そして死ぬ。今日と違う明日を生きることが幸せなんだと僕は信じたいです。様々な立場で生きる人々に。。

2011年3月8日火曜日

Nexus S kernel安定化 CFS

bfs+bfq+voodoo-sound+oc1.4ghz あたりの構成でつかってきましたが、たまーにおかしな状態になるので、タスクスケジューラをデフォルトのCFSに戻してみることにした。今回もkernelダウンロードから。
git clone git://android.git.kernel.org/kernel/samsung.git
で、現在のAndroid 2.3.3向けのkernelをダウンロードしておく。今回のkernelフィーチャーは
Voodoo sound driver patch
BFQ
OverClocking 1.4ghz
custom boot splash logo
色温度(color temp)D65 -> 8000K
あたりにとどめて、CFS利用時の安定度のチェックも兼ねてみる。そもそもいままでつかってきたBFSのパッチは、kernel-2.6.35.7向けのバージョンで、最新ではない。そのあたりをCFSにすることで変化があるのかどうか。。

2011年3月3日木曜日

SetCPUのProfile運用

オーバークロックのkernelをビルドしてから、たまにQuadrantでベンチとって見たりしたくらいで、別にOCいらなくね?という人、いますよねw。OCしなくても案外快適なもんですが、やっぱり1.4Ghzあたりで駆動すると、Flashのページのスクロールの反応とかがまったく違ってきます。で、使用状況に応じてCPUのクロックを制御すれば、、という話。最初はプログラムを書いてみるかとか、思ってました。いわゆる、このあたりをいじるプログラムですね。

# pwd
pwd
/sys/devices/system/cpu/cpu0/cpufreq
# ls
ls
cpuinfo_min_freq
cpuinfo_max_freq
cpuinfo_transition_latency
scaling_min_freq
scaling_max_freq
affected_cpus
related_cpus
scaling_governor
scaling_driver
scaling_available_governors
scaling_setspeed
cpuinfo_cur_freq
scaling_cur_freq
stats
ondemand

やるかぁ。と思ったそのとき、まてよと。。SetCPUでできるじゃん。。ProfileをEnableにしてエントリを追加するだけです。自分の設定はUSB接続時に1.3Ghz固定にして、あとは適当に。これ便利だわ。めんどくさがらずに使ってみるといいね。


それにしても、sysfs使ってなんかつくりたくなってきたぞ、ビデオドライバ周りがもうちょっといじれるといいから、そのあたりから攻めますかね。