Ronzi A3 の (オリジナルの)ファームウェアは、2 つある。ひとつは、公式ファームウェア。もうひとつは osakanataro 氏が購入元からもらったもの。
ともに 5/11 版で 違いは、ファイル形式。更新ツールも違い、公式版は カスタマイズしたもの。osakanataro 氏が購入元からもらったものは Ingenic が提供しているものがベースで設定をカスタマイズしてある。
Jz4760/B 機 のファームウェアは、他にもある。ひとつは、IQQ M1 用。もうひとつは、Ramos V65Pro 用。
これで、3 機種分の ファームウェアが手に入った。ここで、それらについての解析結果をまとめていこうと思う。
ファイル形式 (Ingenic ツール用)
mbr-xboot.bin : パーティションとブートローダ
boot.img : カーネル と initrd
recovery.img : カーネル と initrd (リカバリ用)
system.img : ext4 / のファイルシステムイメージ
userdata.img : ext4 /userdata の ファイルシステムイメージ
cache.bin : ext4 /cache の ファイルシステムイメージ
vfat.bin : /flash (等) 内部 FLASH ストレージの初期化データ (all 0)
boot.img , recovery.img は、
split_bootimg.pl で分離することが出来る。再結合は、Android ソース添付の mkbootimg コマンドを利用するそうだ。
参考URL :
リカバリイメージの解体と再構築 - urandroid分離した initrd は、cpio + gzip で固めたもの。
例えば
gzip -d < boot.img-ramdisk.gz | cpio -id
で展開できる。
ちなみに、これらの機種の FLASH は、すべて SD カードインターフェイス。NAND Flash を直で扱うような機種とは違って一般的なファイルシステムを使えるのだ。
NAND Flash を直で扱う場合、書き換え回数とか チェックサムを管理しないとならない。NAND FLASH には、OOB というエリアがあるが、管理データの扱いは様々で解析が面倒なのだ。
ファイル形式2 (Ronzi A3 公式, Ramos V65Pro)
mbr-xboot.bin
先頭にパーティション情報 512B 。続いてブートローダのコード。
ただ 856948 bytes とブートローダにしては、大きい。uboot でも 普通なら 100KB - 200KB ぐらいのもの。画像が含まれているのではないか? そうだとすると LCD ドライバがあるし、機種毎に内容が違うことになる。さらに言うと、定期的に LCD にデータを送り込まなくては画像は表示できない。割り込みに対応した OS が入っている可能性まである。
IQQ M1 では、電源 Off の時に USB から充電しようとすると PMP でお馴染みの 充電のアニメーションが表示される。それはこの xboot でやっているのかも知れない。 Ronzi A3 では表示されないが、コードは入っているのかも。
パーティション情報は、
Device Boot Start End Blocks Id System
/dev/block/mmcblk0p1 4162 12484 262144 83 Linux (/system)
/dev/block/mmcblk0p2 13004 29648 524288 83 Linux (/data)
/dev/block/mmcblk0p3 30298 31338 32768 83 Linux (/cache)
/dev/block/mmcblk0p4 33289 254213 6959104 b W95 FAT32 (/sdcard)
こんな風になっている。boot.img と recovery.img は、パーティション 1 の前の隙間にはいる。
Blocks は KB 単位。Start と End は 31.5KB (63 x 512) 単位。
Ronzi A3 の Flash は 4GB しかないので、FAT32の領域が大きすぎる。ここは、実際のサイズを元に 再フォーマットするようで問題ないらしい。
Ramos V65Pro もほぼ同じ。 FAT32 のサイズが違うだけ。
Start 位置を KB 単位に直してみる。
Start real-size lbr-size A3-0511 V65Pro-0817
system 131103 278523 262144 210905 200600
usrdata 409626 544761 524288 67312 49434
cache 954387 94216.5 32768 30724 30724
vfat 1048603.5 - - 8 111607.44
(参考) /proc/partions より toral 3799040 real-vfat 2750464 と判明。
なんと ... もっと大きくできるのだった。lbr-size に合わせるならパーティションをいじらなくとも良い。
lbr のサイズをいじるならもっとぎりぎりに出来る。ここまでは、Start 位置を変えなくともよい。
Start 位置を変えてもインストールできるなら vfat の エリアを削れば良い。ただ system のスタート位置は変えないか、後ろにずらす。userdata は、実際よりずっと小さい。後で フォーマットし直すのだろうか? そのためには、mke2fs 関係のツールが必要だが、入っているかどうか要チェック。(A3 は、systeem/bin にあった)
vfat の Start 位置は意外と重要らしい。というか SD カードインターフェイスとはいえ NAND Flash なのだから Start 位置は重要ではないか? NAND Flash の消去ブロックサイズは 512KB ぐらいある。
Start 位置を 63MB 境界にしてしまうのは、どうだろう?
Linux の Fdisk なら セクタ 63 , ヘッド 1, シリンダ 1 にしておいて、Start と Size を 1024 の倍数になるよう指定する。
これを元にして、system.img を作りなおす。userdata は、app が入る最小サイズで良さそう。
追記: 4760(B)_deefault.ini に 書き込み位置が書いてあるとのことなので、付きあわせてみた。
16 進数 K 単位 Start x 63sec
mbr-xboot.bin 0 0
boot.img 0x500000 5120 K
recovery.img 0xB00000 11264 K
system.img 0x8000000 131072 K 131103 K
userdata.img 0x19000000 409600 K 409626 K
cache.bin 0x3A400000 954368 K 954387 K
vfat.bin 0x40000000 1048576 K 1048603.5 K
どうも微妙に違う。そういえば lbr の START 位置が FDISK では出ていなかった。なにか間違えたかも。それはともかく、ただの SD カードだから、パーティションは MBR の情報に従って分割される。これは間違いない。
0x00000000 +------------------------+
| mbr |
0x00000200 +------------------------+
| xboot | max 5MB - 512
0x00500000 +------------------------+
| boot.img | max 6MB
0x00B00000 +------------------------+
| recovery.img | max 117 MB
: :
0x08000000 +------------------------+
: :
(partiton 1)| system.img | 256 MB
: : (16 MB)
0x19000000 +------------------------+
: :
(partiton 2)| userdata.img | 512 MB
: : (20 MB)
0x3A400000 +------------------------+
: :
(partiton 3)| cache.bin | 32 MB
: : (60 MB)
0x40000000 +------------------------+
: :
: :
(partiton 4)| vfat.bin | 2686 MB
: :
: :
0xE7E00000 +------------------------+
どうも これが正しいらしい。CHS ジオメトリでまるめているから間違えたようだ。
V65Pro は、VFAT の初期値があるが、例によって demo 用の video などが入っている。8KB の all 0 で良さそうだ。どうせ後でフォーマットできるし。
boot.img , recovery.img
これらは、他の Android と同じ構造。ファイルの先頭も ANDROID! となっている。
カーネルのソースコードのベースは、たぶん MIPS のサイトにある。(未入手)
userdata.img
app というディレクトリ配下に apk が入っている。
最初に起動するときに インストールして apk を 削除?
system.img
lib 配下に ダイナミックリンクライブラリがある。
解析したいのは、ここ。機種非依存のものを更新したいのだ。Ronzi A3 のファームウェアは、更新されるような気がしない。一方 Ramos は有名なメーカなので、V65Pro は数が出るに違いない。ファームウェアが更新される見込みはある。IQQ M1 はよくわからない。それなりに人気はあるようだが..
動画関係の不具合はひどい。再生できたり、出来なかったりする。想像では、間に合わないのが原因で buffer への先読みがまずい。Ramos は基本 PMP のメーカだし、これほどの不具合があれば直させるはず。
Ronzi A3 の サスペンドのまま持つ時間は短いようだ。基本はカーネルで対処するのかも知れないのだが、userland レベルで多少なりとも改善する方法もあるかも知れない。例えばサウンド。回路を Off にしてないのではないか? .. とか。サスペンドするときに スクリプトを動かせるなら Off にして復帰するときに 戻す.. とか。ヒントは、IQQ M2 の boot.img 。これの initrd では、Wifi の Off が仕込んであった。
追記: taobao での最近の販売数 上位 4 ショップの販売数の合計は、V65Pro 369 に対し IQQ M1 は 11 。
app 配下に apk が入っている。これらは、一旦イントールしたら消せない? userdata.img にあるものとは扱いが違うらしいので、消せるものはどれなのか知りたい。
あと userdata.img , cache.img recovery.img のコピーがまるまる入っている。このせいで ファームウェアのサイズがでかくなっている。どちらが不要なのか?
本来の userdata.img , cache.img を all 0 にしておいてもちゃんとインストールできるような気がする。確かめてみよう。
追記: osakana 氏から
CFW 20111018版 が出た。
詳細は、リンクをみてもらうとして ... DalvikTurbo が入ったのが嬉しい。どんなものか使ってみたい。
.. というか M1 にこそ入れたいところ。
あと framework を入れ替えたとのこと。
Media Player (SeeJoPlayer.apk) とか lib 配下のダイナミックライブラリーも入れ替えてみたいところ。ちょっとやってみたい。ただ、全部入れ替えると動かなくなるかも。
ついでに書いておくと M1 に入っている Advanced Task killer と Optimized ToolBox も入れてみたい。
付録: Windows から system.img userdata.img を見る。
- Linux Reader
を使うと EXT4 のパーティションが読めるらしい。イメージファイルも直接開けるどころか vmdk とかも OK 。
だが、実際やってみたところ、V65Pro , M1 の userdata.img や system.img は開けたものの A3 のはダメだった。例えば EXT4 は不完全だとか?
追記: v1.6 になっていたので、試したところ EXT4 も読めた。Windows 環境しかないところでは重宝しそう。
さて、A3 になくて M1 にある便利なもの。
- Optimize Tool Box (Android Optimizer) (2011/0/21 現在 最新版は v2.1.0)
どうもマーケットに出てこない。
ここに、あるはずなんだが... Phone がないとインストールさせてもらえないようだ。... そういえば、M1 には、Phone.apk が入っていた。
http://www.kfkx.net/AndroidOptimizer/AndroidOptimizer.html
ここからダウンロードできるのは、中国語版。
いろんな機能が入っていて、なにかと便利。
あと、これと ギャラリーでは、見れるはずの動画がエラーになる現象が起きにくいようだ。ファイルを少し Read していたりするのではないか?
ファイル名は、M1 では、cn_opda_xxx_207.apk となっている。
ちなみに動画は、媒体?放 でみないとボリューム制御ができなくて具合がわるい。そして、動画プレイヤーとして、媒体?放を選べるのは、Optimize Tool Box だけだったりする。(一回、常に使用する設定をすれば ES ファイルエクスプローラでもこれが使われる)
また、動画などを選ぶと、抜けられない。媒体?放 だと 終了すると戻って来るし、戻るアイコンもある。
ただ、A3 は、動画の性能がイマイチ。720p mp4 は無理。さらに、信じられないことに音が悪い。M1 だと 720p は問題ない。
- Media Player (SeeJoPlayer.apk)
これは、system.img にある システムアプリ。
媒体?放 のように、ボリュームコントロールが付いている。
- Advence Task Killer
メモリが少ないので、必要そう。M1 になって入ったということは、そういうことだろう。
M1 になくて V65Pro や A3 にあるもの。
- Android Assistant
バッチアンインストールの機能がある。いろいろいじっている場合は意外にも便利。
あとボリュームコントロール。 Optimize Tool Box にもあるが、すぐには出てこない。
- Home 画面
V65Pro は、PMP っぽい カスタマイズがされているようだ。
フォントについて
フォントを入れ替えるという話題は 前は結構あったのだが、これはどうするべきなのだろう?
ここに、 MTLc3m.ttf, MTLmr3m.ttf 自体はある。DroidSansJapanese.ttf というのもある。
ググったら
フォントのサーチ順序は、ソースを見る限り、MTLmr3m.ttf(モトヤLマルベリ3)、MTLc3m.ttf(モトヤLシーダ3)、DroidSansJapanese.ttf(これまでの標準)の順になっているので、/system/fonts以下に設置するだけで...
なんて情報があった。MTLc3m.ttf あたりをそのままコピーしておけば良いのか...
追記: osakanataro 氏よりコメントがあり、Android 2.2 では、DroidSansJapanese.ttf のみサーチするとのこと。MTLc3m.ttf を使うなら rename すべし。
ファームウェアカスタマイズの記録
- カスタマイズ1 -- 失敗
A3 の ファイルシステム が Linux Reader で見えなかったので、 V65Pro の system.img , userdata.img を使って A3 の中身を移す。
android までは出たが ... その先に行かないようだ。失敗。
- カスタマイズ2 -- 成功
A3 の system.img , userdata.img を 当面はベースにする。
まずは、userdata の shrink -- 不要なものを消して、M1 から気に入ったものをコピー。
GoogleServicesFramework.apk
Vending.apk
com.icenta.sudoku.ui.apk
ES_file_manager.apk (com.estrongs.android.pop.apk を rename)
(M1 より)
Advanced_Task_Killer.apk
AngryBirds_2011-03-14_1.5.3_MIPS.apk
cn_opda_a_phonoalbumshoushou_207.apk (Optimized Tool Box)
Quickoffice.apk
次に、system.img の SeeJoPlayer.apk を V65 のものと入れ替え。
lib/jz4760b_lib は、どうも 機種依存性がないようなので V65 のものと入れ替え。
MTLmr3m.ttf を fonts/ にコピー
まずはここまで ....
SeeJoPlayer.apk は、同じソフトだった。言語を 日本語にすると 媒体?放 が Media Player になる。
- カスタマイズ3 -- 成功
GoogleServicesFramework.apk , Vending.apk は、V65 や M1 では system.img に移動している。とりあえず V65 からコピーして、userdata.img の方の apk は消してみる。
次、etc/jz4760_bin etc/jz4760b_bin -- どうもこれも機種依存ではなさそう。その上 60/60B 両方ある。これもコピーしておこう。
ちなみにコピーはこんな風にしている。
# tar -C /mnt/V65sys/etc/jz4760b_bin -zcvf 1 .
# tar -C /mnt/A3suz_sys/etc/jz4760b_bin -zxvpf 1
まずはここまで ...
- ちょっと調査
さて、system 側の apk で V65 のみ にあるもの は、他に SoundRecorder.apk , TelephonyProvider.apk がある。逆に A3 のみなのは、Phone.apk 。
これを V65 と同じにしてみる。ついでに M1 と比べてみると .. V65 よりさらに
Dictionary.apk
Gmail.apk
Maps.apk
NetworkLocation.apk
Talk.apk
と多数ある。これらは、後回し。まずは、V65 に近づけるのが目標。
他に V65 と違うファイルがあるかチェック。
etc:(V65 のみ)
etc/ppp/chat-scripts/chat-777.conf
etc/ppp/chat-scripts/chat-ctnet.conf
etc/ppp/peers/evdodialer
etc/wifi_switch.sh
lib:(V65のみ)
lib/huawei-em770w-ril.so
lib/libDmplayer.so
lib/libnl-tiny.so
lib/libvia-cds7-cdma2000-ril.so
lib:(A3のみ)
lib/libext2_blkid.so
lib/libext2_com_err.so
lib/libext2_e2p.so
lib/libext2_profile.so
lib/libext2_uuid.so
lib/libext2fs.so
bin: (V65のみ)
bin/akmd8975
bin/lh
bin/lw
bin: (A3のみ)
bin/mke2fs
bin/verifier_test
ついでにいかにも機種依存なファイル
lib/hw/copybit.default.so
lib/hw/gralloc.default.so
lib/hw/gralloc.lynx.so
lib/hw/lights.lynx.so
lib/hw/sensors.goldfish.so
lib/hw/sensors.lynx.so
lib/wifi/modules/8192cu.ko
usr/keychars/lynx-keypad.kcm.bin
usr/keylayout/lynx-keypad.kl
lib/libreference-ril.so (これも?)
.ko はカーネルが違うから ダメ。lib/hw は、M1 では、
copybit.default.so gralloc.xam5001.so sensors.goldfish.so
gralloc.default.so lights.xam5001.so sensors.xam5001.so
こんな風になっている。V65Pro と A3 では、機種の名前?が同じなので、ファイル名が重なる。
ところで、Wifi は、同じ 8192cu.ko を使う ... ということは、USB 接続で 同じような モジュールを使っているのだろう。
V65Pro は、A3 をベースに作った 第二世代の製品 と言えそうだ。ソフトだけではなくて、ハードも改善されている。CPU の高速化は もとより、ボタンを増やしたり。多分 サウンドにノイズが載るのも直っているのだろう。ちょっと欲しくなってきた。
- カスタマイズ4 -- 成功(でもない)
framework をまるごとコピーしても大丈夫なのだろうか?
とりあえずやってみよう。
# tar -C /mnt/V65sys/framework -zcvf 1 .
# tar -C /mnt/A3suz_sys/framework -zxvpf 1
android の代わりに miumiu が出るようになった。HOME 画面に変化はない。
... と思ったら ツールバーが違う。サウンド± のアイコンがない。... って osakanataro 氏も書いていたが、実際に見るまでなんのことか分からなかった。V65Pro は、サウンド±のボタンが付いているのだ。
あと AngryBirds はちゃんと動いているような ..
ToDo: ツールバー関係は元に戻したい。あと、PMPのような HOME 画面にするには、何が足りないのだろう? Launcher2.apk あたり?
- テスト 1
V65Pro の mbr-xboot.bin は動くのか ... 確かめてみたい。
やってみたら、最初の 『ronzi 溶智』も出なかった。... まぁ当たり前か。ちなみに、ブートローダ は、最初に クロック周りの設定をする。そうしないとメモリも使えない。usbboot たと stage1 がそれを行う。SD カードからブートする場合は、mbr-xboot.bin のどこかに それをするコードと情報がある。クロックアップとかを試すなら mbr-xboot.bin をいじることになるのだ。
- テスト 2
userdata.img を vfat.bin (8KB all 0) と置き換えるとどうなるのだろう? もちろん、system.img の 中の userdata.img は残す。
これはダメだった。system.img の userdata.img と recovery.img を消す osakanataro 氏の方法で shrink することにしよう。
リカバリ... なんてのは、再インストールで良いのでは? と思う。どんな状態になっても 元に戻せるのだから。だが、リカバリーの機能を確認することが簡単なマシンでもある。失敗を恐れる必要がないのだから。まあ、いずれ。
- カスタマイズの案
microSD に 2 つめの Android を インストールする というのも出来ても良いかも知れない。
カーネルは、本体のものを使うのならば、initrd を編集して、system.img の中の /dev/mmcblk0 を扱っているところを 修正する。
これは比較的簡単だが、userland をいじる人向け。カーネル自体をいじる場合には使えない。... となると Dingux のように ブートローダを変更して dualboot にするのだろうか?
xboot とは何だろう? ファームウェアを作ったところが 作ったのだろうか? それとも Ingenic が作って、どこかにソースを公開しているのだろうか?
ブートローダを いじらなくとも kexec という機能が使えれば、別のカーネルを立ち上げることは可能。もちろん、オリジナルカーネルは、そんなものは config してなくて 使えない(はず)。まぁでもカーネルをいじるのが前提の機能だから、そのときは本体側のカーネルも入れ替えるのだろう。
ただ、UI は考えないといけない。カーネルが動いている状態なら、画面出力自体はできるだろう。あとはボタンでなんとか。
... といってもカーネルを入れ替える理由は何だろう。開発中ならば、usbboot で簡単に入れ替えられる。まぁ出来ても良いのだが... ううむ。
- カスタマイズ5
build.prop はよく分からないが、これぐらいは編集しておいた方が良いかも知れない。
ro.sf.lcd_density=160
ro.product.locale.language=en
ro.product.locale.region=US
あと、
rild.libpath=/system/lib/libreference-ril.so
なんていう記述がある。
これも V65 のものを 置き換えたらダメなもの?
さて、system.img から userdata.img と recovery.img (ファイル名は recovery.cpio.img) を消しておく。
あと nicoWnnG を入れてなかったので、userdata.img の方に入れておく。
これで試した。まずは、書き込み終了から 2 分ほど 『ronzi A3』が
出て 一旦真っ暗になり、2 分ほど経つと 『miumiu』が表示され 10-20秒ほどで HOME 画面になる。USB が接続されているので、続いて USB 接続の画面。
おまけ : bin/busybox について
bin には、busybox が入っていて、結構な数のコマンドが ある。だが、使えるコマンドはもっと多いような ... bin の ファイルと後で比べてみよう。
Currently defined functions:
[, [[, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk,
basename, beep, blkid, brctl, bunzip2, bzcat, bzip2, cal, cat, catv,
chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt,
cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cttyhack,
cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df,
dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, du,
dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid,
ether-wake, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush,
fdformat, fdisk, fgrep, find, findfs, fold, free, freeramdisk, fsck,
fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep,
gunzip, gzip, halt, hd, hdparm, head, hexdump, hostid, hostname, httpd,
hush, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd,
init, insmod, install, ionice, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink,
iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd,
last, length, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap,
logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr,
lsmod, lzmacat, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev,
mesg, microcom, mkdir, mkdosfs, mkfifo, mkfs.minix, mkfs.vfat, mknod,
mkpasswd, mkswap, mktemp, modprobe, more, mount, mountpoint, msh, mt,
mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt,
passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root,
pkill, popmaildir, poweroff, printenv, printf, ps, pscan, pwd,
raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath,
reboot, reformime, renice, reset, resize, rm, rmdir, rmmod, route,
rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script,
scriptreplay, sed, sendmail, seq, setarch, setconsole, setfont,
setkeycodes, setlogcons, setsid, setuidgid, sh, sha1sum, sha256sum,
sha512sum, showkey, slattach, sleep, softlimit, sort, split,
start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd,
swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar,
tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top,
touch, tr, traceroute, true, tty, ttysize, tunctl, udhcpc, udhcpd,
udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma,
unlzop, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock,
volname, watch, watchdog, wc, wget, which, who, whoami, xargs, yes,
zcat, zcip
一つもリンクされてなかった。
awk basename bunzip2 bzcat
bzip2 chroot cp cpio
diff dirname du echo
ed egrep expr getopt
gunzip head hexdump hostname
less losetup mknod od
patch printf pwd script
sed sort swapoff swapon
tail tar touch uname
unzip vi wc
vi , less などは tty でないと使えないけれども、それは別にして これぐらいはリンクしておきたいところ。あと、ls などは toolbox の方をリンクしている。
とりあえずは、以上のものを xbin の方にリンクを作っておこうと思う。
画面の回転について
A3 を 縦画面で使ってみたいと思っていたのだが、どうしたら良いか分からない。
で検索していたら、『日々模索: Witstech A81E カスタマイズ』という記事を発見。
要は、
ということらしい。センサがないのにドライバがあると、位置を固定してしまうのかも。
だだ ... A3 では 自動回転というメニューはない。どうしたものか....
- 回転をロックするようなソフトで代用できる?
- プロパティーをファイルで設定する? 名前は何?
回転をロックするようなソフトで試したところ、Gセンサがある M1 と同じような動作になった。ロックの状態はちゃんとトグルするのだが、すぐ元に戻る。M1 の場合は、ロックすると必ず横向きで固定される。
回転をロックする機能は、M1 に入っている Optimize Tool Box にもあった。Widget を add すると 7 つのボタンが付く。それぞれ機能を定義していくのだが、その中に ロック機能があった。
要するに sensors.xxx.so が有効でないか、ロックされれば、横向きに固定している。
これは ... framework をいじらないとダメなのではないか? たぶん同じところが作っているから、M1 や V65 の ものをベースにして、sensors.xxx.so を 削除しても同じかも知れない。
ちなみに、他の機種でも、ロックされれば必ず縦になるようなものがあるようだ。
追記: Optimize Tool Box をいじっていて気がついたのだが、回転はランチャーだけの問題ではないだろうか?
Optimize Tool Box は常に縦画面で動作する。そこから、アプリをアンインストールできるが、ちゃんと縦画面になる。
要するに、framework をいじらなくても、ランチャーの方をいじることで、縦画面にできるのではないか? .. といってもどうやっていじるのか分からないが。
ググッてみると、例えば Screen 3 だけ強制的に 横画面にする(ベースが縦画面の機種) といった 改造版 Launcher2 を作っている人がいた。
ただ、縦ベースの 機種で、横画面にしたいというのが、ほとんどのようだ。希望する機能のものがあるかどうか...
ちなみに、ランチャーの入れ替え方法(例)
(sdb shell)
# rm -r /data/data/com.android.launcher2
# mount -w -o remount /dev/block/mmcblk0p1 /system
# busybox cp /sdcard/Launcher2.apk /system/app
(再起動)
ボタンの設定について
ボタンを押すと、スリープモードから抜けてしまう。スリープモードから抜けるのは POWER ボタンだけにしたい。
『TeckBooster: Androidのキー設定を変更する』という記事をみると何か 設定できるような気がするのだが ...
やってみたのだが、どうもなにか違う -- スリープ状態には 2 つあるように見える。
最初は、画面を消したり、サウンドを OFF するだけの状態。ここからだと POWER ボタン以外でも復帰する。だが、時間が経つと POWER ボタンでしか 復帰できなくなる。おそらく サスペンド状態になっているのだろう。
もともと、希望どおりだということは分かった。設定は必要ないようだ。
CFW を作るスクリプト
いろいろ試していると、よくわからなくなってくる。それで、CFW を作る手順をスクリプトにしておくことにした。
- mkcfw-a3-1.0base.tgz
これは、CFW を自動で作ってくれるような便利なものではない。CFW を自分で作れる人向けで、そういう人なら 見れば分かるだろうから説明はしない。
再インストール後の設定。
何度もやっているが、忘れてしまいそうなので。
- 言語、タイムゾーン、日付・時刻の設定
- ES エクスプローラの設定
サイズ: 小さい
- nicoWnnG の再インストール
userdata/app に入れるだけだとダメとのこと。
結局再インストールが必要。
- nicoWnnG の設定
インストール後 → 開く
簡易設定: キーサイズ 最小。
詳細設定: 1. キーボードの下を空ける
2. キーの高さ 最小
3. 候補表示の高さ 小
4. 候補表示のフォントサイズ 最小
- 設定 言語とキーボード
再インストール後に、使うように設定する。
1. nicoWnnG IME にマーク
2. 入力するところで、長押し。
- ホーム
ウィジェットの追加 検索 Web
ウィジェットの追加 Switch keys
ソースコード
- ランチャー : MIPS/packages-apps-Launcher2 (mips-froyo branch)
- framework : MIPS/frameworks-base (mips-froyo)
たぶんこれがベース。ちょっと見てみよう。
android について何も知らないので、まずヒントを探す。
『新・開発者の戯言: Android開発に関する備忘録』 というのを見つけたのだが、
//画面の回転動作を制御
//横固定
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
//縦固定;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//現状で固定
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
//回転
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
なんて書いてある。キーワードは、orientation か。
で、まずは、ランチャーを見てみたのだが、何もしていないっぽい。改造して上記のようなコードを入れれば良いということか ....
それはともかく、デフォルト値とか設定とかないのか? と思い framework の方を 探してみる。( framework の方は、変更するつもりはない。どんな制御をしているのか見るだけ)
core/java/android/content/res/Configuration.java :
デフォルトは、ORIENTATION_UNDEFINED のようだ。... ここを個別の機種対応で、いじっていないのなら、Gセンサー関係のコードがなにか悪さをしている?
core/java/com/android/internal/widget/RotarySelector.java
これは何だろう? まじめに見ないといけないかも知れない。
あと、setRequestedOrientation に関係あるのは、
core/java/android/app/Activity.java:
core/java/android/app/ActivityManagerNative.java
このあたり?
ところで、Gセンサー関係のコードがなにか悪さをしているなら、強制的に 横画面/縦画面にするしかなさそう。たとえば workspace 0 , 1 は縦画面、2 , 3 は default動作(センサ?) 4, 5 は横画面とか。たぶんこれが簡単に対処できる方法ではないかと。
縦画面について
ちょっと Optimize Tool Box を使ってみているのだが ... ひとつ、縦画面での入力になるところがある。
App Manager → Desktop folder
ここで、+ を押すとカテゴリ名を入れるダイアログが出る。
12 キー になっていないと、ひどいことに。
あと、各種の設定を呼び出せるのだが、縦画面だったり横画面だったり。どういう仕組みなんだろう?
追記:
# mount -w -o remount /dev/block/mmcblk0p1 /system
# mv /system/lib/hw/sensors.lynx.so /system/lib/hw/sensors.lynx.so-org
(再立ち上げ)
例えば、上記のようにして、sensors.lynx.so を使わないようにすると、挙動が少し変わる。
Optimized Tool Box からの アンインストールや (Quick Profilesでの)各種設定 などが縦画面ででる。あと、ツールバーからの USB 関係の設定や、Advance Task Killer なども。
あと アプリケーション実行中に不意に縦画面になる場合があるようになった。どうも インストール終了のメッセージ が出ると縦になるようだ。
- SensorSimulator
ところで、こんなものがある。G-sensor がどういう状態か見ることが出来るらしい。
追記2:
Zeam Launcher を使うことで RotatingScreen.apk で縦画面にすることが出来た。
- Zeam Launcher の設定は、Sensor rotation ON
- /lib/hw/sensors.lynx.so は削除しないと すぐ元に戻る。
- 自動回転 ON にしないと、ランチャーから起動したアプリが横画面になる。要注意。
アプリが横画面だと、終了時 横画面に戻るが ほぼ満足。Zeam Launcher は、使いやすいし、これで良いんじゃないか。
アプリをビルドするには?
実はなにも知らないのだが... とりあえず Launcher2 をビルドしてみたくなった。
- Eclipseのプラグインで開発
これみると、Eclipseとプラグインが必要らしい。
あと JDK と Android SDK 。これは入っている。とりあえず、Android SDK だけ取ってきていて、そのときに JDK を要求されたから JDK も入れた。
Android SDK は、不明なデバイスが出るのが気持ち悪かったので 取り敢えず adb のドライバを入れるのに取ってきていた。後で adb を動かすようになったけど、まだ adb しか使ってない。
カーネルソース
全部で 87 ファイルあるが、そのうち 33 ファイルは yaffs2 。あとは Android とのインターフェイス周り 。パッチは 130 ファイルだが、それぞれの修正は少ないようだ。
さて、WM8650 に移植したものはどうなったか。
android-2.6.32.9-wmt.tgz ( 新規分 ファイルリスト )
android-2.6.32.9-wmt.patch.gz ( パッチ ファイルリスト )
新規で 422 パッチ 156 と巨大だった。あまり見たくないのだが ...参考にする場合があるかも知れない。
あと、新規ファイルには config ファイルが含まれる。これは重要。
自分でカーネルをでっち上げるつもりは、あまりないのだが、android での変更は思ったより少ない。最悪なんとかなりそうな気はする。
ちょっとどれぐらい大変なのか。検討してみることにした。
まず、Ingenic のカーネル :
これを 以下の 5 つに分ける。
で、パッチを linux-2.6.32.9 に適用してみる。rej が出たファイルのうち Makefile と Kconfig を除いたものは以下のもの
drivers/mmc/core/mmc.c.rej
drivers/mmc/core/core.c.rej
drivers/serial/8250.c.rej
drivers/usb/musb/musb_gadget_ep0.c.rej
drivers/usb/musb/musb_regs.h.rej
drivers/usb/musb/musb_gadget.c.rej
drivers/usb/musb/musb_core.c.rej
drivers/usb/gadget/file_storage.c.rej
drivers/usb/gadget/gadget_chips.h.rej
drivers/mtd/ubi/upd.c.rej
drivers/mtd/nand/nand_ids.c.rej
drivers/mtd/nand/nand_bbt.c.rej
drivers/mtd/nand/nand_base.c.rej
drivers/mtd/mtdblock.c.rej
drivers/input/keyboard/gpio_keys.c.rej
arch/mips/include/asm/bootinfo.h.rej
include/linux/mtd/mtd.h.rej
include/linux/mtd/nand.h.rej
include/mtd/mtd-abi.h.rej
mtd 関係が多い。mtd と それを使う yaffs2 や ubifs は使わないので、移植を全部捨ててしまうなら、まぁなんとかなりそうな感じ。ただ、gpio_keys.c は全然だめ。
これにさらに、android の変更が入る。gadget や input あたりが結構関係しそう。まぁ実際に作業するなら、android のパッチを当ててから ingenic の パッチを当てることになるだろう。
じゃぁということで、linux-2.6.31.3-jz-r1198.patch.gz を mtd 関係とそうでないものを分ける。
mtd 関係の変更が実に多かった。-- SD カードインターフェイスになったのは、意外と移植が間に合わなかったためだったりして。
285 musb_core.c.rej
964 musb_gadget.c.rej
212 musb_gadget_ep0.c.rej
22 musb_regs.h.rej
1483 total
これは嫌だと思ったのは、musb 。musb とは、いわゆる OTG コントローラのことらしい。そういえば、OTG はサポートしておらず device only かも知れない。A3 とかにも 切り替える機能は全然なかったし。
とは言え 、JZ4760 以降の OTG サポートした USB-2.0 インターフェイスは、それまでの ものと全然違う。(無理やりでも) device only として config できるなら、musb を一切サポートしないということが出来るかも知れない。そうでなければ、この面倒なのをなんとかしないと ...
とりあえず、linux-2.6.31.3-jz-r1198-nomtd.patch.gz をさらに 3 つに分ける。
gpio_keys.c がまずいのは、汎用のコードを 専用のコードに書き換えてしまっているから。-- たぶん、linux-2.6.31.3 版を 元に 名前を変えてコピーし、gpio_keys.c には手を入れないのが良いのだろう。
追記: 10/30
ftp://ftp.ingenic.cn/3sw/Jz4770/01LinuxBsp/20110729/source/
に Ingenic のカーネルの最新版があった。日付は 8/9 だが、置かれたのは 10/28 。
ベースは相変わらず 2.6.31.3 だったが .. なにか変わったのだろうか? とりあえず見てみよう。
ターミナル・エミュレータ アプリ
Android にも ターミナル・エミュレータ があるということを知った。
で、さがしてみたら github.com に登録されているのが見つかった。
- jackpal/Android-Terminal-Emulator
みたら jni というディレクトリがある。... ということは NDK 。マーケットで 名前を指定しても見つからないはずだ。
それはともかく、ソースコードがあるのは幸いだった。なければ、MIPS では動かしようがない。
ところで、元ネタは 『Android NDK でネイティブ CUI プログラムを書く!』の記事。stdin / stdout を使うコードが書けるとは、ちょっとした驚きだった。libc や libstdc++ があるのだから、出来て当然 ... とは思わなかった。