2011年11月05日

開発環境の整備(2)

前記事ではグダグダになってしまったので、一回整理。

開発環境の整備とかいうタイトルにしてしまったが、Android とはほぼ関係ない。では、なにをやろうとしているかといえば ... Redhat Enterprise Linux 6 (RHEL6) の mipsel 版 clone を作ること。ただし、ブート可能なのはとりあえず目標としていない。まずは、RPM をビルドできる環境として root を 展開して chroot するものを目指す。

    何故 他のものではなく、fedora でもなく RHEL なのか? ... というと基本的に RPM を使っているシステムが好きなのだ。で、fedora はでかいし更新が頻繁で、作っているうちに時代遅れになってしまうのが嫌なのだ。RHEL は更新の頻度は低め だし、6 ならしばらく使えそうだ。あと、断っておくが全部をビルドするつもりはない。目指すのはあくまでビルド環境として成り立つ最低限度のもの。

どこまで出来るかは分からないのだが、やってみている。現状は、 RHEL6(clone) の chroot 環境 に qemu-mipsel を入れて セルフだか クロスだかよく分からないような 環境になっている。その環境で、 343 個の rpm をビルドした。最終的に 1000 個ぐらい必要なので、1/3 ぐらいの達成度。

ビルドするにあたっての基本方針

  • 64bit(x86_64) ではもともと i386 環境と共存できるようになっていて、 /lib , /usr/lib は 32bit 環境用に空けてある。

    i386 の代わりに mipsel を突っ込む というのが基本的なアイディア。その環境で qemu の usermode というのを使って mipsel のバイナリを動かす。rpm コマンドとかビルドするのが難しいものは、 x86_64 を使って 親の 環境を流用する。

  • 準備 src.rpm から ビルドして x86_64 の野良クローンを作る。

    この方針だと x86_64 と mipsel が同じバージョンでないと困る。多少のバージョンが違ってもなんとかなるが、まったく同じものをベースにして置き換えていくのがベストなのだ。

    まずは、ベースとなる環境を作ってみることから始める。これも出来ないのでは、mipsel 版なぞ無理な話なわけで、mipsel 版の ビルドの 予行演習でもある。

    また、どこまで作るのか ... 全てを作っていては とても巨大になる。どれを ビルドするのかを見極めることも 同時に行う。

    最低限度必要なのは、自分自身をビルドできるもの 。gnome など当面必要なさそうなものは、はずす。

    この作業は クリアした。まぁ適当なものだが、

    に置いておく。mindev10bin2.iso と mindev10src5.iso だが、どちらも 2GB 弱もある。bin の方は、すべての RPM と rootfs の tarball -- mindev10.tgz が入っている。

    root になるディレクトリを作って そこに root 権限で

    # tar -zxvpf mindev10.tgz

    とする。(いきなり usr とかになっているので 注意)。あとは、chroot して、

    # mount /sys
    # mount /proc

    とすれば、だいたい使える。これ自体 (java 系を除く) すべての x86_64 RPM をビルドできる環境になっている。

      ただし、i686 パッケージが入っている。これは mipsel の環境を作るには邪魔なので、アンインストールしておく。

    ちなみに src の iso はすべての SRPM と minroot.tgz 。

    minroot.tgz は、boot 可能な(はずの)最小の環境。これには rpm コマンドが入っているので、ここから RPM をインストールしていくことができる。

    この root イメージに chroot する親OS のディストリビューションは、あまり関係ない。Linux のバージョンの方が重要だが、2.6.24 以降なら問題ないはず。

    さて、これら以外に mipsel-devkit1-wk0.tar というファイルがあるが、mipsel 版について、いままでの成果をつっこんだもの。ただしまとまってはいない。

mipsel 開発環境

まずは、なにをするのか ... というと qemu のビルド。qemu といっても QEMU user-mode というもので、linux のカーネル機能 binfmt_misc とあわせることで、mipsel などのバイナリを native のように動かせるもの。

    mipsel-devkit1 に qemu-bin.tgz に最低限必要なバイナリを入れてある。

      startup.sh
      usr/bin/qemu-arm
      usr/bin/qemu-mipsel
      usr/bin/qemu-ppc

    mipsel 以外に arm とか ppc も入れてみた。.... mipsel が移植できるなら arm や ppc も同じやりかたでできるはずなのだ。mipsel がうまくいくようなら、これらもやってみるかも知れない。

    このバイナリを作った SRPM も SRPMS-cross に入れてある。

クロス版 binutils , gcc , glibc

最初に必要になるのは、この 3 つ ... なのだが すでに 擬似セルフ環境に移行しているので、あまり重要ではなくなっている。だが、arm などの移殖のために、どうやって作っていったのかをメモしておく。それに GPL はソースだけでなく、どうやって作ったかの情報をも要求している。説明可能になってないと厳密にはまずい。

    まずは、binutils 。これは、オリジナルの SRPM が、クロス用を作れるようになっている。

      rpmbuild --without testsuite --define "binutils_target mipsel-redhat-linux"
      --rebuild binutils-xxx.src.rpm

    これで、できるので、インストールしておく。redhat になっているが、とりあえずなので、気にしない。

    さて、これからが大変

    • 0) 準備 (種となる libc.a と include ファイルを用意)
    • 1) gcc のビルド (最小環境)
    • 2) glibc のビルド
    • 3) gcc のビルド (stdlibc++ を含めた環境)

    という手順。

  • 0) 準備

    ビルドで、実行可能なファイルが作れるかチェックしているので、適当なものでよいから libc.a などが必要なのだ。で、ちゃんとした include ファイルと glibc を用意できれば、標準的なビルドが可能になる。

      mipsel-devkit1 の mipsel-devkit1-lib00.tgz には 3) が可能になる 最低限のファイルを入れてある。( /lib を使うので注意 )

      1) から行う場合は、このうち usr/mipsel-redhat-linux/lib の crt*.o libc.a だけが必要。

    • 1) gcc のビルド (最小環境)

      SRPMS に (変更した) gcc の SRPM を入れてある。これをとりあえず rpmbuild で configure するところまで 進める。

        パッチを当ててくれるし、config.log に config のオプションが残っているので テンプレートとして使えて便利。


      ../configure --prefix=/usr --target=mipsel-redhat-linux \
      --build=x86_64-redhat-linux --host=x86_64-redhat-linux \
      --disable-threads --disable-checking --with-system-zlib \
      --enable-__cxa_atexit --disable-libunwind-exceptions \
      --enable-gnu-unique-object --enable-languages=c,c++ --disable-libgcj \
      --disable-libmudflap --disable-libgomp --disable-libssp \
      --disable-shared --disable-libstdc__-v3

      最初の configure はこれ。ほとんどのライブラリを disable にするし、libc.a しかないのでシェアードライブラリも disable に。

      あと、--disable-fixed-point も入れておくと 使わない固定小数点ライブラリをビルドしないので、ビルド時間を短縮できる。

      これが終わったら、インストールディレクトリを用意して

      # make DESTDIR=xxx install

      これで、一応ファイルをチェック。必要そうなものだけ、選んで / に展開しなおす。(後述)
    • 2) glibc のビルド

      glibc のビルドに gcc は必要だが、ほかに カーネルヘッダーが必要。

      Ingenic のサイトにあった、linux-headers-2.6.24.3.tar.bz2 をおいてある。これを /usr/mipsel-linux/include におく。

      で、gcc と同じように SRPMS においた (変更した) glibc を途中までビルド。これを元に configure しなおして、ビルドする。

      ../configure CC=mipsel-linux-gcc CXX=mipsel-linux-g++ \
      AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib --prefix=/usr \
      --enable-add-ons=nptl,c_stubs,libidn,ports --without-cvs \
      --enable-kernel=2.6.18 --enable-bind-now --with-tls --with-__thread \
      --disable-multi-arch --disable-profile --enable-experimental-malloc \
      --disable-nss-crypt \
      --host=mipsel-linux --build=x86_64-redhat-linux \
      --with-headers=/usr/mipsel-linux/include

      glibc も インストールするディレクトリを用意するのだが ... オプションが違うので注意。

      make install_root=/tmp/new-glibc install


      mipsel-devkit1-inc0.tgz
      mipsel-devkit1-lib0.tgz

      これらが、作ったもの ... のはず。(実はすでに セルフで RPM が作れているので、そこからとってきている)

      inc0 の方は、クロスでは、/usr/mipsel-redhat-linux に展開し、lib0 は / に展開して /lib と /usr/lib にインストールする。

    • 3) gcc のビルド (stdlibc++ を含めた環境)

      まずは、上記の inc0 を /usr/mipsel-redhat-linux に展開して lib00 を展開する。
      lib0 でも良いかも知れないが、/usr/lib のファイルを /usr/mipsel-redhat-linux/lib に移動しないとだめかも。

      3) のステップでは後ろ 2 行を変更。

      --enable-libmudflap --enable-libgomp --disable-libssp \
      --enable-shared --enable-libstdc__-v3

      だいたい enable にする。libssp は使わないと思うので disable のまま。

      mipsel-devkit1-gcc0.tgz は、これで作ったバイナリ。すべてではなく、必要そうなファイルを選んである。

      以上 ... なのだが、これらのうち 3) で作った gcc の一部 は セルフ環境でも使う。ただし、cc1 , cc1plus 以外の実行形式のファイルはセルフのものと置き換えている。

    擬似セルフ環境

    以上は、x86_64 システム自体は壊さない範囲での作業だった。これからは rpmbuild でパッケージをビルドできるように システムのファイルも書き換えていく。

    そのため、chroot 環境を別に用意する。最終的には、実機で chroot して動かせる 本当のセルフ環境を作るのが目的だが、今は それができない ので擬似セルフ環境としておく。

    擬似セルフ環境は次のステップで作っていく。

    • 1) rpmbuild ができるようにする
    • 2) 作った binutils , glibc , gcc に置き換える。
    • 3) 作った RPM を 手動でインストールしていき、さらに ほかの RPM をビルドできるようにする。

    3) が作業のメインなのだが、一筋縄ではいかない。依存関係が巡回しているのだ。そのため、仮に作った RPM をインストールして 全部そろったところで 再度正規の RPM をビルドしなおすことになる。この作業は非常にたいへんなので、説明が長くなる上、整理できていない。3) は後回しにして その成果物を先に紹介する。

  • 1) rpmbuild ができるようにする

    正確には、

    rpmbuild --target mipsel --rebuild xx.src.rpm

    ができるようにするわけだ。セルフ環境を目指しているわけで、ビルドに必要なものは、/usr/include /lib /usr/lib にインストールされていなければならない。そして、一部のものは、/usr/bin のコマンドを入れ替える必要もある。

    とりあえず、include については、上記のものを /usr/include にインストールする。もとの include は、/usr/include-x86_64 とでもしておいて、参考にしている。

    また、セルフ用のコマンドに置き換えるまでは、/usr/mipsel-redhat-linux/ の include や lib が参照される。include は、/usr/include へのリンクで済むが、lib はちょっと面倒だったりするので、早い段階で binutils や gcc を置き換える。

    /usr/bin の置き換えについてだが、とりあえず mipsel-redhat-linux-xx をすべて xx に置き換える。本当は、 /usr/mipsel-redhat-linux/bin に集めてパスを通すのが正統のような気もするが まぁ今はこれでやっている。

    以上の作業をすれば、一応は rpmbuild はできるようになる。ただし、いくつかの設定が具合が悪い。/usr/lib/rpm/macros , /usr/lib/rpm/redhat/macros , /usr/lib/rpm/rpmrc あたりを編集しなければならないが、ちゃんと整理できていないので説明できない。

  • 2) 作った binutils , glibc , gcc に置き換える。

    最初にビルドすべきなのは、zlib 。ビルドしたのは良いとして、どうやってインストールするかが次の問題。

    全部は置き換えたくないのだ。

    # rpmbuild --target mipsel --rebuild zlib-xxx.src.rpm

    これでできた RPM に対して

    # rpm2cpio zlib-xxx.mips.rpm | cpio -id
    # rpm2cpio zlib-devel-xxx.mips.rpm | cpio -id

    こうやって展開する。このうち /usr/include , /lib , /usr/lib (pkgconfig も) をインストール。

    /lib , /usr/lib は基本的に問題がない。/usr/include も置き換えると決めたので問題なし。 問題なのは、/usr/bin だが as,ld など binutils のコマンド cpp , gcc , g++ , c++ といった gcc のコマンド、 あと pkgconfig と chrpath それに パッケージ固有の xx-config あたりは置き換えることにする。

    glibc のパッケージでは、/sbin/ldconfig と /usr/bin/ldd あたり? ほかもありそうなのだがいまのところこれぐらい。

    こうやって置き換えては、ビルドを続け、さらに置きかえる。x86_64 がすでにインストールされているから、依存関係のチェックは効かない。

    こうやって作っていくのだが、gcc がビルドできないことが最初の壁。

    どうしたものかと思ったのだが、ビルドでエラーになったら 手動で make する。prev-gcc/cc1 をクロスのものと置き換えることを 2 回ぐらいやれば、なんとか最後まで行く。

    で、上記のクロス版とあわせるのだ。実行形式の cpp , gcc, g++ などは置き換えてしまう。ただし、cc1 , cc1plus を置き換えるとビルドが遅くなる。一応切り替えるようにしておいて 問題なければ クロス版を使う。

    *) 現在のバイナリ

    devkit にある

      gcc-bin-self.tgz
      mipsel-devkit1-bin.tgz
      mipsel-devkit1-inc.tgz
      mipsel-devkit1-lib.tgz

    mipsel-devkit1-xx.tgz は、devel-rpms.sh で生成した。不完全であれば作りなおせる。

    ちなみに、cc1-libs.tgz は、将来 mipsel に全部置き換えた上で、cc1/cc1plus のみ クロスを使う場合に使うつもりのもの。今は関係ない。

    こうやって mipsel-devkit1 を作ってはみたが、実際の環境そのものではない。いろいろ不完全なところがあるので、動作を確かめた上で fix していこうと思う。

追記: 問題点多数

    環境を変更したのだが、問題点が多くて.... もういちど作りなおそうとしている。

    まず、gcc 関係の バイナリが足りない。cpp も入れ忘れたし、cc1 , cc1plus も 古いものにしてしまった。

    asis にしてもちょっとひどいので、作りなおす。

      gcc の実行環境は、やっぱりよく分からない。

    • セルフとして作ったつもりだが、/usr/mipsel-redhat-linux/include を要求される。
      /usr/mipsel-redhat-linux には、/usr/include と /usr/lib への シンボリックリンクを作る。

    • 正しく環境設定できれば、PATH_MAX が定義されないという状態にはならない。

      #include <stdio.h>
      #include <limits.h>
      #include <stdarg.h>
      #include <stddef.h>
      main() {
      #ifdef __mipsel__
      printf("hello world (mips) %d\n",PATH_MAX);
      #else
      printf("hello world\n");
      #endif
      }

      たとえばこんな ソースをコンパイルして

      /usr/mipsel-redhat-linux/lib/gcc/mipsel-redhat-linux/4.4.5/include/limits.h
      /usr/mipsel-redhat-linux/include/limits.h
      /usr/mipsel-redhat-linux/include/bits/posix1_lim.h
      /usr/mipsel-redhat-linux/include/bits/local_lim.h
      /usr/mipsel-redhat-linux/include/linux/limits.h

      この順番で linux/limits.h が include されれば OK 。絶対パスで記述したが、実際の読み込みのパスは次のようになっている。

      /usr/mipsel-redhat-linux/bin/../lib/gcc/mipsel-redhat-linux/4.4.5/../../../../mipsel-redhat-linux/include/...

      これは、/usr/mipsel-redhat-linux/bin に gcc などバイナリを置いた場合。/usr/bin に上書きすると、相対パスと絶対パスが入り交じって少々ややこしくなる。

      コンパイルは、gcc , gcc -static , g++ , g++ -static で試す。

      ちなみに、現在の壁は、openldap と python 。python はビルドできたが、モジュール関係のビルド 環境が変。そしてこの 2 つの パッケージのせいで、多数の spec ファイルを書き換えるハメになっている。出来たら解決しておきたい。

        openldap は、nss, nspr と unixODBC を要求する。unixODBC は、qt を要求するのだが、spec を書き換えてユーザインターフェイスをなしに出来て、なんとかビルドできた。だが nspr とかは全然進捗なし。結構厳しい。

      それでも結構な数の RPM は、ビルドできた。現在は 430 個。... といっても SRPM の数で言えば 160 。作ろうとしてる SRPM は全部で 500弱。やっぱり 1/3 ぐらい。

      バイナリを /usr/bin 以外に置く場合、/usr/lib/rpm/ の設定を変更しないといけない。/usr/bin/strip など 絶対パスが入っているものは、都合が悪い。
posted by すz at 11:05| Comment(0) | TrackBack(0) | Jz47xx(Linux)

2011年10月29日

USBbootToolのコンフィグ

Ingenic から出ている USBBootTool は、Android 機に(も)使われている。これを使うと ファームウェアの更新はもとより、全く違うファームウェアですら書き込める。さらに、4740 や 4725B/4755 といった PMP 機にも対応している(ようだ: 未確認)。NAND Flash の PMP 機 への書き込みも興味があるのだが、まずは Android 機の設定について調べてみよう。あと、Jz4770 に対応した版もある。確認していないが、同じような設定方法のはず。

今確認できているのは、Ronzi A3 と IQQ M1 。これらの設定の違いを見てみることにする。

    注) Ronzi A3 (と Ramos V65Pro)の公式ファームウェアは、Ingenic のものを変更している。 ファームウェアのファイルが単一のファイルになっているのだが、Ingenic のツールで扱えるように 分解できる。

    Jz4770 に対応した版は、いまのところ Jz4770 開発環境の中だけにある。公式版は Jz4760 まで。

    追記: V65Pro の情報を右端に追加。これについては、最後にまとめてコメント


    機種    Ronzi A3 IQQ M1 V65Pro
    ファイル名 4760(B)_default.ini 4760_xam5001.ini 4760(B)_default.ini
    [UserSetting]
    ForceErase 1 0 0
    Format 1 0 0

    この設定を IQQ M1 と同じにすると VFAT 領域を初期化しなくても済みそう。

    [Fileset]
    MaxFileCount 7 7 8
    EndPage 7812000 7812000 7812000

    Flash のサイズが違うのに同じ設定 -- これより小さな容量のマシンは気にしなくとも良いということか。

    [File5]
    FileName=userdata.img
    StartAddr 0x19000000 0x1F400000

    [File6]
    StartAddr 0x3A400000 0x40800000

    [File7]
    StartAddr 0x40000000 0x46400000

    [File8]
    StartAddr 0

    IQQ M1 は、サイズが大きくなっている。.. のだが userdata.img の開始位置からずれてくる。このあたりは、パーティションになっているので 整合性を取れば自由にサイズを変更できそう。

    [OpenCardSetting]
    PowerPin 123 108 123
    PowerOffLevel 0 1 0
    CidPsnModel SD_MODEL FIXED SD_MODEL

    これは 非常に重要な項目。これを間違えると まずいと思われる。... のだが、関係なかったりするかも知れない。

    [PLL]
    EXTCLK 12 12 12
    CPUSPEED 114 240 114
    PHMDIV 3 3 3
    BOUDRATE 57600 115200 57600

    CPUSPEED が違うが 書き込み中だけの話なので、実は気にしなくて良い。BOUDRATE は、シリアルの設定だが、製品では関係ない。

    今、Ramos V65Pro を購入中なのだが、Ronzi A3 の設定と違うのは、 PowerPin, PowerOffLevel ぐらいのはず。これも調べておこう。

    追記: V65Pro

    ヒストリには、たとえば、mbr-xboot_r300_60bA3w_110509.bin といったファイル名が残っている。確かに V65Pro は、Jz4760B 。なのだが、設定は同じ。違うのは、File1-7 は使わずに File8 を使う点。ひょっとしたら、File8 はもともとこういうものかも知れない。

    あと、ForceErase=0, Format=0 となっていた。全部をひとつのファイルにしているから関係なさそうなものだが... 。

    さて気になる PowerPin だが、Ronzi A3 とまったく同じだった。チップを変更したが基本は同じなのか ... そもそもあまり関係ないのかはわからない。それはともかく、Ronzi A3 のツールで設定も変更せずに、分割したファームウェアが書けるようだ。これは、ちょっとうれしい。


USBBoot の仕組みとファイル名の関係

    Ingenic の CPU は、USBBoot の機能を持っているわけだが、どんなタイプのメモリが付いているかも分からない状態ではメモリを設定できずメモリにアクセスできない。

    だから、最初はキャッシュにプログラムをロードする。そのプログラムが、メモリの設定を行うことで、メモリにロードできるようになる。

    最初のものが stage1 といわれるもので、CPU名/fw.bin など の小さな bin ファイル。JZ4760/B の場合は、DDR2 なので 4760/fw_ddr2.bin を使う。

    stage1 は、メモリの設定いがいにも CPU クロックの設定や GPIO の設定を受け持っている。これらの設定は、上記の ini ファイルの値を元に fw.bin のイメージをメモリ上で書き換えることで、stage1 プログラムに渡す。

      fw.bin は SDRAM , fw_ddr2.bin は、DDR2 だが、他に DDR3 の fw_ddr3.bbin と Mobile SDRAM の fw_mddr.bin がある。

    メモリにロードするプログラムは、stage2 だが、ファイル名は、CPU名/usb_boot.bin になっている。
    これは、USB ドライバを持っていて、ROM のドライバの機能を上書きして、(USB はリセットしないで) 新たな機能を加える。ちなみに、ハードウェアに関する 2.3 のパラメータは、stage1 と共用している。(多分 PowerPin とか シリアルの設定とか)

    これと通信することで、内蔵フラッシュに書きこむのだが、SD カード と NAND Flash では書きこむ方法が違う。特に NAND Flash は OOB という 領域の管理が面倒。LinuxNandcfg.ini と MiniOSNandcfg.ini で Linux と (PMP 機で使われる) MiniOS の 2通りに対応している。... ただ、Android 機は、いまのところ全部 SD カードなので関係なく気にする必要はない。

    この stage2 は、書きこむ機能はあるが、吸いだす機能は持っていない。ドライバにもそういう機能はない。悪用を防ぐ目的だとは思うが、USBBoot で書き込めるファームウェアを最低1つ持っていないと気軽にはいじれない。ファームウェアが公開されているかどうかは、重要なポイント。

      補足: 吸いだすことは、android が立ち上がった状態で adb に接続すれば、簡単にできる。Jz47xx の android 機は(いまのところ) 最初から root で shell が動く上に busybox も入っている。

      busybox を使って、内蔵フラッシュから dd で吸い上げれば良いわけだ。system.img は read-only だから たぶん USBBoot で書き込み可能なファームウェアを再構築できる。その上 /data/app も残っているみたいだから、プレインストールアプリも吸い出せる。

      novo 7 basic もこうやって再構築できるかも知れないのだが ... 失敗すると危険なので、公式ファームウェアが出るのを待ったほうが良さそう。

    Ingenic 版について

      ftp://ftp.ingenic.cn/3sw/00tools/usb_boot/

      ここに、Ingenic オリジナルの USBBootTool がある。バージョンは、r166 (2011/06/09)。
      ソースコードも置いてあり、ちょっとだけ古い 2011/03/04 の日付になっている。

      この Windows 版 USBBootTool は、driver と UI のプログラム, そして driver インターフェイスの dll から成っている。

      ソースコードが、全てを含んでいるかどうかについては調べていないが、少なくとも UI のプログラムは入っていた。これを元にすれば、英語版も作れそうなものだが、誰も作っていないようだ。

      あと、Jz4770 への対応は、stage1,stage2 のプログラムで済む。ドライバも含めて、ツール自体は関係ない(はず)

      ftp://ftp.ingenic.cn/3sw/Jz4770/01LinuxBsp/20110729/
    • usb_boot_burn-jz4770-20111025.rar

      ... と思って一応確認したら 10/28 に更新されている。 USBBootTool の最新版が単独でダウンロードできるようになった。

      ちょっと見たのだが、上で説明したのと大分内容が違う。要注意。

        まず config の TOPの ファイル名が違う。今まで config.ini だったのが Setting.ini になっている。

        # CpuType: 0 - 25\40,1 - 4750 ,2 - 4755 ,3 - 4725B , 4 - 4760, 5 - 4760B,6 - 4770
        # SystemUsed: 0 - miniCos ,1 - Linux , 2 - Other #
        # ForceErase/Format: 1 - Used ,0 - Unused #
        # DDRType: 0-fw.bin, 1-fw_mddr.bin,2-fw_ddr1.bin,3-fw_ddr2.bin
        # (OLD: 0--SDRAM(fw.bin), 1--DDR(fw_ddr1.bin), 2--DDR2(fw_ddr2.bin), 3--MDDR(fw_mddr.bin) )
        # StorageMedia: 1-SD/MMC,0-NAND

        [UserSetting]
        CpuType=6
        SystemUsed=1
        ForceErase=0
        Format=0
        ProgrammeCount=0
        DDRType=0
        StorageMedia=1

        ここらあたりは、項目は同じ。DDRType は、stage1 のファイル名を指定するのだが、番号と ファイル名の対応が変わっている。Jz4770 は DDR2 を使うのが普通のはずだが fw_ddr2.bin はないし使っていない。

        あと CPUType について、IQQ M1 は、Jz4760B にかかわらず 4 を使っていた。分離するほどの違いはなかったはずなのだが ... 何故 5 を新設したのだろう?

        # AdvanceModel: 1 - Used ,0 - Unused #
        # FileXUsed: 0 - Filehistory-0 ,1 - Filehistory-1 ,2 - Filehistory-2#

        [FileSetting]
        AdvanceModel=1
        File1Used=0
        File2Used=0

        よく分からないのが、 AdvanceModel。[FileSetting]に関係するはずだが ...


    Novo 7 basic 版について (osakanataro 氏の記事 参照)

      USBbootTool も出ている。これの config をチェックしてみたところ、上記 Ingenic 4770 版ではなく、Ronzi A3/V65Pro 版を元にしていることが分かった。

      内容が 4770 追加になっているし、config のコメントに lynx というのが残っている。やはり 7 つのファイルを書き込むのだが、cache.bin の位置がどうも違うようだ。

      あと、mbr-xboot.bin には、microSD カードから ファームウェア をアップデートする機能があるらしい。... といっても Novo 7 だけかも知れないのだが ...
posted by すz at 12:03| Comment(2) | TrackBack(0) | Jz47xx(USBBOOT)

2011年10月26日

コンパイラについて

MIPS 版の RHEL 6 をビルドするという野望は捨てていないのだが、ちょっと息抜き。

    MIPS のコードを生成できるものとして、gcc 以外に pcc がある。pcc は、もともと UNIX で使われていたもので、gcc より起源が古い。だが、オープンソースでなかったので、 (gccを採用した) i386 unix や linux の台頭 とともに一度は消えた。

    これが、オープンソースになり、ほとんど re-write されて復活したのは、わりと最近。 NetBSD とかもこれでビルドできるらしい。あと、rpm もあって、使ってみることは簡単にできる。

    ほかに、オープンソースの まともなコンパイラとして、clang(+llvm) というのがある。詳しくは知らないが、BSD 系で採用されるかも知れないらしい。

    なんで、こんなことを書いたかというと ... RHEL 6 のビルドの最初の障壁が gcc だから。どうにもうまくいかなくてうんざりしてきている。

    もちろん、クロスはなんとかなるのだが ... qemu を使ってのセルフがどうにも ... 一回作った gcc で、もう一度 gcc をビルドするのだが ... qemu での実行になるので終わらない。rpm の作成ではエラーが出ると そこで終わりになるのだが、延々ビルドした後、internal error が出てしまう。原因はメモリの使いすぎのような気がする。

    とにかく、gcc は遅かったり、メモリを使いすぎたりするので 困るのだ。そして 一番の障害が gcc 自身のビルド。その傾向がバージョンが上がるにつれて著しくなっている。

tcc (Tiny C Compiler)

    最適化は、ない(か ほとんどない?) がコンパクトかつ超高速な コンパイラとして tccがある。

    最初に紹介されたときは、Linux kernel がビルドできるという触れ込みだった。それだけではない。TCCBOOT というのがあって、なんと ブート時に カーネルをビルドして立ち上げる なんてことが出来た。(ただし、いまも出来るかどうかは知らない)。

    これは、直接バイナリを出すので、アセンブラもリンカも必要ない。そして C のソースコードを スクリプトとして使える機能がある。最新版は、0.9.25 で、x86_64 にも対応している。あと arm にも対応しているのだが 残念ながら MIPS には対応していない。

    コードを見ると arm-gen.c は 2000 行もない。MIPS に移植するのもそれほど困難ではないような気がする。

vcode: a portable, very fast dynamic code generation system

    誰か tcc MIPS 版を作っていないか探したところ、見つからなかったかわりに、こんなのが見つかった。

    ちょっとだけ見たのだが、MIPS のコード生成部は 1000 行に満たない。それだけ短いのだが、コメントも入っていて MIPS のコード生成部を作る参考になりそうな感じ。

    ちょっと、tcc MIPS 版を作りたくなってきた。テストは、実機を使うまでもない。qemu の user モードで十分。

    ちなみに、tcc も (ターゲットの) libc や libgcc を使う。これらは別途用意しておく必要がある。

lcc, A Retargetable Compiler for ANSI C

    そう言えば lcc なんてのもあったのだった。これは、x86 と ALPHA , SPARC , MIPS に対応している。コード生成部を作る参考になるかもしれない。

tcc の調査

    まず、tcc を作ったとして、android で動かせるものなのかどうか。

    1) ライブラリ

    tcc がリンクしているライブラリは、

      libc.so , libm.so , libdl.so

    これらのランタイムは、system/lib/ にある。
    ビルド時に使用するのは、NDK の platforms/android-8/arch-mips/usr/lib (など)

    これだけなら、大丈夫そうだ。

    ただ、これしかリンクしていないということは... リンカの機能も独自に作っているということで、なかなか 面倒な話がある。

    arm-gen.c 以外のもの を ARM_ で grep すると ...

    libtcc.c , tccelf.c , elf.h , tcctok.h で見つかる。特に行数が多いのは、elf.h と tccelf.c

    これらは、リロケーション情報を扱っていたりして、勝手に作れば良いというものではない。binutils と互換性があるように作らねばならないので、結構面倒そう。

追記: Android セルフ コンパイラ

C4droid (C/C++ compiler)

ふと、Android で動くコンパイラがあるかもと思って探してみたら あった。

もちろん ARM 用だろう。組み込みのコンパイラは tcc だが、gcc plugin なんてものもあるらしい。
posted by すz at 23:34| Comment(0) | TrackBack(0) | 日記

2011年10月18日

Ronzi A3 のファームウェア

Ronzi A3 の (オリジナルの)ファームウェアは、2 つある。ひとつは、公式ファームウェア。もうひとつは osakanataro 氏が購入元からもらったもの。

ともに 5/11 版で 違いは、ファイル形式。更新ツールも違い、公式版は カスタマイズしたもの。osakanataro 氏が購入元からもらったものは Ingenic が提供しているものがベースで設定をカスタマイズしてある。

Jz4760/B 機 のファームウェアは、他にもある。ひとつは、IQQ M1 用。もうひとつは、Ramos V65Pro 用。

これで、3 機種分の ファームウェアが手に入った。ここで、それらについての解析結果をまとめていこうと思う。

ファイル形式 (Ingenic ツール用)

    以下の 7 つのファイルからなっている。

    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)

    このファイルは、上記 7 つのファイルをパックしたもの。個々のファイルを取り出す コード は、とりあえず出来た。

  • split_nib.c
  • split_nib.zip (.exe 入り)

    調べてみたところ、local のものと 公式版から 取り出したものは完全に一致した。

    解析の詳細:


    00: 4e 49 42 00 07 00 00 00 34 00 00 00 07 00 00 00 NIB
    01: bc e8 5c 18 88 07 00 00 fc 1a 0d 00 fc 42 39 00
    02: fc 32 6a 00 fc 92 a8 0c fc fa ac 0f fc 0a 8d 11
    03: c0 dd cf 06 88 07 00 00 74 13 0d 00 00 00 00 00
    04: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    先頭は、"NIB" で始まっている。-- NIB ファイルとでも呼ぼう。

    NIB 以降は、little-endian で 4 バイトづつの 値が入っている。

    最初の 0007 は、セクションの数。mbr-xboot.bin,boot.img,recovery.img, system.img, userdata.img, cache.bin, vfat.bin の 7 つのファイルに対応している。

    0x10 の 185ce8bc は、ファイルサイズで、次からの 7 つのエントリが それぞれのセクションの オフセット。

    わかっていないのは、0x34 から始まる 第二の情報。Flash に書きこむ 位置の情報と思えるが、釈然としない。

  • 最初の情報は、0x788 で mbr-xboot.bin のファイルオフセットと同じ。

  • 2番目の情報は、0xd1374 で、boot.img の ファイルオフセット 0xd1afc - 0x788。

  • その他は 0 。パーティションの先頭からという意味だろうか?

    そもそも mbr-xboot.bin が先頭に書かれるのかどうかも不明。だったりする。ここを解析できれば、パーティションを広げたり、さらには、Android でない別のものを書き込んだり出来るかもしれない。ただ、現状では、さらなる解析は必要ない。

    ちなみに、system.img , userdata.img , VFAT のサイズ配分を変えてもインストール出来るような気がする。確かめてみたい。(ファイルが別の場合、書き込み位置は、usbboot の方の config ファイルに書かれているから、当然これも変更する。1つの場合、もし位置情報が含まれているのなら、そういう面倒なことはしなくて済む。... だが、そういう情報はないのかも。)

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 カスタマイズ』という記事を発見。

    要は、

    • lib/hw/sensors.lynx.so を消せ
    • RotatingScreen.apk を入れろ。
    • 表示 → 自動回転 を ON にせよ。

    ということらしい。センサがないのにドライバがあると、位置を固定してしまうのかも。

    だだ ... 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 しか使ってない。

    カーネルソース

      いきなり別の話になるが、ソースつながりで....

      カーネルのバージョンは、端末情報から 2.6.32.9 だと分かる。だが、Ingenic が公開しているソースは、2.6.31.3 ベース。しかも Andoroid のコードは入っていない。

      で、Android 対応のカーネルソースが見つかれば良いのだが、残念なことに見つけられていない。

      だが、幸いなことに、WM8650 の Android のカーネルソースは手に入った。バージョンも 2.6.32.9 ベース。これを参考に Ingenic のソースを マージすれば ... あるいはなんとかなるかも知れない。

      あと、android のカーネルソースもある。

    • MIPS/kernel-common (android-2.6.32.9)

      このソースと WM8650 のベースに差があるとは思うのだが ...

      linux -- android-2.6.32.9 -- WM8650

      として差分を見てみることにする。

    • android-2.6.32.9.tar.gz ( 新規分 ファイルリスト )
    • android-2.6.32.9.patch.gz ( パッチ ファイルリスト )

      まずは、android-2.6.32.9 まで。
      新規分 ファイルリスト を抜粋すると ...

        kernel/power/userwakelock.c
        kernel/power/earlysuspend.c
        kernel/power/fbearlysuspend.c
        kernel/power/consoleearlysuspend.c
        kernel/power/wakelock.c
        drivers/i2c/chips/pca963x.c
        drivers/rtc/alarm-dev.c
        drivers/rtc/alarm.c
        drivers/switch/Makefile
        drivers/switch/switch_gpio.c
        drivers/switch/Kconfig
        drivers/switch/switch_class.c
        drivers/misc/wl127x-rfkill.c
        drivers/misc/kernel_debugger.c
        drivers/misc/pmem.c
        drivers/misc/apanic.c
        drivers/misc/uid_stat.c
        drivers/usb/gadget/f_adb.c
        drivers/usb/gadget/f_mass_storage.c
        drivers/usb/gadget/android.c
        drivers/leds/ledtrig-sleep.c
        drivers/net/pppolac.c
        drivers/net/pppopns.c
        drivers/char/dcc_tty.c
        fs/yaffs2/...
        net/ipv4/sysfs_net_ipv4.c

      全部で 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++ があるのだから、出来て当然 ... とは思わなかった。
posted by すz at 21:06| Comment(7) | TrackBack(0) | Jz47xx

2011年10月16日

Android TV BOX

pandawill.com を眺めていたら、結構 Android TV BOX の機種を扱っている。

CPU は、tcc8902, rk2918, S5PV210 とおなじみのもの。メモリは 全部 512MB 。HDMI とイーサネット、WiFi も全部付いている。USB Host も付いていて、ハードディスクも付けられるようだ。SDカードも GG 以外は付いているようだ。

まぁ 特に欲しいというわけではないのだが、Jz4770 を採用したものが出たら考えてしまう。

ちなみに、Jz4770 も 100M イーサのインターフェイスは、持っている。USB は、OTG が 1 つと 12 M までの USB HOST が 1 つ。HDMI も持っているし、TV-Out や VGA の出力ができる TV エンコーダもある。

いずれは、出てくるかも知れない。

追記: Jz4760/B なら既に出ていた。

どうも IV-BOX X1 または IV-BOX X3 がそれらしい。ちなみに IV-BOX X5 というのもあって、こちらは RK2918。



内部写真まで公開しているが、X1 は Jz4760B 。CPU ボードが別になっていて面白そう。ちょっと興味がある。

  • X3 の方が上位機種に見えるが Jz4760 らしい。

  • X2 もある。どうも全部同じ サイズの CPU ボードを使うみたいだ。

  • メモリは、2 個ついている。たぶん 256 MB なのだろう。

  • 右端は、USB 接続の Wifi のはず。

  • 左端の USB は、USB 2.0 OTG のはず。

  • イーサネットが付いている。Jz4770 にはあるが、Jz4760/B にはないはず

  • HDMI も 付いている。Jz4770 にはあるが、Jz4760/B は VGA までのはず。

    なにか腑に落ちない。Jz4770 の方が安く作れそう。だがしっかり Jz4760B と書いてあるし ... まぁいずれ Jz4770 のを出してくるに違いない。

    追記: ここは終わってしまったようだ。メーカ自体が。ううむ残念。

http://www.aliexpress.com/product-fm/500900322-4760B-android-TV-android-TV-bot-PPtv-android-android2-2-wholesalers.html
Aliexpress だとこれ。$82.11+送料 $29.67

http://item.taobao.com/item.htm?id=12887821957&
taobao だとここらしい。400元。

追記: ACII.jp で、『〜師範、ARMって何ですか!〜』なんて記事が


    編集I:でもこれ、将来的にはものすごく安い値段になる可能性がありますよね?

    hito:Androidタブレットから「液晶とタッチパネルとバッテリを除いたもの」と同じなので、ものすごく安い値段で売れる可能性はあるでしょうねぇ……。数出てくるようになれば、って感じですが。

こういう記載があるのだが... Android TV BOX はスコープに入っていないのかな? まさに、「液晶とタッチパネルとバッテリを除いたもの」なのだが ...

すごい値段なのかどうか? 出る数が違うから、タブレットとさほど変わらないような気がする。

追記: Male A1000

    Mele A1000 is a $70 hackable, Linux-friendly ARM-based PC
    Mele A1000 Android 2.3 STB Unboxing and Review

    これは、Allwinner A10を使った もの。

    DealExtreme だと送料込みで $100 (ちょっと)。

    A10 って SATA (3Gb) が付いているのか。SDIO も UHS 対応 4ch 。Marvell のようなサーバ向けチップではないけど ... 結構いろんなインターフェイスが付いている。

    こういうのを JZ4770 で出して欲しいのだが ...

    それはともかく、http://rhombus-tech.net では、Allwinner A10 を使った CPU ボードを $15 ぐらいで出そうとしているそうだ。形状は、PCMCIA ?

    「Raspberry Pi」 みたいなものだが、インターフェイスがない分 安くできるのか?

    そういえば EKEN の タブレットは、独立した CPU ボード構成だった。$20 で WM8650 ボードが売ってたから $15 は 可能 と言えば可能。(ただ RAM 256 MB という条件になるかも)

    追記:
    後継機 Mele A2000 が出ている。 今の価格は、A1000 が $92.60 で A2000 が $98.20 (FreeShipping)。機能は同じで、デザインが良くなった?

追記: 2012/05/23

    49ドルのAndroidミニPC「VIA APC」発表、7月出荷。Neo-ITX フォームファクタ

    という記事が出ている。WM8650 の後継 CPU の WM8750 を積んだマシンで、Cortex-A9 800 MHz 。一応メモリは 512MB なので、使えるレベル。

    ただ、SATA がないので、Neo-ITX フォームファクタ であるメリットはなさそう。やはり SATA 付きの Male A1000 の方が楽しめそう。( ただし、私は MIPS 派なので 手をださない)

    Deal Extreme の これ は、同じようなものだが、Android TV BOX なのでケース付き。リモコンまで付いている。スペックも VIA APC に劣らない。どうせなら、こっちの方が良いとのこと (@ naobsd ) 。この手のものは、パワーユーザがどれだけ付くかで 選ぶのが吉。

    ただ、電子工作としてみた時には、少々事情が異なる。( カーネルをいじれないと面白くないが) GPIO とか I/O が出ていることが 重要だったりする(場合もある)。USB HOST が使えれば、なんとかなりそうなものだが ... やりたいことによって 重要度は変わるだろう。

Cubieboard

    Allwinner A10 には、Cubieboard なんてものが出ている。

    電子工作でいろいろいじれたりするし SATA が付いているのもポイントが高い。結構欲しいような ... JZ4770 で出たら飛びつくのだが ...
posted by すz at 17:49| Comment(0) | TrackBack(0) | 日記

2011年10月09日

JZ4770 Android MID

最初の Jz4770 機として NOVO7普及版(GC860) が出てきた。

IQQ M1 を買ったばかりなので 当面Jz4770 機を 購入する予定はないのだが、いずれは買うと思うので、まとめのページを作っておこう。

Jz4770 機の魅力

    Android端末を選ぶ基準』の記事とダブルのだがいま一度書いておこう。

  • カーネルのソースコード や xburst(= MMX/SSE 拡張のようなもの) 対応の jpeg6b, mplayer のソースコードが公開されている。さらには、GPU の SDK も公開。

  • USB からブートする機能があり、文鎮にはならない。

    自分でビルドしていじりたいような人間にとって、この 2 つの特徴は非常に魅力があるのだ。まずは、ソースコードが公開されていないと話にならないが、USB からブート または SDカードからブートする機能も重要。動くかどうかわからないものでも安心して実行させられる。-- 簡単に文鎮になられてはたまらないのだ。

    ほかのいくつかの CPU もカーネルのソースコードは公開されているし、USB or SD ブート の機能があるものもある。だが、チップの付加機能を使えるとは限らない。Jz4770 は、そういう意味で楽しいチップなのだ。

    中華MIDは、一般的に言って 基本機能がこなれていない。ソースコードを見てデバッグするような人が出てくると、使えるマシンに成長していく可能性がある。

  • MIPS であり ARM でない。

    一般の人にはデメリットかも知れない。NDK を使ったアプリは動かないからだ。だが、使うほうより作るほうに楽しみを求める人間にとっては、逆に魅力があったりする。他には、Andoroid MIPS のメーカが少ないために情報が発散してしまわないというのも魅力だったりする。

  • 1 GHz で安価な CPU。

    1 GHz というのは、いまや最高の性能ではない。だいたい普及帯の性能レンジになってきている。 だが、MIPS としてはようやく手に入れられるようになった 高性能 -- 長い間 Ingenic の CPU は 400MHz 程度だった。 他に比べて見劣りしないというのは、動機という観点では重要だ。

    安価というのは、推測。だが、今までの Ingenic CPU は安価だったし、NOVO7 の 2 機種の価格差からみて実際に 安価であろう。ひょっとしたら RK2918 (Cortex-A8) より随分安いのかも知れない。

    これは、Jz4770 機が実際に 多数でてくれば、あきらかになっていくだろう。

  • 十分な動画性能

    Android 機には、動画性能が十分でないものがあるようだ。そして普通それはソフトの問題。開発に十分なコストを割けないために 起きている問題だ。

    Ingenic の Jz47xx では、あまりそういう問題は起きておらず CPU の能力を使えている。ただ、今までは CPU の能力が低く 他と比べて見劣りしていた。Jz4770 でようやく H.264 1080p を再生できるようになった(はず)。

    ちなみに 再生の処理のほとんどは、CPU が持つ xburst 命令(MMX/SSE のような拡張命令 ただしデータ幅は 32bit しかない)で行っている。VPU というハードウェアアクセラレータがあるが、これも中身は MIPS xburst 。これで間に合うのだから たいしたものだ。逆に 他の処理で xburst で高速化できるようなものがあるかも知れない。そういう意味で xburst に、ちょっと期待している。

NOVO7普及版(GC860) のスペック

    OS: Android 2.2.1
    CPU: Jz4770 (1008 MHz) / GPU GC860 (444 MHz)
    RAM: 512MB
    Storage: 4GB (SD Card interface , ext4)
    バッテリー容量: 4000mAH (1 cell)
    動作時間: 10 時間 (4000 mAH / 400 mA )
    サスペンドでの持ち時間 : 285 H (4000 mAH / 14 mA )
    液晶: 7inch 800x480 静電式 multi-touch
    価格: 〜599元 (〜8386円 : 14円/元換算) -- (※)
    ファームウエアの入手: ?

    ※) 時間は、中華流サバ読み計算方法による
    ※) 実際に買う場合、手数料と国際送料が加算される。


    追記: 分解写真を見付けた

    http://tabletrepublic.com/ainol-novo7-basic-disassembled/2011/10/07/

    ここ。

    まずは、この写真をチェック。

    http://tabletrepublic.com/wp-content/uploads/2011/10/024500hbnn45ubq827u7bb.jpg

    CPU を見ても変わり映えはしない。注目すべきは、回りのチップ。

    左上の IC は、おそらく SDカードの中の IC と同じもの。Ronzi A3, IQQ M1 と同じ仕組みのはず。生の NAND Flash のマシンと比べれば、いじるのが楽で嬉しい特徴。(MicroSD が内部に載っている方が嬉しいが、それはさておく)

    ひょっとしてファームウェアを作っているところも同じだったりして...

Jz4770機は安いのか?

    NOVO7普及版 は、599元だそうだ。静電式マルチタッチで RAM 512M でスペック的には遜色ないものが 599元だから、これから出てくるものものの中にはこれより随分安いものがあるかも知れない。

    でも、日本で売られるとすれば、これぐらいでないとウケない。静電式マルチタッチ + RAM 512M を条件として ライバル機と比べてみよう。

    まず、559 元 を 8386円 と書いたが国内のショップで売られる場合こんなに安くならない。450 元の Bopad Q500 9480円になった。ここから逆算して 21円/元換算 ぐらいが妥当そうだ。

    ... だとすると 12580円 あたり。

      赤札天国というところで 『Ainol NOVO7 Basic 4GB 予約受付中』だそうだ。価格は、10980 円。

      思ったより安い。こんな価格付けなら、国内のショップの方が良い。思わず買ってしまいそうだ。... だが少なくともファームウェアがダウンロードできてから。サスペンドまわりも気になる。それに.. 5inch の方が欲しい。まだまだ待つのだ。

      追記; 予約が終わったら、11780 円になっていた。ファームウェアは、ここ に置かれるらしい。(novo7 basic は、まだ)

    http://www.geocities.jp/aesthetic_music/memo/android.html

    Androd 機をまとめているページがあったので見たのだが、RK2918 や TCC8803 は、一般にもっと高いようだ。TCC8803 機のほうが若干安めで Dawa D8 が 14980円。あと サムソン S5PV210 というのもあるが 似たような感じ。

    まぁ 最新だから安いというのもある。CPU の差だけで 価格が随分違うのもおかしな話ではある。だが、ファームウェア・メーカとライセンス料の存在がある。カスタマイズするにも開発コストがかかり、その分をなんらかの形で徴収しないといけない。単なる推測だが、Jz4770 だと Ingenic が結構負担していることになるかも知れず、その分安くなるのかも知れない。

    適当なのであんまり参考にならないのだが aliexpress.com で検索してみた。静電式マルチタッチ + RAM 512M を条件にしたのは同じ。

    追記: aliexpress に 出てきた。

      novo 7 cortex a10 tablet pc android 2.2 1GHz Xburst capacitive $113.50($96.84 + $16.66)

      これだと、8800 円ぐらい? 十分安いが ... Paypal 使えなくなっているし。

        $129.29($112.63 + $16.66) に値上げされている。-- 10100 円ほどか。まぁ妥当な価格っぽいが、格安感はなくなった。

      novo 7 cortex a10 tablet pc android 2.2 1GHz Xburst capacitive (lina zhang's store)

      ここは、超あやしい。$155 / 3個 Freeshipping なんて 違うものが来そうだ。上のリンクも cortex a10 なんてデタラメ書いてあるが、買っている人がいるから freedback で分かるはず。下は買っている人もいない。さすがに嘘っぽいからか。

      追記: 上記のショップは、"Shenzhen Eternal Technology" というらしい。で、下のショップは、画像も含めてまるまるコピーしている。画像には、Eternal という文字が見えるし ... 怪しいどころではない。

      Ainol Novo 7 (basic version) 4G tablet PC Android 2.2 7 inch capacitive screen A10 xburst dual camera HDMI $117.89 (free shipping)

      微妙に安いところが出てきた。まぁこれからも出てくるかも知れない。いまのところ、"novo 7 basic" では引っかからず xburst で 引っかかるところもある。

    ドキドキ堂 で

      9990 円(送料無料) になっていた。

      送料無料だし、相当な格安感がある。599元に対して 3.3 割増し の計算 (12.5円/元換算)。
      ひょっとして、在庫処分? あるいは中国本国で既に値崩れしているとか?

      私としては、安く購入できて良いが、Ingenic は大丈夫なのだろうか? Jz4770 も Novo7 basic しか採用していないし。

追記: 2011/10/11 所感

    最初に注目を集めた中華パッドは EKEN M001 だった。

    1万円で買える超激安Androidタブレット「EKEN M001」が登場

    なんて記事が出たのが 2010年04月末のこと。

    CPU は WM8505 330 MHz(?) メモリ 128MB あれから一年半 -- その間に RK2808 (600MHz) / メモリ 256 MB の Moose E7001 が注目され、TCC8902, WM8650 の マシンなどが出た。

    その後の話は、なんだか良く分からない。が、WM8650 / メモリ 256MB 程度のマシンは、まったく注目されないようになった。

    いまは、1GHz , メモリ 512MB , 静電式マルチタッチ が普及帯? かつて、ドッグ・イヤーという言葉があったが、それを久々に体感したような気がする。

    こういう流れにあって、 Ingenic から ようやく 普及帯 レベルの CPU が出てきた。半周ぐらい遅れている感じはするが、チップを自社製造しなくなったと思うので、RK29xx の RockChip 社 などとチップの性能で良い勝負を繰り広げていくのかも知れない。

      Jz4780 をググるとなにか出てくる。ガセかも知れないが 次は 1.3GHz だそうだ。そして 来年には 2.0GHz 。自社で製造しないし、シュリンクが基本ならそれも可能なのだろう。
      Ingenic に有利な点があるとすれば、130nm で 600MHz を叩き出している点(Jz4760)。プロセスルールに対して 周波数が高い。ちょっと期待してしまう。

    でも、中身はまだまだという気がする。ソフトの開発は時間がかかる。Ingenic は、ソースコードを積極的に公開している。その努力がいずれ実ると思いたい。

    個人的には、どこまでも自由に使えるマシンというのは夢なのだ。そのためには、ソースコードを積極的に公開しているようなところが、競争に淘汰されずにタイムリーにマシンを供給してくれないといけない。

    あと、自分の開発力には限りがある。あれもこれもやる余裕はない。そういう意味で Ingenic に注目している。 ARM を選ぶと選択枝が多すぎて目移りする。MIPS なら、選択枝はない。しかも、ひとつの CPU の製品寿命が比較的長い -- 末永く楽しめそうなのだ。

    とりとめがなくなったが、言いたいことはひとつ。Jz4770 がんばれ。

追記: 『詳しい記事』があった。

まずは、気になる消費電流。

    サスペンドで 14mA , (明るさ 50% での) 動画 370mA - 450mA だそうだ。バッテリーは 4000 mAH。
    USB からも充電できる(500mA)けれども、AC アダプタなら 5V 2A なので早く充電できる。

    4000 mAH で 14 mA なら IQQ M1 流計算方法だと、サスペンド 284 時間。こんなには無理だろうが M1 の 1.5 倍持つ計算。-- 3 日は大丈夫そうだ。

    (明るさ 50% での)Angry Birds は、500 mA 。動画では、VPU などを駆動するが CPU を 100% は使わない。だが、Angry Birds は、常に CPU を 100% 使う (はず) 。ずっと Angry Birds を動かしてどれぐらいバッテリーが持つかというのは、基準として使えるかも知れない。

    サスペンドでの消費電流は、IQQ M1 の 9 mA より多い。これは、メモリが 2 倍載っているためかも。ところで、サスペンドとずっと書いてきたが、スタンバイと記事には書いてある。2段階の処理になっているようなので、もう少し消費電流が減るかも。

カーネルは、2.6.32.9-svn9261 zyliu@ubuntu3

    IQQ M1 は、2.6.32.9 clvia@ubuntu -- ここからも FW は、同じ所で作っていることが分かる。

CPU は、1008 MHz (BogoMips 1005.97)、GPU GC860 は、444MHz 動作。 あとメモリは、DDR2 504 Mhz 。

    CPU 性能は、 Cortex-A8 (2.0 DMIPS) and Cortex-A9 (2.5 DMIPS) に対して 1.5 DMIPS と書いてある。

    MIPS24k のデータから取ってきた値のような ... 2次キャッシュ付きというのを考慮してないかも知れない。Cortex-A8 程度はありそうな気がするのだが ...

分解写真もある。

    ストレージには、SK6617 (SD card controller) が付いている。Ronzi A3 や IQQ M1 も同じようなチップが付いている。Write 11 MB/sec と書いてあるが、SLC での最速ケースかも知れない。MLC では、1/2 だと思っておいた方が無難。あと、ウェア・レベリングはしているのだろう。そうでなければ、ext4 を使うのに不安が出てくる。

リモコン付き

    リモコン? そんなものが必要になるような使い方が出来るということ?

    ... HDMI があるから 大画面で楽しむことができるのか。Jz4770 の TV BOX が出るのもそう先の話ではなさそう。

ベンチマーク

    Nexus One 2.2+ (Cortex-A8 1GHz) との比較でわずかに負けている程度。だが、MIPS-optimized virtual machine のためだと記事には書いてある。Dalvik Turbo が入っているのか?

    2D, 3D は、RK2918 (Cortex-A8 1GHz / GC800 550 Mhz) に負ける。あともうひとつの CPU である VPU は、500 MHz だそうだ。

    Quadrant Advanced というのを使っている。 MIPS でも動くベンチマークがあったのか。

      Total: 1270 CPU: 4377 Mem: 816 I/O: 431 2D: 201 3D: 527

      と出ている。

      NDK ではないが、GPU がないと動かないらしい。Ronzi A3 でやってみたかったのに。残念。

        追記: Quadrant が A3 で動かないのは、"stencil buffer" がないため。 CPU とか GPU が関係ない項目を計りたいだけなのだが、計らせてくれない。この "stencil buffer" は、アプリケーションでは、glGetIntergerv(GL_STENCIL_BITS) で チェックするらしい。

      追記: ちょっと RK2918 の結果を拾ってきた。

      Total: 1246 CPU: 2341, Memory: 986 I/O: 2119 2D: 175, 3D: 607

      Arnova 10G2(2.3) という機種らしいが詳しくは知らない。値のバランスを見ると、Novo7 は、CPU がやたら高く、I/O が低い。やはり CPU そのものの性能は反映していない。なにを動かしてもこの性能であれば良いが、動かすものが増えると遅くなってくるらしい。

      思ったのだが、もし Dalvik Turbo を使うなら、キャッシュサイズは、大きくすべきではないか。

      # busybox du /data/dalvik-cache
      35731 /data/dalvik-cache

      キャッシュは、こんな風に Flash に書き出す。小さいと頻繁に入れ替えが起きるかも知れない。そうなるとFlash の寿命が心配になってくる。とはいえ、大きすぎるとメモリを圧迫するのかも知れない。

      キャッシュサイズを 128 MB に設定してみて どうなるか見てみるべきかも。

      # cat /proc/*/maps | busybox grep dalvik-cache

      こんな風にしてどう使われるか見てみたのだが、mmap して使うようだ。

        2cf6c000-2cff9000 r--p 00000000 b3:02 3331 /data/dalvik-cache/system@framework@ext.jar@classes.dex
        2d292000-2d8c8000 r--p 00000000 b3:02 3332 /data/dalvik-cache/system@framework@framework.jar@classes.dex

      map のしかたは、copy-on-write でたぶん書き換えるからメモリは消費する。ただ、動かすものすべてをキャッシュに作るような制御なら キャッシュサイズを大きくしても 消費メモリは変わらない。そうではなく、存在するものだけ mmap するなら キャッシュサイズが小さい方が消費メモリが減る。ただし、キャッシュを頻繁に書き換える恐れが出てくる。いずれにせよ、書き換え頻度が多いようなら Dalvik Turbo の使用を諦めるべき。

    Vellamo だとひどい結果だ。Nexus One にだいぶ差をつけられている。

      半導体大手のQualcomm 社の Vellamo というベンチマーク で新しいもの ?

      Ronzi A3 にインストールだけは出来るようだ。だが、3D グラフィックは 見られたものではなかった。
      あと、オンラインでないとテストできないような項目も多数。

メモリ


    cat / proc / meminfo
    MemTotal: 375512 kB
    MemFree: 77060 kB
    Buffers: 27940 kB
    Cached: 142212 kB

    384 MB か -- frame buffer とかに 128 MB も取っているのか。まぁ HDMIの解像度なら、これぐらい必要か。

動画

    再生が失敗する画面が出ていた。... ronzi A3 とかと同じ問題を抱えているかも。

    いまのやつは、間に合わなければ、エラーにしてしまう。(性能が低い)ronzi A3 で 720p を見ると、数秒表示してエラー。それは良いのだが、解像度が低い場合でも すぐエラーになることがある。ファイルからの読み込みが間に合わなくともダメらしい。


追記 2011/11/1: Novo 7 basic のファームウェアが出てきた。(osakanataro氏の記事)

ファームウェアは、2種類

  • Android 2.2 アップデート版 Novo7Basic_android2.2_20111029

    これは、update.zip を microSD に入れて volume-up ボタンを押しながら立ち上げ、最初のロゴが出た所で離すとインストールされるものらしい。

    最初のロゴなら、xboot のはず。ブートローダ(mbr-xboot.bin)が あれだけ大きかったのは、この機能を含んでいたためかも。

    追記: 中国語なのでよくわからないが、ユーザ登録が必要なような...

  • Android 3.2 ? Android3.2_Novo7_Basic_1029

    こちらは、USBboootTool - 9.6_card_burn_tool---chyuan.zip を使って書きこむタイプ。

    system.img など 7 つのファイルに分かれている。2.2 の方も zip を ばらぜば、USBboootTool で書き込めるらしい。( 両者の mbr-xboot.bin が同じなら大丈夫 )

    ファームウェアが出てきたことで novo 7 basic は、薦められる機種になった。2.2 の方は Ronzi A3 でのカスタマイズのやりかたが効くはずだし、使うのには苦労しないだろう。

    逆に Ronzi A3 に取り込めるものがあれば嬉しい。Flash 10.1 が入っているはずだし、動画再生の問題も直っていそう。あと切水果 ってアプリがあるが .. Fruit Ninja のこと?

    追記: こちらは、登録がいらないようなので ... まずこれからダウンロード ... してたら 切れた。再度つないだら要登録に。

追記: ようやく購入することにした。

osakana 氏から ファームウェアを ダウンロード させてもらったので、購入条件成立。

http://dokidokido.com/category/ainol/novo7basic/index.html
ドキドキ堂 で 9990 円(送料無料)になっていたので、ここにした。

ところで、ファームウェアの 2.2 は、update.zip の形式で、3.2 は USBbootTool の形式。
update.zip には、mbr-xboot.bin が含まれていない。

ひょっとしたら、3.2 のものが 使えない恐れが... とりあえず バックアップを取って比較しないと。
posted by すz at 21:20| Comment(2) | TrackBack(0) | Jz47xx

2011年10月02日

IQQ-M1について

IQQ M1 は、Jz4760B を採用した Andoroid 2.2 タブレット。こいつを購入したので、いろいろ情報をまとめておこうと思う。

なぜ IQQ M1 を選んだのか?

    前記事 『Android端末を選ぶ基準』の条件をクリアしているのが理由のひとつ。特にサスペンド状態でのバッテリーの持ちが良いというのが、決め手。価格が安く 800x480 の 5inch モデルというのも気に入った点。

    もちろん Jz47xx に注目しているからという理由も大きい。ただ、普通に使おうと思っているので決めてにまではならない。

    IQQ M2 というのもある。M1 のデザインを良くしたもの。消費電力など機能の改良があるかも知れない。ただし、購入時には入手できなかった。また、ファームウェアが 入手できるものの 完全なものでない疑いがある。(2011/9/8 版)

スペック

    OS: Android 2.1
    CPU: Jz4760B (660MHz)
    RAM: 256MB
    Storage: 8GB
    バッテリー容量: 1800mAH (1cell)
    動作時間: 4.6時間 (1800mAH / 390mA) -- (※)
    サスペンドでの持ち時間 : 200H ! (1800mA / 9mA) -- (※)
    液晶: 5inch 800x480 dual-touch
    価格: 369元〜399元 (5166円〜5586円 : 14円/元換算) --(※2)

    ※) メーカ側の 公称値 (実測値ではない)
    ※2) 実際に買う場合、手数料と国際送料が加算される。

メーカサイト

購入方法(1)

    未だ taobao でしか変えないので、代行業を通すことになる。

    今回使用したのは、『タオバオ新幹線』。

    IQQ M1 を 369元 で 買うとする。中国国内送料は出品者負担で 0。日本への送料は、商品の重さ + 500g で計算。( IQQ M1 は 400g なので 900g として計算 )

      どうも 130元 + 40元(+500g) の 1/2 で 85 元らしい。

    為替手数料 は、1元につきプラス 1.5円 (レートは、12.5 円で 14.0 円 -- 手数料の割合は、12% )
    代行手数料 は、9,000円以下の商品を買い付けた場合 980円。(それ以上は 9% )

    計算すると 7336 円。一方、商品自体の値段は、369 x 12.5 = 4612.5 円。

    おおむね、送料込みで 6 割増しで買える計算になる。

購入方法(2)

    同じ代行だが、http://taobuy.jp/ が多少人気があるようだ。

    ここで IQQ M1 を検索しても ちゃんと出てくる

    「一括直送プラン(簡易検品なし)」 だと
    369元の本体 5,535円 + 送料 1,386円 + 手数料 100円 = 7021円?

    まぁあまり変わらないといえば変わらない。

    ただ特記すべきこととして、taobuy など普通は 2 回の振込が必要。ちょっと面倒。タオバオ新幹線の場合、1 回で済むのだが、大雑把な 重量計算で算出するので 国際送料がだいぶ高くなる。


購入方法(3)

    SmartQ5 のときお世話になった ジャスティン というところもある。改めてみたら 10/1 から年内休業だそうだ。

    休業中だが、いくらぐらいになるかちょっと計算

     元/円レート 12.2 円
     商品価格の合計が800元未満=一律130元
     中国国内の基本送料として、一律30元 (後で清算)
     検品手数料 商品10点まで=25元
     航空便書留小包
      400g〜500g未満 58元
      900g〜1000g未満 103元

    369 元 + 130元 + 送料 60元 = 6819 円。

    まぁこれも結果は、似たようなもの。レートに手数料はかからないが、これぐらいのものだとあまりメリットが出ない。

評価(その1)

    たいして使い込んでいないが、とりあえず。

  • 動画

    Jz4755 の PMP で 720p の mp4 はハネられて再生できなかったのだが、再生できている。
    フレームスキップもあまり感じられず、いい感じ。ただ、1080p は未評価。Jz4770 からのはずで、たぶんダメ。

    使っていてわかったのだが、再生でエラーになることが結構ある。一度は再生できたものが、エラーになるので、フォーマットの問題ではない。再起動したばかりでもエラーは起きる。ファイルのロードが間に合わなかったときに問答無用でエラーにしている感じ。

    動画再生ソフトは、3 種類はいっている。"ES Video Player" , "Media Player" , 動画。
    "ES Video Player" ,は、例によって G-センサに連動する。

    エラーについては、どれも同じ。エラーが起きたファイルは、他のプレイヤーでもエラーになる。
    ... ひょっとして、SDカードのドライバがバグっているのか? ... とも思ったが USB接続で PC から読み書きしても問題ないし... いったい何が原因なのだろう?

    動画は、ES エクスプローラでファイルを選択して見ている。専用ソフトでないので、ちょっと使いづらい。
    あと、付属の動画再生ソフトでは、アスペクト比の調整だとか細かい調整は無理。

  • pdf

    Quickoffice が入っていて QuickPDF で読める。日本語もちゃんと表示される。ただ、読めることは読めるが、字がつぶれて見えなかったり、表示が遅かったり... 常用するのは、なかなか難しいように感じた。


動画ソフトの考察

    MIPS なので、NDK で作った ARM 用のものは使えない。RockPlayer を試したかったがインストールできなかった。

    ただ、汎用のものは、CPU の付加機能を利用できないので使えたとしても遅くて使い物にならないはず。-- ARM でも付加機能は、CPU 毎に違う。どうやって付加機能を使うのかの情報を公開していないものも多いから、付属の再生ソフト並みの性能にするのは、一般的に困難。

      Cortex-A8 などは、Advanced SIMD (NEON) 命令を持っているそうだ。

      64ビットと128ビットのSIMD命令セットだそうで、これを使いこなせるのなら、汎用でも結構なところまでいけるかも知れない。

    いろいろ探したところ

    [APP] [15-June-2011] MPlayer for android V2

    なんていうのが見つかった。Jz47xx には、mplayer の パッチがある。自分でビルドできるなら、これは使い物になるかも知れない。ちなみに V2 は、NEON 対応だそうだ。

    あと GUI だけの動画プレイヤーも多いらしい。こういうのは、NDK とは限らないので 良いものがあるかも知れない。

評価(2) -- しばらく使った感想

  • サスペンドでの持ちが微妙

    ちゃんと調べてないのだが ... どうも 2 日ほどしか持たないような..
    サスペンドしたまま持ち歩けるので最低限の条件はクリアしているのだが、気がつくとバッテリーがないことがしばしば。

    まぁこんなもんだろう。

      追記: 満充電の状態から、サスペンドで まるまる 2 日+α ほおっておいたのだが ... 電源が切れていなかった。充電すると 充電 % が出てくるが、65% ぐらい。

      200H (8.3日)は、さすがに無理だろうが、4 日程は持つかも知れない。

  • スピーカーの音が小さい。

    アラームであまり役に立たない。スピーカー用のアンプIC は定番のものを使っているはずで、たぶん抵抗1つ付け替えるだけで、解決するのだろうが... 中をみてみないことには。

  • microSD がのみこまれた。

    ケースの口が大きく、ソケットの上部に入れてしまった。これで分解する理由ができてしまった。

    で、分解しようとやってみているのだが、うまくできない。Ronzi A3 は簡単だったのに...

  • ちょっと、もっさり。

    だいぶ程度がわかってきた。このマシンは、BogoMips 598.01 とでる。メモリも 185404 Kb で 64MB 分を 別の目的に使っている。

    EKEN M009S は、BogoMips 約 800MHz で実際に 800 MHz で動いているが、どちらも Angry Birds で背景を Off しないとまともに遊べない。Ronzi A3 は、480x272 で 1/3 程度の画素しかないから問題なかったのだった。

    ちなみに、/proc/cpuinfo , /proc/meminfo を ファイル・ブラウザを使って直接みている。

  • タッチパネルの反応が悪い。

    付属のプロテクト・シール?を貼っている。... なにも貼らなければ、問題ないのかも知れないが ... 誤操作を結構するので苦しい。

    気泡が随分あるからこれが原因のひとつかも。

アプリ開発

分解できた。

    USB などコネクタが並んでいるところから浮かせられた。あとは、ツメを差し込んで ...

    中をみると小さな基板が ... Ronzi A3 などより小さく 全体の約半分。のこりの半分はバッテリーで、1800mAH と確かに書いてあった。

    microSD が飲み込まれたのは、液晶と基板の間に隙間があるためで、ストッパーとして、ゴムの両面テープ をつけた。

    Wifi モジュールは 基板に直接取り付けられている。1.5cm 角ぐらいの小さなもの。

    あと、液晶のコネクタが 2 組みあった。7 inch とか 別の種類の 液晶 を付けることを想定しているようだ。

    音が小さい理由のひとつは、スピーカー に付けられた パンチング・メタル(?) かも知れない。ついでに外してみた。

追記 : M1 が壊れたっぽい。

      USB を つないだ状態で使いながら寝てしまったのだが、起きて気がついたらハングアップしていた。(画面は表示されていた)

      しょうがないので、リセットしたのだが立ち上がって来ない。

      ブートローダーが動きさえすれば 画面が出ると思うのだが、暗いまま。

      不審に思いながら、再インストールを試みたのだが、インストールできない。

      USB Boot は出来る。が、先に進まないのだ。

    この状況から推測するに、メモリが死んだっぽい。USB Boot は、最初のプログラム(stage1) を キャッシュ
    に読み込む。stage1 メモリを使用可能にして、stage2 を読み込む。stage2 は、USB の制御コードを持っていて、ここから色々なリクエストに応答できる状態になる。

    stage1 が動いて stage2 は動かないみたいなので、メモリが死んだと判断したわけだ。

    普通メモリは死なない。壊れたとすれば、配線の方だろう。運が悪いことにハンダ付けが十分でなかったのかも知れない。

    諦めが肝心だが、どうしよう。

    • どうせ いつかは Jz4770 の 7inch か (未だ存在しない) 5inch を買う。(解像度は、たぶん 800x480) 。

    • Novo7 basic も良いが、初物だし未だファームウェアも出ていない。もうちょっと様子を見たい。出来たら 5inch が欲しいし。

    • では当面 Ronzi A3 だけを使うのか?

      CFW を自分で組むようになって、A3 が気に入ってきている。小さいし、持ちやすい。ポケットに入るし。ただ、実用面では、ボリュームボタンがないとか、画面の回転が自由にならないとか、イヤホン使っても音が悪いとか、サスベンドのまま長時間もたないとか、いろいろ不満はある。

        ついでに書くと、動画 -- Jz4760B (600 MHz) だと 720p が再生できる。が、Jz4760 (526 MHz) だと間に合わない。

        あと、V65Pro が Jz4760B とは限らない。勘違いしていて Jz4760 かも知れない。Gセンサも あるような ないような -- レビューにはあるようなことが書いてあるし、Ramos のページも縦画面を 出していた。.... が、Gセンサがあるという記述を見つけられていない。

    • というわけで

      V65Pro を買いたいという理由が強化された。ちょっと検討してみよう。

      Aliexpress だと

      http://www.aliexpress.com/product-fm/502750015-Freeshipping-RAMOS-V65PRO-4G-720P-4-3-inch-Android-2-1-Tablet-PC-with-WIFI-wholesalers.html
      Freeshipping RAMOS V65PRO 4G 720P 4.3 inch Android 2.1 Tablet PC with WIFI
      $78.95 (FreeShipping)

      これか。今 の Paypal のレートは、78.2 だから 6200 円ぐらい? これを 299 元だとすると 20.6 元/円あたり。

      同じ Aliexpress なら、Novo 7 basic が 送料込み8800円だから、ちょっと割高に感じる。もし国内のショップで売られてもこれより安いかも知れない。

        追記: 上記のサイトは値上げして 1万円になった。それはともかく、V65Pro はやっぱり欲しいので、買ってしまった。Novo 7 basic は、M1 が復活したこともあってまだ待ち。

      なら Novo 7 basic を買えば.. とも思うのだが、持ち歩くのは厳しいし。あと aiiexpress は Paypal が使えなくなっている。返金を受けることもあるから、リスクや面倒が増えたかも知れない。

M1 が生き返った

    うんともすんとも言わなかった M1 だが、一回分解して基板を浮かせたところ USB BOOT が 立ち上がってきてインストールできた。基板が歪んでいたとかそういう理由かも知れない。(M1 の基板は相当薄い)
    microSD が喰われてしまわないように入れた プチルゴムのストッパーが だめだったのかも。
    で、再度組みなおして、インストールしなおしたら、ちゃんと立ち上がった。
    まぁ、とりあえずは良かった。

posted by すz at 16:08| Comment(22) | TrackBack(0) | Jz47xx

2011年09月05日

Android端末を選ぶ基準

あくまで私見だが、私の中華Android端末を選ぶ基準というのを書いておこうと思う。中国製の Android 端末はやたら沢山あるしこれからも出てくるだろう。私の基準に合わないものも多数ある。私の基準に合うものが、日本のショップで売られると入手性がよくなるわけで、私の望むところであるから、この基準を主張しておこうと思う。なおこの基準は、前々から記事に書いていた。別に目新しいわけではないが、ここでまとめておく。

1) ファームウェアが最低でもひとつ入手できること。

これがないと、カスタムすることもできないし、元に戻すこともできない。最後までファームウェアが出てこないこともあり得るから、確認してから買うべきだとおもう。

普通は、アップデートとして提供される。だから、出たばかりの製品ではファームウェアが出ていない可能性が高い。アップデートが出るまで待てということでもある。


  • http://www.smartdevices.com.cn/support/download/

    Android の前に Ubuntu が動作する SmartQ5 を出したところ。その後 SmartQ V5 などがヒット。

    いまや値段が高めに感じるが、ファームウエアについては安心できる。

  • http://www.eken.com/support/

    中華Andoroid が知られるきっかけになった EKEN M001 を出したところ。

    VIA WM8505/8650 が中心だが、ファームウエアは割と頻繁に出ている。これを元にした CFW も定番が存在するようだ。

    VIA WM8650 は、600MHz でもっさり気味とも言われるが、EKEN M009S などは低価格で、とりあえず使ってみたい人にはお薦めかも。

    ちなみに、EKEN M009S の互換機らしきものも存在するようだ。(EKEN とは書いてなくてわずかに安い)

  • http://www.pandawillforum.com

    ショップのサポートフォーラムだが、Gpad G10 (TCC8902) のファームウエアがダウンロードできる。

    いまは、Android 2.3 の β3 が最新のようだ。

  • http://www.ieronzi.com/technic.asp
  • http://www.soiqq.com/down.asp?sid=7

    Jz4760/B MIPS アンドロイドを出しているところ。Ronzi A3 は、ファームウエアが存在するが、IQQ M1 == Ronzi A5 の ファームウエアは未だにないようだ。
      -- 9/12 IQQ M1/M2 のファームウェアがダウンロードできるようになった。

    以上は、私が知っていることを列挙しただけで偏った内容。中華Android 端末は、膨大な種類があるから欲しい機種の情報を事前に探しておくべき。無名のものも多数あり、ファームウエアの入手に難があるものもある。要注意。

2) ファームウェアを確実に更新できること

ハードウェアが物理的に壊れていたら別だが、いわゆる文鎮になる可能性がないものがベスト。

SDカードや USB からブートできる CPU は存在する。そういう CPU を採用していれば、ファームウェアが完全に壊れても元にもどせる。

また、ファームウェアが置かれる NAND Flash と別の SPI Flash から ブートできる CPU もある。SPI Flash のブートローダを書き換えすることがないようなつくりで、SD カードや USB からブートできるようなものなら、CPU に機能があるものと同等と思ってよさそう。

    SPI Flash は、8pin の IC で 容量は 512K〜2MB 程度のものが良く使われる。PC の BIOS 用に使われることもあるらしい。

    この容量なら、u-boot がはいる。(+ カーネルも入らないことはないが、普通は入れないだろう)。

この条件は、単に使う人より、CFW を作るような人にとって重要な条件。ちょっと失敗したぐらいで、文鎮になってはかなわない。ただ、単に使う人にとっても、CFW の出やすさやそれを入れるときの安心感にかかわってくる。

Andoroid で使われる CPU のうち、自分が興味をもったものしか知らないのだが、

  • SDカードや USB からブートできる CPU

    Jz4760/Jz4760B (MIPS) (USB からブート)

    TCC8902 (USB からブート)

  • SPI Flash からブートできる CPU

    VIA WM8650

    (注意) SPI Flash にどんなブートローダが入っているかに確実性は依存する。しかし、それについて情報を持っていないので、リスクがある。

    もし、u-boot が入っているなら、ソースコードは入手できる。コードを見ればどういう機能をインプリメントしたか分かるはず。

性能がいまひとつの、安物ばかりで申し訳ないが、いまのところこれしか知らない。

TCC8902 の次の世代の TCC8803 あたりは、USB ブートの機能を持っていると思われるが、確信まではできない。

RK2818 や その次の世代の RK2918 が USB ブートの機能を持っているといいなとは思うのだが、前の RK2808(Moonse E7001) では 文鎮化した話をよく聞いたような気がするので、あまり期待できない。

3) サスペンドでの消費電流が少ないこと

サスペンドして長時間もたないと、持ち歩いて 使うのはなかなか難しい。だが、この条件を満たさない機種の割合が 非常に多いと感じる。

持ち歩かなくとも、すぐに使える状態にできないと 使う頻度が減る。やはり重要な要素だと思える。

サスペンドが使えなくとも数秒で起動するなら問題ないのだが、それはもっと難しいだろう。

こうなってしまうのは、理由があると思う。たぶん 薄利で 販売するし、製品寿命が短いために、開発費をかけられないのだ。そうであれば、残念なことに今後もあまり期待できない。

これを条件としてしまうと、買いたいと思える機種がなくなってしまうかも知れない。次の 4) の条件を満たすのなら、"望ましい" ぐらいにしておく。

4) カーネルのソースコードが入手できること

私は、そういうものしか興味がなく、カーネルのソースコードが入手できないものは買わない。

ただし、GPL 違反だと声高に主張するつもりはない。いまのところ 中国国内向けのものをなんとか入手している感じがあり、へたをすると 単に買えなくなるだけかも知れないという不安がある。それに、著作権の問題であり、第三者が声高に主張するのは筋違いとも思う。

ただ、私は決してカーネルのソースコードが入手できないものは買わない。ソースコードが入手できると、上記のサスペンドの問題が解決できる可能性が出てくる。自分が解決できなくとも、誰かがするかも知れない。そういう意味で 使うだけの人にとってもメリットがある。

    ちなみに、本来 GPL 違反に問われるのは、販売者であるはずだ。バイナリを渡した人に責任があるのであって、ビルドした人に責任があるとは書いてない。もちろんビルドした人に最終的に責任が行くが、責任がある期間は有限だ。その期間内にソースコードを入手しておかないと、中古として売ったりすると GPL 違反に問われるリスクを負うことになる。

    GPL違反の問題は、厳密に適用すると 一般のユーザにも関わってくるような種類の問題だ。だからあんまりアレコレ言いたくないのだ。

カーネルが入手できる CPU

  • Jz4760/B

    ftp://ftp.ingenic.cn/3sw/01linux/ にパッチがある。

  • tcc89xx/88xx

    http://www.telechips.com/ の Technical Support に Open Source SW というリンクがあり、カーネルが置いてある。最新は 2011/08/22 の日付。

  • VIA WM8560

    http://ftp.gpl-devices.org/pub/vendors/Wondermedia/WM8650/
    公式サイトは知らないが、ググったら 見つかった。

    GPL的には、Android のそれぞれの機種でカーネルのソースコードが入手できないといけない。その機種に対応するために多少の修正が入るはずでそれがなければビルドできない。だが、ソースコードだけあっても、データシートが入手できないと実際に改良することは難しい。とりあえず、CPU メーカが ソースコードを公開していたら 条件クリアということにしておく。

      本来必要なのは、CPU メーカが出しているソースとの差分(patch)と .config 。これだけあれば、リリースされているものと同じものが再構築できるはず。これぐらいならメールに添付できるぐらいの量。

    ちなみに、TI や Freescale といった有名所は、さがすまでもなく条件はクリアしているはず。

条件は以上。人によっては、静電式のタッチパネルであることとか、いろいろな条件があると思う。だが、上であげた条件は、それ以前のもので、機能や性能がいくらすぐれていても選択枝には入れない。

追記: 文鎮化を避けられる他の CPU

AML8726-M Cheerchip AMLogic -- Novo8 が採用しているこの CPU は、SD カードからのブートができて、ツールもあるらしい。

詳しくは知らないが、とりあえずメモ。

Novo7 の「Allwinner A10」はどうなのだろう? ちょっと興味がある。
posted by すz at 06:52| Comment(0) | TrackBack(0) | 日記

2011年08月30日

開発環境の整備(1)

新たにマシンを組んで開発環境を整備することにした。

なにの開発環境かというと、当然ながら Jz47xx の開発環境だ。OS は、64bit の Linux で RHEL 6.1 clone 。

    後述するが、64bit の Linux というのは重要な要素。64bit が使えるマシンを持っていなかったので、わざわざ新調することにしたのだ。

    CPU は、AMD Fusion E-350 。64bit だけでなく、仮想化の機能も使ってみたい。低消費電力も重視しているので、これになった。

    RHEL 6.1 clone と書いたのもわけがある。Scientific Linux や CentOS が有名 だが、そのどちらでもないし、最終的に 全部自分でビルドしたものに置き換えるつもりなので、野良 clone になりそう。

さて、64bit Linux を使う思惑の説明をしておこう。

    (1) qemu は、マシンそのもののエミュレータのほかに、Linux のバイナリの実行もサポートしている。... 要するに mipsel の 32bit の環境を作れば、chroot することで 動かすことができる。

    (2) 64bit の x86_64 の環境は、/lib64 , /usr/lib64 を使うようになっていて、32bit の 共有ライブラリと共存できる。この特徴を利用して、i386 + x86_64 環境ではなく、mipsel + x86_64 環境にしてしまおうというのが思惑。

    (3) rpm 関係をはじめとして、devel 以外の環境は x86_64 のものを使えるし、noarch パッケージも ビルドする必要はない。これはありがたい。

    ちなみに、x86_64 では i386 などを動かせるという 定義を rpm で しているわけだが、mipsel も 動かせるという定義に変えないといけないはず。ちょっと面倒かも。

こういう思惑で進めていて、うまくいけば RHEL 6.1 相当の mipsel 環境ができあがる。ただ、失敗するかも知れない。なかなか難しいのだ。

    どう進めていくかもうすこし説明しておこう。

    (1) まずは、chroot する x86_64 自体のビルド環境を作る。実環境は壊したくないし、最終的に mipsel の ビルド環境も chroot して作る予定なわけで その予行演習にもなる。

    (2) まず、devel パッケージをいれて、最低限度のものはすべてビルドできるようにする。

    最低限度のもの ... という定義はかなり面倒。ちゃんとビルドできることも確かめておかないとならない。... でビルドできることを確かめる過程で 野良 clone ができてしまうわけだ。

    この作業を進めていたが、だいぶ目処が立った。ただし、ビルド環境のみを重視しているので、gnome などは排除している。

    (3) 次に qemu と クロスのビルド環境を作る。

    クロスといっても fullset はすこぶる面倒。fortran とか java とかあるし それらに必要なライブラリ群も膨大になる。まずは、gcc と g++ をなんとか作り上げる。

    この作業も進めているが、gcc をビルドするのに glibc が必要だったりする。その上なぜか 実行できるかチェックしていたりして ... qemu の環境も必須だったりした。

    ちゃんとした glibc はないので、Ingenic のサイトから とってきた glibc のバイナリ から の crtX.o とか libc.a とかを借用することで、gcc はなんとかビルドできた。

    また、ヘッダファイルも一式必要のようだ。target は mipsel-linux にした。これは、x86_64 の ヘッダファイル と Linux カーネルの mips の asm からとりあえずでっちあげて /cross/mipsel-linux/include に置いた。(あと prefix は /cross )

    ちなみに使った gcc は、4.4.3 (patch なし) 。あくまで仮置き。

      この gcc で Jz47xx のカーネルがビルドできるか試してみたところ OK 。動くものが出来たかどうかは分からないが、たぶん大丈夫だろう。たとえ、ここでやめても一応成果にはなった。

    gcc と g++ ができたら、次は glibc のビルド。 glibc が出来れば、ちょっと一息つけるのだが、まだ出来ていない。

    (4) それが出来たら、少しづつパッケージをビルドしていく。パッケージをビルドするのは、依存関係があるから 一筋縄ではいかない。エラーになったら 依存関係があるもののビルドをやって、再度ビルドしなおし。たいへんな作業なのだが、x86_64 環境を作る過程で かなり練習している。ただ devel パッケージを当てて端折ったところもあるから、難しいところも出てくるはず。

    (5) パッケージがだいぶ揃ったら mipsel をメインにして 新たなビルド環境を作る。ビルドのほとんどは gcc (g++) の実行が占める。これを qemu のエミュレーション でやっていたら終わらないので クロスの gcc は残す。ほかに ビルドが出来なかった devel でない環境は x86_64 のものを流用する。

    このビルド環境で再度作ってみる。一回作れたので問題はないはず。

    (6) 最後にできたものを 実機にもっていく。ひょっとしたら大きな落とし穴があって動かないかも知れない。... といっても glibc ぐらいのもののはずで、(5) の環境で作り直す。

    ちなみに、softfloat にはしない。Jz4760 は fp があるし、ないものでも カーネルでのエミュレーションでなんとかなる。

    (7) 最終目標は、自分自身をビルドできる最小セット。ビルドに関係ないものは切り捨てるし、最小にするために、SPEC ファイルも書き換える。(gnome とか ビルドしないつもりだし、ドキュメント関係も 切り捨てるつもり)。予想では RHEL 6 全パッケージの 1/4 〜 1/3 ぐらいの規模になる。

... とまぁ遠大な計画。まだ (3) の途中だし挫折するかも知れない。すくなくとも時間はかかる。時間がかかると、途中で別のことがしたくなって中断するかも。

前に redhat-7 の環境をどうのということを書いたが、よくよく見たら ビルド環境がなかったのでパス。もっともそれがあったとしても RHEL 6 レベルに到達するのはかなり難しい。今回は、RHEL 6 どうして arch の乗り換えという方針。これなら成功すれば 一気に最新の環境が出来上がる。うまくいけば ppc も作りたい。arm までは手を出さない。(RPM ベースでは arm の実績はないようだ、ppc や mips は 64bit 版がある)

追記1 -- 気がついたことを追記していこうと思う

  • glibc は、RHEL のビルド途中のもの (すなわち正規のパッチを当てたもの) のビルドがなんとかできた。(ただし gcc,g++ までで addon も rtkaio は失敗)


    ftp://ftp.ingenic.cn/3sw/01linux/00toolchain/
    jz-crosstools-src.tar.bz2 67863 KB 2009/04/03 0:00:00


    ビルドするにあたり、これに含まれている ビルドスクリプトが大変参考になった。

    ちなみに、正規の glibc は mips に対応していない。ビルドするには、glibc-ports を glibc のディレクトリに置いて addon のリストに top ディレクトリを加えるそうだ。

  • ただ、gcc はあくまでクロス用のものしか作れていない。なにが不便かというとライブラリを /cross/mipsel-linux/lib に置かないといけないということ。/lib , /usr/lib を使うようなものにしたかったのだが、挫折。

    だが、よくよく考えてみれば、本当にクロス... というか native で動かしたいのは、cc1 と cc1plus のみ。 rpmbuild で mipsel 用の gcc の パッケージが作れれば それを当ててから cc1 と cc1plus を置き換えれば良い。当面は rpmbuild でビルドしていくこと をやっていこう。

    binutils は、cc1 と cc1plus ほどは CPU を消費しない。mipsel のパッケージを作って エミュレーションで動かしても良いかも知れない。

  • rpmbuild についてだが、--target=mipsel を付けるだけでビルドできるものがあった。/usr/lib/rpm/macros を編集しないといけないと思っていたのだが、単純なものはそれすら必要ない。

    ただ、作ったものは rpm でインストールできない。結局は /usr/lib/rpm/macros を編集しないといけない。

  • rpmbuild では、mipsel だけの依存関係は見てくれない。x86_64 の rpm があれば通ってしまい、必要なものがないのにビルドしようとする。

    これは、困るので一旦 devel パッケージ群を アンインストールすることにした。

    ビルドが通ったら、x86_64 の devel をインストールして、mipsel の共有ライブラリを /cross に コピーしていく作戦。

    実は、言うはやすし、なのだ。devel パッケージは 200-300 個ぐらいある。やってられないので、早めに gcc の rpm を作って rpm コマンドが使えるようにしたい。

  • rpm で、システムの arch を見ている。/bin/arch や /bin/uname 経由なら 割と簡単にごまかして mips に見せかけられそうだが、システムコールで見ているとちょっとやっかい。これは調べておかないと。

    ちなみに mipsel のバイナリになってしまえば qemu が "mips" を返すようになる。"mipsel" でなくて構わないのか? という気がするが カーネルがどうなっているか調べて 必要ならそれに合わせようと思う。

追記2 -- いくつか失敗したのでメモ

  • gcc や binutils は、本来 rpm を作成する予定のソースコードを使い、機能に関するオプションも同じにしておく。

    gcc の パッケージのビルドは、作成した gcc を使ってライブラリを作成する。作成した gcc とは、mips だから cc1/cc1plus を含め qemu で動作する。そうなると時間がかかってしょうがないのだ。

    正規のパッケージを作成するときは止むをえない。(セルフ環境が出来ていたら、そちらを使った方が良い)。だが、とりあえず、バイナリが使いたいだけなので、ビルドを一旦止め x86_64 の cc1 に置き換えるとかした方が良い。

    最終的なクロス環境でも x86_64 の cc1/cc1plus 置き換える予定だから、同じオブジェクトが出るようにしておいた方が良いという理由もある。

    binutis は、シビアではないと思うが、些細な差異が問題が出るといやなので同じにしておく。

    ちなみに --target は、mipsel-linux で良いと思う。

  • x86_64 で動かす クロス用の 環境がビルドできたら、mipsel に見せかけるように環境を変える。/usr/bin の gcc とか as,ld などは、mips のものに置き換える。

    あと /usr/include や /lib /usr/lib も置き換え。/cross/mipsel-linux 以下にあるものをコピー。
    (簡単なプログラムが ちゃんと コンパイルできて、動作するかも確認しておく)

    /usr/lib/rpm/macros は、x86_64 を mipsel に置き換える。あと %mips mipsel を追加。

    /bin/uname , /bin/arch も mips を返すようにすべきだが、まだやっていない。

追記3 binutils/gcc/glibc の変更

    ビルドを進めていたのだが、gcc のビルドで internal error になる。x86_64 の cc1 を置き換えても同じ結果。

    だんだん面倒になってきたので、mips64el で実績のあるパッケージを使うことにした。64bit だが、実績のないものより随分マシ。

    RHEL6 の gcc は、4.4.5 ベース。だが、/usr/lib/gcc/x86_64-redhat-linux/ を見ると 4.4.5 は 4.4.4 のシンボリックリンクで 4.4.4 と共用できるようにしているように見える。

    さて、gcc-4.4.4 というと fedora 13 。

  • http://fedoraproject.org/wiki/Architectures/MIPS

    ここを見ると、fedora 13 は、mips64el への移植プロジェクトがあって、バイナリとソース RPM をリリースしている。

    で、オリジナルの fedora 13 のパッケージと spec ファイルを比べると、どこに変更が必要かわかる。binutils でさえパッチが追加になっていて、一筋縄ではいかないような感じ。RHEL6 をベースにして target だけ変更すれば良いような甘いものではなかったらしい。

      ちなみに差分について、メモに残しておく。

      binutils
      Patch101: binutils-2.19.51.0.2-ls2f.patch
      Patch102: binutils-2.20-loongson2f.patch

      +%ifarch mips64el
      +# no this feature in mips
      +OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-fstack-protector//g'`
      +%endif
      +%ifarch mips64el
      + --disable-multilib \
      + --disable-fixed-point --without-ppl --without-cloog \
      + --disable-checking --disable-werror \
      +%endif
      +%ifnarch mips64el
      mkdir -p %{buildroot}%{_prefix}/sbin
      gcc -static -Os %{SOURCE1} -o %{buildroot}%{_prefix}/sbin/libgcc_post_upgrade
      strip %{buildroot}%{_prefix}/sbin/libgcc_post_upgrade
      +%endif
      +%ifnarch mips64el
      %post -n libgcc -p %{_prefix}/sbin/libgcc_post_upgrade
      +%endif
      +%ifnarch mips64el
      %{_prefix}/sbin/libgcc_post_upgrade
      +%endif

      glibc:
      +Source2: glibc-ports-9f99a41.tar.bz2
      +Patch2: %{glibcsrcdir}-fedora-mips.patch

      +mv glibc-ports-* ports
      +%ifarch mips64el
      +%define _lib lib32
      +%define _libdir %{_prefix}/lib32
      +BuildFlags="-Wp,-U_FORTIFY_SOURCE"
      +GCC="gcc -march=mips3 -mabi=n32 -mplt -fPIC -fexceptions -Wa,-mfix-loongson2f-nop"
      +GXX="g++ -march=mips3 -mabi=n32 -mplt -fPIC -fexceptions -Wa,-mfix-loongson2f-nop"
      +%endif
      +%ifarch %{portarches}
      +AddOns=,ports$AddOns
      +%endif
      +%ifarch mips64el
      +/lib32
      +/usr/lib32
      +%endif

    • gcc のビルドにすごく時間がかかるのだが、ほとんどは、fixed-point の生成。(さらに エミュレータ環境では これのための時間が飛躍的に増える) 使いもしないのに、やってられないので、disable することは重要。
    • glibc に mips を対応させるには、 glibc-ports が必要。
    • -march=mips3 -mabi=n32 これはどうすべきなのだろう?
    • redhat 系の mips では、64bit が標準で 32bit は lib32 を使うものらしい。-- これは 気に入らない。x86_64 のように lib と lib64 を使うようにして欲しかった。まぁ好き勝手に作るので、32bit 専用で lib を使うようにしたい。
    • 上でも書いたが soft-float にはしない。Jz4760 は FP を持っているし、次に出る Jz4770 も持っている。その前のものは FP がないが、別にカーネルでのエミュレーションで問題ないはず。soft-float にすると FP を持っている CPU がそれを生かせない。-- こっちのデメリットの方が大きい。

    さて、この fedora 13 (MIPS) の binutils/gcc/glibc をビルドして、x86_64 の環境も入れ替えることをまずやろうと思う。

    ... これはなんとかなった。いろいろ問題があるもののパッケージも作れた。

    次は、cross 用の もののビルド。

    binutils は簡単だ。

    --define "binutils_target mipsel-linux" --without testsuite

    このオプションを追加するだけで良いらしい。

    問題なのは、gcc 。

    ../configure --prefix=/usr --target=mipsel-linux --enable-shared \
    --enable-threads=posix --enable-__cxa_atexit --disable-libunwind-exceptions \
    --enable-gnu-unique-object --enable-languages=c,c++ --disable-libgcj \
    --disable-multilib --disable-fixed-point --without-ppl --without-cloog \
    --disable-checking --disable-werror --disable-libgomp

    クロスの環境は、これでなんとか。ただし、include ファイル一式と glibc を用意しないといけなかった。(さらに mipsel の gmp-devel, mpfr-devel libz-devel 相当も用意した)

    実をいうと、この bootstrap となる環境をどう作ったのか良くわかっていない。最終目的のモノが出来てしまえば それを使うようにすれば良いから 気にしないことにする。

      いちおうメモしておくと、もともとの ヘッダーファイルは fc13 mips64el のパッケージから。glibc は Ingenic が提供しているバイナリ(たぶん soft-float) 。それを元に中途半端に作ったものを入れ替えつつ試行錯誤した。

    さて、これを元に glibc

    インストールした gcc/g++ は、prefix なしの as/ld を使うようなので、binutils のコマンドを /cross/mipsel-linux/bin とかに prefix なしでコピーしておく。

    で、build 用ディレクトリは、x86_64 用に rpmbuild で作った上で、glibc-ports , を ports に rename して入れ、glibc-2.12-2-gc4ccff1-fedora-mips.patch を当てる。


    export PATH=/cross/mipsel-linux/bin:$PATH
    ../configure \
    CC="mipsel-linux-gcc" \
    CXX="mipsel-linux-g++" \
    CFLAGS="-fexceptions -DNDEBUG -g -O3" \
    --prefix=/usr --enable-add-ons=ports,nptl,c_stubs,libidn --without-cvs --enable-kernel=2.6.18 --with-headers=/usr/mipsel-linux/include \
    --enable-bind-now --with-tls --with-__thread \
    --enable-multi-arch --disable-profile --enable-experimental-malloc --disable-nss-crypt \
    --build=mipsel-linux





  • 追記: 2011/10/04

      なんだか 遅々として進まない。

      MIPS 用の gcc パッケージのビルドで失敗する。... ひょっとしてメモリ(というより空間)不足?

        MIPS の 32bit は、ユーザ空間(kuseg) が Max 2GB で小さい。3GB とか 場合によっては、4GB 弱使える i386 より不利な面がある。 クロスなので、メモリ自体は不足しないと思うのだが、リソース制限がかかってエラーになっているかも知れない。

      それはともかく、飽きたので まずは自分自身をビルドできるものをちゃんと作ることにした。

      それは、随分進んだ。(jdk の 2-3 のパッケージを除き)ビルドしたパッケージだけを使って自分自身を作れている。 だいたい必要な SRPM 数は 600 弱。java なしで済ませられると 500 以下にできるのだが、まだうまくいっていない。ちなみに gnome は外してある。latex など一部のドキュメント・ツールと emacs も外している。

      当てたパッケージの総数は、1000 弱。

      これを fix させてから再び MIPS に挑戦するつもり。

    追記: とりあえず今の状況とビルドメモ

      まず、RHEL6 野良clone だが、ほぼ自分自身がビルドできるようになった。

      できないのは、gcc の i686 ライブラリのパッケージのみ。32bit の環境まで作れば問題ないはずだが、面倒なのでパス。

      作ったのは、1301 の rpm に加えて java 関係 をビルドするためのパッケージ 205 と i686 glibc パッケージ 8 。まぁ 1500 個ものパッケージがある。

        http://nmj.sumomo.ne.jp/my-rhel6/

        ここに野良ビルド版の 全て -- ソースRPM と RPM を置いておく。ただ、大きいので予告なしに消すかも知れない。

      これを元に mips 版を作るのが目標

      0) 準備

      ビルドする環境は、作った RHEL6 野良clone 。これの tarball を元に chroot での環境を作る。まず、この環境の 32bit は mips にするので、i686 パッケージは全部アンインストールしておく。
      次に qemu をビルドして、/usr/bin/qemu-mipsel をインストール。あと これを実行するように binfmt_misc を設定する。

      1) クロス版 binutils の ビルド。

      RHEL6 では、オリジナルの binutils でクロス版も作れるようになっている。

      # rpmbuild --define "binutils_target arm-linux-gnu" \
      --define "binutils_target mipsel-linux" \
      --rebuild binutils-xxxx.src.prm

      とりあえず、こんな感じで作って インストールする。

      ちなみに、これで作った binutils は、普通のクロス用と違う。ld のパスが セルフ用と同じになっている。/lib /usr/lib がデフォルト。

      2) クロス版 gcc の ビルド(1)

      つぎに gcc だが、mips の libc やヘッダファイルが必要 。で、gcc が出来たら glibc を作って libc やヘッダファイルを作る。--- 巡回してしまっていて ゼロからのビルドは大変難しい。おすすめは、

        ftp://ftp.ingenic.cn/3sw/01linux/00toolchain/

      から toolchain のバイナリ と ソースを取ってくること。ソースにはどうやってビルドするかが分かるスクリプトも付いている。

      クロスの環境は、/usr/mipsel-linux に作る。この下に 最初に使う libc,libm と include ファイルが必要になる。

        インストール先は、上記だけで済まない。/lib と /usr/lib/gcc/mipsel-linux , /usr/libexec/gcc/mipsel-linux を使う。


      gcc のソースコードは、RHEL6 のもの -- gcc-4.4.5-6.el6.src.rpm を使う。これを普通にビルドし、configure を終了したところで止める。

      このソースツリーを使って mips 用の config をする。

      # ../configure --prefix=/usr --target=mipsel-linux \
      --build=x86_64-redhat-linux --host=x86_64-redhat-linux \
      --disable-threads --disable-checking --with-system-zlib \
      --enable-__cxa_atexit --disable-libunwind-exceptions \
      --enable-gnu-unique-object --enable-languages=c,c++ --disable-libgcj \
      --disable-libmudflap --disable-libgomp --disable-libssp \
      --disable-shared --disable-libstdc__-v3

      最初は、シェアードライブラリがない ので disable にする。また、libstdc も無理なのでパス。
      これで configure して make , make install 。

      3) glibc のビルド 。

      これもまた、RHEL6 のものを使う。glibc のビルドでは、カーネルヘッダのみあれば良い。前に使った include ファイル や libc.libm は一回捨てて、カーネルヘッダのみを /usr/mipsel-linux/include に展開する。とりあえずは、ingenic のサイトの toolchain の ソースに付属するもので良い。

      さて、mips の glibc をビルドするには、glibc-ports が必要 ... なのだが、RHEL6 の glibc は、正規版ではなく、ある時点でのスナップショットのため完全に対応する glibc-ports がない。

      しょうがないので、glibc-ports-2.12.1.tar.bz2 をベースにする。上記のように glibc のソースを展開したあと、これを展開して、ports に リネーム。

        実をいうと、glibc-ports-2.14 の ports/sysdeps/mips だけ入れ替えている。ただし、fpu/ftestexcept.c , fpu/feupdateenv.c はエラーになるので 12.1 に戻している。


      # ../configure CC=mipsel-linux-gcc CXX=mipsel-linux-g++ \
      AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib --prefix=/usr \
      --enable-add-ons=nptl,c_stubs,libidn,ports --without-cvs \
      --enable-kernel=2.6.18 --enable-bind-now --with-tls --with-__thread \
      --disable-multi-arch --disable-profile --enable-experimental-malloc \
      --disable-nss-crypt \
      --host=mipsel-linux --build=x86_64-redhat-linux \
      --with-headers=/usr/mipsel-linux/include

      いまのところこれ。add-ons から rtkaio を除いているし、disable-nss-crypt の指定をしている。nss-crypt がビルドできるようになったら enable して glibc を作りなおさないといけない。... ただし先の話。

      ビルドが完了したら インストールするのだが、x86_64 の環境を壊してしまうとまずいので、install_root を指定する。

      # make install_root=/tmp/new-glibc install

      たとえばこんな風にする。new-glibc にインストールされた、lib 配下を /lib に移動する。
      そして、usr/include を /usr/mipsel-linux/include に移動。

      あと usr/lib を /usr/mipsel-linux/lib に移動。ただし問題がいくつかあって fix しないといけない。

      • いくつかの .so は ../lib のもののリンクになっている。これを /lib になるように張り替える。
      • libc.so などは、テキストで、/usr/lib を指しているところがある。これを /usr/mipsel-linux/lib になるように編集する。


      4) クロス版 gcc の ビルド(2)

      正しそうな 環境ができたので、作りなおす

      (1回目) --disable-shared --disable-libstdc__-v3
      (2回目) --enable-shared

      最終的には、--disable-libmudflap --disable-libgomp も削除しないといけないし、gcj もビルドしないと。でも、それは先の話。

      さて、これで gcc と glibc が出来た。このバイナリ一式があれば、gcc も glibc も再ビルドできる。整理して、ダウンロードできるようにしておこうと思う。

    ここまでがクロスの環境。

    さて、ここからは、qemu-mipsel を使った 擬似セルフ環境に移る。

    (前に戻れなくなると困るので、以上の chroot 環境を fork する。)


      5) rpmbuild できるように 環境を切り替え

      まず、

        /usr/lib/rpm/platform/xx/macros
        /usr/lib/rpm/rpmrc

      に mipsel の定義を追加。

      次に、/usr/bin/gcc など を mips 版に置き換える。setarch が使えると便利なのだが、調べていない。手動で置き換えても ... まぁなんとか。

      こうすると、次から ビルドするものは すべて mipsel になる。rpmbuild での指定は、

      rpmbuild --target mipsel ....

      とする。

      簡単なものは、これでビルドできてしまう。うまくいくかどうかのチェックには、zlib と mingetty を使っている。

      ここからが大変。必要な パッケージは x86_64 で すべて当たっている。 依存関係が分からない状況で ビルドしていく。できた mipsel 版の rpm も rpm コマンドでインストールしない。rpm2cpio を使って /lib /usr/lib を中心に取り出して 手動でインストールする。

      /lib, /usr/lib にインストールされている ダイナミックライブラリ の 元となる ソースパッケージは、280 ぐらい。これらを地道に 作っていく。なかには、gcc (セルフ)など手強いものがある。が、クロスでの gcc ビルドは諦めた。実機で ビルドするつもり。

      追記: これなのだが、妙にうまくいっていない。

      dlopen が見つからないとか 作ったシェアードライブラリがリンクできないとか 色々。
      どうも MIPS の場合は、-fPIC でないとシェアードライブラリが作れないような ...

        dlopen が見つからないというのは、明示的に -ldl を指定していないことが理由。

      あと -D__mipsel__ が自動では定義されていない。普通は rpm の設定でごまかせるのだが、ごまかせない rpm もある。

      さらに、gcc は、/usr/mipsel-linux/xx を必要とするのだが、prefix が /usr になっているので、両方に同じものを用意しないとまずい。

      まぁ、色々あるのではあるが、bash も ビルドは出来て、qemu-mipsel では動いている。binutils の セルフ版もビルドは出来た。glibc は惜しいところまで行く。(locale 作成で メモリ不足のためエラー )

      gcc も 途中までは出来る。クロスで一旦全部作ったから、gcc や g++ のフロントエンドだけが欲しい。( cc1 などは、クロスのものを使いたいし ライブラリも全部できている ) 。エラーが起きるのは確か cc1plus の 2 回目のビルドだったと思うので、gcc , g++ はできているかも知れない。

      あと、メモリ不足の件。これは実際は 空間不足のはずで、ヒープのスタートアドレスとか ダイナミックライブラリのスタートアドレスが関係しているのだと思う。だが、どこで定義しているのかまだ分かっておらず直せていない。

    調査(1)

    • __mipsel__ を定義したいのだが、誰がどこで定義するのが正しい?

      gcc を見たら、__x86_64__ などは、gcc/config/i386 の配下で見つかった。答えは gcc 。gcc は、cpp/gcc/cc1 のパーツに別れているのだが、関係あるのは (おそらく) cpp 。

      で、定義するのは、gcc/config/mips/linux.h (の TARGET_CPU_CPP_BUILTINS() ) が普通らしい。この定義の中で TARGET_64BIT, TARGET_BIG_ENDIAN を参照して、

      __mipsel__ , __mipseb__ , __mips64el__ , __mips64eb__

      のどれかを定義することにした。

    • メモリ不足はなぜ起きるのか? まずは map から

      # cat /proc/プロセス番号/maps

      とすることで、どこに map しているかが分かる。qemu-mipsel を使っても 元の mips の mapping に従っているように見える。maps を 整理すると ...

      00400000- プログラム(cc1 など)
      xxxxxxxx- heap (text - data - bss の次から)
      40000000-40001000 ---p
      40001000-40a01000 rw-p stack
      40a01000- /lib/ld-2.12.so

      40000000- /lib/ld.2.12.so
      40b1c000- libgcc_s.so.1

      60000000- qemu-mipsel
      6d523000-6d544000 [heap] (qemu 自体の)
      2b898922c000- /lib64/ld-2.12.so

      heap や stack について、簡単なプログラムで printf してチェックしたところ、heap は、プログラムの終わりから stack は、40a10000 あたりから逆向き に割り当てられることが分かった。

      要するにプログラムが使えるアドレス空間は、ダイナミックライブラリを除くと 00400000 - 40000000 の 約 1GB ということになる。これが足りない.... ということが 起きるかどうかは、分からない。随分前のバージョンでも 数百MB なら使っているのを見たことがある。

      問題は、スタックかも知れない。 40000000 からの 1ページは、アクセス不可になっている。ということは、これがボトムで これを超えることは出来ないのかも。そうだとすれば 40a01000 までの 10MB がスタックに割り当てられた 領域。

      stack も alloca を使うと大量に消費することになるから、stack 領域の不足 の可能性は高い。

      ただ、 40000000 にアクセスしたときに copy-on-write で割り当て直すかも知れない。これも簡単なプログラムで確かめることが出来る。確かめてみたところ、40001000 には書き込めたが、40000000 だと core dump した。たぶん、stack bottom は超えられないのだろう。

      追記: 調べていたら、qemu の -s オプションでスタックサイズを変更できることが分かった。

      たとえば、qemu-mipsel -s 67108864 /bin/bash.mips として 起動すると /lib/ld-2.12.so のアドレスが 44001000 に変わる。

      で、ソースを見てみると ... ulimit も参照してスタックサイズを決めている。

      stack size (kbytes, -s) 10240

      ulimit で見てみたら、10MB にしていたのは、自分であった。そして、たとえば ulimit -s 65536 とすれば、64MB 確保されることが確認できた。

      virtual memory exhausted: Cannot allocate memory

      それはクリアできたが、やはりダメだ。... というより悪化しているかも。

    追記: 結構出来てきた。パッケージ数にして 208 個。(... といっても 1/5 ぐらい。)


    • cc1 , cc1plus

      なんとか セルフで cpp, gcc , g++ と cc1, cc1plus を作ることはできた。忘れないように書いておくが、エラーになったら prev-gcc の cc1 を クロスのものに置き換える。2 回ぐらい置き換えたら なんとか誤魔化せた。

      セルフ環境では、セルフで作成した binutils , glibc の rpm を使っている。

      binutils は、オリジナルの srpm で OK だったが、glibc は locale の作成でメモリ不足でエラー。
      まとめて変換しているところを 1 つづつ行うように修正。それでも最後はダメなので、いくつか 削除しておく。

      元のインクルードファイルは、一旦 /usr/include-x86_64 に rename して新しく作った glibc-headers と glibc の作成に使った カーネルヘッダをベースにした。

      で、基本は、cc1, cc1plus をクロスのものに置き換えて使う。

      ... これで良いかと思ったのだが、クロスは、/usr/mipsel-linux/include を要求する。これはシンボリックでごまかす。ただし、/usr/mipsel-linux/lib を作るとまずい。-ldl がないといったエラーは lib も作ったためのようで、かなりハマった。

      良く知らないのだが、cc1 は cpp の機能も兼ねるのが原因みたい。__mipsel__ などの定義も クロスでは作っていないので、有効にならない。これも要注意。

      binutils も 実をいうと良くわからない。セルフで作った ld は、/usr/lib /lib を見てくれるが、クロス用は ちょっと挙動が違うような ...

      あと /usr/bin/ldd と /sbin/ldconfig は、新しく作った glibc のものと置き換えた。

    • pkgconfig

      もともと pkgconfig は、/usr/lib64/pkgconfig に *.pc として 作られている。
      これらは、/lib64 などを参照するように書かれている。これらを全部書き換えるのではなく、
      セルフ用に 作った pkgconfig を使うようにしている。こうすると 新しく作った /usr/lib/pkgconfig/*.pc のみを参照するようになる。

      足りないものは、x86_64 の方から取ってきて書き換える。

    • linux/xx.h

      Ingenic のカーネルヘッダが元だが、足りない定義がある。問題が起きるのは、audit など

      capability.h falloc.h netfilter.h

      いまのところ上記を置き換えている。

    • libgcrypt

      -DNO_ASM を指定するとなんとか。

    • elfutils

      ビルドできていない。どうしたものか。

    • メモリ不足(空間不足)

      解決できていない。gcc のビルドや、glibc のビルドで起きている。

    • chrpath
    • いんちき spec

      rpm の依存関係がループしていたりするので、いきなり 正しい rpm は作れない場合がある。こういうのは、とりあえず作っておいて、後で作り直す。

      ... で、そういう対応をしたものが実に多かったりする。特に python とか。

      当面の目標は、python をビルドすること。これができると 大分進んだことになる。

    • PATH_MAX

      この定義がないのでエラーが起きるものがいくつかある。正しく修正したいが、どこを修正すべきか分かっていない。

    • valgrind ( arch がないというエラー )

      とりあえず、python が出来た。だが、perl も rpm もビルドできていない。あと ポイントになりそうなもので、mesa がある。

      rpm にために必要なもので作れていないのは、elfutils と nss (nspr, nss-softokn, nss-util)

    • libtiff , tcp_wrappers

      どうもおかしい。ちゃんとリンクできないみたいだ。
  • posted by すz at 00:46| Comment(0) | TrackBack(0) | 日記

    2011年08月28日

    Jz4755を使った装置




    Jz4755 でイメージ検索をしていたら、こんなのが見つかった。

    Jz4755 と SDRAM/NAND FLASH が載っているのに、デバイスは USB device と MicroSD だけ。

    使い道が ほとんどない。これは一体何だろう? と思ったのだが、P3GO GT-break という もので、PS3 の Jailbreak 用のデバイスだった。

    確かに、それなら納得できるのだが、なんでわざわざ Jz4755 のようなオーバースペックのチップを使うのだろう? 意外と開発環境が整備されていて、安いという条件を満たすものは少ないのかも知れない。

      taobao で検索すると、チップを1個単位で買っても 20元〜40元ぐらい。(1元 12.5円換算だと 250円〜500円 ) -- 中華オリジナルチップは、機能のわりに安いのだ。

      それでも Jz4725B はそれより安いし、Jz4725B でいいじゃないかとも思う。NAND FLASH をつけずに MicroSD から ブートするようにすれば コストはさらに下げられるのに。

    どうせなら、LCD や audio 関係のピンをサイドに出して、いかにも開発用ボード風にしてくれたら、大歓迎だったのに ....

    まぁ値段は、4000円弱と それなりにするみたいだから興味を持つだけで終わったかも知れないが。

      ところで、これを他の目的に使うとしたら、どういう使い方ができるのだろう? これで出来ることは jz4755 PMP や Jz4760 の Ronzi A3 でも出来るから 実際にこれでやりたいというわけではないのだが、ちょっと考えてみる。

    • 動画エンコーダー? チップ自体は、カメラ入力をリアルタイムエンコードするぐらいの能力はある。
      ファイルを置くとエンコードしておいてくれる.. といったものは実現可能。

      ただ、性能は PC より劣る。せいぜい Atom の 1/2 ぐらいか。最新の CPU を使ったり、GPU エンコードを使っていると 1/10 とかそれ以下。 どこでも出来るのと、PC が空くのがメリットか。

        Jz4755(Jz4760 も) は、Dual プロセッサで 1 つは DSP 的に使う。プログラマブルではなく、DCT や 動きベクトル探索(Motion Estimation)など動画関係の機能をいくつか持っている。また IPU というデバイスもあって、YUV RGB の相互変換ができる。汎用プロセッサのほうも MMX/SSE のような SIMD 命令をもっている。これらを全部動員すれば、それなりの性能にはなるのだ。

        消費電力は、すくない。電力あたりの性能はかなりのもののはず。あと性能を上げるのに USB に沢山挿すという手が使える。面白そうな気もするが、逆立ちしても GPU エンコード にかなわないなら魅力はあまりないかも知れない。

        ちなみに、Jz4760 の エンコード性能は、VGA (640x480) を 20 fps までだそうだ。エンコードフォーマットは MPEG-4 と書いてあり H.264 とは 別かも知れない。Jz4755 はほぼ同じ機能を持っているがクロックが 2/3 と考えると VGA を 13.3 fps まで 720p なら 6 fps ぐらい? 一方 GPU だと 1080p が実時間の 1/3 だとか。ううむ、1/10 どころではなさそうだ。

    • Linux サーバマシン

      いちおう、ストレージ もあるし、PC とは USB を介して Network で接続できる。Network があれば画面を PC で表示して 操作することも出来る。

      ただ、PC がないとなにもできない。PC を使っている間だけ使えるもの ... という制限が付く。
      Network があるといっても PC が routing して面倒見ないと 外部とはつながらない。

      まぁ VM のような位置づけ。VM が有用ならば これもなにか使い道があるかも知れない。開発など MIPS であることが重要なら有用だったりするのだが、一般の人には関係ない。

      独立したマシンだから インストール不要の VM みたいな特徴はある。ただ 外部と接続したい場合は インストール不要 というわけにはいかない。

      いろいろ制限はあるが、使い道はあるような気はする。

      たぶん この2つに集約されるのだろう。この条件で使える特殊なハードは、ビデオ系の演算しかないし、それを使わないなら MIPS が動く VM のようなものという特徴しかない。

      ちなみに Ronzi A3 になると タッチパネル液晶、AV 出力 、 USB 1.1 Host (無線LAN or 改造して外部出力)、バッテリー動作 とハードが増え、使い道も圧倒的に増える。



    こちらは、カッパドキア研究室で Dingux が動くかもと話題になった GAMEBOX (の中身)

    普通の PMP はヒートシンクなど付けていないのに、これは やたらでかいヒートシンクが付いている。オーバークロックで常用するためだろうか? それにしてもここまで大きくする必要はなさそうだし、ファンも不要 -- 単なるデザインなのか?

    これは、ちょっと興味がある ... お手軽なビデオ再生用マシンとしても使えそうだし。ただ、いまどき NTSC のみというのは どうなのだろう? ... といっても Jz47xx で HDMI 出力は Jz4770 しかないから当面期待できない。かといって 他のチップだといじる楽しみがない。

      VGA ぐらい付けてくれれば .. とも思うが LCD 出力を D-A 変換しないといけないから、コストが上がってしまうのかも。

        ちょっと、データシートを見たら、チップ自体は VGA 出力が可能だった。LUMA/CHROMA_U/CHROMA_V という 3 つのアナログ出力がある。だが、コンポジット出力では LUMA しか使わないようだ。

      USB device (左下の mini-B) が付いているのはポイントが高い。 PC につなげて microSD とか FLASH を書き換えるために付いているのだろうけど、いじるためには必須。

      USB Host が 4つもあるのも良い。キーボードやマウスが繋げられそうだ。USB メモリも付きそうだが、12Mbps までだから 遅くて使ってられないはず。

    まぁ DealExtreame だと 4100円ぐらいだから、ひとつ入手しておいてもいいかも 。

    追記: 2012/4/15

    いまさらなのだが ...

    http://club.dealextreme.com/forums/Forums.dx/threadid.1160125

    Linux が動いたらしい。こんな古いものを .. という気もするがなんか楽しそう。

    追記:

      ところで、なぜ Jz4755 を気にかけるか ...

      チップが購入可能で、BGA でないため 電子工作の範疇にかろうじて入ってくるのだ。

      Jz4760 も購入可能ではあるが、BGA だから自作はとても無理。メモリも DDR2 だから BGA が一般的。これで好きなものを作るのは、あまり考えられない。

      Ingenic のカーネルも 対応しているし、高性能でないことを許容できれば面白いチップなのだ。

      ただ、Ronzi A3 のような ものが出てくると それを流用してなにか作ったほうが良いかという気がしてくる。ただし、旬のものなので時期をすぎると入手できなくなる。せっかく苦労してソフトをいじっても対応するハードが既にないという事態になりそうだ。カーネルとかをいじる時はこれが怖い。

      一応気に入ったハードが出たら、同じものをいくつか買い込むようなことをしている。なにか作っている間に壊れたら努力が無駄になる。ものを作る努力に比べたらハードの値段など安いものなのだ。ただ、他の人に成果を分けるのは難しい。できた頃にはハードが入手できないからだ。

      そういうわけで、ハードの自作が可能なもの が気になるわけだ。

    そういえば ... Jz4755 の PMP は、今いくらぐらいなのだろう? 2010年11月に購入した際は、T552 265 元、T555 180 元 だった。

      麦迪 T552 はもう扱っているところは、ほとんどない。

      麦迪 T555 ならまだある。安いところで 145 元。ものは悪くないのだが、欠点がある。
      ケースの透明の部分が薄いガラスで、液晶との間に空間があるため割れやすいのだ。

      紫光 T816 というのが、T552 に近いかんじ。(4.3 inch 480x272) 安いところで 145 元 とだいぶ安くなっている印象。取引もぼちぼちあるようだ。

      ちなみに 紫光 T950 という Jz4725B を採用したタイプ(3inch 400x240?) もある。こちらは 結構取引があって 100元ぐらいからある。

      やはり、いまさらという気はするのだが ... USB Boot で いろいろ動かすなら、お手軽な方が良いかもしれない。T555 や T950 の液晶は コントローラ付きなので手軽に操作できる。

      Jz4725B は、扱いにくい。が、100元なら現地価格で 1200円しかしない。7割増しで入手しても 2000円ちょっと。この値段でいろいろやってみることが出来るなら、すごく有用な気がしてくる。いろいろやってみるためには、開発環境がポイントになる。

      Jz4755 で 150元ほどなら、同じ条件で 3000円ちょっと、あんまり大差ない感じがする。また、Jz4755 は、カーネルがちゃんと対応しているので、Linux だけを動かすなら 4.3inch のスキャンタイプの LCD でもなんとかなりそう。

      ただ、いずれにしても PMP ベースだと I/O が足りないので PMP で出来ること以上のことは難しい。音を出したり、画面になにか表示するみたいなことで満足せざるを得ない。

        PMP だと FM ラジオ が付いていたりする。ついてなくともパターンがある場合が多い。ここから I2C は引き出せる。あと、デバッグ用に シリアルの TX のみパターンが付いている場合がある。普通ならこれぐらいしか I/O が使えない。

        Jz4755 は、TV-Out がある。画面はここに出力することにして、LCD を外してしまえば、一気に 20本ほどの I/O ピンが得られる。ただし、LCD 用のピンは他の機能をもっておらず GPIO としてしか使えない。

        あと、Jz4755 はタッチパネルのインターフェイスを持っているが、PMP ではほぼ使われない。カメラインターフェイスも同様。-- PMP には miniOS というのが使われるが最後までサポートされなかったようだ。

        ちなみに、miniOS は、Jz4725B/Jz4755 で共通のものがあるようだ。それ以前のものは、Jz4725/Jz4740 対応で互換性がないみたい。

      やはり Jz4760/Jz4760B を使った Ronzi A3 のようなものが、良いのかも知れない。12M bps ではあるが、USB HOST を使うことで 応用が広がる。
    posted by すz at 14:10| Comment(0) | TrackBack(0) | Jz47xx