2015年03月28日

Polasma 代替バッテリー

赤 Polasma は、常時 sshd を動かしてサーバー的に使ってるわけだが、心配になるのがバッテリーの劣化。で、どうしようかと悩んでたりする。

ひとつの案として、電気二重層コンデンサを使って代替とするのはどうだろう? 充電が追い付かないような機種では不可能だが、Polasma は大丈夫そう。これが使えるとバッテリー加熱による破裂なども心配しなくて良さそうだ。ただし不格好だ。当然ながらケースには収まらない。ふたも閉められない。


 ・電気二重層コンデンサー10F2.5V 270円 (Φ10mm x 30mm)
 ・電気二重層コンデンサー10F2.7V 200円 (Φ13mm x 34mm)
 ・電気二重層コンデンサー5F5.4V 600円(10.5mm x 22mm x 33mm)
 ・電気二重層コンデンサー120F2.3V 1000円(Φ18mm x 40mm)

秋月電子には、こういったものが豊富にある。600円のやつがスマートに使うには良いような気がするが、200円 x2 でも良さそう。

ついでだが、バッテリーは大体3端子だったりする。+/− 以外の3つ目は何かというと、温度測定用のサーミスタだそうだ。温度によって抵抗値が変化する。今回は、固定の抵抗で良いわけだが、あまりデタラメな温度を検出されても困る。ちょっと調べておこう。
 ・マイナスとの間に 10.08 kΩ 、温度は Android で 25℃。
なくても大丈夫なのかも知れないが、一応。あと pigu は、12.5 kΩ

さて、10F 直列でどれぐらいの時間使えるものなのか計算しておこう。

容量は 5F 。使用する電圧範囲は 4.2V から 3.4V までとしよう。

1/2 x 5 x (4.2)^2 - 1/2 x 5 x (3.4)^2 = 15.2(J:ジュール)
15.2/3.6 = 4.22 mW・H = 4.22 mA・V・H
3.7V 定格だと、1.14 mAH 相当

正規バッテリーの 1/1000 のオーダー。もう一ケタ欲しいが ...実際どうなのか?
動作時に 500mA(1.85W) 流れているとすれば、3600*1.14/500 = 8.2秒。平滑するだけの目的なら結構いけるかも。

数字の根拠について、ちょっと。3.4V ってのは、Power_Off_Voltage/Power_Off_Voltage の値。また 500mA というのは、FG_Battery_CurrentConsumption を見てて決めた。(300mA 台のこともあるが、実質何もしてない時 )

次の問題は、Android 側の管理。
まず、0V からの充電が可能かどうか。出来ないとなるとちょっと面倒そうだ。普通ならプレチャージというのがあって、通常の 1/10 ぐらいの電流で充電しようとするのだが、こいつはどうだろう?

これをクリアできても、通常充電とトリクル充電の移行サイクルが異常に短くなる。充電ロジックが異常だと認識しないかどうか?これも心配。

別の案 -- Ni-MH x 3直列 で代替



秋月のサイトを見ていたら

 ・ニッケル水素電池パック 3.6V830mAh 150円

なんとこんなものが売っていた。なんか安いぞ。専用ケースまで作って売ってる。電子工作の電源にも良さそうだし買ってみることに。

Ni-MH だが、満充電での電圧はおおむね 1.4v 超えだったと記憶している。x3 だと 4.2v 。で過放電ぎりぎりが、0.9v とかそのあたり。Ni-MH は急速充電が可能で 1C (830mA)ぐらいは大丈夫のはず。4.2v 以上に電圧を上げないのならば、一般的な リポ電池の充電回路で充電できるはずなのだ。(確か 4.2v を超えたとしても、1/50 C トリクル充電は大丈夫。)


http://www.kansai-event.com/kinomayoi/battery4/NiMH_world_selection.html より

これこれ、3.4v/3 = 1.13v なんてのは急激に電圧が落ちるところ。満充電は、1.4v 前後ではあるが、それ以上にしてはいけないという意味ではない。たぶん大丈夫だろう。

リチウム電池の代替にメモリ効果のある Ni-MH を使うのは変な話ではあるが、付いてさえいれば良いわけで 容量が(相当に)落ちたとしてもどうということはない。また常時通電の場合、Ni-MH のほうが安心できる。

これもやってみたい。ついでに書くとサーミスタを付けてやれば完璧である。それは、たしか千石電商で合うものを扱っていたと思う。

実践編 電気二重層コンデンサー



もう、手に入れてしまった。とりあえずやってみることに。
お金をけちって、200円の電気二重層コンデンサーを2個だけ買った。ピグも一台遊んでいるわけで、バッテリーを使わないならピグも常時ON にするかと思い、ピグに付けることにした。



まぁ配線だけだし、電子工作とも言えないレベル。端子の部分だけちょっと工夫。基板を削って、一列の丸ピンソケットを嵌めている。本体の端子は 3mm ピッチ? だが、左右に少し移動するので、丸ピンソケットのくぼみに収まった。サーモスタット代替の抵抗は手持ちの 10kΩと 2.2kΩを直列にした。作ったアダプタは、本体の端子のバネだけで止まっている。これでは安定しないので、今のところテープで止めている。ダイソーとかで EVA を買ってきて、もうちょっとマシにしたい。

やってみたら、動いた ... のであるが、あらかじめ充電する必要があった。0v では電源が入らず、充電もされない。調子に乗って AnTuTu ベンチを動かしたが走り切った。

バッテリーは、3.6v 59% で始まって、4.2v 70% という変なことになった。が、ほおっておいたら 100% で落ち着いた。ただ電圧は、4.0v から 4.2v を行き来している。また、バッテリー温度は 19℃と認識された。

つぎ、充電ケーブルを抜いて、どれぐらいもつか確認。Wi-Fi オン、操作を極力しない状態で 60秒だった。しばらく 100% だったが、3.9v になったと思ったら、電源が落ちた。落ちた後のバッテリー電圧は、2.8v 。すぐケーブルを挿したのだが、0% と表示される。4% になったところで、電源を入れると起動した。で、立ち上がっても 5% と表示される。
動作させていても、60秒もつのである。スリープすれば随分と持ちそうだ。ケーブルを抜いて移動させる程度なら全く問題ない。

電源ボタン短押しで、充電のモニタが表示される。中華PMP もこういうタイプが多かったが、これらの機種は、ケーブルを挿して給電すると、とにかく起動シーケンスが動く。たぶん u-boot までは来て、充電可能であれば、短押しは出来るようになる。で、充電可能な最低電圧は 2.7v かそのあたりだろう。

バッテリーが 0v だと、短押しで何も起きない。が ... 一秒 0.001v ぐらいのペースで電圧が上がっていく。数時間放置しておいたら、電圧は 4.0v まで行って、起動可能になっていた。

もうひとつ、不具合。リブートが出来ない。どうも充電OFF になってから、立ち上げるまでのパワーがない。一回電源OFF してから、パワーを溜めて 電源ON しないとダメなようだ。


実践編 Ni-MH x 3直列



150円のニッケル水素電池パック は、ポラスマの方で使ってみる。まぁ使えなるまで使ってみて、ダメになったらそのとき考える。どれぐらいの期間使えるかはさっぱり分からない。1年かも知れないが、数年かも知れない。

まず、電子工作でも使おうと思っているので、使わなくなった、1000mAH リポ電池を使用した モバイル・バッテリーを専用充電器に仕立てる。ちゃんと充電できて、充電が自動停止したら OK だ。工作は極めて簡単。もとのリポ電池を外して、専用ホルダーのケーブルを付けるだけ。元のリポ電池は生きていて 4.0v あったのだが、保護回路が基板側についていたので、単体では使えない。



充電から2−3時間で赤から黄色になった。このときの電圧は、4.19v 。OK だ。一晩放置したが、4.10v になっている。

次に、ポラスマ。まぁ配線して、10kΩの抵抗を付けただけ。専用ホルダー使わずに 電池の電極にハンダ付けすることも出来るのだが、ホルダー買ったし。



当然のように、立ち上がる。最初は 3.6v 34% であった。温度表示は想定どおり 25℃。
で、しばらく充電していたら 3.9v 99% になっていた。今は、4.15v 100% 。大丈夫そうだ。これで運用してみる。

おわりに


今回は、正規のバッテリーを温存する目的で、物理的にバッテリーを交換してみた。そうではなくて、充電電圧を下げて、寿命を延ばす方法もある。これについても探っていきたい。

追記1 (2015/07/01)




現在のポラスマ(予備機)。ダミーバッテリーの作りかたが分かってきた。やわらかい材質の木 −ファカルタか桐ー で作ればうまく行った。電極をどうするかが問題だったのだが、ピンヘッダをコの字に曲げて木に差し込む。木の方は溝をほっておく。ケーブルをハンダづけしたら、接着剤で固定。

また、ポラスマのバッテリーには、温度計のNTCの代わりに固定抵抗が入っていた。本体の方も無視するようになっていて、NTC を接続しても温度が 25℃固定だった。



現在の Pigu (予備機)。なんとこんな形に。スマホ台を木工で作った。そこにダミーバッテリーで、Pigu を付ける。エレコムの BT キーボード を付けてデスクトップぽくしてみた。BT キーボードのバッテリーを抜いて、ケーブルで本体バッテリーに接続してある。

一応、バッテリーの温度計(NTC) もバッテリーケースに付けた。バッテリーにくぼみがあってそこに嵌る。
posted by すz at 11:15| Comment(0) | TrackBack(0) | android

2015年03月18日

C4droid(2) -- perl4

気が変わってもうすこし、tcc & gcc の整備をしようと思う。せっかくなので何かビルドしたいのだ。
... いろいろ考えたのだが、perl にしようと思う。... といっても現バージョンではない。perl 4 である。

http://www.cpan.org/src/unsupported/4.036/

元にするのは、ここのやつ。なんと日付は 1994/1/31 -- 20年以上前のものである。この 4.036 は、FreeBSD-2.2.8R にも採用されたもの。4 の最終バージョンでもある。

ftp://ftp.tw.freebsd.org/pub/releases/i386/
FreeBSD は、ここにソースを含めたものが置いてあった。なんと 1.1.5.1 まである。

何故 perl かというと、システムの api を相当数使用しているため。perl が tcc でビルドできるようになれば、tcc のために用意した include の整備が進むだろう ... というのが目論見。実際に動かすのは今のところ優先度は高くない。

そもそも ... perl4 の使い方を知ってる人は少ないかも知れない。サブセットなわけで、perl に詳しい人でも、どの機能が使えるのか分からないかも。FreeBSD の オンライン manpage はある。山のような セクションがある perl5 とは違って perl.1 のみ -- そして 、日本語に翻訳されたものもある。ただし、日本語版はダウンロードするものしか見つけられなかった。

  ・英語版 perl.1
   日本語版 http://www.jp.freebsd.org/man-jp/get.html (2.2.8 あたり)
  ・日本語版 FreeBSD ハンドブック (おまけ)

日本語版 のマニュアルがあるものの、cat した変換済みのものである。文字コードが EUC で今の一般的な環境と違う。また、漢字1文字分戻るのに ^H^H になっているようだ。perl のテスト・練習を兼ねて html 変換スクリプトを作って見るのも良いかも知れない。

実は既に tcc でビルドできるところまで行った。結構苦労したのだが、細かいところは端折ってメモを残そうと思う。

移植の手順


1) セルフの gcc でビルドできるようにする。
(Configure で作ったものから修正していく。)
2) ビルドできたら、build-gcc.sh を作成し make を使わないようにする。
3) ファイルを必要なもののみになるように整理。
4) build-tcc.sh を作成し、gcc の include を借りてビルドできるようにする。
5) tcclib/include を整備して tcc で完結するようにする。

大変だったのは、1) なのだが、基本的に エラーが起きたら削るという作業。削ったものの中には移植可能なものがあったかも知れない。

さて、ビルドの時間の比較

gcc -O2 tcc
real 1m9.300s 0m1.899s
user 1m6.610s 0m1.300s
sys 0m1.510s 0m0.280s

さすが、tcc は高速。だが、最適化なしなので、サイズは大きくなってしまっている。

gcc -O2 tcc
bytes 347483 509704

まとめ


 ・perl-4.036-android-150318.tar.gz -- perl4 ソース+バイナリ
 ・tcc-0.9.26-android-150318.tar.gz -- tcc ソース+バイナリ
 ・tcc-android-150318.tar.gz -- tcc バイナリ
 ・sqlite-bin.tar.gz -- おまけ

今日の成果物。作った perl4 は、完成度が低いと思われるので、バイナリのみは提供しない。tcc は perl4 をビルドできるよう include を足しただけ。sqlite は、拾ってきたバイナリ。perl と組み合わせて使うとなにかと便利かも。ちなみに、perl という名前で生成しているが、/system/xbin/perl4 に置くつもり。

変更元は、素の perl-4.036 でセキュリティパッチも当ててない。変更点を調べる場合は、diff を取って欲しい。あと、sys-api.txt というファイルが置いてあるが単に 外部シンボルを調べただけのもの。

おわりに


次は、vi をなんとかしたいのと、scp が欲しい。出来るかどうか分からないが。

付録 gcc 環境作成のメモ


メモだけ残しておく。とりあえず loop デバイスで /usr に mount して 使うようにした。/data/local 使うのが良いのかも知れないが、端末の初期化で消えてしまう。/usr にしても boot.img を直さない限り mountポイントを作らないとダメで面倒ではある。
今の認識では、gcc 環境は借り物で、使うときにだけあれば良い。tcc での簡易開発環境を /system に仕込むというのが目的で、公開するものは、tcc でビルド可能にすると思う。

# dd if=/dev/zero of=/sdcard/usr.img bs=1024K count=300
# losetup /dev/block/loop0 /sdcard/usr.img
losetup: /dev/block/loop0: Bad file number
# losetup /dev/block/loop7 /sdcard/usr.img
# mke2fs -T ext4 /dev/block/loop7
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
19200 inodes, 76800 blocks
3840 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=79691776
3 block groups
32768 blocks per group, 32768 fragments per group
6400 inodes per group
Superblock backups stored on blocks:
32768

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mount -o remount,rw / /
# mkdir /usr
# mount -o noatime -t ext4 /dev/block/loop7 /usr
posted by すz at 22:29| Comment(0) | TrackBack(0) | android

2015年03月16日

C4droid -- tcc と gcc

Android で動作する C コンパイラというか開発システム?に C4droid というのがある。有料なんだが、そんなアプリはこれしかないようなので、購入してみた。
add on には、「GCC for C4droid」、「SDL plugin for C4droid」あと関連アプリに「Ministro」というのがある。C4droid 自体は 5MB 程度なのだが、add on を適当にインストールしたら、SDカードに 257MB ものファイル群が出来上がった。

本当は、ちょっと tcc に興味を持っただけなのだ。/system にちょっとコンパイラを仕込んでみたいというだけなのだ。まぁ セルフの GCC も使ってみたい気はする... のだが、しょぼい IDE で使う気はしないので、どうしたものか。

とりあえず、ファイルに何があるかの調査。(以下、延々調査内容なので、読み飛ばしたほうが良いかも)

/sdcard/Android/data/com.n0n3m4.droidc/files/gcc

arm-linux-androideabi/ lib/ terminfo/
bin/ libexec/ tmpdir/
include/ plugin_version

こんな場所にそれらしきものが。

#ls bin
arm-linux-androideabi-ar arm-linux-androideabi-ranlib
arm-linux-androideabi-as arm-linux-androideabi-strip
arm-linux-androideabi-g++ m4
arm-linux-androideabi-gcc make
arm-linux-androideabi-ld pkg-config
arm-linux-androideabi-nm sdl-config
# ls arm-linux-androideabi/bin
ar as cc g++ gcc ld nm
ranlib strip

m4 と make も見つかった。ただ、objdump と objcopy がなく少々不便。

# ls -F lib/gcc/arm-linux-androideabi/4.9.1/
crtbegin.o* crtend.o* include-fixed/
crtbeginS.o* crtendS.o* libgcc.a*
crtbeginT.o* include/ libgcov.a*
# ls arm-linux-androideabi/lib/
crtbegin_dynamic.o libSDLmain.a libogg.a
crtbegin_so.o libandroid.so libpanel.a
crtbegin_static.o libc.so libpng.a
crtend_android.o libdl.so libsmpeg.a
crtend_so.o libform.a libstdc++.a
libEGL.so libfreetype.a libsupc++.a
libGLESv1_CM.so libjnigraphics.so libthread_db.so
libGLESv2.so libjpeg.a libtiff.a
libOpenSLES.so liblog.so libtiffxx.a
libSDL.a libm.so libvorbis.a
libSDL_image.a libmenu.a libvorbisfile.a
libSDL_mixer.a libnative_app_glue.a libz.so
libSDL_net.a libncurses++.a pkgconfig
libSDL_ttf.a libncurses.a

ライブラリは、.a のものと .so が混在。一体どれが使われるのだろう?
gcc は、相対パスで動作するので、ディレクトリを移動。qemu-user 環境を作って、/usr/local へ。
gcc を /usr/local/bin に置いた場合 include のパスは次になった。

"/usr/local/lib/gcc/arm-linux-androideabi/4.9.1/include" --(1)
"/usr/local/lib/gcc/arm-linux-androideabi/4.9.1/include-fixed"
"/usr/local/arm-linux-androideabi/sys-include"
"/usr/local/arm-linux-androideabi/include" --(2)

システムの include は(2) に、gcc の include は(1) に置いてみる。
次はライブラリのパス

-L/usr/local/lib/gcc/arm-linux-androideabi/4.9.1
-L/usr/local/lib/gcc

こうなっているのだが、.so がここにあっても困る。
collect2 のオプションが、

-dynamic-linker /system/bin/linker -X -m armelf_linux_eabi \
/usr/locallib/gcc/crtbegin_dynamic.o \
(xxx.o) -lgcc -lc -ldl -lgcc \
/usr/local/lib/gcc/crtend_android.o

/system/bin/linker を使うわけで、/system/lib の libc と libdl をリンクしたい。-L/system/lib 必須ということになった。

gcc hello.c -L/system/lib

これで、a.out が生成されるようにはなった。qemu-user 環境では動かないが、実機では動くというしろもの。この問題はおいておいて、次。tcc はどこにあるのか?

# ls -F /data/data/com.n0n3m4.droidc/files/
busybox* file.stderr indent* temp.c*
c4droid_version file.stdin tcc*
file.sh file.stdout temp*
# ls /sdcard/Android/data/com.n0n3m4.droidc/files/tcclibs/lib
fix.o libcrypt.a libm.a librt.a
libc.a libdl.a libpthread.a
# ls /sdcard/Android/data/com.n0n3m4.droidc/files/tcclibs/include/
a.out.h fpu_control.h netpacket stdlib.h
alloca.h getopt.h nl_types.h string.h
ar.h glob.h obstack.h strings.h
arpa gnu-versions.h paths.h sys
asm grp.h poll.h syscall.h
asm-generic ieee754.h protocols sysexits.h
assert.h internal pthread.h syslog.h
atomic.h inttypes.h pty.h tar.h
bits langinfo.h pwd.h tcclib.h
byteswap.h lastlog.h rdma termio.h
complex.h libgen.h regex.h termios.h
conio.h limits.h regexp.h tgmath.h
cpio.h link.h resolv.h thread_db.h
crypt.h linux sched.h time.h
ctype.h locale.h scsi ttyent.h
dirent.h malloc.h search.h ucontext.h
dlfcn.h math.h semaphore.h ulimit.h
elf.h memory.h setjmp.h unistd.h
endian.h mntent.h sgtty.h utime.h
err.h mqueue.h signal.h utmp.h
errno.h net stdarg.h values.h
error.h netax25 stdbool.h varargs.h
fcntl.h netdb.h stddef.h wait.h
features.h neteconet stdint.h wchar.h
float.h netinet stdio.h
fnmatch.h netipx stdio_ext.h

どうやら、ここら辺。
で、この tcc は、

tcc version 0.9.25 - Tiny C Compiler - Copyright (C) 2001-2006 Fabrice Bellard

こういうもので、バージョンがひとつ古い。参考にするに留めたい。
strings でパスらしき文字列を grep すると

/system/bin/linker
/usr/local/include
/usr/include
/usr/local/lib/tcc
/usr/local/lib
/etc/ld.so.cache
/lib:/usr/lib
/dev/zero
/etc/TZ
/etc/localtime
/proc/stat
/proc/cpuinfo
/sys/devices/system/cpu
/dev/null

こんな風になっている。/system/bin/linker が含まれているが、自分自身が ダイナミックリンクされているのだろう。他には実情に合わないパスが色々と。

まぁ、とりあえず最新版をビルドしてみよう。「TinyCC on ANDROID (ARM)」という ブログを見つけたので、知識を拝借させてもらう。
 1) sys/ucontext.h を拾ってくる。
 2) strtold() を strtod() で代用

long double strtold(const char *s, char **p) \
{ return (long double)strtod(s, p);}

 3) config.h を以下の内容で作成

#define CONFIG_TCCDIR "/system/xbin"
#define CONFIG_TCC_CRTPREFIX "/usr/local/lib:/data/local/lib:/sdcard/tcc/lib"
#define CONFIG_TCC_SYSINCLUDEPATHS \
"/usr/local/include:/data/local/include:/sdcard/tcc/include"
#define CONFIG_TCC_LIBPATHS "/system/lib:/usr/local/lib:/data/local/lib:/sdcard/tcc/lib"
#define CONFIG_TCC_ELFINTERP "/system/bin/linker"

#define HOST_ARM 1
#define TCC_ARM_VERSION 7
#define TCC_VERSION "0.9.26"

 4) tcc.c を以下の define でコンパイル

-DONE_SOURCE -DTCC_TARGET_ARM -DTCC_ARM_EABI -DWITHOUT_LIBTCC

うそでしょうと思うほどあっさりとビルドできた。
やっぱり qemu-user 環境で動かないので、実機で。
tcclib.h stdarg.h stddef.h
だけ用意して 実験

# ./tccwk
tcc version 0.9.26 - Tiny C Compiler - Copyright (C) 2001-2006 Fabrice Bellard
Usage: tcc [options...] [-o outfile] [-c] infile(s)...
tcc [options...] -run infile [arguments...]
General options:
(略)
# ./tccwk -I. -c hello.c
./tccwk -I. hello.c
tcc: error: file 'crt1.o' not found
tcc: error: file 'crti.o' not found
tcc: error: file 'crtn.o' not found

おしい。gcc で使った、crt を用意して

./tccwk -nostdlib -I. ./crtbegin_dynamic.o hello.c crtend_android.o -L/system/lib -lc -ldl
./a.out
hello
./tccwk -nostdlib -I. crtbegin_dynamic.o hello.c crtend_android.o -L/system/lib -lc -ldl -run
hello

えー、こんなにあっさりと動くものなのカ。ブログ主に感謝。

では、tcc 自身をビルドしてみよう。
... と include ファイルをどうするのか?という問題があった。
出来るだけコンパクトにしたいので、使っているものを調べてみる。

dlfcn.h fcntl.h math.h signal.h stdio.h
string.h unistd.h
errno.h inttypes.h setjmp.h stdarg.h stdlib.h
time.h
sys/mman.h sys/time.h sys/ucontext.h


まぁこんなものか。... なんてのは甘かった。include がネストして

tcclib/include/:
alloca.h fcntl.h math.h stddef.h sys/
android/ inttypes.h memory.h stdint.h time.h
asm/ limits.h pathconf.h stdio.h unistd.h
asm-generic/ linux/ setjmp.h stdlib.h
dlfcn.h machine/ signal.h string.h
errno.h malloc.h stdarg.h strings.h

tcclib/include/android:
api-level.h

tcclib/include/asm:
errno.h page.h siginfo.h
fcntl.h posix_types.h signal.h
mman.h sigcontext.h types.h

tcclib/include/asm-generic:
errno-base.h fcntl.h mman.h signal.h
errno.h mman-common.h siginfo.h

tcclib/include/linux:
capability.h fcntl.h stddef.h
compiler.h limits.h time.h
errno.h posix_types.h types.h

tcclib/include/machine:
_types.h kernel.h setjmp.h
internal_types.h limits.h

tcclib/include/sys:
_types.h limits.h syslimits.h ucontext.h
_wchar_limits.h mman.h sysmacros.h
cdefs.h select.h time.h
cdefs_elf.h sysconf.h types.h

整理してシンプルなものにしたいんだが、regex とか追加したいような気もする。追加する場合は、整合性上さわらない方が良いだろう。今のままだと gcc から引っ張ってきているだけなので、gcc との整合性も取れている。
さて、例のブログに tcc でコンパイルする場合の変更点が載っているので、同様に修正。
やってみたところ、sys/cdefs.h に修正が必要だった。で、

tcc: error: undefined symbol '__aeabi_lasr'
tcc: error: undefined symbol '__aeabi_d2ulz'
tcc: error: undefined symbol '__aeabi_d2lz'

出た。よくは分からないが libgcc.a のようなものが必要なのだろう。

long long __aeabi_llsr(long long, int)
-- logical shift right [1]
long long __aeabi_lasr(long long, int)
-- arithmetic shift right [1]
int __aeabi_lcmp(long long, long long)
-- signed long long comparison [3]
int __aeabi_ulcmp(unsigned long long, unsigned long long)
-- unsigned long long comparison [3]

int __aeabi_d2iz(double)
-- double to integer C-style conversion [3]
unsigned __aeabi_d2uiz(double)
-- double to unsigned C-style conversion [3]
long long __aeabi_d2lz(double)
-- double to long long C-style conversion [3]
unsigned long long __aeabi_d2ulz(double)
-- double to unsigned long long C-style conversion [3]
int __aeabi_f2iz(float)
-- float (single precision) to integer C-style conversion [3]

ぐぐったら、Run-time ABI for the ARM(R) Architecture と冠する pdf があってこんなのがいっぱいある。... 困ったどうしたものか?
あれ? コンパイルだけやって undefined をチェックすると たくさんあるうちの3つがエラーになっている。他の実体はどこに?

U __aeabi_d2lz
U __aeabi_d2ulz
U __aeabi_idiv
U __aeabi_idivmod
U __aeabi_l2d
U __aeabi_lasr
U __aeabi_ldivmod
U __aeabi_llsl
U __aeabi_llsr
U __aeabi_memcpy4
U __aeabi_memcpy8
U __aeabi_memset
U __aeabi_uidivmod
U __aeabi_ul2d
U __aeabi_uldivmod

libgcc.a みたいなものと書いたが、libgcc.a に定義されていた。... というか libc とかも gcc でコンパイルされているし .. 。でも、libgcc.a そのものを指定すると別の undefined エラーが。解決するには、collect2 が必要になってしまう。とりあえず、自己完結しているものを集めて libtcc.a を作ったところ ... tcc が、ビルドできた!

あとは、ライブラリサーチパスとか crt ファイルの変更だとかをやって整理。

config.h:
#define CONFIG_TCCDIR "/system/xbin"
#define CONFIG_TCC_CRTPREFIX "/system/tcclib/lib:/data/local/tcclib/lib:/sdcard/tcclib/lib"
#define CONFIG_TCC_SYSINCLUDEPATHS \
"/system/tcclib/include:/data/local/tcclib/include:/sdcard/tcclib/include"
#define CONFIG_TCC_LIBPATHS "/system/lib:/system/tcclib/lib:/data/local/tcclib/lib:/sdcard/tcclib/lib"
#define CONFIG_TCC_ELFINTERP "/system/bin/linker"

#define HOST_ARM 1
#define TCC_ARM_VERSION 7
#define TCC_VERSION "0.9.26"

まぁ場当たり的な修正ばかりだが、一応は動く。

まとめ


 ・tcc-0.9.26-android-150316.tar.gz ソース+バイナリ版
 ・tcc-android-150316.tar.gz バイナリ版

最初の成果物。ソース+バイナリ版は、build-tcc.sh で tcc 自身がビルドできる。
バイナリ版は、/system/xbin に tcc を /system/tcclib に include と lib を置くように作成。
もうすこし詳しく書いておく。
tcclib を置けるのは、/system /data/local /sdcard のどれかの配下。tcc コマンドはパスが通っていれば良い。
ライブラリの指定は、-lc -ldl あたりだと思うが、なしでいける場合もある。long long を使うようなコードでは、-ltcc を付けないといけない場合がある。
-run オプションも動くようだ。

おまけ GCC のビルドオプション



COLLECT_GCC=/usr/local/bin/gcc
Target: arm-linux-androideabi
Configured with: ../configure --host=arm-linux-gnueabi \
--target=arm-linux-androideabi \
--enable-static --disable-shared --enable-languages=c,c++ \
--enable-initfini-array --disable-lto --with-float=soft --with-fpu=vfp \
--with-arch=armv5te --disable-libquadmath \
--disable-multilib --disable-libgomp \
--disable-libmudflap --enable-target-optspace --enable-threads \
--disable-libatomic --disable-tls --disable-nls \
--disable-sjlj-exceptions \
--disable-libstdc++-v3 --disable-libsanitizer --disable-plugins \
--disable-libgcc --disable-libssp --disable-docs --disable-libitm \
--with-gnu-as --with-gnu-ld --prefix=/prog/c4droid/OutDir \
--with-mpc=/prog/c4droid/mpc --with-mpfr=/prog/c4droid/mpfr \
--with-gmp=/prog/c4droid/gmp
Thread model: posix

おわりに


セルフで動く tcc をビルドするという目的は、達成されてしまった。アドホックなんで不具合は出るかも知れない。優先度は高くないが、手直しはしていきたい。
さて、次は gcc をセルフで動かすように整理したい。/system ではなく loop デバイスで /usr パーティションを mount して使うのが良いかと思っている。これもボチボチやりたいが、バイナリは配布しないかも。
次は、Mediatek のカーネルについて調べてみたい。
posted by すz at 01:49| Comment(0) | TrackBack(0) | android

2015年03月14日

Pigu & Polasma

久しぶりの記事。
N-04C を長らく使ってきた。ティザリング以上の改造もせずおとなしく使っていたのだが。。。
たまたま、ポラロイド Pigu という機種が (税込送料込) 4980円 で特売されていることを知り、予備も含めて2個発注した。情報取集に努めていたところ、ポラロイド Polasma という機種が、トイザらスで特売されていることを知った。出遅れたので諦めてたのだが、妹の地元に在庫があり、頼んで2個確保してもらった。

これらを喜び勇んで購入したのは、MediaTek だからである。ファームウェアを弄っても元に戻せるとふんで、改造して遊ぶのが主目的。バッテリーがへたってきた N-04C の代わりにメインスマホとして使おうというのも目的ではある。

ファースト・インプレッション


店頭購入の Polasma を先に入手できたので、まずこれから。N-04C と比べて画面が美しくかつ広い。まずそこに感銘を受けたのだが、CPU性能が高くきびきび動く、その上消費電力が小さいようだ。N-04C では充電より消費の方が多く、充電している時でもバッテリーが減っていくということが良くあったのだが、こいつは、そんなことはない。携帯して使っても、バッテリーが持つ。これだけで、スマホも随分と実用性が上がったなぁという印象を受けた。
ただ、N-04C ほどタフではない。すぐに壊してしまいそうな .. そんな印象がある。ゴリラガラスとか強化ガラスであるとは一切説明されてないし、画面が広く筐体が薄すぎる。本当に簡単に壊してしまいそうだ。
次は、Pigu 。Polasma を入手できてしまったので、どうしたものかと思っていたのだが、意外にも良い。携帯性が良いのが理由。別にタフではないのだろうが、Polasma ほど気を使わなくとも済む。その上バッテリーの持ちが Polasma よりもさらに良い。当然ながら、筐体が小さいのも携帯性に寄与している。Polasma クラスでさえ電話のサイズではない -- 小型タブレットだろう。
Pigu の 画面は 320x480 と狭い上に液晶も青っぽくあまり良くないわけだが、携帯性のほうが優先度が高い。持ち歩きたいのは Pigu の方になった。

どう使いわけるか


4台も入手してしまってどうするの?と思われる人もいるだろうが、もともと弄るために買ったのだ。多すぎではあるが、別に困らない。

Pigu (Black) : これはいつも持ち歩く。
Polasma (Yellow) :

 Windows機の傍らに置いて、サブ機として使う。動画も専らこれ。気分によって持ち歩くが、SIM の数の問題が。もし、BT子機にできるようになったら、pigu との 2台持ちにしたい。

Polasma (Red) :

 開発機 - SSHDroid を常に起動し、専ら ssh でログインして使う。セルフコンパイル環境の C4Droid も導入。ファームウェアを弄る実験も専らこれ。

Pigu (Green) :

 予備機 -- カラーの バッテリーカバーを付けたのだが、いまのところ、単なる予備になってしまっている。


MediaTek のツールについて


SP Flash Tool (SPFT)
SP Flash Tool v5.1352.01.zip (MD5: bb3cad2ceed284651e4c494b9966b605)
MT6577 USB VCOM drivers.rar(MD5: 8e9388d06ae7e3f6bd5074f8c8e4a8e8)
まずはこれ。ROM イメージを焼くためのツール。ROM イメージを持っていれば、bootloader を壊してさえ、元に戻せる。セキュリティ上どうかと思うが、吸い出すこともできるので 後述の MtkDroidTools と合わせて完全なバックアップも作れる。Windows8 でドライバを導入するのは面倒だが、freetel nico の手順書が参考になる。

MtkDroidTools
MtkDroidTools_v253.exe(MD5: c95067099942bb3dea0acf5a5a29737a)
http://adbdriver.com/downloads/
いくつかの機能があるのだが、SPFT で 吸い出した ROM イメージを 書き戻せるような形式に変換してくれる。実機に接続する必要はあるが root 化は必要なく、stock の ROM イメージを作成することが出来る。他には CWM の自動生成にお世話になった。
困ったことに、アンチウィルスソフトに、トロイの木馬だと認識されてしまう。(AVG では最近、ウィルスとは認識しなくなったみたい)

root化


Polasma は、Framaroot で root が取れるという情報があったので、なんとか入手した。確かに root は取れた。だが、Pigu では無理であった。
しかし MediaTek の場合、SPFT + MtkDroidTools でいけるのだ。
1) SPFT で ROM を吸い出す。
2) MtkDroidTools で変換すると CWM が自動で作成される。
3) recovery_cwm.img と boot_patched.img を書き込む。
4) CWM を起動して、UPDATE-SuperSU-v2.46.zip をインストール


この手順は強力で対策不可能な感すらある。逆にこれを知ってる人間に盗まれたらやばい。重要な個人情報を扱う場合は Android の暗号化機能で、ディスクを暗号化しておいた方が良い。

root化して使いたいもの


とりあえずは、ESファイルエクスプローラでの パッケージ(APK)のバックアップ 。沢山マシンがある上に初期化も頻繁にするので、いちいちダウンロードするのはやってられない。

あと CF.lumen 。液晶の色温度を設定できるフィルターソフトで、要root + 4.4.2以上。Pigu では是非とも使いたい。

あともう一つあるが、ここではコメントを控えておこう。

さて、開発目的だと、もう root化は必須だ。変更したりできなければ話にならない。
普通は、adb で入って su するわけだが、sshd を使うことを覚えた。やっぱりこっちの方が便利。busybox の vi が使えたりするし。sshd は、SSHDroid が良いようだ。

とりあえずの ToDo


1) セルフ用 tcc をビルド
大した目的ではないが、これはクリアしておきたい。実を言うと C4Droid には、tcc のバイナリが含まれていたりする。これを参考にしてビルドに挑戦。tcc 自身で tcc も作りたいが、C4Droid の gcc も使ってみたい。もちろんコマンドラインでのビルド。gcc もファイルをピックアップして通常の tree に組み込むのだ。

2) Polasma を BT子機に
全然どうしたら良いかわからないのだが、やりたい。仕組みすら見当が付けられない。
タイムリミットは、8月あたり。現在は、SIM を2枚持っている。だいぶ前に買って眠らせていた、6か月のプリペイドが使えなくなるまでになんとかしたい。

ヒントとしては、Pigu 。なぜか対応しているのだ。バージョンが違うため流用は出来ないだろうが参考にはなるだろう。あとは、同じ MediaTek の 4.2.2 のタブレット。Lenobo の YOGA がそのひとつで、BT子機になるらしいのだが... ROM イメージをなんとか入手して調べてみたい。

おまけ1


カーネルソース
 ・https://android.googlesource.com/kernel/mediatek/ (4.4.4)
 ・https://github.com/aniruddha-adhikary/mt6572_kernel (4.2.2)
ビルドするのが目的ではなく調査用。いやモジュールぐらいは...

おまけ2


今の Polasma(yello)


少しでも安心したく、DX.com で購入した強化ガラスのスクリーンプロテクターを貼っている。専用品などないので、サイズが近い LG G2 用にした...のだが四隅がはみ出してしまった。はみだしたところは Polasma を削るしかなかった。道具に撤するので問題ないのだが、少し残念。HTC one M8 用だと長方形で、画面部分だけ覆えるのだが、それで良かったかも。ちなみに、強化ガラスは加工できないそうだ。傷が入れば割れてしまう。ダイヤモンドやすりで削ろうと思ってたのだが甘かった。

裏には、バンカーリングもどきを付けた。動画とか見るし必要だと考えた。さらに、リールクリップを付けている。余計な気もするが、落としたくない。

今の Pigu(black)


これも、リールクリップを付けている。ストラップホールなどないので、ケースに穴を開けた。内部に空間があるところに穴を開ける必要があった。ストラップは以前 DX.com で買い置きしてたもの。適度な遊びになっていて具合が良いようだ。

おまけ3


http://www.needrom.com/download/polaroid-pigu-cwm/
http://www.needrom.com/download/polaroid-pigu/
http://www.needrom.com/download/polaroid-polasma-cwm-twrp/
http://www.needrom.com/download/polaroid-polasma-shrinked-rom/

stock の ROM とかが、置いてある。ぶっ壊してもまぁなんとかなる。
そうそう、Polasma はロシア?で 「QUMO Quest 506」という製品名で売られている。これ用の TWRP なども動作する。

(追記)
ココのサイトが、Polasma の 中国国内版を見つけた。NAMO NX5 または NAMO NXPLAYER だそうだ。ボード名である「htt82_wet_jb5」が見つけるキーワードになったそうだ。で、htt82_wet_jb5 でググると Elephone P7 Mini というのもある。こっちは形も違うのだが V10 だそうだ。(Polasma は V10B)
ついでに Pigu の ボード名 hexing72_cwet_kk でググっても何も出てこない。Pigu はオリジナルではないか?
posted by すz at 21:38| Comment(2) | TrackBack(0) | android