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

    2011年07月06日

    JZ4760 Android MID

    基板設計や FPGA で遊んでいたので、こちらはしばらくお休みしていたのだが... 久しぶりに JZ4760 を検索してみたら、なんと Android 2.2 の MID が出ている。

    Android の主力は ARM だから MIPS の android を出すには相当がんばらないといけない。

    どんなものか見るために買ってみたいような...

    想像では、tcc89xx と同じような感じではないかと思う。MIPS の 600 MHz は、普通の ARM11 の 800 MHz と同じような性能だろう。動画の能力は tcc89xx ほどはないが、H.264 720p ぐらいはなんとかしているはず。

    まぁいまどき買うようなマシンではないのだが ... Linux のソースが手に入ったりするし、いじるには面白そう。

    さて、見付けたのは次のもの

    aliexpress:


    E430 1 個 $66.98 (freeshipping)
    E430 2 個で $131.96 (freeshipping)

    いま Paipalのレートは、83.3 円ぐらいだから、5600円ぐらい。2 個だと 11000円で ほんの少し安くなる。

    スペックは、

    • OS Andriod 2.2
    • Memory 256MB DDR2
    • Storage 4GB NAND Flash
    • LCDSize 4.3 inch LCD (480*272)
    • Camera NO
    • WIFI IEEE 802.11b/g
    • ports Mini-USB , MicroSD, 3.5mm headphone , TV OUT
    • Battery 1400mAh
    • Weight 140g


    PMP に毛が生えたようなスペックと値段だが、WIFI があるのと RAM が多め なのが PMP とは違う点。あと、G センサは付いてない。

    taobao:


    KTMID 480元

    Yahoo!ファイナンスでは、1元 12.56 円。代行を通すことで 4割り増しになるとすれば、8440 円。

    こちらは、7 inch で (たぶん) 800x480 。WIFI は、802.11 b/g/n。DDR II 256 MB/Nand flash 4GB なのは同じ。
    あと G センサが付いているようだ。

    バッテリーは 3000 mAH で 8H 使えるらしい。

    ちなみに Jz4760 は、600 MHz 。USB OTG が付いたので 外部の装置が使える。キーボードやマウス、3G のドングルは使えるらしい。

    実はこれも aliexpress で買える。が、少々高めのようだ。

    追記: E430 というのは、『ronzi A3』というものだった。

      OSAKANA TAROのメモ帳:ronzi-a3関連』が詳しいようだ。

      taobao で『溶智』を検索すると 299元ぐらいらしい。『ronzi A5』 というのもあって 5 inch でマルチタッチになっている。

        299 元の 4割り増しだと 5260円ぐらい。taobao で買っても特に安く手に入るわけではなさそうだ。

        ronzi A5 は 399元。まだ入手できないようだ。

        去年買った T552 が 265元だったことを考えると 299元の ronzi A3 は随分お得な感じがする。CPU 周波数が 1.5 倍でメモリが 8倍。USB HOST機能付き!

        ronzi A5 は、その前に買った SmartQ5 (889元) のようなものか。半額以下でメモリも増えている。(ちなみに、解像度は 800x480 らしい)

        OS の出来の問題があって無視できない -- というより重要なのだが。それにしても 安くなったものだ。

    このマシン(ronzi A3/A5)の魅力

      OSAKANA TAROのメモ帳:ronzi A3 その4 firmwareアップデート
      に詳しいが、USB Boot が可能なので、firmware をおかしくしてしまっても 元に戻せる。tcc89xx と同じようなものだが、使うためではなく、いじるために買うので重要な要素なのだ。

      Linux カーネルも Ingenic 社が Open Source として積極的に公開している。うまくすれば、Andoroid マシンではない ものに仕立てることも可能。

      Andoroid マシンではないもの の候補のひとつは、dingux。うまく移植できれば dingux アプリを動かすことができるはず。

      あと、携帯できるサーバマシンとか。32G MicroSD とか USB メモリ とかを付けて ネットワークに WIFI を使うとか。-- 3G のドングルを付けてルータにするとか。他のものでも同じようなことはできる。だが安いというのは大きなメリットで気軽に専用機にできる。据え置きのサーバでもメリットがある。UPS 付きでかつ低消費電力だ。DISK は 外部電源付きの USB DISK が使える。

      電子工作レベルの専用機も楽しいかも知れない。OS は入れない or Free の RTOS ぐらいにしておいて、自分で MicroSD や LCD を操作する。

        これ、ライブラリを作って放置中。USB Boot でロードして、LCD に文字を表示する程度なら動いた。ただ LCD はコントローラ内蔵の いわゆる SmartLCD だから簡単だった。4.3 inch タイプは VIDEO みたいにスキャンしないといけないので、ちょっと難しい。

        USB Boot も実は具合がわるかった。原因は libusb で扱えないような仕様が一部あったため。android の ツールを利用するなら なんの問題もなさそう。

        ライブラリは、Jz4760 には対応していない。対応させるのは可能なのだが、デバイスが膨大にあるので、すごい手間。だが、この手間をかけると Jz4755 とどこがどういう風に違うのか分かってくるので、いずれはやっておきたい。

      あと、内蔵 Flash が SDカードインターフェイス(デバイスは不明)というのも良い。Nand Flash だと扱いが面倒なのだ。ちょうど SmartQ5 の MIPS 版のような感じで root イメージの解析や置き換えが楽そう。

      A3 vs A5 という観点でみると、A5 のメリットは タッチパネル と 解像度。android として 使うなら 明らかなメリットだが、改造したり開発したりする場合のメリットではない。もしメモリが 512MB あれば 開発マシンとして大きなメリットだが、そうでなければ入手しないかも。

      前にも書いたが メモリが多い 安価な MIPSマシン など他にないのだ。256 MB あって Disk がつながりネットワークにもつながれば 立派な開発マシンとして使える。MIPS マシンには思い入れがあるので、かなり嬉しい。

        Disk がなくとも 高速なネットワークがあれば良い。それは、Hi-Speed の USB device があればクリアできるので、Jz4725B/Jz4755 でも OK なのだが、メモリ 256MB というのは無理。

        玄人箱HG の経験からいうと、メモリ 256MB は開発マシンの最低ライン。128MB でも出来ないことはないが、スワップしまくりになったりして、相当に厳しい。

        追記: MIPS の Android 機として使える CPU なぞ他にないと思っていたが、riverRunner さんのコメントより、ATM7001という CPU があることが分かった。

        採用機種は、歌美(gempei) HD8800PRO(4.3インチ) とHD8900PRO(5インチ) だそうだ。

        CPUの情報や Linux のカーネルソースが手に入らないと興味がわかないのだが、一応メモ。

    追記: aliexpress のやつをポチった。

      まぁ安いし。いじるのは、気が向いたとき。(今は電子工作のほうがホットなので)
      急いてはいないので、freeshipping にした。たぶん 2-3週間かかる。

      記録: 2011/07/05 ぽちり。(2個セット)
      2011/07/10 shpping のステータス

      7月13日 15:24 引受 HONG KONG (日本郵便でトラッキング可能になった)
      7月16日 17:18 国際交換支店から発送 HONG KONG
      7月17日 14:16 国際交換支店に到着 NARITA
      7月18日 9:00 通関手続中
      7月19日 15:34 国際交換支店から発送
      7月20日 7:27 到着 (最寄りの支店)

    追記: 分解写真発見


      (tjw2700c的空間 より)

      基板の裏には、部品が一切なく LCD が載る。LCD の型番は、KD43G18-40NB-A1

        LCD のケーブルは、40極だが タッチパネルが付くので 一般的な 4.3inch LCD とは配列が違うようだ。

        aitendo で扱っている液晶モジュール [QD04300] と同じ配列ではないかと思う。

      FLASH は普通の NAND FLASH (29F32G08CBABA)。 SDカードインターフェイスというのは、間違いだった。 (さらに訂正: 後述)

      WIFI は、USB ドングル がベース(右上)。Jz4760 には Hi-Speed 対応の OTG と、12 Mbps までの USB Host が 1つづつある。USB Host を WIFI に割り当てているのだろう。

      OS から改造する前提で、WIFI を外してしまって、USB の線を引き出したいところ。HUB を付ければ いろいろなデバイスを付けられそうでもある。

      あと、円筒型の水晶がない。... これだけで なんとなく高級感がある。

        円筒型だと手はんだになる。そして、だいたいは、ひどいつけ方になっている。固定するための 処置も必要なのだが、これもひどいのが多い。それがないので基板が美しい。ちなみに、水晶のひとつは、LCD コネクタの左上でたぶん メインクロック。あと RTC 用の 32.768 kHz がどこかにあるはずだが分からない。

      インダクタ(円柱状のパーツ)が 5つも使われている。(LCD ケーブルの下に 3つ)

        普通は電源の数 -αで CORE と LCD バックライトの 2 個の場合が多い (3.3V はレギュレータで済ます)。CORE 電圧は 1.2Vだそうだ。DDR2 に 1.8V が余計に必要だとして +1 。あと 2 つは何だろう? USB に出力する 5V と 充電用?

        大きめのインダクタが付いているのは、少しばかり頼もしい。電源の安定性に貢献しそうだし。中華PMP の中をみると 欠けていたりすることも多いので、大きいやつだと安心感がある。

      LCD ケーブルの下、NAND FLASH の右の IC は何だろう? こんなにピン数が多い IC が必要になるとは思えない。

        約2GB の /mnt/sdcard の正体なら嬉しいが.. 違うのだろうなぁ。
        ライセンス IC ? これも、まさかという気がする。ライセンス ICは、普通ファームウェアメーカの利益保護のためにあるようなのだ。これは、Ingenic 社が直接提供しているように思うし、ライセンス 料を払っていたらこんなに安く作れないような気もする。
        少なくともセンサの類ではない。-- センサにこんなにピンは付いていない。

      基板は、安物とは思えない印象。

      改造とか電子工作の観点でみると結構ポイントが高い。普通は改造する必要もないが、WIFI 用 USB に コントローラを付けたりするのが容易にできる。

        Jz4725B,Jz4755 の PMP を改造したりすることを今まで検討していたのだが、I/O を付けられないのがネックだった。これだと USB OTG を使って Disk を繋げたり、WIFI 用 USB の先にいろいろ付けることができて、応用できる範囲が広がる。

        オシロとかロジアナといった専用機を作ることもできそうだし、USB カメラを付けてドライブレコーダを作ることもできそうだ。

        別のケースに入れることが出来ると、さらに楽しそうな... 。

          PSP のリプレース用ケースに入れられるかも知れない。それが出来るとボタンを入れるスペースが手に入る。USB キーボードのようなものを電子工作で作れば、結構楽しめそう。マイクロコントローラは、(例えば) AT90USB162/ATMEGA32U2 といったものを使う。

          だが、クラムシェルにしてみたい。DS の リプレース用ケースには入らないのだろうか?

      ... といっても Linux を自分でビルドして 仕込むとか が出来ないと。いままで調べてきたが、tcc89xx なんかよりは敷居は低い。最新のソースコードが入手できる。チップの扱い方のドキュメント(programming manual)は、公開されていないようだが、Linux を使う限り 必要ないかも知れない。Linux を使わない場合でも ソースコードを見ればだいぶわかる。

        jz4760_pm.pdf で検索したら落ちていた。リンクは提示しない。ググルヨロシ。

        jz4760_pm.pdf を少し見てみた。まず、これを見ても全ての機能の詳細が分かるわけではない。分からない機能は、

        • MXU 命令 の詳細

          MMX/SSE のような SIMD 命令があるが、詳細 はこれではわからない。いまのところ jpeg や mplayer に対応したコードを見る他ないようだ。

        • GPU の詳細。

          これは、分かっても使いこなせない。ライブラリなどは入手できるので良しとしよう。

        • VPU の詳細。

          Jz4755 からあった ME/MC/IDCT/DBLK の機能の他に CABAC という bitstreame を扱う機能が追加されている。ME/MC/IDCT/DBLK については、Jz4755_pm.pdf に詳しく書いてあったので 合わせて見る必要がある。

        こういう込み入った機能は、あまり分からないが、あとは大体記載されているようだ。

        気になる機能

        • MDMA , BDMA

          2 つも DMA 関係の機能が増えている。一体何だろうと思ったのだが、ディスクリプタで制御できる DMA だった。ディスクリプタというのは、メモリに置いたDMA の指示で、リンクでつなげることが出来るもの。

          普通の DMA と比べオーバヘッドを減らせるのが特徴で、少し大きなメモリブロック(数KB のオーダー) なら memcpy を使ってのメモリコピーの代わりに使え、CPU の負荷を減らせる。珍しい機能ではなく、かなりの 種類の組み込みCPU が同等の機能を持っている。Intel でも そういう機能があって IOAT という名前が付いている。

          これは、Linux だと DMA Engine として利用できる。(対応した場合)。

          2 つもあるのは、何だろうと思ったのだが、MDMA は、memory-memory を含む一般的なもので、BDMA は、NAND Flash の制御(BCH) も扱えるタイプらしい。

          BDMA は 3ch , MDMA は 2ch ある。BCH を 3多重でパラレルに使えるとは思えないので、単純に 5ch あると思っても良いのかも知れない。

            そういえば ... デバイスと CPUキャッシュとの間のコヒーレンシは、サポートしていないような ... そうなるとディスクリプタのありがたみは、ちょっと減少する。まぁキャッシュスルーのレジスタにいちいち値をセットするよりは、メモリに書いて キャッシュフラッシュ一発の方がオーべヘッドは小さいのだが...

        • PMON

          CPU の機能で、キャッシュミスヒットの回数などをカウントするレジスタ。Intel でパフォーマンスカウンタと呼ばれる機能。

          本気でチューニングするには、この手の機能が必要で、Linux だと oprofiler という機能で利用できる。(対応した場合)

        • SPI-Boot

          Jz4760 から SPI-Flash からのブートが可能になった。NAND Flash, MMC/SD , USB からのブートは従来どおり。

          ひょっとしたら、SPI-Flash に ブート ローダを置いて USB ブートをサポートしない装置が出てくるかも知れない。たぶんそんなことはしないと思うが、要注意。

        • USB コントローラ

          今まで手に入れた Programmers Manual には、USB コントローラの詳細が載っていなかった。今回拾ってきた jz4740_pm.pdf jz4725b_pm.pdf jz4760_pm.pdf には、詳細がある。以前拾った jz4755_pm.pdf には載っていないが、たぶん jz4725b と同じではないかと思う。これで不明だったことが分かる。
          (どうも jz4740 と jz4725b の USB は同じようだ -- jz4760 の USB は、ホスト機能をサポートしただけあって、全然違う。)

          使えるエンドポイントは、EP1-15 (EP0 は、control) 。DMA も 8 チャネルサポートしている。

          このチップ DMA は全部で何チャネルあるのだろう? IPU や VPU , LCDC 他のメモリ転送機能まで DMA にカウントすると 32 ぐらいじゃ済まないような ...

          それはともかく、jz4755と比べ随分進化している。使いこなすのがなかなか大変そうだ。MDMA/BDMA も使っているのかどうか? DMA Engine をサポートしていたら使っていると言えそうだが、後回しになってそうなきがする。USB の DMA もサポートしているのかどうか。


      とっつきやすいのは、Dingoo Linux と互換にするようなもの。NAND Flash は デュアルブートのためにいじるだけだし、ボタンはキーボードで代用できる。LCD は フレームバッファがあればよいはず。解像度とか色数を合わせるのはやっかいかも知れない。2D アクセラレータが使えればなんとかなりそうだが... オプションで使える IPU というものもあって 仕様を合わせるのは面倒そう。

      いじって遊ぶのは楽しいのだが、今は時間が取れない。だが、いずれはやってみたい。

      あと、ビューワー系のソフト。オリジナルのサイズで展開して 2D アクセラレータ (or IPU ?) で転送を指示するだけ。jpg の展開も SIMD を使うことができる(改造した jpeg6b のソースコードが入手できる)。
      ファイルのロードが遅いかも知れないが 次のページを先読みすれば事足りる。

      普通に作ればもっさりなんかにはならないと思うのだが... android では難しいのかも知れない。

    追記: Jz4770 も発表されていた。

      Ingenic のホームページを見ていたら Jz4770 が載っていた。180nm プロセスの Jz4740 -- 160nm プロセスの Jz4725B -- 130nm プロセスの Jz4760 と来ていたが いきなり 65nm プロセス。Ingenic はついに手に入れたようだ。CPUは 1GHz で 256KB の L2 付き。

      Jz4770 の機能自体は、Jz4760 を拡張したもののようだ。-- 気がついた拡張は、3Dグラフィックスと 100M Ether MAC 。あとクロックが上がったおかげで 1080p に対応できるようになった。USB は変わっていない。

      これが出れば だいぶ、ARM と張り合えるかも知れない。... といっても Cortex-A8 クラスとなんとか という感じ。

    作ってみたいもの

    • NAS (のようなサーバ)

      必要な装置 : USB HUB , USB Disk , USB Network (WIFI or 100M Ether)

      基本普通に Linux でサーバを作るだけだが、UPS 機能を活かすにはだいぶ改造がいる。
      停電になったりすると USB Disk の方は電源が落ちる。で、ライトバックキャッシュを NAND Flash などにセーブしてからシャットダウン。再起動したときに USB Disk に書き戻す。

      ちなみに本体の WIFI は 12Mbps の USB に接続されているからサーバ向けには遅すぎる。WIFI にしたいとしても Hi-Speed の方にするべきだろう。

      Linux でサーバを作るというのも簡単ではないかも知れない。MIPS のディストリなどあっただろうか?
      まぁ ディストリがあろうがなかろうが、気にいったものに仕立てるのはおお仕事。玄人箱HG 向けに 自分 ディストリを作ったことはあるのだが、結構骨がおれた。

        Fedora も MIPS に対応してたのか。できたら、これをベースにしたい。... と思ったがすべて mips64el だった。

        rpm にしたいのだが、今なにがあるのだろう?

        ftp://ftp.linux-mips.org/pub/linux/mips/mipsel-linux/

        ここに RedHat-7.0 の mipsel.rpm があることは分かった。しかし .. 2001 年だ 古い!

        一応 rootfs の tarball はあるから chroot で動くかどうか試してみることは出来そう。

      LCD タッチパネルは、必須ではないのだが、せっかく付いているのだから 有効には使いたい。

    • PCにUSB接続して使うサブマシン

      必要な装置 : なし

      Linux の設定で、PCに USB 接続すると (USB ストレージではなく) Network でつながるようには出来る。これは、SmartQ5 で実験した。

      Network といっても PC とつながるだけ。PC 側でルータを動かさないと PC を経由して外部とはつながらない。これは、そういう使い方は想定しない。PC との接続のためだけに Network の仕組みを利用する。

      で、なにをするかというと なにはともあれ ファイルサーバ。そうしておいて PC からプログラムや 手順を書いたメモなどを読み込めるようにする。

      次の段階として、PC でアプリを動かして なにかの目的に使う。簡単なものだと フォトフレームとか、サブコンソールとか。あと、HTTP 経由でのメモ帳とか。

      わりとなんでも出来そうだが、PC 単体でできることなら意味が無い。USB メモリで事足りるものも意味はない。

    • dingux アプリを動かせるもの

      必要な装置 : キーボード

      dingux そのものといっても良いかもしれない。違うのはカーネル。(とブートローダ)

      ディストリは用意する必要はない。dingux 自体がディストリ。

      最初の 2 つは、別に これでなくても出来るのだ。SmartQ5 でも良いし tcc89xx の android マシンでも良い。だが、dingux 互換にするには Jz47xx でないと無理。

      以前 Jz4725B などでやろうとしていたが、途中で放置してしまった。当時は Jz4725B/Jz4755 は、Ingenic のカーネルはサポートしていなかった。(今はどうか知らない) 。一方 Jz4760 は ものが出来る前からサポートされていた。この差は大きい。 Jz4760 なら安易に作れるかも。

    • オシロとかロジアナとか。

      必要な装置 : 計測デバイス (USB)

      USB Host or OTG の先に キャプチャするデバイスを付けて コントロールする。ー 要するに PC の代わりにする。別に オシロとかロジアナみたいな高級なものでなくとも良い。arduino でデータを取って表示してログするだけでも有用な場合がある。

      PC でできることをこれでやる意味はある。ひとつは消費電力。あとは設置の自由度。PC が専有されないというのも魅力。

      それは良いのだが、電子工作のネタにしたい。できたら、USB 装置をケーブルでつなげただけというものには、したくない。もっと一体感があって専用装置と見紛うようなもの --- なんて考え出すとなかなか 進まなくなる。

    クロックアップとスワップ

      携帯総合研究所:クロックアップとスワップでHT-03Aの動作を軽快に

      こんな記事をみつけた。スワップON/OFF するツールはあるようだ。... といっても ただのランチャーみたいなもので、動作させるスクリプトは仕込んでおかないといけない。

      クロックアップの方は使えるのだろうか? Linux でのクロック取得/変更の API はアーキテクチャ非依存で Jz47xx も対応していたような気がする。(うろ覚え)。たしか 最大周波数はブートローダから受け取った値を使っていて、それ以上に上げられないよう制限をかけていた。

      これを試してみる価値はあるかも知れない。

      ちなみに、SWAP ファイルは MicroSD に置いた方が良い。NAND Flash が壊れると いろいろ具合が悪い。 MicroSD なら壊れても交換可能だし、メーカと 全体容量にもよるが、なかなか壊れない。NAND Flash は良品が付いているとは限らない。中古品の可能性もある。壊さないよう大事に使うに越したことはないのだ。
      (ジャンクの PMP の基板を見るとたいがい NAND Flash だけがない。外して再使用されているとしか思えない。そして再使用先は、こういった安物の PMP/MID であろう。)

      注意!) これらの操作はシステムを壊す可能性があります。試してみるなら自己責任でお願いします。

    注意!

      OSAKANA TAROのメモ帳:ronzi-a3関連』より:

      Market関連:
       Android Marketがあるが、おそらく非公式対応。このため時期により使えない場合あり。
       その他にHiApk(安卓市場)もインストール済み。
       Android Marketで検索すると、いろんなアプリが出てこないが、様々な要因があるようだ。
       OpenWnnやATOK系が出てこないのは、NDKを使っているためで、回避しようがない。

      MIPS なので ARM native のアプリは動かない。そこは割り切る必要がある。

      ファームウェアの完成度が低く 不安定でもっさりという情報もある。android として使いたい人にはお薦めできない。せめて PMP としての完成度が高ければ、とりあえずの使い道もあるのだが、それに関しての情報はまだない。

      一般の人にとっては、安いだけの android マシンで いまのところ魅力は少ない。カスタムファームウェアが出回るような状況にでもなれば魅力が出てくるかも知れない。

    ファームウェアについて

      ちょっと アップデートファームウェアに含まれるファイルをチェックしてみた。

      ツールエントリ 実際のファイル名 サイズ ファイルタイプ
      mbr-xboot.bin mbr-xboot-60_rz43_1104280101.bin 862820(B) MBR
      boot.img boot_rz.img 2678(KB) ANDROID!
      recovery.img recovery.cpio.img 2984(KB) ANDROID!
      system.img system.img 219805(KB) ext4
      userdata.img userdata.img 67312(KB) ext4
      cache.bin cache.img 30724(KB) ext4
      vfat.bin vfat.img 8(KB) ZERO

      boot.img と recovery.img の先頭は、ANDROID! で始まっている。そういうファイルは、tcc89xx の Android マシンの アップデートファームウェアに含まれていた。

      tcc89xx (E7002とか)』の記事から抜粋すると

        boot.img と recovery.img は同じ形式で ANDROID! で始まる。たぶん ブートパラメータ+カーネル+initrd

          boot.img/recovery.img 詳細

          split_bootimg.pl を使うと kernel と initrd (と ブートパラメータ) を 取り出せる。
          kernel 自体は boot.img/recovery.img で同じものを使っている。
          initrd は、ASCII cpio + gzip のファイル形式。
          これを 展開すると ... init.rc やら init.tcc92xx.rc やらが出てくる。
          初期化でなにをやっているかは、これをチェックすれば良い。

          逆に 作り直すには、mkbootimg を使うらしい。これは未チェック。

      これらは、たぶん /dev/mtdblock に直接書き込まれる。それ以外は、たぶん ウェアレベリングを行う UBI が提供する ブロックデバイス 上に置かれるデータだろう。ファイルタイプ MBR としたデータは そのブロックデバイスの先頭に書かれるパーティションデータ。

      単に /dev/mtdblock に書きこむデータでも NAND FLash の OOB も合わせて更新しなければならない。そして更新するプログラムには、Linux カーネルそのものを使うのが理にかなっている。


        Linux で更新するのであれば、USB は一旦リセットされて違う ID に切り替わるのではないか? と思える。更新ツールのドライバは一体どの ID に反応するようになっているのか?

        このあたり、後で調べてみたい。

      まだ単なる推測に過ぎないが、boot.img/recovery.img のどちらかを USBBOOT で直接メモリに書きこんで Linux を起動して、ファームウェアを アップデートする仕組みなのだろう。

      (訂正) この推測は相当に間違っていた。USBbootTool.exe だし、今までにあった USBBOOT のツールの延長線上のもの。USBBOOT でしか動かないし Nand Flash などに書きこむ機能しかない。当然カーネルも送り込まない(はず)。で、書きこみ先も SDカードインターフェイスのストレージで Nand Flash ではないようだ。(後述)

      それはともかく、system.img を書き換えることで済むカスタマイズは割と容易だ。
      カーネルを置き換えたり、dual boot 化したり、ブートパラメータを変更したりするには、boot.img/recovery.img を編集する ことになりそう。


      $ perl ../split_bootimg.pl ../boot_rz.img
      Page size: 2048 (0x00000800)
      Kernel size: 2052096 (0x001f5000)
      Ramdisk size: 687722 (0x000a7e6a)
      Second size: 0 (0x00000000)
      Board name:
      Command line:
      Writing boot_rz.img-kernel ... complete.
      Writing boot_rz.img-ramdisk.gz ... complete.

      $ perl ../split_bootimg.pl ../recovery.cpio.img
      Page size: 2048 (0x00000800)
      Kernel size: 2052096 (0x001f5000)
      Ramdisk size: 1000538 (0x000f445a)
      Second size: 0 (0x00000000)
      Board name:
      Command line:
      Writing recovery.cpio.img-kernel ... complete.
      Writing recovery.cpio.img-ramdisk.gz ... complete.

      split_bootimg.pl はそのまま使えた。

      さて、initrd の方を見てみると...

      init.rc: # mount yaffs2 mtd@system /system
      init.rc: # mount yaffs2 mtd@system /system ro remount
      init.rc: mount ext4 /dev/block/mmcblk0p1 /system
      init.rc: mount ext4 /dev/block/mmcblk0p1 /system ro remount
      init.rc: mount ext4 /dev/block/mmcblk0p2 /data nosuid nodev
      init.rc: # Do this before we mount cache so eventually we can use cache for
      init.rc: #mount yaffs2 mtd@cache /cache nosuid nodev
      init.rc: mount ext4 /dev/block/mmcblk0p3 /cache nosuid nodev
      init.rc: socket vold stream 0660 root mount

      こんな風になっていた。... 変だ。予想と違う。UBI も見えない。... どうも 例の ピンの多いデバイスは、SmartQ5 で使っていた SanDisk の iNANDのような デバイスのようだ。

      4GB の Nand Flash が存在するが、たぶん使っていない。 (間違い: 後述)

      これは嬉しい誤算だ。Nand Flash の扱いは面倒で 自由に使うのは難しい。Android を捨てて別のシステムを入れるとしても、Nand Flash なら書き換え回数とか の仕様を 同じにしておかないとマズイところを 全く自由に使えるのだ。SmartQ は 1GB しかなく不足ぎみだったが、一応 2GB あるようだし、ひとつのシステムを入れるだけなら十分な容量。

      さて、UBI を使っていないなら、MBR のファイルは 物理的にパーティショニングしていることになる。どんなものなのかちょっと見てみると

      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 (/??)

      ちょっと変。cache.img が 30724KB なのから考えると Blocks は 1KB 単位。system.img も 210905 KB だからちゃんと入る。... だが、FAT が 7GB も取っている。... これはとりあえず取っておいて、後ろは使わないということ?

      あと、Start がずいぶんずれている。大きな隙間だが ここに boot_rz.img とかが入っているのだろう。

      ところで、NAND Flash と SDカードインターフェイスの Flash の両方付いているのはなにか変。いったいどういう接続になっているのだろう?

      ようやく分かった。ieronziからダウンロードした ファームウェア のアップデートツールに SK6633 , SK6811 とかのキーワードが含まれていた。SK6633 というのは、NAND FLash を MMC/SDカードインターフェイスに変換するコントローラ。SDカードの中身みたいなもので、あんまり高価なものではないのだろう。

        正確には、JEDEC eMMC4.41 対応 だそうだ。(SK6633 は eMMC4.4) バス幅は、x1,x4,x8 だが、MSC0 から ブートするためには x4 である必要がある。

      直接 NAND Flash を扱えるのに わざわざこのチップをいれているというのは、扱いやすさを狙ったものだろう。ただ、ウェアレベリングがどのレベルで実現できているかは不明で、アテにするのはマズイかも知れない。


        不明だったチップはこの写真の右。


        shindoのブログ:SDカードの内部 より引用

        SDカードの中に入っているのはこれ。--- 見たことがある チップの形だと 思ったのだが、思い出せなかった。これですっきりした。

    もうすぐ

      ぽちったのが、日本郵便のトラッキングに出るようになった。あと 1週間前後だろう。

      adb で接続すれば、root で操作できるらしい。とりあえず /proc をチェックしたり どんなドライバが使えるかチェックしたりするつもり。

      あとは、MIPS 版 RedHat 7.0 を chroot で動かしてみる。うまくいくようなら、これで自分ディストリをビルドしてみる。

        ビルドするだけなら、chroot の環境があればなんとかなる。(メモリが足りなくなるはずで、swap は必要)

        どのディストリをビルドするかについては、悩ましい。Redhat 7.0 だと古すぎるのだ。それに どのディストリも膨大だ。

        実は、玄箱 HG 向けに 自分ディストリとして、RHEL 4.0 を シュリンクしたもの(GUIなし) を作っている。 これも新しいわけではないのだが、一旦これを作ることを目標としようかと思う。

        同じものが出来たら、これを元に さらに新しいものをビルドするかも。新しくするときの やりかたは、arch にあまり関係ないので そのときは 玄箱 HG も合わせてバージョンアップするつもり。

        こういう古いものから作っていくのは、けっこう難しく面倒。挫折するかも知れない。

    追記:7/20 到着 とりあえず記録

    • MID とのみ書かれた箱が, プチプチに包まれて 外箱?(箱じゃないかも) にはいっていた。

    • 備品は、USB 型 AC アダプタ (5V , 1A) と USB ケーブルのみ。

    • 本体右下 ロゴが入るところは、MID とのみ刻印 (写真とおなじ)。

      削った痕跡もない。

    • 充電は 82% ぐらいで即電源が入った。

    • Welcome が出て android

      Ronzi A3 そのものではないということ。正規の OEM品ということだろう。

    • 言語は日本語に設定してあった。

      これは、ちょっと好印象だった。そこまでの動作確認が出来ているということで、初期不良の可能性がかなり減る。-- 海外通販で一番嫌なのは初期不良での交換だから、嬉しい対応。

    • 日付はあっていたが、タイムゾーンは GMT のまま。

    • 端末情報:

       モデル番号 RK43
       Androidバージョン 2.2.1
       カーネルバージョン 2.6.32.9
       ビルド番号 RK43_60WFRT_RZA3_20110504_1

    • いまのところ、adb に接続できていない。

      SDK が古いかもということで、ダウンロード中。

      ところで、Linux から 見える USB の情報

      T: Bus=01 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 12 Spd=480 MxCh= 0
      D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
      P: Vendor=18d1 ProdID=dddd Rev= 2.16
      S: Manufacturer=Ingenic
      S: Product=USB Mass Storage
      S: SerialNumber=INGENIC108A
      C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=500mA
      I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
      E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
      E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=125us
      I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
      E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
      E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms


      Product名が、"USB Mass Storage" になっているので勘違いしないよう注意。USB のインターフェイスは 2 つあって、#0 が USB MassStrage Class 、#1 が Android adb 用。

      adb 用といっても 専用の USB デバイスという気がしない。Linux の USB Gadget の 1 つを 使っているだけに思える。

    • adb が使えるようになった。原因は、inf の編集をする所を間違えたためだった。(amd64 の所を書き換えていた)


      # cat /proc/cpuinfo
      system type : JZ4760
      Hardware : lynx
      processor : 0
      cpu model : Ingenic Xburst V4.15 FPU V0.0
      BogoMIPS : 525.92
      wait instruction : yes
      microsecond timers : no
      tlb_entries : 32
      extra interrupt vector : yes
      hardware watchpoint : yes, count: 1, address/irw mask: [0x0fff]
      ASEs implemented : mxu
      shadow register sets : 1
      core : 0
      VCED exceptions : not available
      VCEI exceptions : not available


      そうそう、Jz4760 から FPU が付いたのだった。
      BogoMIPS 525.92 ... ってことは 526 MHz ?
      microsecond timers がないから MIPS32 互換じゃなくて準拠だとか。


      # cat /proc/meminfo
      MemTotal: 184792 kB
      MemFree: 6228 kB
      Buffers: 3116 kB
      Cached: 47776 kB
      SwapCached: 0 kB
      Active: 67200 kB
      Inactive: 76676 kB
      Active(anon): 44040 kB
      Inactive(anon): 50584 kB
      Active(file): 23160 kB
      Inactive(file): 26092 kB
      Unevictable: 1352 kB
      Mlocked: 0 kB
      HighTotal: 0 kB
      HighFree: 0 kB
      LowTotal: 184792 kB
      LowFree: 6228 kB
      SwapTotal: 0 kB
      SwapFree: 0 kB
      Dirty: 0 kB
      Writeback: 0 kB
      AnonPages: 94348 kB
      Mapped: 29360 kB
      Shmem: 288 kB
      Slab: 6896 kB
      SReclaimable: 1620 kB
      SUnreclaim: 5276 kB
      KernelStack: 1960 kB
      PageTables: 3792 kB
      NFS_Unstable: 0 kB
      Bounce: 0 kB
      WritebackTmp: 0 kB
      CommitLimit: 92396 kB
      Committed_AS: 2705840 kB
      VmallocTotal: 1015800 kB
      VmallocUsed: 76316 kB
      VmallocChunk: 934396 kB

      MemTotal 184792 kB ということは、256 MB から 77352 kB も抜かれていることになる。
      フレームバッファとか TV 出力とか 2D アクセラレータとか IPU とかで使う最大サイズを割り当てていくとこういうことになるのかも。
      184MB の内訳で注目するのは、(anon) と (file) 。
      (anon)の合計が 94624 kB 。Swap の対象はここ。
      (file)の合計が 49252 kB 。これは、ファイルのキャッシュ。

      Swap を設定していなければ、(anon) は減らない。アプリを起動していくと (file)を食いつぶしていき、それでも足りないと Linux が 適当に選んだプロセスを kill していく。ここに至れば正常動作ではなくなるが、その前に (file) が少なくなりすぎると 異常に遅くなる。

        ちなみに、プログラムのコード(text) は、(file) -- ファイルのキャッシュに 含まれる。遅くなるのは、再ロードが頻発するため。

      特にアプリを起動してないのに anon が 94MB もあるのは、相当に厳しそうな感じ。

      追記: 立ち上げ直後の Meminfo を再度チェックしたら (anon) の合計は、57 MB だった。あと、総メモリは、command line で mem=192M と指定していた。

      64MB ものメモリを何に使っているのか? 昔見たソースだと IPU 用のメモリなどは カーネル管理のメモリから割り当てていたのだが...

      ところで、dmesg をみていると SDカードを認識する前で

      JZMMC: CMD5 error report--Timeout while responsing
      mmc:jz_mmc_stop_dma
      JZMMC: CMD5 error report--Timeout while responsing
      mmc:jz_mmc_stop_dma
      JZMMC: CMD5 error report--Timeout while responsing
      mmc:jz_mmc_stop_dma
      mmc:jz_mmc_stop_dma
      JZMMC: CMD5 error report--Timeout while responsing

      というメッセージが出ている。stop_dma が 2 個連続で出ているところを見ると システム用と 挿した microSD の 両方とも 同じ現象のようだ。 JZMMC のドライバがバグっているのでは?と思えてくる。

      あと、ソースコード自体は、cpufreq をサポートしているはずだが ...

      /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

      とかは確認できなかった。

      Linux を見ると arch/mips/jz4760/cpufreq.c がソースコード。

      MAX_FREQ = __cpm_get_cclk() / 1000;
      /* in kHz. Current and max frequency is determined by u-boot */

      というコメントがあり、boot のパラメータで 最大周波数が決まることが分かる。さらに付け加えておくと、好きな周波数にできるわけでなく、 MAX_FREQ の 1/2 , 1/3 , 1/4 ,1/6 ,1/8 にできるだけのようだ。 そうなると BogoMIPS の 526 MHz が MAX_FREQ で 600MHz には決してできないように思えるのだが ...

      コードや jz4760_pm を見ると、boot 時の クロック の設定をそのまま使い、CCLK(= CPUクロック) の 最終段の分周器 を変更するということらしい。PLL は 2 つあるのだが、デバイスにも供給するので、動的に変更したり、好きな値を設定するものではないようだ。

      ちょっとオーバークロックにしてみるとかが出来なくて残念。ただ、クロックをどういう風に供給するかちゃんと設計した上で、安全な PLLの設定変更の方法が分かれば 動的に変更できるようになるかも知れない。

    電源Off で充電できるか確認

      Jz47xx の 中華PMP だと USB に電源を接続すると必ず 無意味な充電アニメーションを表示していた。
      こいつは、USB に電源を接続してもなにもおきない。充電ランプもないから充電しているかどうかはハッキリとは分からない。

      もし本体で充電制御していたら、電源Off では充電できないことになる。不安なので一度確認してみることにした。

      結果は OK 。問題なく充電できた。

      実を言うと、2台買ったうち1台液晶を割ってしまった。結局、他のものに使うしかなくなったのだが、それは望むところでもあって液晶がないことは大きな問題ではない。ただ、本体で充電制御していたら厄介なのだ。これで野良カーネルでも動かせそうで安心した。

      ちなみに、ボタンだとか、USB,MicroSD の detect,スピーカーON/OFF 等 GPIO の割り当てを発見しないといけない。-- Jz47xx はピンが多いから単純な 1:1 の割り当てだと思えるのでそれほど苦労しないと思うが面倒ではある。

      話題が飛ぶが、Jz47xx 自体は、ハイバネーションやサスペンドをサポートする機能を持っている。例えばSDRAM を セルフリフレッシュモードにして、消費電力を押さえるとか.. だが Ronzi A3 とかは サスペンドにしても消費電力が多いようだ。まぁ Note PC でもイマイチだし、他の中華 Android でも事情は同じようなもの。大メーカが作ったスマートフォンだけがまともに対応しているような気がしてくる。

      中華 Androidは、いろいろ出ているが、チューニングという点では、ほとんど期待できない。コストをかけられないのだから、そういう傾向になるのは、必然と思える。だから、CPUの開発元がカーネルソースとかドキュメントを公開しているものを選ぶべきだろう。さらにいうと、カーネルの 置き換えに失敗したりして、動かなくなっても再インストール可能なものが望ましい。そういうものでないと カーネルを改造しようとする人が現れない。

      Ingenic は、Android としては 遅いのが難点だが、メーカが頑張っているし 今後は期待できそう。Jz4770 の機種が出るころには、買いというレベルになっているかも知れない。

    追記: Jz4770

    • ftp://ftp.ingenic.cn/3sw/01linux/tmp/

      を見てみたら、

    • jz4770-20110610.rar 96465 KB 2011/06/13

      こんなものがあった。ダウンロードして覗いてみたら、vivante gpu の SDK やらそのドキュメントなどが含まれていた。カーネルや U-Boot のパッチなども含まれ、jz4770 の開発に必要な一式が入っている感じ。

      何時 Jz4770 が出荷されるのか知らないのだが、このぶんだと意外に出荷が近いのかも知れない。2次キャッシュ付きの 1GHz だが、RK2918 などの Cortex-A8 と同じようなもの。ARM でないというハンデがあるから、 RK2918 より高いということはないはず。きっと求めやすい価格帯で Android マシンが出てくるだろう。楽しみだ。

    追記

    ronzi A3 は、bigpad でも 扱っている 価格は、5300 円前後と安いが、別途送料がかかる。日本語のサイトだが 場所は中国。aliexpress のようなものみたいだが、Paypal やクレジットカード以外に、デビットカード、またはE-チェック(お客様の銀行普通口座を使用する)が使えるとのこと。

    日本語は怪しいが、怪しいサイトではないようだ。中国のbigpad.jpからタブレットPCが無事届きました。 というレポートがあった。

    追記:

    G500 が 9480円で発売された

    5 inch 800x480 で GPS 付き。マウンタがあるように、カーナビを意識したつくりで、G センサはたぶんない。

    GPS に価値を見出すなら、良さそうな感じ。ただ、感圧式タッチセンサーはイマイチらしい。

    値段的にはどうなんだろう? 450 元 なら x12.5 で 5625 円。4 割増しなら 7875円。ショップで買えるのならこんなものかな。

    MIPS Androidの簡単なまとめ によると jz4760 android が中国で続々出ている。良いことだ。

    ちょっと taobao を検索してみた。

    • IQQ M1 (溶智 A5) は、だいたい 399元。だが、最も売れている所は、369元。

      これ、カラーバリエーションがあるようだ。

    • IQQ M2 369元。M2 が既に出ている。値段も変わらない。辞書が付いたのが違い? -- 日本人にはメリットではないが ...

      消費電力が少ないことを謳っているようだ。1800 mAH で 4-5 時間使え、サスペンド(9mA 消費)で 200時間持つみたいなことが書いてある。ライバルは、RK2818 (not RK29xx) -- まぁそうだろう。

      改良したのなら、A3 のファームウェアも出して欲しい。

      追記 メーカーページ http://www.soiqq.com/

      ここを見ると M1 も 辞書がある。消費電力についての記述も同じ。(動画再生時 390mA で 4.6時間、サスペンド 9mA で 200時間保持)。また、両方とも JZ4760B で 660 MHz だそうだ。

      さらには、M? なんて機種も載っているのだが ... これまた同じ。いったいどういうことなのだろう?

      ところで、メーカーページには、ダウンロードのコーナーがある。firmware がダウンロードできるものしか選ばないつもりなので、firmware が出たら購入を検討するかも。

        firmware がないと、いじった後、元に戻せない。CFW も出る可能性がないわけで、いくら良さそうでも買うつもりはないのだ。

    • 博派 Q700 (カメラ付き / GPS なし) は、399元

    • 博派 Q720 (カメラなし / GPS 付き?)は、450元

    • 博派 Q500 (カメラなし / GPS 付き 5inch)は、450 元

    • 山水 V608 は、368元前後。-- これカラーバリエーションがある。よくみると、RK2818 なんて書いてある。

    • 山水 V616 は、結構ばらつきがある。488 元としておく。

      これ、FLASH 10.1 なんて書いてある。本当? CPU は、、ちゃんと JZ4760B と書いてあるんだが...

        ... ググると ヒットする。FLASH も MIPS 版が出ているのか。

    • 山水 V618 は、500 元。

    • KTMID 390元

      なぜか安くなっている。Q700 の値段を見れば、こんなものなのかも。

      ところで、カメラ付きのモデルの魅力に気がついた。もちろんカメラを使うのではない。-- カメラ用に出ている I/O を別の目的に使うのだ。

        ほとんどの製品は、製品に不要な I/O は線を引き出しておらず使えない。カメラインターフェイス(CIM) と共用になっている機能は結構あるので、なにか拡張するのに使えるかも知れない。

        データシートを見ると CIM と共用なのは、TSSI/SSI1/MSC2/EPD だそうだ。あと すべてのピンは GPIO にも使える。カメラ用インターフェイスはあまり知らないのだが、D0-D7 , PCLK/HSYNC/VSYNC/MCLK の信号線がある。これらを全部使うものなら、TSSI/SSI1/MSC2 といったシリアル系の機能 が使える。TSSI は、TS Slave Interface だが TS のストリームを出力する装置などないだろうから無視。EPD(Eink ディスプレイ?) は Display のインターフェイスらしいが、他のピンと合わせる必要があり使えない。SSI は、SPI を含むシリアルインターフェイスで、MSC2 は MMC/SD カードインターフェイス。

        MSC は、USB device の次に高速なインターフェイス。SDIO や SD カードに使う手もあるが、電子工作的には、FPGA をつなげたりすると面白いものが作れるかも知れない。

        ちなみに、カメラ付きは、Q700 と KTMID のようだ。

    • ronzi A3 の液晶 65元

      関係ないが、ronzi A3 の液晶だけ売っているところを見つけたのでメモ。ただ、わざわざ買いたいとは思っていない。taobao で買う機会があれば、これも買っておこうという程度。

      65 元 x 12.5 x 4割増し = 1137 円。随分安いようにも思えるが、単品で買うなら 4割増しでは済まないし、なにより面倒。

    • VX530LE/VX570/VX585HD 用液晶 46 元
    • 麦迪 T953 M17FHD M15L M16HD M16HD T955 T951用液晶 45元
      なども見つけたのだが、どれも同じに見える。ただ、タッチパネルを付ける端子はあるもののタッチパネル自体はついていない。
    • VX580R VX575 VX620 VP30 VP40 用タッチパネル 18元
    • VX530T VX530VX570T用タッチパネル 13.5元
      タッチパネルは、別売のようだ。同じに見えるのだが、この微妙な価格差はなんだろう?

      それはともかく、液晶まるごとなら、65 元の方が無難そうだ。タッチパネルのみなら、
    • Repair Parts Replacement Touch Screen/Digitizer for 4.3" GPS $4.92 (dealextreme)
      というのもある。ケーブルがすこし長いようだが、付けられないわけではなさそう。

      4.3inch の調査はこれぐらいにしておこう。

      ところで、原道N5 内屏 で検索すると、原道N5 の液晶が出てくる。よくよくみると 40 pin で 4.3inch のものとピン数が同じ。-- ひょっとすると 互換性があるかも。(注意: 800x480 なので接続できたとしても、カーネルその他の 再ビルドが必要。-- 普通手に負えない。)

      メモ: 40 pin タイプの信号線

      (参考: PSP Type)
      1 : LEDK GND
      2 : LEDA GND
      3 : GND VCC(2.5V)
      4 : VCC VCC(2.5V)
      5-12 : R0-R7 ←
      13-20 : G0-G7 ←
      21-28 : B0-B7 ←
      29 : GND ←
      30 : CLK ←
      31 : DISP (Display On/Off) ←
      32 : HSYNC ←
      33 : VSYNC ←
      34 : DEN (Data Enable) N.C.
      35 : N.C. AVCC(5V)
      36 : GND AVCC(5V)
      37 : XR (touch panel) N.C.
      38 : YD (touch panel) TEST1
      39 : XL (touch panel) TEST2
      40 : YU (touch panel) TEST3

      注意) PSP 用の液晶も 40pin だが、一部共通のところがあるものの、互換性はない。

    おまけ、本当に 4割増しで買えるのか?

      タオバオ新幹線』が、明朗そうなので、ちょっと検証。

      上記の IQQ M1 を 369元 で 買うとする。国内送料が書いてないが、12元かかると仮定しておく。日本への送料は、500g 以内なら 130 元。 半額セール中で 65元のようだ。

        商品の重さ + 500g だそうだ。IQQ M1 は 400g で、170 元。これの 50% だから 85 元が正しい。

        ちなみに、369元のところは、中国国内送料は無料。


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

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

      倍率は、1.59 倍で とても 4 割増しに収まらない。さらに Paypal だと +3.5 % で 1.65 倍まで上がる。

        4 割増し というのは、それ以下で買うのは難しいという基準のつもり。もし、国際送料を無視できるなら、Paypal 込み でも 1.42 倍に収まる。

      これぐらい余計にかかるのなら、aliexpress や dealexpress といったところで発売されるか、国内で発売されるのを待った方がよさそう。(あれこれついでに買うものがあれば別)

      例えば 450 元の G500 が 9480円なら 1.69 倍。あんまり変わらないように見えるが、初期不良の対応がまったく違う。

      追記: 結局 ここで M1 を買うことにした。

        M2 を買いたかったが、予約みたいなので諦め。ちなみに M2 はボタンが銀色。-- それ以外の違いは分からない。ちなみに、液晶とかいろいろ一緒に購入している。

          あ、ボタンの位置や数も違う。筐体の厚みも違うかも。

        中国人スタッフもいて、電子部品のような面倒そうなものも扱ってくれるようだ。

        重量を先方に聞いて国際送料を計算し、払込は 1回で済ますようだ。ただ、IC 1個 100g で 9個で 900g となってしまう例もあった。(トレイ付きとはいえそんなはずは ...)

        そうそう。振込先は、楽天銀行 or 東京三菱UFJ 。

    追記 2011/9/29 IQQ M1 入手

      これは、普通に Android として使うために購入。別記事を立てようと思うがとりあえず。

      デザインは、無骨でただの直方体のよう。ボタンも白で目立たない。

      電源ボタンは、イヤホンジャックの横。上面左側に、キャンセル、メニュー、ボリューム +/- の 4 つのボタン。

      電源 Off のまま USB で接続すると ... PMP で良く見るような充電のアニメーションが表示される。カーネルを立ち上げていないようで結構凝ったつくりになっている。(ちなみに、サスペンド状態ではなにも表示されない)

      さて、起動。起動時間は、Ronzi A3 と似たようなもの。画面上部にガチャピンのようなアイコン。-- これは、Advanced Task Killer というものだそうだ。

        こういうのを標準として入れてくる。

      ホーム画面?は、Gセンサーに追従するが、アイコンとかパーツ毎にリドローしているような...でももっさり感はあまりしない。

      もっさり感バリバリなのが、Angry Birds 。スクロールもガタガタだし、紙芝居的。背景を表示しないようにすると、まぁ遊べるようになる。ほおっておくと画面が暗くなって 最後にサスペンドするので要注意。

      それに比べて動画は問題ない。付属のものしか見ていないが、まぁ良いかんじ。ちなみに アプリは、Media Player

      サスペンドでは、サウンドの回路も Off しているようで、ポップノイズのような音が聞こえる。問題は、サスペンドでどれぐらい持つかだが、200 時間は無理でも結構持つヨカン。
      Wifi を 自動 Off してくれるかどうかは、ちょっと疑問。M1/M2 のファームを比較してみたのだが、M2 で入っていた off するプログラムが M1 では入っていない。

        サスペンドは、問題ないようだ。全然バッテリーが減らない。

        時計のアラームをサスペンド中に設定しても、ちゃんと鳴る。ただ、スピーカーの音が小さすぎて目覚ましにするのは厳しいようだ。


      たぶん、もっさりと評される部類だが、私はサスペンドの方を評価する。もっさりは、Dalvik turbo で多少改善するかも知れないし。あとは、安定していたら、とりあえず合格。

      ところで、持ち運ぶためのケース

      Stylish 4.3inch Protective Leather Case for SmartQ V5 - White $3.54

      というのがぴったり。Smart Q5 とほぼ同じ外見だから当然だが、4.3 inch の Ronzi A3 でもフィットする。

    追記 液晶交換

      液晶を割ってしまった 1号機 の液晶を交換した。

      交換に使ったのは、これ -- VX570R用(58元)。Ronzi A3 用のものが 65 元であるのだが、つい安いのを選んだ。

      結果は OK 。タッチパネル のキャリブレーションに不安があったが 問題なし。

      これで復活はしたのだが、いじっている間に バッテリーのケーブルが外れてしまった。

      もともと開発用だし、バッテリーは交換用として 保存しておき、常に USB ケーブルから電源元を取って動かすことにしよう。常時電源をつないでおいてもバッテリーのことを心配する必要がない -- まぁ、これはこれで メリットがないわけではない。

      ケースに収めるかどうかも未定。ネジが 5 つあってケースに基板を固定している。ネジをつけなくとも ケースがしっかりホールドしてくれそうなのだが ... ついでに無線LAN を外して USB HOST を引き出したいし。しばらくは裸のままにしよう。

      ついでにメモ バッテリーのプリントは、

      P325080
      KY 20110426

      50 mm x 80mm x 3.2mm 厚 -- 1400mAH とのことだったが、容量は書いてない。  

      オリジナル液晶

      KD430G18-40NB-A1
      20110331=1

      タッチパネル BB253C<U>

      バッテリーがない場合の不具合

    • 日付が元に戻る -- これはしょうがない
    • サスペンド状態になると 終わる。REBOOT するしかない。

      充電中はスリープモードにしない -- というのは効いているかも。

    追記: Ramos V65pro

      Ramos の V65Pro というのも Jz4760/B らしい。taobaoで検索してみたところ、Ronzi A3 とほぼ同じスペックだが、数が出ているように思える。価格も 299元とか。あと、Gセンサがあるようだ。

       参考記事: http://pad.zol.com.cn/248/2489410.html
       メーカーページ: http://en.mumumusic.com/v65pro/spec.html -- Jz4760B だった。
       ファームウェア: http://www.ramos.com.cn/support.php?product_id=58
           RK43A_60BWFRT_RAMOSV65_20110817_1 (2011-09-13 , 244MB)

      Onda VX570R も似たスペックで 250元とか少し安い。だが、肝心の CPU は 何か分からない。RK28xx ?
      まぁ関係ないのだが、液晶を流用したので、どんなものか知りたかったのだ。

      ところで、ファームウェアを書き込むツールは、Ingenic が公開している。

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

      バイナリだけでなく、ソースも公開されている。ソースコードを見てみたのだが、すなおにファイルのデータを書いているような...

      bin ファイルは 1 つで 400 MB ぐらいある。このファイルに含まれるのが、system までならこれぐらいのはず。もし、system に 他のパーティションの tar ファイルが含まれているのなら、system までがあれば良いようにも思える。ちょっと解析してみたい。

        だいぶ分かった。

        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 ファイルと呼ぶことにすr.
        NIB 以降は、little-endian で 4 バイトづつの 値が入っている。

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

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

        これだけ分かれば、取り出すことができる。だが、その次のデータは何なのか?
        たぶん書き込み位置を示す情報だと思うのだが、0 が多い。また、先頭が 0x788 で、ファイル上のオフセットと一致する。いまのところ、これだけしか分からない。

        個々のファイルを取り出す コード をとりあえず作った。

      • split_nib.c



    posted by すz at 01:11| Comment(19) | TrackBack(0) | Jz47xx

    2010年11月29日

    T555を分解した

    T552 は分解写真が既にあるので、T555 だけ分解してみることにした。

    気になるのは、まず メモリの容量と bit幅。サイズから見て 16bit x 2 は載せていないと思える。Jz4755 であることは既に確信しているので 気になる点ではない。


    裏蓋 :

    ツメの位置が 重要なので記録

    下側中央から 裏蓋を 押し込んで はずしていく。電源スイッチ側に向けて はずしていって、次は 上側(ボタンがあるほう) 。ある程度浮いたら ボタンを取ってしまう。(壊れやすそうなので)。
    コネクタ側 は最後にして ひっぱって裏蓋を取る。

    バッテリー:

    バッテリーは薄型 幅 42mm 長さ 60mm 厚さ 2mm + ぐらい。
    P304259 KYJA11/3.7V と読めるが容量はわからない。

    (写真は、基板に貼っていたバッテリーを剥がして、裏蓋側につけなおしたもの。)

    バッテリーをはがすと 基板が見えるのだが ... 両面テープを慎重にはがさないと
    いけない。水晶に気をつける。

    (メモ) 裏蓋側につけなおす場合は、位置を間違えないことが重要だが、バッテリーに ツメの後が少し残っているので 注意すれば問題ない。

    あと、組み上げる場合、電源スイッチ と スライダー(?) の 位置を合わせておく必要があるので注意。



    (写真撮っていたら、バッテリーの接続部が断線した。写真は切れる前だが、だいぶ傷んでいるのは見てとれる。)

    基板には、

      ProjectXA-S3040
      Date: 10/01/09
      Ver.AD-

    の印刷。例によって ChipRise 製だ。

    基板は 4 ヶ所ネジ留めされている。表面には 液晶があるだけだろうから 今回は取り出さない。

    ざっと主要パーツの刻印を読み取ってみる。

    • CPU : JZ4755
    • メモリ: 16bit W9825G6EH-75 x1 (32MB)
    • NAND FLASH : 29F32G08CBAAA
    • FM モジュール: RDA 5807P


    つぎは、いつもチェックしているパーツ

    • カップリングコンデンサ: 100 6M -- 100uF ?
    • SOT23-5/6 の IC

      5pin A2IK x 3
      5pin LT45-A (or LTA5-A ?) + コイル

    • コイル付きは、たぶん 1.8V core 電圧用 。
    • A2IK は、XC6219 互換の G9091 ? -- LOD で 最大 300mA もれ電流 65uA 。なぜこんなに沢山使っているのだろうか?

    メモリは 32bit ではなく 16bit のようだ(一応裏面にもう1つがある可能性はある)。 想定内ではある。32MB なのは 嬉しい点で メモリを付け替えなくとも あるレベルまでは使える。

    回路的にどうなのかは、調べていかないといけないが、Jz4725B と違って ピンがあまるはずだから すなおな設計になっている と 期待したい。

    電子工作への応用 .. という点では ボタンが横ならびで 変なところに付いていないし、LCD が飛び出さないし、良さそうな感じではある。

    全体的に、A-33 よりはるかに良い感じで気に入った。が、もう作っていないらしいのが残念。

    あといくつか写真を載せておく。-- ぜんぶイマイチ。パーツを調べる段階になったらもう一度撮りなおさないと。



    USBBOOT してみる



    例によって M(Menu) ボタンが USBBOOT 。電源スイッチを OFF にした状態で これを押しながら USB に接続すると JZ4750 と認識される。

    まず、USBBOOT の cfg ファイル。... とりあえず a41 の 32M 版と同じでよいような気がする。

    で、boot コマンドを入力すると ... stage1 すら全然動かない。

    stage1 の ソースを見ると Jz4725B なら 16bit RAM そうでないなら 32bit RAM というコードになっていた。RAM の設定が違えば動かないのは当然ではある。

    で、よくわからないので 無理やり Jz4725B と同じにしたら ... やっぱり動かない。

      オリジナルの board_4750.cを見ると、Jz4725B , Jz4750 以外に Jz4755 のコードも入っている。そういえば Jz4725B のコードだけ 取り込んだのだった。

      で Jz4755 のコードは SDRAM 32bit 前提になっている。だから取り込んでも T555 では動かない。どうしたらよいか 検討しなくては。

      -- Jz4755 では 水晶が 24 MHz だったのが原因 だった。config を書き換えたら OK 。 これが違えば USB で通信できない。

      -- 次に NAND FLASH が見えないとかの問題が起きた。

      なんとか動くようにした。

    • usbboot-wk19.tar.gz

      FLASH は、A-33 と同じ。

      usbboot :> nquery 0 0
      CPU data: Boot4750
      ID of No.0 device No.0 flash:
      Vendor ID :0x2c
      Product ID :0xd7
      Chip ID :0x94
      Page ID :0x3e
      Plane ID :0x84
      Operation status: Success!

      GPIO はさっぱり。

      BOOT_SEL は、BOOT_SEL1 (PC31) と PE25 / ADIN1 の組み合わせ。PC30 / PE25 は M(MENU) ボタンを押しても変化せず 共に H 。それで切り分けられる条件は、ADIN1 > 381 で NAND FLASH そうでなければ USBBOOT@24MHz 。 -- ADC が読めないと ボタンの状態が分からないらしい。

    posted by すz at 20:37| Comment(0) | TrackBack(0) | Jz47xx(機種解析)

    2010年11月27日

    taobaoでT552/T555購入

    Jz4755を採用した中華PMPを ついに入手できた。


    (T555)

    (T552)

    買った T552/T555 自体については、『Jz4755(T552とか)』の記事を参照してもらうことにして、まずはコストとか入手に関することをメモ。

    まえに SmartQ5 を購入したとき利用した 代行業者 ジャスティンに今回も頼むことにした。前回は、よくわからない状態で適当に選んだ。レートとかも実はわかってなかった。今回は他の業者も試してみようとちょっと調べてみたのだが、結局今回も頼むことになった。

    • 元→円のレートは、いまだと 12.5 円ぐらい。にも関わらず 16円とかの固定レートを採用している業者がある。手数料 5% とか言ったところで レートの差分が 28% もある。トータルの支払い金額が重要で要素のひとつにすぎないのだが、この不透明な感じが嫌で、そういう業者は避けることにした。
    • 手数料 10% で YAHOOファイナンスの 1.5 円増しといった業者もあった。これだと +12% 。上記より不透明さがなくここにしたいと思ったのだが、最近の取引がキャパシティを超えていて『ご新規さんお断り』状態だったので無理だった。
    • ジャスティンの場合は、YAHOOファイナンスのレートより僅かに高いだけなのだが、手数料がなんだかんだで細かく付く。単価の安いものを沢山買ったり、複数のショップで買う場合はかえって高く付く傾向。今回は1つのショップから あまり安くないものを買うので レートに上乗せしないここで買うことにした。

    買ったものは、T552 と T555 x3 。T555を沢山買い込んだのは、開発用にしようと思ったため。いくつか壊すことになりそうなので 数がいる。T552 は まずは実用として使ってみるつもり。

    購入記録

    • 2010/11/01 見積もり依頼。同日見積もり結果

      T552 265 元
      T555 180 元 x 3

      中国国内基本送料:30元(超過の場合は国際送料で精算)
      手数料:130元+追加3品目×20元=190元
      合計:1025元=12,610円(レート12.3)

      説明にある通りの請求額。

    • 2010/11/13 - 2010/11/15

      T555 について希望した色がなく、しかも生産終了で入荷の見込みがないとの連絡があり、色変更。あと、T555の後継は T556/T557 だそうだ。

        色は、粉色 / 酒色 / 白 の各色 1 つづつにしたのだが、白がなく 酒色 x 2 になった。ちなみに 粉色は 白っぽい桃色で、酒色は ぶどう色。

        T555の後継は T556/T557 というのは、たぶん違う。T556/T557 の方が古いはず。-- たとえば ここに Mahdi のファームウェアがあるのだが、T555 がない。... その後作ったのでは? と思えるが 、入荷の見込みがないのも事実だろう。


        (T556)

        (T557)

        T556 は、液晶面に ボタンが 3 つある。-- 他の目的に使ったりするには、あまり嬉しくない特徴。T557 は、全部 上にあるが、数が減っていて 5 個。


    • 2010/11/24

      発送の連絡と 2 回目の支払い

      国内送料超過分:10元=120円(レート12.3)
      航空書留:153.8元(重量:1900g)
      検品手数料:25元 (これは自分でオプションを付けた)
      合計:178.8元=2,270円(レート12.7)

      請求額:2,390円 (トータル 15000円 + 振込み手数料 x2)

      日本郵便の トラッキング:
       11月19日 引受
       11月25日 到着
       11月26日 受け取り

      期間は随分かかってしまった。欠品になってやりとりがあったから止むを得ない所がある。
      価格は? 最初のところより安いとは思うのだが、1000円-2000円も違わないはず。
      国際送料が思ったより高かったが、箱が無駄にでかかった。

        で安いのか?.. というと 180元の T555 が 3500円。265元の T552 が 5000円といったところ。
        まとめ書いしたからこの値段だが、1 個単位なら +1000円 ぐらいの上乗せ?

        中国国内なら 805元 +送料 40元で買えたわけだ。レートが 12.5 円なら 総額 10500 円。4500 円分が 手数料と国際送料。ものにもよるが、taobao で買うなら これぐらい割増になると覚悟しなければならないようだ。

        あと taobao で、20元とかの電子部品を多数買いたいのだが、ジャスティンでは難しい。頃合いをみて別のところで頼んでみようかと思っている。

      Jz4755 のマシン自体 ほかのところで見つけられなかったのだから、これぐらいで買えて満足ではある。

    T555について


    さて、J4755 の実力はどんなものなのだろう? そして、T555 は本当に Jz4755 なのだろうか?

    まず T555 。イヤホンには TV-OUT とちゃんと書いてある。ボタンの数は、6 つで 数は A-33 と同じ。電源スイッチはスライドスイッチで、いままで見てきた Jz4725B の PMP と同じ。

    サイズは、A-33 より 2-3mm 厚く、ボタンがない分、縦がコンパクト。デザインは悪くない。A-33 のような 安っぽい感じはあまりない。

    電源を入れてみても、一見しただけでは A-33 と 区別がつかない。使うつもりがない 英語ー中国語辞書がついていて、A-33 にはない FM ラジオが付いているのはすぐわかるが 意味もあまりない。

    さて、Jz4755 を実感するために ビデオを見てみる。一応 1080p / 720p / 360p の mp4 (H.264) と 240p の flv (H.264) が用意できたので見てみると..

    1080p / 720p は、対応していないフォーマットだと言われて見られなかった。H.264 の 360p や 240p の flv はまったく問題ない。Jz4725B では、低解像度 Xvid でも引っかかりのような挙動があったのだが、それもほとんど感じられない。あと 動画を再生するまで待たせられる時間が短いかんじ。

    まちがいなく Jz4755 だ。それは良いが、720p の H.264 は無理なのが残念。480p ならあるいは見られるのかも知れないが持ってない。

    バッテリーは、3 時間で 目盛り 1/2 ぐらい。Jz4725B と比べれば Jz4755 は dual core で最大消費電力が大きい ので心配していたが、処理あたりの 消費電力はさほど違わないのかも知れない。

      Jz4725B だと、240p の flv で音ズレが起きていた。ソフトの出来が悪いせいかも知れないと思っていたのだが、動画なら 2 倍速いはずの Jz4755 でこれなら チップの実力なのだろう。

      沢山買った T555 だが、本格的にソフトを作るつもりはまだない。jz4725B のカタが付いてからにしようと思う。それまでは、USBBOOT を動かしてみるとか、Jz4725B との (レジスタの)違いを見てみるとか その程度。

    T552 について


    つぎに、T552 。

    これは、事前にだいぶチェックしているので デザインに関して意外なところはあまりないのだが、前面が湾曲している。あと思ったより縁が広くその分筐体が大きい。

    ボタンはやはり 6 つ。電源スイッチもスライド式。

    電源を入れてみる。T555 と基本同じ機能(FM ラジオは付いていない)。

    問題は動画の機能だが、見れる 動画は T555 と同じだった。見れるものは、T555 と同じく問題ない。
    あと、フィルタ機能はないはずで、低解像度の動画でアラが目立つ心配があったが、480x272 程度では 関係ないようで、思ったより良いかんじ。

    画面は 3.0 inch の T555 と比べると随分大きく感じる。これ以上大きいと携帯性に難がでるし、4.3 inch (か 縁が狭い 5 inch )が丁度良いのかも知れない。
    液晶は横液晶。上下の視野角は狭いが 左右は(多少)広く 縦液晶の T555 より見やすい。

      縁が広い 4.3 inch だが、デメリットとは思っていない。なぜなら最後には改造するつもりだから。余裕があるほうが嬉しい。大き過ぎるのは困るが許容範囲内だと思う。

    液晶の画質については、好みがあるのであまりコメントしない。400x240 になれているせいか、480x272 でも 十分な感じがする。左右の視野角も十分とはいえないが別に困るほどではなさそう。

    実用として使うなら バッテリーの持ちは重要だが、まだよくわからない。

      一時間で目盛り 1/2 になってしまった。液晶の消費電力が大きいのか、あるいは .. バッテリーが弱ってたりするのかも。

    ところで、ボタンの配置は 横一列で T555 と同じなのだが、機能の割り当てが逆。混同してしまってとても困る。MENU ボタンと PAUSE ボタンは チップの機能に結びついている (MENU: USBBOOT / PAUSE: ソフト電源) ソフトで変更できる種類のものではない。こういうのにポリシーがないのはどうかと思う。
    posted by すz at 00:42| Comment(1) | TrackBack(0) | 日記

    2010年10月31日

    USBBOOTプログラム用ライブラリ

    Linux は Linux でやるとして、USBBOOT で動かすプログラム用の開発環境が欲しくなってきた。

    いままで LCD 自体を動かすとか、そういう目的に使ってきたが、テスト目的でも割り込みを使ったり段々高度な使い方になって行きそうだ。デバッグにしてもメッセージを画面に残したいし。ライブラリ化していかないと、収集が付かなくなりそう。

    • 理想は、avr-libc のようなもの。デバイスを生で扱えるレイヤー と 少し使い易くして デバイスの違いを吸収してくれるレイヤー。それと printf みたいな共通ルーチン。

    • ある程度の規模の組み込みシステムだと newlib が良く使われているのだが、ソースだけで 16MB とか規模がすごく大きくなっている。テストやちょっとしたものを作りたいだけなので、規模が大きいのはどうかという気がする。それにデバイスを制御する部分はないので、そこは自分でつくらないといけない。

    • PIC24F や PIC32 だと MPLAB という開発環境がある。豊富な周辺装置を扱っているのでこういうのも参考にできたらと思うのだが、残念ながら PIC は良く知らないのだ。かといってこれから調べるのも大変そうだし ... ライセンス的な不安もある。

    とりあえず。次の方針でライブラリーを整備していこうかと思う。

    • avr-libc を参考にして、avr-libc 風味で作る。

    • とは言え、Ingenic が用意した define や マクロがあり、これらは linux や USBBOOT でも使われている。この定義は、整理して使う。

    • 共通関数は、avr-libc でサポートしているものを avr-libc 自体や 他のライブラリから取ってくる。

    さて、avr-libc 風味とはなにか?


    • どの CPU かが分かる define 。

      avr-gcc だと -mmcu=atmega88 とか CPU を指定すると __AVR_ATmega88__ が define されるようになっている。汎用の mipsel を使うのでそこまでは出来ないが、CPU の定義で 内部で使うヘッダーを切り替えるようなことはしたい。

      とりあえず __JZ4725B__ とかにしておこうと思う。メーカ名までいれると長くなりすぎ。

    • SIGNAL で定義する割り込み関数。

      avr-gcc だと SINGAL(SIG_ADC) とかで定義した関数は、レジスタをセーブリストアするプロローグ・エピローグに 変更され 割り込みベクタに直接登録される。

      mips では、割り込みベクタは共通になっているので、そういうわけにはいかないのだが、
      そこから先に 擬似ベクタテーブルを置いて、そこから割り込み要因毎に call しようかと思う。

      で、weak シンボルを使って、SIGNAL で定義した関数があれば、デフォルトと入れ替える。
      関数は、特別な関数ではなく普通の C 関数。

      実は割り込みでなにをどうセーブして... といったあたりが良く分かっていない。
      まずは、効率より動かすことが先。-- なんとかして セーブして C 関数を call するところから始めようと思う。
      で、その先で 擬似ベクタテーブルに call してもどってきたら リストアして eret 。

    • avr-libc と同じレベルの共通関数。

      なにからなにまで入れると大きくなるし作るのが面倒なので、avr-libc と同じレベルにしておく。

      いろいろ検討したのだが、newlib だと ライブラリが別のライブラリ関数を call して ... 芋づる式に 大きくなっていくようだ。どうも avr-libc の stdio を移植したほうが良さそう。

      • avr-libc では、最終的に getc/putc のレベルになるようだ。

      • 一方 string とか アセンブラになってしまっている。どうしたものかと思ったのだが、ここだけ newlib 使っても良いのかも知れない。


    こんな感じでどうだろう? それに加えて CPU やマシンで使うのに便利な関数群を加える。

    • キャッシュフラッシュ関数 や c0 レジスタのアクセスマクロ

      デバイスを扱うとき メモリに書き込むのを保証しないとダメで キャッシュフラッシュ関数 が必要になる。

      大雑把な 全キャッシュフラッシュと 範囲指定のキャッシュフラッシュぐらいは用意しないと 面倒。

      c0 レジスタのアクセスマクロ としては 割り込み禁止/許可ぐらいにしようかと思うのだが、
      内部の割り込み処理を作るのに必要なものもあるので、それらもついでに 定義しておく。

    • LCD を使う putc のような共通関数。

      Ingenic の ツールとかは、シリアルつかってメッセージを出力する共通関数がある。だが PMP を使う場合 シリアルを引き出すのが難しい。

      逆に LCD は接続されているので、機種ごとに LCD の 出力モジュールを用意したらどうかと思う。

      今、出来ているのは、ILI9325 ILI9326 だけだが、いくつか GPIO の定義が必要なものの、だいたい 共通化できそうな感じ。

      一方 Neo Slim 3000 は、HSYNC/VSYNC を使ったインターフェイスになっていて、ちゃんとフレームバッファを定義した上で、LCD モジュールを 使わないと 表示できない。さらに DMA やら 定期的に転送するための 割り込み処理も必要。

      これもなんとか作って、必要なものが揃っているか確認するとともに、有用に使えるようにしておきたい -- とは思っているのだが、なかなか厳しそう。

    • USBBOOT 対応

      USBBOOT にも対応ではなく、改造版 USBBOOT に対応。

      0x80600000 から ロードして C 関数と同じく a0,a1,a2 にパラメータをセットして call する。a0,a1 は、argc , argv 。

      実行モード は、カーネルモード (Normal)/割り込み禁止でスタート。

      NAND FLASH や microSD/SD からロードすることは別途考える。(= 当面考えない)


    作業は進んでいる。判ったことを少し。

    • avr-libc は、かなりアセンブラ化されている。string 系は使えない。printf の中核の vsprintf も だいぶカスタマイズされていて、float 関係の下位関数がアセンブラで使えない。

    • 使えないものは、newlib ではなくて NetBSD から取ってくることにした。vsprintf が似ているのが理由。下位関数を含めて入れ替えて、file 構造体のアクセスを avr-libc に合わせる。

    • ライセンス上あまりあちこちから取ってきたくないので、NetBSD に統一する。string も移植するし、libm も必要なら、NetBSD から持ってくる。

    • NetBSD のバージョンは、2.1 にした。古いほうが シンプルだろうというのが理由。.. ただアセンブラの記法が 合わない。量はすくないし、勉強がてら自力で変換するつもり。

    ここまでが MIPS32 共通部分の話。jz47xx 固有の部分や CPU の設定は、全部作る。とはいえ jz47xx のヘッダーは Ingenic が出しているものを ベースにして整理する。

    全体の規模は、共通部分 1万行 / jz のヘッダ 1 万行 ぐらい。これに 自作のコードが付くことになる。

    ... なかなか大変になってきたが、一度作っておくと後が楽になるはず。

    ここらで一旦 スナップショット。

    当面は、usbboot に同梱。ヘッダーファイルの整理中の状態も入れてあるが、入れるのはこれだけ。次は消す。

    ベースにした NetBSD の一部も 置いておく。適当に移植したので分からなくなったときの参照用。

    現状:

    • 共通部分はビルドできるようになった。(ただし未テスト) ディレクトリは、

       - include/, stdio/, stdlib/ -- avr-libc-1.7.0 ベース
      - string/, others/ -- NetBSD-2.1 ベース (setjmp.S だけ newlib)

    • jz47xx 固有 + MIPS32 (4Kc ?) は、ヘッダが大分できた。

      - include/jz/ -- jz_xx.h は Ingenic の カーネルヘッダベース (jz_core.h を除く)
         jz_core.h は、主に MIPS32 関係で自作
       - jz/ -- cache.c は、usbboot から取ってきて API を NetBSD 風にした。
         vector.S は、割り込みベクタテーブル avr-libc を参考に weak シンボル。
         delay_us.c delay_ms.c は、ビジーループでの遅延。CPU クロックは CPM の 設定から計算。
         出来ているのはここまで。割り込みを作りたいが全然。
       - drivers/ -- 作ったものを追加していく予定だが、全然。
         一応 ili9325/ili9326 の コードは置いてある。

    • おまけ。

        - done/ jz47xx のヘッダを モジュール毎に切り出したもので、作業用。後で消す。
        - notyet/ まだ反映済みでないもの。CIM と DBLK だけ残っている。

    • Todo
      やるべきことは山ほどあるが、やりたいことから手を付ける。

      (1) hello world 。

      まずは、リンクできてプログラムが動くことを確認する。

      最初に確認したいのは、getopt 。次に puts / fwrite / printf (浮動小数点なし)

      そのためには、puts をつくらないといけない。作るにあたって serial / usbboot / LCD を 選択できるようなことも 考えたい。

      (2) マシン情報の表示

      c0_prid や OTP の情報。CPU クロック と メモリ 量の表示。

      マシン非依存でないと困る。

      (3) 割り込み

      まずは、OS タイマー割り込みを カウントするものでも良いから。割り込み処理ができるようにする。

    なんだかんだ変更したので次の版。

    変更点:

    • テストプログラムをビルドできるようにした。

      tests/01_hello : ただの hello world 。

      .rel.dyn というセクションがないと怒られたので、target.ld に追加。

      あと、-msoft-float でビルドするようにした。libgcc.a をリンクすると 今度は、.eh_frame がないと怒られそれも追加。

      さらに、malloc 用の __heap_start / __heap_end も追加。一応 16MB でも動くような値にしている。
      メモリマップは、

      0x80600000 text
      data
      6MB bss
      heap
      0x80c00000 stack

      xburst_stage2 がメモリの後ろ 4MB に配置されるので、16MB のことを考えると 0x80c00000 までにしておかなければならない。
      先頭が、0x80600000 なのは、Linux の zImage と同じにしておくため。
      プログラムエリアは 6MB しかないが、前の 6MB も 基本自由に使える。

      malloc と realloc には、 __heap_end との比較のために STACK_POINTER() というマクロを使っているのだが、auto 変数 のアドレス使って適当にやっている。

    • printf を使えるように した。

      FILE *fdopen_serial(FILE *fp);
      FILE *fdopen_ubcomm(FILE *fp, void *p);
      FILE *fdopen_ili9325(FILE *fp, int reset, int cs, int backlight);
      FILE *fdopen_ili9326(FILE *fp, int reset, int cs, int backlight);

      こんな関数群を作った。fp に stdout を指定することで、printf が使えるようになるはず。
      ... だが、これだけでは stderr が出力されないし、複数のデバイスに出力することも出来ない。

      void jzcon_append(FILE *fp);
      void jzcon_setup();

      だいぶいんちきなんだが、一回 fdopen した状態で jzcon_append() するというのを 出力したいデバイス分やって jzcon_append() することで、stdout , stderr に表示できるようにした。

      この関数群を drivers に入れて jz/console.h に定義をまとめた。

      ちなみに、argc/argv は USBBOOT経由で 渡ってくるのだが、コマンドラインが そのまま argv[1] に入っている。普通に使うには、parse_args でバラさないといけない。

      いろいろ初期化が面倒だが、そうしておかないと 低レベル処理のテストがかえって面倒になるので、やむを得ないところ。

    これで ようやく Todo(1) hello world の準備ができた。あとはデバッグあるのみ。

    とか書きながら、テスト前にさらに変更。

    変更点:

    • Todo(2) マシン情報の表示 。

      一応、マシン情報の表示と CPU クロック, メモリ量の表示を作った。

    • Todo(3)に着手。-- OS タイマー周りを Linux のコード見ながらいれてみた。

      OS タイマーは、32bit カウンタで、クロックソースを 外部クロック(12MHz), RTCクロック(32.768 kHz), ペリフェラルクロック PCLK (CPU クロックの 数分の1 (設定による)) から選べて、それを 1/N にするプリスケーラ もある。(N = 1,4,16,64,256,1024)

      自由度が高いのだが、高解像度(PCLK = 100MHz オーダー) と 低解像度 (外部クロック/4 = 3MHz) の 2 つの使い方を 標準ということにした。

      32bit しかないのでいずれオーバーフローするわけだが、100MHz で 43 秒持つ。3Mhz なら 23.8 分も持つ。

      これだけ持てば 割り込み処理がうごかなくとも ちょっとしたベンチマークをするのに使える。それは有用だが、割り込み自体のテストするのにはちょっと具合が悪い。

      割り込み自体のテスト用に 他のタイマーも調べてみたのだが、クロックソース と プリスケーラの機能はみな同じだった。WDT(ウオッチドックタイマー)も同じで 使い方が判ったので jz/wdt.h を作って avr-libc 流に使えるようにしておいた。

      さて、割り込み周り。とりあえず jz/interrupt.h を作って SIGNAL(IRQ_TCU0) とかで割り込み関数を定義するところは作った。

      あと、OS タイマーの割り込み処理も作った。実をいうと細いところはまだ理解していない。... のだが、作った割り込み処理が動くような仕様にしたいと思っている。

      ちょっと細かくなるのだが、

      SIGNAL(IRQ_TCU0)
      {
      REG_TCU_TFCR = TCU_TFCR_OSTFCL; /* ACK timer */
      current_cycle_high++;
      __intc_ack_irq(IRQ_TCU0);
      }

      これが動く仕様にする。
      __intc_mask_irq(), __intc_unmask_irq() は、関数を呼ぶ側で面倒を見るが、__intc_ack_irq() は自分でやる。

      追記: デバイス側の 割り込み要因をクリアしないと INTC の割り込み要因はクリアされないようだ。
      __intc_ack_irq() はダミーで意味をなさない。

    • Todo(3)-- タイマー周りを いれてみた。

      沢山ある 16bit タイマーのうち 1 つを (秒間 100回とか)定期的に割り込みを起こすようにする。基本は OS タイマーと同じだが、違う所もありまだ仕掛り中。

      ちょっとタイマーの機能についてメモ。

      各タイマーは、16bit で 2つの比較レジスタを持つ。ひとつは HALF MATCH。タイマーがこれ以上になると HALF MATCH 割り込みを起こす(もちろんマスクできる) 。もうひとつは FULL MATCH 。こちらは、FULL MACH 割り込みを起こすと共にタイマーを 0 にリセットする。

      で、PWM は、HALF MATCH と FULL MATCH を使って実装するわけだ。定期的に 割り込みを起こすだけなら、HALF MATCH は使わない。

      よく見たら OS Timer も 比較レジスタがあって 0xffffffff に設定されていた。こちらは時刻用だから、フリーランニングにするのが普通。

      WDT も同じく 比較レジスタは 1つ。

      ちなみに、WDT は 16bit もあるし クロックソースやプリスケーラがあって自由度が高いのだが、avr-libc スタイルの wdt.h では、RTC をソースにして、15ms 〜 128 秒の間で 使えるようにしている。

      最大128 秒と大きくしたのは、立ち上げ時とかシャットダウンのときに使えるかなと思ったため。


    割り込みの勉強

    まず MIPS のレジスタについて。

    汎用レジスタは 32 あるが、それぞれ次のように別名が付いていて、特定の役割を持っている。

    • r0 (zero) -- 常に 0
    • r1 (at) -- アセンブラ用 (32bit値 や アドレスのロードなど)
    • r2-r3 (v0-v1) 戻り値 32bitまで : v0
    • r4-r7 (a0-a3) 関数の引数
    • r8-r15 (t0-t7) 関数内で自由に使える 
    • r15-r23 (s0-s7) 関数内で使う場合セーブしてから使う
    • r24 (t8)
    • r25 (t9) 関数の call 先 アドレスにも使用
    • r26-r27 (k0-k1) 割り込み処理でのみ使用するレジスタ。
    • r28 (gp) グローバルポインタ PIC で使用
    • r29 (sp) スタックポインタ
    • r30 (fp) フレームポインタ
    • r31 (ra) リターンアドレス
      ※ PIC はポジションインディペンドコードのこと
      ※ at をプログラムで使いたいときは、set .noat とする。

    さて、TX19A のマニュアルを見ると こいつはシャドウレジスタというのを持っているが、 r0/r26/r27/r28 は 対象外。r29 も バンク 1-7 で共通だそうだ。一方 M4K(PIC32MX で採用) とか M14Kc もシャドウレジスタを持っていてこちらは 32 個全部が対象。

    MIPS32 と 言っても いろいろあるようなのだが、どうも Jz47xx は、普通の MIPS32 で シャドウレジスタ は持っていないらしい。

    次にどういう風に処理するか検討

    • ユーザーモードはサポートしない。OS を作りたいわけではなく、マイクロコントローラのように使いたいだけなのだから。
    • そうすると、正常系の例外・割り込みは 装置からの割り込み (と MIPS のソフトウェア割り込み) のみ。.. ということになるはず。
    • 普通にスタックにレジスタをセーブして、割り込み処理の C 関数を call すれば良さそう。なにをセーブすべきかというと zero, s0-s7, k0-k1 以外 と c0_status , c0_epc(割り込み発生アドレス)。
    • 戻ってきたら レジスタ と c0_status (の IE)をリストアして (セーブした)c0_epc に jump 。
      あとは全部 C 関数に任せる。

      (メモ)
    • ERET は、ユーザモードに戻る命令らしく使わない。
    • セーブ・リストアの処理をするのに k0,k1 が使える。

      割り込みの許可と stack ポインタの復帰を atomic にやりたいのだが、どうするのだろう?
      割り込みを許可したら その時点で 割り込みが入る可能性がある。stack を元に戻していないと stack がどんどん大きくなる可能性がある。

      stack を開放してから k0 に入れておいた c0_status の値を mtc0 。で、k1 に入れておいた 戻りアドレスに jump ?
      -- そうなると mfc0 で割り込み可にした瞬間に 割り込みが入る可能性がある。で、k1 が壊されてしまう。k1 をセーブしても同じで最後に k1 を使わざるを得ない。困った。
      -- ひょっとして アドレスの範囲を見て return しようとしていたら、epc ではなく、k1 に jump ?

    割り込み処理の C 関数では、(とりあえず)簡単にするため 割り込み禁止のまま 実行することにする。

    とりあえずこの方針で。

    実をいうと全然動いていない。どうもコンパイル環境も関係あるようなので、自分でビルドした gcc(4.2.4) で動かす方針で、検討する。 (MinGW環境でmipsel-gccをビルド の記事参照)

      にある dingux_toolchain_20091022.tar.bz2 を linux や xburst_stage1/2 をビルドするのに使っているのだが、このライブラリは MinGW+MSYS 環境 でも使えるようにしたいと思っている。で、自分でビルドしているわけだが、gcc-4.3.4 を使いたいところ 古い MinGW の環境のため make の関係で gcc-4.2.4 までしかダメ。別に gcc が、古くても大丈夫だろうとタカを括っていたのだが、なにか変。-fno-pic を指定しても、一部 PIC 特有の gp を使ったコードになっている。
      とにかく、OpenWRT は動いているのだから そのパッチを使ったら良いだろうということで、試してみている。

    全然関係なかった。


      void msg_init(void *p)
      {
      comm_area = p;
      }

      というコードに注目しているのだが、
    • 自分でビルドした gcc の場合
      -fno-pic などを付けようがなにをしようが、

      msg_init:
      j $31
      sw $4,%gp_rel(comm_area)($28)

      というコードになってしまう。gp($28) に正しい値が設定されていないと誤動作する。

    • dingux_toolchain の動作

      -fno-pic では、
      msg_init:
      lui $28,%hi(__gnu_local_gp)
      addiu $28,$28,%lo(__gnu_local_gp)
      lw $2,%got(comm_area)($28)
      j $31
      sw $4,0($2)
      -fno-pic -mno-abicalls では、
      msg_init:
      lui $2,%hi(comm_area)
      j $31
      sw $4,%lo(comm_area)($2)
      -fpic では、
      lw $2,%got(comm_area)($28)
      j $31
      sw $4,0($2)

      という風にオプションに対してコードが変わる。-fno-pic では、gp($28) に値が設定されていることを期待していない。

    • 対策
      外部から呼び出される場合(startup を含む)、gp の設定をちゃんとする。外部を呼び出す場合 gp をセーブして call し戻ってきたら gp をリストアする。

      こんな感じか。

    やはりよく判らない。ちょっと実験。


      head.S:
      .text
      .extern c_main
      .globl _start
      .ent _start
      .type _start, @function
      .set noreorder
      _start:
      la $gp, __gnu_local_gp
      j c_main
      nop
      .set reorder
      .end _start
      main.c:

      extern void msg_init();
      extern void msg_proc();

      void c_main(int argc, char *argv[]) {
      int i;

      msg_init((void *)argv);

      for (;;) {
      msg_proc();
      }
      }

      msg.c:

      struct comm_struct {
      void (*proc)();
      };

      struct comm_struct *comm_area;

      static inline unsigned long read_gp() {
      unsigned int c = 0;
      __asm__ __volatile__(" \
      .set noreorder; \
      move %0,$gp; \
      .set reorder" : "=r" (c): );
      return c;
      }

      static inline void write_gp(unsigned long c) {
      __asm__ __volatile__("\
      .set noreorder; \
      move $gp,%0; \
      .set reorder" :: "r" (c));
      }

      void msg_init(void *p)
      {
      comm_area = p;
      }

      void msg_proc () {
      unsigned int saved_gp;
      saved_gp = read_gp();
      if (comm_area && comm_area->proc)
      (comm_area->proc)();
      write_gp(saved_gp);
      }

      上記の head.S main.c msg.c から成るプログラムを 自分ビルドの mipsel-gcc (ver 4.2.4) で作成。共通オプションは、

      -O2 -fno-zero-initialized-in-bss -mips32

      リンクは、binutils-2.19.1 で

         mipsel-ld -nostdlib -EL -T target.ld head.o main.o msg.o -o hello.elf


      で 共通オプションのみ, -fpic を追加, -fpie を追加で比べてみたが同じものが出来た。

      80600000 _start:
      80600000: 3c1c8060 lui gp,0x8060
      80600004: 279c00a0 addiu gp,gp,160
      80600008: 08180004 j 80600010 c_main
      8060000c: 00000000 nop

      80600010 c_main:
      80600010: 27bdffe8 addiu sp,sp,-24
      80600014: afbf0010 sw ra,16(sp)
      80600018: 0c18000e jal 80600038 msg_init
      8060001c: 00a02021 move a0,a1
      80600020: 0c180010 jal 80600040 msg_proc
      80600024: 00000000 nop
      80600028: 0c180010 jal 80600040 msg_proc
      8060002c: 00000000 nop
      80600030: 08180008 j 80600020 c_main+0x10
      80600034: 00000000 nop

      80600038 msg_init:
      80600038: 03e00008 jr ra
      8060003c: af84ffe4 sw a0,-28(gp)

      80600040 msg_proc:
      80600040: 27bdffe8 addiu sp,sp,-24
      80600044: afbf0014 sw ra,20(sp)
      80600048: afb00010 sw s0,16(sp)
      8060004c: 03808021 move s0,gp
      80600050: 8f82ffe4 lw v0,-28(gp)
      80600054: 10400006 beqz v0,80600070 msg_proc+0x30
      80600058: 00000000 nop
      8060005c: 8c420000 lw v0,0(v0)
      80600060: 10400003 beqz v0,80600070 msg_proc+0x30
      80600064: 00000000 nop
      80600068: 0040f809 jalr v0
      8060006c: 00000000 nop
      80600070: 0200e021 move gp,s0
      80600074: 8fbf0014 lw ra,20(sp)
      80600078: 8fb00010 lw s0,16(sp)
      8060007c: 03e00008 jr ra
      80600080: 27bd0018 addiu sp,sp,24

      どうしても いきなり gp を使うと説明したものの具体例。

      -G 0 を 付けてみたら、-fpic とか -fpie に関係なく次のコードになった。

      80600000 _start:
      80600000: 3c1c8060 lui gp,0x8060
      80600004: 279c00a8 addiu gp,gp,168
      80600008: 08180004 j 80600010 c_main
      8060000c: 00000000 nop

      80600010 c_main:
      80600010: 27bdffe8 addiu sp,sp,-24
      80600014: afbf0010 sw ra,16(sp)
      80600018: 0c18000e jal 80600038 msg_init
      8060001c: 00a02021 move a0,a1
      80600020: 0c180011 jal 80600044 msg_proc
      80600024: 00000000 nop
      80600028: 0c180011 jal 80600044 msg_proc
      8060002c: 00000000 nop
      80600030: 08180008 j 80600020 c_main+0x10
      80600034: 00000000 nop

      80600038 msg_init:
      80600038: 3c028060 lui v0,0x8060
      8060003c: 03e00008 jr ra
      80600040: ac44008c sw a0,140(v0)

      80600044 msg_proc:
      80600044: 27bdffe8 addiu sp,sp,-24
      80600048: afbf0014 sw ra,20(sp)
      8060004c: afb00010 sw s0,16(sp)
      80600050: 03808021 move s0,gp
      80600054: 3c028060 lui v0,0x8060
      80600058: 8c42008c lw v0,140(v0)
      8060005c: 10400006 beqz v0,80600078 msg_proc+0x34
      80600060: 00000000 nop
      80600064: 8c420000 lw v0,0(v0)
      80600068: 10400003 beqz v0,80600078 msg_proc+0x34
      8060006c: 00000000 nop
      80600070: 0040f809 jalr v0
      80600074: 00000000 nop
      80600078: 0200e021 move gp,s0
      8060007c: 8fbf0014 lw ra,20(sp)
      80600080: 8fb00010 lw s0,16(sp)
      80600084: 03e00008 jr ra
      80600088: 27bd0018 addiu sp,sp,24


      どうも -G 0 は、いわゆる static に 近いようだ。で、-G 0 を付けないと gp が正しいことを常に期待するコードになっている。

      ... となると xburst_stage1 は -G 0 付きが良さそう。xburst_stage2 は、リロケータブルだから、-G 0 なしにしなくてはならない。で、ロードして実行するプログラムは、基本どちらでも良いが、libgcc が -G 0 なしだと思うので -G 0 なしに統一しておいたほうが良さそう。

      ちなみに xburst_stage2 は、アドレステーブルを自分で変換している。仕様をあわせないとたぶん動かない。

      ところで、-fno-zero-initialized-in-bss は、まともな start-up を持っていないので初期化をさぼるために入れている。いずれ外さないといけないと思っている。

    問題がひとつ判った。jalr v0 となっている所。xburst_stage2 のコードは、飛び先アドレスを t9 に入れておかないといけない。理由は、t9 相対で gp を設定しているため。 逆に gp は壊してしまうので、-G 0 を付けない場合は、call 前後でセーブ・リストアが必要。

    ここを直したら、プログラムが動くようになった。ようやくデバッグが出来る。

    デバッグが少し進んで printf が使えるようになった。一旦スナップショット。


    変更点:

    • printf , getopt が動くのを確認。

      いろいろバグはあった。修正した中で重大かも知れない仕様変更をした。

      変更したのは、stdin/stdout/stderr 。ポインタではなく、実体のアドレスに変更。
      - 要するに代入できない。まだ malloc を動かしたくないのが理由。

      usbboot のプログラムのほうにもバグがあったので修正。

      たぶん malloc や memcpy/memset は未確認。memcpy/memset はアセンブラで結構複雑。
      - 条件によって動くコードが変わるのだ。

    • Todo(2) マシン情報の表示 。

      一応、マシン情報の表示と CPU クロック, メモリ量の表示が出来た。

      Jz4725: c0_prid 0x0ad0024f
      Jz4725B: c0_prid 0x1ed0024f
      (Jz4750 : c0_prid 0x1ed0024f )
      Jz4755: c0_prid 0x2ed0024f


      CPU クロック, メモリ量 は、Jz4725/Jz4725B で正しく取得できている。
      ただ OTP は全然。Jz4750/Jz4755 系でないとダメなのかも。

      c0_prid は、何だろう? 8bit づつに分けて 4 つのフィールドになっているらしい。
      - ベンダー 0xd0 core 0x02 rev 0x4f で、最上位の 1 バイトはベンダー定義。

      Jz4725B は Jz4755 と違って core の拡張はないようだから これで合っているようだ。ベンダー定義の部分は、 00001010 と 00011110 の違いか。

    • xburst_stage1 が 動くのを確認。

      自分ビルド gcc-4.2.4 を使ってのビルドで動作が確認できた。
      オプションは、-G 0 。

      xburst_stage2 はまだ動かせていない。

      Todo
      (3) 割り込み (つづき)

      いま作ってある ostimer と timer を動かす。

      (4) timer の 実用化。

      callback を登録できるようにする。-- なにやら OS っぽくなってきたが、次のステップで必要なのだ。

      (5) ベンチマーク

      時間が分かるようになったならベンチマークをしてみたい。MXU あり/なしの jpeg-6b とか をやってみたい。

      (6) generic-LCD での表示。

      要するに Neo Slim 3000 で LCD を使えるようにしたいのだ。ここまで出来れば終了の予定。

    バージョンアップした。

    変更点:

    • Jz4755 (T555) での動作確認と修正

      jzlib 自体は 変更なし。マシン情報の表示はできたが、予想に反して OTP は見えない。

    posted by すz at 14:12| Comment(0) | TrackBack(0) | Jz47xx(USBBOOT)

    2010年10月21日

    Linux(r237)のテスト

    ベースバージョンをr237に変更したが、そろそろテストを開始しようと思う。

    まずは、ブートするまでの流れを おさらい。

    • メモリマップ:

      0x80000000
      割り込みベクタとか
      0x80002000
      (8KB) (1)xburst_stage1
      (stack)
      0x80004000
      0x80010000
      0x80100000 (offset 1MB) :
      (u-boot ) : (4)kernel(vmlinux.bin)
      : + initrd
      0x80600000 (offset 6MB) 0x80600000(max)
      (3)kernel (zImage)

      0x81c00000
      (4MB) (2)xburst_stage2
      (stack)
      0x82000000 (32MB の場合)

    • usbboot で boot コマンドを入力すると、xburst_stage1/2 をロードして 実行する。stage1 はメモリとかクロックとかハードウェアの初期化で、stage2 は、コマンド処理。stage1 は実行後不要になる。
    • kernel (zImage) は、0x80600000 にロードして同じアドレスから実行する。改造した usbboot では コマンドラインも渡せるようにしている。
    • kernel (zImage) は、0x80010000 から 内蔵したイメージを展開していく。イメージは、vmlinux.bin + initrd 。
      パラメータ(コマンドラインのアドレスとか) はセーブしていて、vmlinux.bin を実行するときに渡す。
    • vmlinux.bin の開始アドレスは、kernel_entry (arch/mips/kernel/head.S)
    • kernel_entry は start_kernel(init/main.c) を呼び出す。
    • start_kernel では、かなりの初期化を実行した後(printk すら 使えるようになった後)、setup_arch(arch/mips/kernel/setup.c) を呼び出す。ここから プログラムのメモリ(BSS) 以外のメモリの初期化とかが始まる。

    次に、前回 (r108) でどこまで実行できたか

    • zImage をロードして制御を渡す 。OK
    • start_kernel 実行開始 OK 。
       - LCD のバックライトを点灯させることで確認
    • setup_arch 実行開始 NG 。
       - setup_arch まで行かない。


    今回は、r237 ベースに変更してしきり直す。

    今回からは、バックライトに加えて、赤黄の LED が使える。また、ある程度処理が進めば、
    LCD へのメッセージ出力 も可能になる予定。

    さて、前回と同じところまで行くものなのか確認 -- したら全然動かない。

    困った。全く動かない。

    過程を書くとちょっと込み入った話になるので、パスして結果だけ。

    • zImage が カーネル(kernel_entry)に処理を渡すのは確認できた。
    • だが、kernel_entry から startup_kernel に処理がわたらない。
    • 細かく調べると 冒頭の mtc0 が動かないことが判った。

        kernel_entry:
        800144f0: 40086000 mfc0 t0,c0_status
        800144f4: 3c011000 lui at,0x1000
        800144f8: 3421001f ori at,at,0x1f
        800144fc: 01014025 or t0,t0,at
        80014500: 3908001f xori t0,t0,0x1f
        80014504: 40886000 mtc0 t0,c0_status

      • c0_status というのは、カーネルモードとか割り込み禁止とかの CPU の動作モードや 割り込み原因などのステータスが格納されているレジスタ。
        このコードは、それのビットを立てたり落としたりしている。

        c0_status の意味:(一部)
      • bit4 UM
      • bit2 ERL (RESET/NMI 発生時に 1)
      • bit1 EXL (通常例外/割り込み発生時に 1)
          - UM=1 かつ ERL = 0 かつ EXL = 0 のときユーザモード。
      • bit0 IE (1: 割り込み許可 / 0: 割り込み禁止)

    • c0_status になにを設定すると動かないのか細かく調べたところ

      もとのデータは、0x1240CE16 が多いが このうち
      0x4 -- ERL ビットを 0 にすると 止まるか暴走する
      ことが判明。
      ちなみに、暴走した後放置しておくと、フラッシュから立ち上がった。

    • 調べると Reset や NMI で実行開始した場合 ERL bit が 1 になる。
      ERL を 0 にするには、

      (1) ERET で復帰
      (2) プログラムで 0 を書き込む

      の 2 通りがあるらしい。(2) では暴走するのだから (1) の方法を使うのか?
    • 頼りになるものは、u-boot のソースコードぐらいだが ... JzRISC では

      /* CU0=UM=EXL=IE=0, BEV=ERL=1, IP2^7 = 1 */
      li t0,0x0040FC04
      mtc0 t0,CP0_STATUS

      としていた。

    ERL=1 だと割り込み許可ができない(or 無効) 。困ってしまったが、最初の割り込み許可までは、動作確認できるはず。
    とりあえず
    • 先頭の CP0_STATUS の設定 (arch/mips/kernel/head.S)
    • raw_local_irq_disable (arch/mips/include/asm/irqflags.h)
    • raw_local_save_flags (arch/mips/include/asm/irqflags.h)
    • raw_local_irq_restore (arch/mips/include/asm/irqflags.h)
    の 0x1f を 0x1b にすることで 先に進むことにした。

    • 大雑把にいうと動作モードには、ユーザモード/カーネルモードがあるが、カーネルモードにも種類があって、ERL=1 は NMI/Reset での実行状態/EXL=1 は 例外(システムコールとか)・割り込みが起きたときの実行状態/UM=ERL=RXL=0, は通常の実行状態。
      上記の対処は、ERL を変更しないようにしたということ。

    こうすることで、setup_arch の直前まで来た。

    さて、setup_arch の直前には printk が入っている。これをどう表示させるのだろう?

    ちゃんと調べてみると arch/mips/kernel/early_printk.c というのがあってここで定義している。で、call する関数は prom_putchar() 。
    そして、prom_putchar() は、(現config では) シリアルを使う版が arch/mips/jz4750l/board-a41.c に記述されていた。

    ならば、prom_putchar() を LCD を使うように書き換えてみたところ .... 出た。



    最後のメッセージは、NR_IRQS:256 で ここから先は、やはり ERL を 0 にしないと無理そうだ。

    それはともかく、いくつか気になるところがある。

    • F4750L とあるが、もう分離しているのだから、A-41 / A-33 に変更しなくては。
    • メモリが 64MB 認識されてしまっている。

      usbboot -f /etc/xbufst-tools/a41-boot64M.cfg

      として起動しているので、64MB の RAM は実際にあるし使える状態。だが、

      usbboot> exec arch/mips/boot/compressed/zImage mem=28M

      として起動しているのだ。( exec は、新規で作成した コマンド )
      mem= を認識させないと stage2 が壊れてしまう。
      ... それにしてもなぜ 64MB と分かるのだろう? トータルのメモリサイズは渡していないのに。

        64MB は、JZ4750L では、ハードコーディングされていた。

        zImage だと 0x80600000 にロードして、先頭から実行すれば良いのだが、別の起動方法もある。
        objcopy で vmlinux を 変換し、0x80010000 にロード。
        実行は先頭ではなく、kernel_entry のアドレスを nm で調べて(いつも同じアドレスだが) そこに go する。具体的には、

        # mipsel-linux-objcopy -O binary vmlinux vmlinux.bin

        usbboot> load 0x80010000 vmlinux.bin 0
        usbboot> go 0x800144f0 0 mem=28M

        ... この方法だとテストプログラムで パラメーターを渡す実績もあるのだが.. linux で認識してくれなかった。... バグっているらしい。

    テストその2(続き)


    これで、どこまで行くか調べたところ、init_IRQ() (init/main.c) から call される arch_init_irq() (arch/mips/jz4750l/irq.c) までだった。

    clear_c0_status(0xff04) /* clear ERL */

    というのがあって、ここではじめて ERL を clear しているつもりらしい。意味がないので、0xff00 にしておいた。


      これで次に止まるのは、次のところと分かっている。
    • raw_local_irq_enable (arch/mips/include/asm/irqflags.h)
      -- 0x1f を 0x1b に 0x1e を 0x1a にしておく。


    最後に止まるのは、calibrate_delay() -- 実際にタイマ割り込みが来ないと 先に進めないようだ。

    • ちなみに、calibrate_delay() が完了すれば、おなじみの BogoMips が表示される。


    さてどうしたものか ...Linux カーネル Tree にマージ申請したときの紹介には、

    • The JZ4740 has a mostly MIPS32 4K compatible core (no on cpu timers)

    と書いてあるのだが ...

    とりあえず、MIPS 4K ファミリーの Software User's Manual というのを見てみる。CP0 のレジスターは、 $0-$31 まで定義されていて、

      $12 STATUS (上記の c0_status のこと)
      $14 EPC (通常の例外・割り込みからの復帰アドレス)
      $30 ErrorEPC (NMI/Reset からの復帰アドレス)

    と書いてある。実際に値を読みだしてみると...

      $14 EPC 0xADD273F3 とか 0x8DDA73F3
      $30 ErrorEPC 0x94D5BFFF

    なにか初期値がそのまま入っている感じで電源投入の毎に微妙に値が変わるのだが、起動後は、何回読みだしても同じ値。

    これらに 適当な値を入れて ERET すると ... ユーザモードになって ... 結局アドレスエラーで 例外が起きそう。では、BEV を 0 にした上で、0x80000180 とか 0x80000200 の一般例外ベクタから 望むアドレスへの ジャンプ命令を書いておけば良いのだろうか?

    で、それをどこでやるのが適切なのだろう? やはりブートローダからのカーネル実行?

    • ERET は、カーネルモード(通常 NMI や例外・割り込みで切り替わる)からの復帰命令。


      これをテストプログラムでやってみた。

      0x80000180からの例外ハンドラは、

      3c028000 lui v0,0x8000
      24420170 addiu v0,v0,0x170
      8c480000 lw t0,0(v0)
      8c440004 lw a0,4(v0)
      8c450008 lw a1,8(v0)
      8c46000c lw a2,12(v0)
      01000008 jr t0
      00000000 nop

      こんな命令列にする。その 16バイト前から ジャンプアドレスと パラメータを入れておく。なにか例外が起きれば、ここが実行されるわけだ。例外は故意に起こすが一旦ユーザモードに入らないといけないので、ERET を使う。( ErrorEPC にアドレスエラーを起こす値を設定しておく。)

      プログラムに実行が渡ったときの c0_status は、

      0x1200EE13 -- UM = 1 , EXL = 1, IE = 1

      状態としておかしくない。で、
    • IE を 0 / 1 にするのは OK 。
    • UM を 0 にするのは OK 。
    • EXL を 0 にすると ... 例外。
      という動作になった。... どうも ERL/EXL を変更するのはダメのようだ。

      それはともかくこれで割り込み禁止/許可ができる。

    • ブートローダ(usbboot) で 例外を起こして Linux 実行。
    • Linux では ERL/EXL を変更しない。
        0x1b を 0x19 に / 0x1a を 0x18 に

      という方針でやってみる。...

      ところでなぜこんな変なのか? 推測するしかないが、例えば UM/ERL/EXL の状態に応じたシャドーレジスタがあるとか
      ... 他のものがちゃんと動いているはずだし ... なにか設定があるのだろうが今のところ分からない。

    で、やってみた。割り込みが許可できるようになったが、calibrate_delay() で止まる。

    ちょっと見たところ jz4750l と jz4750 で time.c が全然違う。 jz4750 や jz4740 の time.c をコピーしてもビルドはできるが、やはり動かない。

      ちょっと CPU の違いをメモ

      OS Timer (32 bit) 16bit PWM
      Jz4740 x 8 8(?)
      Jz4750 o 6 6(0-5)
      Jz4725B o 5 5(0-3,5)
      Jz4755 o 6 4(1-3,5)

    • jz4750 では、タイマー割り込みには、timer5 を使用している。
    • OS Timer は、get_cycles 用に使用。

      jz4750 と互換性はありそうだが、PWM の都合上 timer0-2 にしないと困りそう。
      割り込みには、TCU0-2 の 3 つがあり timer5 は TCU1 ?
      jz4740 では、timer0 / timer1 / timer2-7 で 3 種類の割り込み。

      (linux の分類の) jz4750 と jz4750l では、レジスタの定義が一部違う。

      jz4750:
      #define IRQ_MSC1 13
      #define IRQ_MSC0 14
      jz4750l:
      #define IRQ_MSC1 24
      #define IRQ_MSC0 25

      jz4725B はいったいどっちなのか? それともまた別なのか?
      ちなみに DMA チャネルのの数

       jz4750 12
      jz4755 8
      jz4725B 6

      jz4750:
      #define MAX_DMA_NUM 12 /* max 12 channels */
      jz4750l:
      #define MAX_DMA_NUM 8 /* max 8 channels */


      jz4755/jz4725B は、jz4750l に近そうだし、CONFIG_FPGA で切り分けできるし、jz4750l を間借りして良かったとは思うのだが ... 情報がないし骨が折れそうだ。

      でも usbboot で テストプログラムを動かせるし、実際に割り込みが起きたらどのビットが立つのか調べることはできるから、あまり心配はしていない。

      もうすこし調べてみると、(INTC)割り込みコントローラと(CPM)クロックジェネレータがだいぶ違う。-- この違いは、付いているデバイスの種類と最大数の違いから来るものでやむを得ないようだ。
      あと (CIM)カメラインターフェイス と (IPU)イメージプロセッシングユニットが違う。-- これは、jz4750l が 設計中のもので変なのだろう。

      追記: なんと Jz4755_pm が入手できた。これを見ると 割り込み原因のビット割り当ては jz4750l に合致する。
      Jz4725B は、4755 を shrink したものだろうから たぶん jz4750l で良いはず。
      タイマーの割り込み割り当ては、timer0,3,4,5 が TCU1/timer 1,2 が TCU2 。
      クロック供給の設定も jz4750l に合致。

      ただし、
      #define INTC_ISSR (INTC_BASE + 0x18)
      #define INTC_ISCR (INTC_BASE + 0x1c)
      は存在せず、INTC_ICSSR が変なアドレス(0xB3016000)にある。

    まぁ、ここらあたりで一旦整理しようと思う。
    usbboot の 起動方法が変わったので いままでの テストプログラムの動作に問題が出るし。

      asis 版
    • linux-jz4725b-r237-wk.tar.bz2
    • usbboot-wk14.tar.gz

      usbboot は、1 回実行すると そこで終わりになった。割り込みをいじったりする場合は仕方ないとしても今までのプログラムも最後に暴走することになる。

      内部で状態を変更してからの実行にしたい。そのためには、少々面倒なことをしないと。
      引数が 使えるから、レジスタをセーブして、引数にセーブエリアをわたして、例外つかって jump 。... みたいな。

      追記:いろいろやってみたのだが、結局

      ERL = 1, EXL = 1 → ERL = 0, EXL = 1

      ならなんの問題もないことが判った。

    テストその3(続き)


    現在は、calibrate_delay() で止まっている。

    タイマー割り込みの処理が実行されて jiffies がカウントUP されば、BogoMips が表示されて先に進むはずだが 割り込みの処理が実行されない。

    で、local_irq_enable() call した後 (init/main.c) で、いろいろレジスタを表示させてみた。

      c0_status 10000403 (EXL = 1, IE = 1, only Hard Int 0 is enabled )
      c0_cause 30c00700 (Hard Int 0 is caused, Excepton code = Interrupt)
      CPM_CLKGR 00000000 (All Clock Gate are opened)
      INTC_ISR 00200040 (TCU2 , RTC are pending)
      INTC_IMR ff5fffff (TCU0, TCU2 are not masked)
      INTC_IPR 00200000 (TCU2 is active ?)
      TCU_TSTR 00000000
      TCU_TSR 00000000
      TCU_TER 00008004 (OS Timer , timer 2 are enabled)
      TCU_TFR 00000004 (timer 2 is FULL comparison matched)
      TCU_TMR 003f003b (Os Timer, timer 2 are not masked FULL comparison match intr)
      TCU_TCNT2 00000a42
      TCU_TCNT2 0000099f

    なんだか正常そうなのだ。timer 2 を使って 周期的に割り込みを起こし、TCU2 の割り込みが発生する設定なのだが、timer 2は進んでいるし、TCU2 の割り込みも発生していて pending になっている。

    割り込みも許可できているつもりだが ... 違った。ERL と EXL ともに 0 でないと割り込みは来ない。結局最初の問題に戻る。

    いろいろやってみたら... write_c0_cause(0) をしてから EXL = 0 にすると ... 先に進んだ。

    ... で mtd が組み込まれてしまい。

    bad eraseblock 210 at 697f000
    Bad eraseblock 2598 at 5137f000
    Bad eraseblock 2600 at 5147f000

    こんなメッセージが ... まだオリジナルのファームウェアを壊すつもりはないので焦ったが、一応立ち上がった。

    とりあえずメッセージが流れてしまったので、途中で止めて BogoMips をみてみた。

    226.91 BogoMips 

    だそうだ。CPUクロックを 228MHz にしているので、CPUクロックにほぼ一致する値になるらしい。

    結局、arch_init_irq() (arch/mips/jz4750l/irq.c) の

    clear_c0_status(0xff04) /* clear ERL */

    write_c0_cause(0);
    clear_c0_status(0xff1f) /* clear ERL */

    に変更するだけで良かった。(ここまで ERL=1 / EXL=1 で来るので、割り込み禁止とかの変更はイキ)

    次は、console とか パラメータとかをキチンとしよう。

      asis 版
    • linux-jz4725b-r237-wk2.tar.bz2
    • usbboot-wk15.tar.gz

      たいして変わっているわけではないのだが、ここまでの分のバックアップ。
      usbboot-wk15 は、wk13 ベースに戻した上で wk14 のテストコード追加。


    追記: 結局 write_c0_cause(0)は、usbboot でもすることにした。これで、c0_status 周りを元に戻しても問題なくなった。.. のだが別に悪影響があるわけではないので当面すのままにしておく。

    さて、今は usbboot での環境を整備しようかと思い、jz47xx の reg.h と ops.h を見ている。jz4740 や jz4750 といったチップ毎に reg.h ops.h があるのだが、どこまで同じで、なにが違うか分かるようにするため、チップ毎のファイルを コントローラ毎に してみている。

    • ひとつ重大なことを発見。.. jz4740 と jz4750l の rtc のコードにバグがあった。jz4750 だけ直してあった。

    • コントローラ毎に してみると ほぼ同じものもあるが、全然違うものもある。SLCD (Smart LCD) はあまり変わらないのだが、LCD (Generic LCD) は、機能が大幅に拡張されていて レジスタの数が 2倍ぐらいになっている。全然違うのは、他には CIM (カメラ) , ICDC (internal CODEC) 。あと SSI や MSC(SDカード), DMAC(DMA コントローラ)は、コントローラーが複数になっていて マクロが変更になっている。
    • INTC (割り込みコントローラ) , CPM(クロック) などは、周辺デバイスの構成が変わっているので チップ毎に違う部分がある。

    • ICDC (internal CODEC) は、Jz4740系 と Jz4750系ではまったく違う。Jz4740系 は、レジスタが普通にメモリにマッピングされているが、Jz4750系は、まるで別デバイスのようだ。
    • IPU のヘッダファイルは変。他のと違う。アプリケーションからとってきて突っ込んだ感じ。Jz4750 と Jz4755 も違うので困惑したが、デバイスそのものは同じだった。編集して 他のに合わせることにした。
      ついでに jz4740 の pm を見て比べたところ、互換性はだいぶあるが、随分拡張されている。
    • OTP(One Time Programmable Module というのがあって、そこにチップの情報が格納されている。
      プロダクトID やら ユニークな ID を作れる情報もある。

    まぁこんな感じ。この作業を通じて だいぶ分かってきたような気がする。

    Linux については、ちょっとお休み。パラメータはちゃんと渡っていることは確認できた。... が xburst_stage2 に callback すると panic することが分かった。ちゃんと panic まで来ているのだが、なぜなのかまでは分かっていない。これをどうにかしないと... 先に進めない。

    ついでに書いておくが、手持ちのなかで Neo Slim 3000 だけが採用している HSYN/VSYNC インターフェイスの LCD は、なかなか使うのが難しいことが判った。DMA も必要だし 周期的に表示するため タイマも動いていないといけない。-- 要するに最初のデバッグに利用するのは困難。

    posted by すz at 19:02| Comment(0) | TrackBack(0) | Jz47xx(Linux)