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)

2010年10月19日

Jz4755(T552とか)

いままで、JZ4725B の話題ばかりだったので、ここで JZ4755 の話題をまとめておこうと思う。

CPU について




0.4mm ピッチ LQFP176 pin パッケージで、内部のブロック図はこんな風になっている。

JZ4725B とこが違うのかというと...

  • SIMD2 :

    SIMD 命令は JZ4725B にもある(60命令)が、命令が追加されているらしい。(SIMD2: 114命令)

  • SDRAM :

    JZ4725B は 16bit 幅だが、16bit/32bit 幅を選択できる。

  • MSC1(SD/MMC インターフェイス):

    JZ4725B は、1bit データ幅 で SD/MMC の性能を使い切れない。JZ4755 は 4bit データ幅。
    ちなみに、SDHC の最高周波数は 50MHz だが 80MHz まで使える (SDHC UHS-I対応?) 。
    MSC0 というのもある。(JZ4725B も同等機能 , 4bit 最大80MHz) ... のだが NAND FLASH と排他で使うもので boot 用。

  • SPI/SSI インターフェイス(最大 50MHz):

    JZ4725B にはない。MSC1 とピンが共用なので実質使えないかも。

  • タッチパネルインターフェイス:

    JZ4725B にはないが、その他の Jz47xx チップはたいがい持っている。

  • UART :

    JZ4725B と同等の 1ch だが、JZ4725B は GPIO に使われてしまうケースが結構ある。JZ4755 は実質使える。

  • サウンド出力 (カップリングコンデンサレス) :

    よくわからないが、BTL 出力ができるらしい。JZ4725B には BTL はない。

  • CS2/CS3 :

    NAND FLASH/SRAM の チップセレクト 要するに NAND FLASH/SRAM を合計 4 つまで付けられる。JZ4725B は 2 つまで。

  • AC97/I2C 出力: JZ4725B にはない。
  • カメラ入力: JZ4725B にはない。
  • TV 出力: JZ4725B にはない。
  • TS インターフェイス: JZ4725B にはない。


Jz4755 のチップは taobao で買える。たとえば ここなら 1 個あたり 25 元 (1元=15.5円として 390円)。パッケージは、0.4mm ピッチとはいえ LQFP176 で 個人の電子工作で扱える範囲には入る。
 あと こことか。

    DINGOO A320 などで使われている JZ4740 は BGA で、電子工作でどうにもできないので、あまり興味がなかったりする。

    JZ4760 には興味があるが、LQFP176 あたりの PMP向けチップが出た上で買えるようにならないと。

さて、このチップは、Dual-Core だが、1 つは VPU で DSP 的に使う。キャッシュのかわりに SRAM が 32KB 。-- どうやって そのもうひとつを使うのか分からないのだが、どうも qi-hardware のメーリングリストに入って ある人にリクエストすれば NDA なしでもらえるらしい。

    qi-hardware が入手しているドキュメントには、

    • XBurst Microprocessor Core, Rev 1.0, Apr 2007, 62 pages
    • Jz4725B Data Sheet, Rel July 7, 2009, 37 pages
    • Jz4725B Programming Manual, Julz 14, 2009, 529 pages
    • Jz4720 Data Sheet, Rev 1, Jun 2008, 37 pages
    • Jz4740 Data Sheet, Jun 2007, 35 pages
    • Jz4740 Programming Manual, July 22, 2009, 539 pages
    • Jz4750 Data Sheet, Apr 2009, 40 pages
    • Jz4750L Data Sheet, July 17, 2009, 37 pages
    • Jz4750L Programming Manual, July 14, 2009, 570 pages
    • Jz4755 Data Sheet, July 7, 2009, 33 pages
    • Jz4755 Programming Manual, Jul 22, 2009, 732 pages

    というのがあるそうだ。この情報は、google のキャッシュに残っていたもの。Jz4750L 単独で Data Sheet やら Programming Manual があるのが興味深いが、それはさておき Programming Manual がないと VPU は扱えなさそう。

    そもそも、Jz4725B の Programming Manual ですら入手できていない。Linux のソースコードがあるので、たいがいの機能は使えるわけだが、VPU は どういう使い方をするのか 分からない.. と思う。

      追記: なんと jz4755_pm が入手できた。VPU が出来ることは、IDCT, Motion Compensation,Motion Estimation,De-Block の 4つだけで レジスタに値を書き込むことで制御する。

    ところで、Jx4755 とかの Xburst core は、MIPS32 4K core あたりとだいたい互換らしいのだが、4K core (5段パイプライン)だと 180nm プロセスで 167MHz ぐらい。Xburst(8段) は同じ 180nm プロセスで 360MHz まで行っている。なにげに結構すごいのかも。

Jz4755 が載った PMP -- Mahdi T552


今は Jz4725B の PMP ばかり集めていて Jz4755 が載った PMP は持っていない。Jz4725B が自由に扱えるまで手を出さないつもりだが、一応調べてみた。

このなかで、Mahdiが結構 Jz4755 の製品を出している

そのなかでも気に入ったのは、T552



こんなやつ。4.0 inch (480x274) 。

気に入ったのは、ここのレビューに分解写真があるのも理由。





  • メモリは、W9812G6GH-6(16MB) x 2 。
  • 例によって FM ラジオのパターンもある。
  • LCD は 0.5mm ピッチ 50pin ? -- RGB インターフェイスか?
  • 裏面に部品がほぼないのは、嬉しかったり。

面白いことに KO Digital HD-300 というのも同じ筐体のようだ。



これは一体なんなのだろう? ProjectXA の文字が見えるところから、ChipRise というところが設計・製造しているのだろう。.. ということは、両方 OEM ?

    KO Digital (可欧) というところも 大きなメーカーっぽい。http://www.kocode.com (FLASH / サウンド付き注意)
    HD-300 はだいぶ古い製品のようで現行は、HD900A とか。ここ見ると 明らかに Jz4755 。画面が例のもの + 720p対応。
    ... どうもよくわからないが、HD系は Jz4755 が多そう。(ただし HD800系は RK かも)


それはさておき、これはどこで買えるのだろう?

ひとつは、ownta.com で、$79.80 -- 84円換算で 6700円。
Free shipping だが、 Registered Airmail $15.74 というのを見ると不安になる。送料を払うなら Express Shipping (3-5 days) - $16.74 が良さそう。

もうひとつは、taobao で、例えば ここここだと 送料込まずで 265元 -- 15.5 円換算で 4100 円。
随分と安いように見えるが、代行業者を通さないと買うのは無理そう。

    例えば taobao 代行業者の グッズエイト を通すと ...
     ( 265元 + 中国国内送料 約20元 + EMS送料 60元 ) x 15.5(元→円)
       + 手数料 500円 = 約 5800円。( これ以外に +振込料金x2回 )。

    代行業者にもいろいろあって、上記は一例。利用したこともないし別にお薦めというわけではない。
    だいたい 元→円のレートは、12円ちょっと。明示されている手数料は 5% だが、レートが 30% 増しに近い。そしてそれは、手数料や送料にもかかる。それでも高くなければ良いのだが、なにか釈然としない。


まぁこんな感じなのだが、 T552 だと Camera インターフェイスもタッチパネルも使っておらず .. 線も引き出せない。(自分でビルドした Linux を動かす前提で VPU が使えないとすると) Jz4725B の PMP と比べて メモリと SD/microSD が速いだけで 機能的にはあまり変わらないことになる。

これではちょっと面白くないのだ。... というわけでパス。

追加: T555




T552 が高いのは、液晶のせいで Jz4755 が高いせいではない。たとえば ここの T555 は、3.0 inch 400x240 , 4GB で A-32 の Jz4755 版という感じだが、170元(本体のみなら 150元)しかしない。... ただ 小さいのはメモリも 16bit かも知れないし、やはり T552 のほうが良さそう。
 あと ここ は、180元。

追記:
パスと書いたが、Jz4755 の Programmers Manual 手に入ったし、買ってしまうことにした。

なにを買うかだが、T552 は、まず欲しい。理由は Jz4755 で 本当にちゃんと H.264 が見れるのかどうかを チェックするため。ちゃんと見れるのならば、画面も大きめだし 実用としても使えそうだ。

ただ、プログラムを動かしたりするのならば、LCD がネック。Smart LCD ではないと思うので制御がたいへん。電子工作で LCD を 外すとかするなら 0.5mm ピッチ 50 pin なのは 嬉しい。フレキとかコネクタの入手性は、54pin の Neo Slim 3000 より良い。

T555 も良いように思えてきた。たぶん Smart LCD で デバッグとかするのに都合が良いし、電子工作で使うにしても LCD を外して線を引き出すのは 楽なはず。ただし、メモリが 32bit でない可能性が高く その点ではイマイチかも知れない。 jz4755 でないということはないはず。720p 対応を謳っているし、TV-out がある。Jz4725B に TV-out の機能を付けると却って高くなりそうだし。

届いたらレポートする予定。

    追記:2010/11/16 なかなか来ない。T555 は、生産中止・希望色 在庫切れだそうで.. 色変更するだけで 2 週間かかってしまった。今製造しているのは T556/T557 らしい。




ところでこれは何だろう? Mahdi が出している M18 Touch という製品らしいのだが、タッチパネルの上に(有線だが)コントローラが付いている。これが、Jz4755 だと面白いのだが ... Jz4755 とは限らない。

Jz4755 が載った E-Book -- EB70




aliexpress.com で 唯一 jz4755 でヒットするのは この 電子ブック EB70

値段は、$89.47 x 1 + $16.96(@EMS) = $106.43 。

液晶は普通の 7inch TFT LCD 800x480 だがタッチスクリーン 。メモリは 32MB , FLASH は不明(8GB まで)。バッテリー容量も不明(3300mAH まで)。 Wi-Fi: 802.11b/g が付いている。他の外部インターフェイスは microSD , イヤホン , スピーカー (マイクも? ) 。leather case が付属。

.. なんというか Android 端末を Jz4755 までダウングレードした感じ。

開発・テスト用ならこういうのも良いかも知れないのだが... 実用として使うならどうなのだろう?
CPU のクラスとしては、RK27xx よりは速いと思うが、RK28xx には負ける。そして、VPU や SIMD を使いこなしてはじめて本来の性能になるから、ファームウェアの出来が重要。
だが、肝心のファームウェアの出来が分からない。

Jz4760


ついでに Jz4760 について書いておこう



前に JZ4760 が出るらしいと書いたが、データシートから転載したらしいブロック図を発見。(url)

日付は、2010-08-20 で随分前の情報だ。ingenic のコードにも随分前から Jz4760 の対応が入っている。出るのは確実なのだろうが、いつになったら出るのだろう? 来年?

それはともかく、ありがたいことに英文の説明も付いている。たぶんこれもデーターシートからの抜粋。


  • XBurst Jz4760 is a mobile application processo targeting for multimedia rich and mobile devices like Smart phone, PMP, mobile digital TV, and GPS. This SOC introduces an innovative dual-core architecture to fulfill both high performance mobile computing and high quality video decoding requirements addressed by mobile multimedia devices.

  • The CPU (Central Processing Unit) core, equipped with 16K instruction cache and 16K data cache operating at 600MHz, and full feature MMU function performs OS related tasks. At the heart of the CPU core is XBurst processor engine. XBurst is an industry leading microprocessor core which delivers superior high performance and best-in-class low power consumption.

  • A hardware floating-point unit which compatible with IEEE754 is also included.

  • The VPU (Video Processing Unit) core is powered with another XBurst processor engine. The SIMD
    instruction set implemented by XBurst engine, in together with the on chip video accelerating engine and post processing unit, delivers doubled video performance comparing with the single core implementation.

  • The memory interface supports a variety of memory types that allow flexible design requirements, including glueless connection to SLC NAND flash memory or 4-bit/8-bit/12-bit/16-bit/24-bit ECC MLC/TLC NAND flash memory for cost sensitive applications.

  • On-chip modules such as audio CODEC, multi-channel SAR-ADC, AC97/I2S controller and camera interface offer designers a rich suite of peripherals for multimedia application.
  • TV encoder unit 10-bits DAC provide composite TV signal output in PAL or NTSC format.
  • The LCD controller support up to 1280x720 output, as well as external HDMI transmitter.
  • WLAN, Bluetooth and expansion options are supported through high-speed SPI and MMC/SD/SDIO host controllers.
    The TS(Transport stream) interface provides enough bandwidth to connect to an external mobile digital TV demodulator.

  • Other peripherals such as USB OTG and USB 1.1 host, UART and SPI as well as general system resources provide enough computing and connectivity capability for many applications.

    ざっとみて、Jz4750 から変わったのは、

    • CPU の周波数 360MHz(400MHz?) → 600MHz
    • FPU (浮動小数点演算ユニット)
    • DDR/DDR2 のサポート (SDRAM は未サポートになった?)
    • USB Device (HI-Speed) の OTG 対応。
    • 2D グラフィックスエンジンの追加。
    • MMC/SD/SDIO の数 2 → 3 等高速シリアル系の強化

    といったところか。機能的には Jz4750 のちょっとした強化版 のように見える。プロセスルールが 180nm → 130nm になるようだ。

    まぁ、最近の Android 向け 高性能 ARM チップには太刀打ちできない。だいたい RK2808 クラス。.. だが MIPS で カーネルソースや情報を公開しているということに意味がある。
    それに(おそらく)値段も安く、あまり高価でないPMPに採用されるはずで、開発して遊ぶには嬉しいポイント。

上にも書いたが これの PMP向け LQFP版 がでると嬉しい。.. だが、これを使いこなすには VPU の使い方がわからないと...

    追記:VPU の使い方は判った。Jz4755 で判らないのは、SIMD(60命令) → SIMD2(114命令) の差分ぐらい。

    2D グラフィックも判った。(Jz4760 データシート入手! ただし pm はない。)

    ― Up to 100M pix/s
    ― Up to 1080P
    ― Line/Rectangle
    ― ROP4/Alpha blending/Filter
    ― Rotation (90/180/270 degree)/Mirror
    ― 1 Rectangle Clip

    だそうだ。ようやく Rotation が出来るようになったわけだが ... キャッシュラインサイズ(32 byte) x 画面縦分の SRAM を持って 変換してから メモリに書き戻すとかしないと メモリ負荷がとんでもないことになりそう。いったいどうやっているのだろう?


追記: VPU の使い方が判ったと書いたが、Linux のソースには、説明がないものの定義が含まれている。VPU が出来ることは、IDCT, Motion Compensation(MC),Motion Estimation(ME),De-Block の 4つだが、MC/ME は定義がある。

よくよく見ると Programmers Manual にすらない OTP (One Time Programmable Module) の定義まである。
OTP には、(どのCPUかが分かる)プロダクトID や (ユニークなIDを作れる)ウェハのIDと位置が入っている。
.. これは嬉しいかも。

追記 20101122: New console in prototype stage
という記事が出てきた。

  • Ingenic 4755 (Dual Core Clocked at 400 MHz but can be overclocked to 550Mhz The second core is a VPU similar to a GPU)
  • 4.0 TFT LCD (Brand: King Display KD43G16-40NC-A3 Resolution: 480x272 Active area: 95.04mm x 53.86mm 262K color, 24bit parallel RGB interface)
  • 64MB SD Ram (Winbond W9825G6EH-6 (2 pieces) 4M words x 4 banks x 16 bits = 32 MB 166MHz/CL3 or 133MHz/CL2)
  • 2GB NAND (Samsung K9GAG08U0E 16 Gb = 2GB MLC, large block 8-bit interface)
  • MicroSD Memory Slot
  • D-Pad and Analog Nub on left
  • Standard A,B,Y,X on the right and L1 R1 Shoulder buttons on top
  • 4MP Video Camera/Camera
  • OS will be Dingux with hopefully a new menu system the fall back will be Gmenu2X



    プロトタイプ基板の画像も出ている。

    外観は、ありきたりな PSP タイプになってしまうようだ。
    (写真は他の人が予想したものだが、基板の形をみれば判る)

    基板だけ見ると Neo Slim 3000 とよく似ている。Hold スイッチがなかったり、カップリングコンデンサの容量が少なかったり デザイナーが同じじゃないかと思えるほど。それに加えて P5-5 のようなマイクロコントーローラも付いている。

    値段は、Estimated price $80 to $85 USD 。ファームウェアの開発にお金をかけていれば 妥当な気がするが... そうでなければ、ちょっと高めのイメージ。

    売れるかどうかは、オリジナルのファームウェア次第か。それが Dingux なら結構期待できるかも知れない。ただ Jz4755 用にカーネルを移植するのは 骨が折れそうなんだが、大丈夫なんだろうか?

    -- 勘違いしていたが、dingoo-digital から出ている情報らしい。本物の次機種?
    なら ファームウェア は期待できそうだ。だが、550Mhz までオーバクロックするのは本当なのだろうか? Jz4740 と同じ 180um なのに?

    -- dingoo-digital も dingoo-tech も関係ないと書いてきた。... ならファームウェアの問題は厳しそう。

    11/24 ウォッチしているんだが、Jz4760 モデルの話も出てきた。今から 9ヶ月後 .. そうかその頃か。



    まさか ... Get-Arcade Pocket Console (RMB320) のことだったりするのだろうか?

    4.3 inch で カメラ付いているし、2GB しかないし。写真さがすと microSD だし TV-OUT あるし。
    A320のチームが作れば Jz4755を選びそうなものだが ... 同じ形状の ものは 無数にある。

    やっぱり違うかも。
posted by すz at 21:04| Comment(0) | TrackBack(0) | Jz47xx

2010年10月01日

USBBOOT で LCD制御

A-41 の LCD は、コントローラで制御する Smart LCD 接続になっていることが判った。おそらく 兄弟機である A-33 も同じだろう。

  • Smart LCD 接続では、フレームバッファを用意して、定期的に 出力するような制御は不要になり、PORT を叩くだけで制御できる。

  • そのかわり、どのようなコントローラが載っていてどのようにコマンドを発行するのかという情報が必要になる。

  • Smart LCD なら、Linux でデバッグする前に、単純なプログラムで試してみることが出来るし、そうするほうが開発効率が良い。

... というわけで USBBOOT で動かせるプログラムとして LCDを制御するようなものを作ってみようと思う。

ピンのアサインについて

    LCD が どのように GPIO に割り付けられるのか? .. これを知らないといけないわけだが、SLCD コントローラを使う前提になるから、だいたいは決まってしまうのだ。

    LCD_DAT0-LCD_DAT17 (LCD の DB0-DB15(+ DB16,DB17) に接続)
    LCD_VSYNC( = SLCD_CS) LCD の WR
    LCD_HSYNC( = SLCD_RS) LCD の RS

    LCD の CS/RD を使う場合は別途 GPIOを(PORTD から)割り当てる。
     - A-41 では RD は 固定 (read しない/できない)

    Linux のコードだと PIN_CS_N / PIN_RESET_N が GPIO として定義されることになっている。RESET も GPIO かも知れない。

    追記:
    A-41 は、
     LCD RESET = 102 PD23 LCD_SPL(LCD)
     LCD CS = 103 PD22 LCD_CLS(LCD)
    だということが分かった。


コントローラについて

    そもそもこれがなにか分からない。だから試行錯誤しなければならないのだ。

  • A-41 では、ILI9325 が有力だが、違うかも知れない。

    FPC-TLN240T36A1 というのが載っているのだが、
    "FPC-TLN240T36A5 9325"でググるとなにやら沢山ヒットする。

  • A-33 は 400x240 なので、320x240 用の LCD コントローラは使っていない。ILI9326 か?

    ちなみに、ILI9325/ILI3926 では アプリケーションノートの PDF もあり、初期化例が載っている。

解析方法について

  • CSとRESET のピンアサインだけは、探す必要がある。CS(RESET) を プルダウンしてみて、GPIO を読めばたぶん分かる。
  • まずは、解析などせず ILI9325 だと思ってプログラムを作成し動かしてみる。全然だめなら解析する。

  • 解析は、ロジアナを使うつもりだが、16ch なので、16bit + RS/WR を一度には取れない。まずは、RS/WR + 下位8bit 分。
    これで、インデックス レジスタの設定を見て どういうレジスタを使っているかを知る。

  • それであたりが付けられなかったら RS/WR + 上位 8bit も取る。同じシーケンスのはず(RD がないから状態によってシーケンスが変わらない)だから、全部が分かるはず。

  • でも、まずは 解析の練習を フォトフレーム KDPDK24 でやるつもり。
     - オリジナルのファームウェアを消す段階になったら、8bit タイプの LCD に交換するのも良いかも知れない。なぜなら 8bit 分GPIO が空く。多分 GPIO の空きは 0 だから貴重。

  • 問題は、テストピン。外れたりすると面倒だから 配線をハンダ付けしてしまうかも。配線材は、ピンヘッダ用接続ケーブル[CB-PH10P-250] を切って使うつもり。

     - PDPDK24 の 20pin の空きパターン(1.0mm ピッチ)でハンダ付けしているのだが、線が太すぎてなかなか難しい。
     - ちょっと反則だが、
      
     これを切ってテストピン代わりに付けるか。
    - 強度が足りなかった。プローブ付けたらもげてしまった。
    - やはり ハンダ付けか。

追記:

    PDPDK24の分析練習は終了。ST7785 か そのあたりのコントローラのようだ。2Ah(CASET), 2Bh(RASET), 2Ch(RAMWR) の繰り返しで画面を更新している。

    picfun: 2.4/2.8インチ QVGA液晶表示器の制御 に、ILI9325 のライブラリがある。LCD が使えるかどうかのテストならこれを参考にしたほうが分かりやすい。

バスについて



  • ILI9325 で 16bit アクセスをする場合、DB17-10 が上位 8bit / DB8-1 が下位 8 bit 。ちなみに、8bit アクセスする場合 DB17-10 に接続し、上位→下位の順で 2 回 Write する。(8bit 用のコードを参考にするのに必要な情報)

    16bit アクセスすると 決め打ちしているが、IPU が使える条件は、32bit (R8G8B8) か 16bit(R5G6B5) しかない。IPU を使わないと 動画性能が落ちるのでかならず使っているはず。


追記:実際のコードを組んでみる。

RESET と CS は判ったので、コードを組みはじめることはできそうだ。(確認したのは、A-33 だが、A-41 も同じだと思う。)

で、A-41 は ILI9325 だと思うので、これ用のコードを検討する。

まずは、ILI9325AN -- アプリケーションノートにあるコードを見てみると ... いくつかのパネルに対してのコードが別々になっていた。

コードを比較してみると ..

  • 初期化の電圧設定 と ガンマ曲線の設定のみが違う。
     - 違うパネルのデータを使っても 表示だけはできそう。
  • ついでに ILI9326AN を見てみると、ILI9325 と手順はほぼ同じものの、レジスタのアドレスと値が違う。各パネルの違いは、ILI9325 と同じような感じ。

とりあえず、アプリケーションノートにあるコードを元にして picfun のコードを参考に プログラムを作成しようと思う。


ちょっといくつか ILI93xx の コマンドリファレンスを 切りだして 画像にしてみた。描画エリアと 描画方向を指定して データを連続で送る ... ということは出来ると思うのだが .. コマンド体系は同じように見えるが、それぞれコマンド自体は違うようだ。


    picfun のコード(ILI9325)だと、
    ST7785 での、2Ah(CASET), 2Bh(RASET), 2Ch(RAMWR)がそれぞれ
  • 0x20 : Horizontal GRAM Address Set
  • 0x21 : Vertical GRAM Address Set
  • 0x22 : Write DATA to GRAM
    に相当している。
    ILI9326/ILI9328 も同じだが、ILI9327 は、2A/2B/2C で ST7785 と同じ。

これだけで描画するというのもひとつの手だ。ただのテストなのだから 凝ったことをする必要はない。

GPIO のアクセス方法

    bit 単位の set/clear 関数はマクロにあるのだが、まとめてアクセスする関数は定義されていない。どのようにアクセスするものなのかまずはチェック

    • GPIO 関係の レジスタは、3 つ 1組みになっている。Read-only の xxx というレジスタに対して、Write-only の xxxS/xxxC というレジスタがある。機能は、該当ビットを 1 にする (xxxS) / 0 にする (xxxC)。-- 以下 xxxS/xxxC については省略して説明。
       - 複数bit の 値を 1 オペレーションで設定することはできない。
    • xxx は PAyy,PByy,PCyy .. とネーミングされているが、マクロは PXyy となっていて統一的に扱う。以下の説明でも PXyy を使う。
    • PXIN -- 入力に設定されたとき ピンの値が読める。
    • PXDAT -- 出力に設定されたときの GPIO の値。
    • PXFUN / PXSEL -- この 2 つで GPIO として使う設定になる。0/0 が GPIO 。
    • PXDIR -- GPIO の方向。1 で 出力。
    • PXPE -- pull-up または pull-down (PIN によって決まっている) の設定。0 で pull-up/pull-down。

      まとめ
    • 出力設定 PXFUN = 0 , PXSEL = 0 , PXDIR = 1
    • 入力設定 PXFUN = 0 , PXSEL = 0 , PXDIR = 0
    • 出力 H: PXDAT = 1 / L PXDAT = 0


delay について

    コードには、delayms など ms 単位での待ちをいれている。これをちゃんと実装しないと、まずそうだ。
    また、GPIO のアクセスで WR のパルス幅をコントロールしないといけない。適当に作ると 早すぎて コントローラの条件を満たさないかも知れない。

      USBBOOT では 228 MHz が デフォルトになっている。1 clock 4ns ぐらい。

    Linux のコードを参考にして、__delay(loops) と mdelay(ms) を作ろうと思う。具体的には、

      #define CPUCLOCK 228000000

      static inline void __delay(unsigned int loops)
      {
      __asm__ __volatile__ (
      " .set noreorder \n"
      " .align 3 \n"
      "1: bnez %0, 1b \n"
      " subu %0, 1 \n"
      " .set reorder \n"
      : "=r" (loops)
      : "0" (loops));
      }

      static inline void mdelay(unsigned int ms)
      {
      int i;
      for (i=0; i<ms; i++) {
      __delay(CPUCLOCK / 2000);
      }
      }

    これ。__delay の 1 loop は 2clock のようだ。




A-41 の LCD に表示できた。

  • WK11: usbboot-wk11.tar.gz

  • 16bit の ILI9325 用のコードで画面クリアが出来た。
     - 青、緑、赤で 全面の塗りつぶしも OK で、予想通り R5G6B5。

  • ただし、最初は安定しなかった。時々画面が白のままになる。
     - delay を増やすことで、正しくクリアできるようにはなった。

      タイミングのチェック:
    • CS/RS/データの確定後 10ns 待って WR を ↓。
    • 50ns 以上(500ns 以下)待って WR を ↑
    • 40ns 以上待って 次のステップ。

     - 追記: ILI_93XX_Reset() が適当だったので安定しないことがわかった。
      普通に clear/set するようにしたら 安定した。

  • フォントの描画コードも入れている。
     - 表示はできているが、現状は色がおかしい。
      → バグがわかった。
     - デバッグに利用できるのももうすぐ。
      → スクロール機能が必須。
  • ILI9326 用のコードも作ったので、A-33 でもやってみたいが、予備が届くまでおあづけかな。
     - バッテリー充電機能が不明なので、いちいちバッテリーを外している。これが面倒。
     - だが使えることを確認して安心したい。

A-33 も動いた。

  • WK12: usbboot-wk12.tar.gz

    結局、制御できるかどうか安心したくて、やってみることにした。

  • ILI9326 16bit インターフェイス用のコードが動くことが確認できた。初期化のコードは、アプリケーションノートから取ってきたものだが、他は、ILI9325 用のコードをベースに レジスタ番号を ILI9326 に合わせただけ。あっさり動作した。

  • 画面サイズは、横 240 x 縦 432 だった。(A-41 は 横 240 x 縦 320)

    これで一安心。

    Linux 移植でのデバッグでも 情報を画面に 残せるようなる。これをベースにして jz_ubcomm ドライバ に組み込む予定。(正規の SLCD ドライバは別途考える)

      A-41 から I2Cを引き出して LED を点灯できるようになったのだが、ほとんど使わないうちに いらなくなりそうだ。

      Neo Slim 3000 の方は、Smart LCD 接続でなく RGB インターフェイス。こうなると、A-41/A-33 で進めたほうが 良さそうだ。

      ところで、予備を everbuying で 2 つ 買っているのだが、売り切れで 1 つしか入手できないという連絡があった。結局差額を支払って A-32 にチェンジ。A-33 とだいたい同じ兄弟機のはずだし、中を見たいし、A-33 ほど安っぽくはないし .. まぁいいか。

    これで LCD制御はひとまず完了。

    • Linux で主に使うのは、フレームバッファの転送だけなので 凝った機能を使わない。SleepMode に入る/出る という機能もあるが、アプリケーションノートそのままだし。

    • いずれ P5-5 にも 手を付けると思うが、先のはなし。

    おまけ: ILI9325 メモ

    • R03h : Entry Mode
       (9326 では、R03h = R003h)

      D15/D14 : TRI/DFM = 00 → 65K mode
      D12 : BGR = 1 → swap R and R (??)
      D5/D4 : I/D = 11 → incliment/decliment:
                      V inc , H inc
      D3 : AM = 0 → update direction = Horizontal

      例:
      ILI93XX_CtrlWrite(0x03, 0x1030);


      TRI/DFM の設定で、16bit モードでも 256K Color の書き込みができる。ただし、2 回の書き込みが必要。(8bit モードでは、3回)

      BGR=1 と下記の REV=1 で、RGB データを逆順にできる。何故か逆順が 普通に R5G6B5 としてアクセスできる設定。

      重要なのが、I/D と AM 。データを書き込む方向を指定するもので、これを使えば画面を回転させられる。

    • R61h : Gate Scan Control
       (9326 では、R61h = R401h,R6Ah = R404h)

      D2 : NDL = 0 → Non-Display Area = black ?
      D1 : VLE = 0 → virtial scrolling = disabled
      D0 : REV = 1 → change endian

      例:
      ILI93XX_CtrlWrite(0x61, 0x0003);
      ILI93XX_CtrlWrite(0x6A, vscroll_base);


      NDL は、表示外エリアが白か黒かを指定するもの。
      REV は、それぞれ R,G,B の MSB の指定。

      VLE は、縦スクロールの許可。これを使えば長辺方向にスクロールできる。Linux の本来のドライバは、フレームバッファから転送するので必要ないが、デバッグでコンソールもどきにするとき欲しい機能。

      とりあえず Pixel 描画以外に、これだけ知っているだけで十分使える。

      あとガンマ曲線の設定を理解できれば、好みの色調に出来て嬉しいかも。

      それ以外で気になるのは...

    • R2BHh : Frame Rate
       (9326 では、R20Bh だが値の意味が違う)

      デフォルト 96 Hz だが、40 Hz まで落とせる。(9326 では、デフォルト 80 Hz / 最小 30 Hz)

      ひょっとして、フレームレートを下げると液晶本体の消費電力もかなり減ったりしないのだろうか? 一度調査してみたい。

    ちょっと修正。

    • WK13: usbboot-wk13.tar.gz

      上記の RESET の操作を修正。
      あと、exec コマンドを追加。0x80600000 にロードして go する簡易コマンド。

      まだ動いていないが、MinGW で動くように気がついたらコードを修正している。
posted by すz at 23:53| Comment(0) | TrackBack(0) | Jz47xx(USBBOOT)

2010年09月30日

A-41 写真集

解析用に写真を取り直した。コメントなどは、Aneca A-41の記事に書く。














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

2010年09月27日

P5-5 分解

P5-5 (PMP3100後継機)の記事の続き。

P5-5 を分解してみることにした。どうせ PMP-3100 と同じだろうと思っていたのだが随分違っていた。

まずは、おさらい。




    これが PMP-3100 の中身。CPU が Jz4725(無印)なのと、液晶側に 14pin の謎の IC(おそらくボタン用) があるのが特徴。-- 実をいうと こういうのを解析するのにロジアナが必須だと思いロジアナを買ったのだ。で、練習に分析してみようと思ったわけ。





これが、P5-5 の中身。基板の色が変わって SDRAM,FLASH の配置が変わっている。

そして、14pin の IC がなくなり代わりに 左上に 8pin の IC が付いた。そしてボタンへの配線が すごくシンプルになっている。



これが、そのあたりの写真。例によって 8pin IC の刻印が消されている。

    pin #8 は GND 。pin #1 は コンデンサがつながっているので VCC だと思う。... PIC のような気がする。
    それはともかく、6 本の I/O ピンでいったいをしているのだろう? ボタンという可能性はまだある。ADC があれば、多重化できる。(PIC なら ADCは pin #3,#5,#6,#7) -- ボタンの配線がシンプルになっているので 合っているかも。

T1 のマークが TxD 。その下の 平行な 2 本線が I2C(SCK,SDA の順)
あと、他の写真。



FM モジュールと イヤホンジャック周り。FMモジュールは、SP3767AHN の刻印。カップリングコンデンサが、47uF/10V になっている。

I2C(左から SCK,SDA の順)が平行なまま伸びてきていて、103(10KΩ)でプルアップされ FM モジュールに接続されている。



コイルがあるあたり。コイルとその近くの SOT23-5 は、core 電圧用。空きパターンは、バックライト電源の昇圧用?

T2 がある。これは何?



SOT23 がやたらあるところ。8pin ICはバッテリー制御用?

SOT23 の刻印は、M21 6620 MO 1AM(x2), あと SOT23-5 の LB26

下の A106 は(たぶん)タンタルコンデンサで 10uF 。その左上の黒いのはコイル? そしてコイルの先は LB26 の pin #1 。

8pin IC の刻印ははっきり見えるが、読めない。XX690M 。XX は 11 のような形をしているが 11 とは思えない。



最後に CPU 周り。一応。

部分写真は、はっきり刻印が撮れた。ちょっと A-41 とか A-33 もがんばってみよう。

ところで、スピーカーとバッテリーのケーブルは取ってしまった。
どこにつなぐのか忘れないようにメモ。

  • 左端中央 四角で囲んであるところ + がスピーカー(青) - がスピーカー(赤)。
  • 右端中央にも おなじような四角がある。おなじようにスピーカーを接続。
  • 左端の 四角の左。+とー が見える。これが バッテリー

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

2010年09月21日

SDRAM換装に挑戦

SDRAMの換装方法(案)という記事を書いたが、いよいよそれを実践してみようと思う。

予定では、

  • ターゲットは、A-41 。

  • 32MBを まずやって、いまくいけばもうひとつを 64MB 化する。

      不安材料は、工作技術以外には、電源。-- 16MB と比べれば 32MB,64MB は大食い。しかも A-41 はあまり電源は強くなさそう。

  • ケースから出さずに、バッテリーを外して作業するつもり

だったのだが...

まずは、SDRAM を外す作業。

興味から買っていて死蔵しているサンハヤトの表面実装部品取り外しキット SMD-21 を使う。

キットには、低音ハンダの他に特殊フラックスとハンダ吸い取り線が付いている。特殊フラックスは、注射器のようなタイプで、一回使った後の保存に不安があったので、今回は普通の無洗浄フラックスにしてみた。

両面テーブでLCDに貼られているバッテリーを外して作業するつもりだったのだが、両面テーブが強力でLCDを壊しかねないので、ケースから取り出して作業することにした。バッテリーは、電線を基板から外すだけにした。



外した後、低音ハンダを吸い取り、1回普通のハンダを盛ってまた吸い取っている。(低音ハンダを残さないようにするため。)

その後、アルコールを綿棒に付けて掃除した後の状態。

そういえば、A11 。16MB では NC の A11 の線があるかチェック .. 右下 (写真では 左下) から GND A4,A5,A6,A7,A8,A9,A11 .. 配線されている。大丈夫そうだ。



次に、aliexpress で購入した SDRAM の足が曲がっていないかチェック。-- OK そうだ。



これが、SDRAM を 付けた後。

付けようとしたときに、気がついたのだが、64MB だった。
まぁどうせ後で付けるんだからと思い、そのまま進めることにした。

ハンダ付けは、半田ごてで押さえるだけにした。

で、目視でチェックして、電源を入れてみた。

全然動かない。

原因が、ハンダ付け不良なのか、電源なのかもわからない。

切り分けるために USBBOOT を試すことにした。USBBOOT は、どんな回路でも動作するように、低クロックで立ち上がるはず。それで立ち上がるなら、電源が原因のはず。

.. ということで、ケースに一旦戻し やってみた。

... 中途半端に動く。USB は認識されるのだが、不明なデバイスになる。

たぶんハンダ付け不良。

それはともかく、バッテリーを外した状態で USB に挿して立ち上がるものなのかどうか確認していなかった。

というわけで、もうひとつもバラすことにした。

で、まず確認。-- 普通に立ち上がる。

ついでにこちらも換装してしまうことにした。



今回は、ランドに残すハンダを多めにしてみた。

    ところで、表面実装部品取り外しキットでは、16cm の低温ハンダ x 5 で、約1,500ピン分取り外しができることになっている。

    今回 2 つで 1 本の 1/2 ほど消費した。54pin x 2 だから 110 ピン (1/10 で 110 ピン) -- 少々使いすぎかもしれない。

    使いすぎると 低温ハンダの除去が面倒なのだ。少し慣れたから次回はもっと少なくできるだろう。

    2 つやってみての所感。

    とりはずしは、15W のハンダごてでやったが、特に問題なかった。問題はその後。ハンダ除去がなかなか 面倒。

    ハンダ除去後、とても汚くなる。残っているのかどうかもはっきりしないので、清掃は必須。綿棒とアルコール(手持ちの 無水エタノール)で十分だった。

    注意したことは、低温ハンダが 他のパーツにつかないようにすること。少々混み合っているので、角のところを 丁寧に。(ハンダ除去も)



一応チェック。今回は間違いなく 32MB 。

そしてハンダ付け -- ハンダ付け不良がないように念入りにすることにした。

で、電源を入れる。やっぱり動かない。何回かやってみたところ 1回だけ立ち上がった。

ハンダ付けが十分でなく、接触不良のようなことになっているのか? それともやはり電源なのか?

ケースに入れ USBBOOT をしてみたところ、ちゃんと 認識された。
何度かやってみたが、ここまでは問題ない。

... ケースに入れてしまったので まずは、どこまで動くのか確認しようと思う。

    stage1 は動く。その後の stage2 のロードは終わるが、制御を渡したあと帰ってこない。-- アドレス線 のどれかが 不良?

ちゃんと動くのであれば、電源を強化しなくてはならない。どう強化すべきなのかの参考にするため、記念写真。


(A-41 1号機 64MB)


(A-41 2号機 32MB)

電源IC について

    写真を良くみると .. MicroSD の左の SOT23-5 は A2IK 、コイルの下にある SOT23-5 は A18T と印字されている。

      コイルは、10uH 。周りにダイオードがない。
      同期整流タイプの電圧下降型 DC/DC には、TOREX
      XC9236A18CMR とか FAN5307S18 とか SC189 とかがある。
      いずれもピン配置は同じで

         (1) Vin Lx (5)
      (2) GND
      (3) EN Vout (4)

      たぶん、これもそうだろう。10uH を使っているということは、あまり高いスイッチング周波数ではなく 1MHz 台ではないか?

    A2IK は、G9091 ? (G9091 は、LOD で 最大 300mA もれ電流 65uA )。互換性があるのは XC6204 , XC6219 らしい。( 最大 300mA のタイプは 型番に E 〜 H が付く)

    出力は 5番ピンだから、そこの先 .. 右上の 大きめのコンデンサが出力につくコンデンサ。入力は 1 ピンで たぶん 左の 下から 2 番目の小さめなコンデンサが 入力に付くコンデンサ。

    A2IK が CPU, SDRAM をはじめとする 3.3V を供給しているのだろう。

    基板右下に SOT23 と SOT23-5 が見える。SOT23 は D2E と読めるが、SOT23-5 は写真ではわからないが T25a と印字されている。

    そして SOT23-5 の右のチップ、これだけ黒い -- コンデンサではなく コイルかも知れない。

    D2E は 1個入りダイオード(RB491D とか)。 SOT23-5 は LCD バックライト用の 昇圧型 DC/DC コンバータ IC かも知れない。

    近くに 4R7 がある。電流測定用? 他には 4.7K(472),10K(103) だけ。

    たとえば、FAN5333A なら、

       (1) SW Vin (5)
    (2) GND
    (3) FB /SHDN (4)

    というピン配置(他のICもこの配置が多い)。 (2) に GND が来ているように見えるし、(1) からダイオードの方に太めの線が伸びている。-- たぶん合っている。

    FB の電圧は、110mVで、4R7 だと 23mA 。

      だが ... そうなると リポ電池 充電用の IC はどこにある?

      SOT23-5 は、全部で 3 個あるが、どれも 充電用ではなさそうだ。バックライトの PWM はわざわざ RxD 機能兼用の PWM3 を使って 兼用機能のない PWM5 はなにか別の目的に使っている。... いやな予感がしてきた。

    • A-33 について:
      A33 にも 3 つの SOT23-5 の IC が付いている。ひとつはインダクタ(100) の横にあるやつで、D19m と印字されている。印字は違うが、1.8V 用以外にはありえない。あとのふたつは A2JB だった。ひとつは LED 専用のレギュレータ?
      -- それはともかく、双子のようなマシンだし やはり 充電用 IC は見つからない。
      相当に不安を感じる。どんな回路で充電しているのか解析しないと ..

    ついでなので、スピーカーアンプについて。SDRAM の左にある 8ピンのICがアンプ(BTL)。写真では全く印字が見えないが LN4890 らしい。これは、Neo Slim 3000 に載っている XPT4890 互換らしい。... といっても互換品は沢山あり、LM4890, TPA2005D1 など。

    さらについで。目立つ FMラジオの空きパターン。これのピン配置

    (5) GND 3.3V (6)
    (4) R-LINE W/R (7)
    (3) L-LINE MODE(L) (8)
    (2) NC SCL (9)
    (1) ANT SDA (10)

  • SCL/SDA が、2.2K(222) でプルアップされているようだ。少々低抵抗値 10K にすべきでは? (ちなみに、実際に FMラジオが付いている Neo Slim 3000 では 4.7K(472) でプルアップ。付いていない A-33 は プルアップのパターンだけ。)

    ちなみに、SCL/SDA は 4mA のクラスの I/O ピンで Typ. なら L 7.4mA / H 10.2mA 流せることになっている。... ここに LED を つなげて デバックするのも良いかも知れない。

  • I2C なら 8 番の MODE が L レベルになっているはず。ライン入力は、付けるデバイスから数字をとると 115 mVr(フルレンジとは限らない)。
  • 3.3V は、FET スイッチ 経由かも知れない。どれだけ電流を取れるか不明。
  • FM モジュールは、なぜか bottom view 基準で番号が付いていて、上下が逆になる。


32MB 化したマシン(2 号機、識別シール 黄色) が動いた !



写真を見ていたら、JZ4725B の足にハンダが 飛んでいた。
これを 細いものでゴリゴリして外したら ... 立ち上がった。

あとは、64MB 機 (1 号機 識別シール 緑) 。

写真を見ると、左側はハンダ付けされているように見えない。ハンダの盛りが少ないのに 押さえるだけなのは無理があった。( すこしランドに ハンダを盛っておけば良かった)

ハンダ付けをちゃんとすれば動くかも知れない。

    ちなみに .. 今回の電子工作は、かなりテキトーにやっている。それは、1回 2回の失敗ならまた買えばよいと思っているから。

    今回のような ショートが起きたら、IC が破壊されるかも知れない。失敗したくないなら、やはりちゃんとチェックすべき。

    今回はテキトーだといっても 一応 気を付けたことはある。ちょっと書いておくと

    • バッテリーは必ず外す。
      電源スイッチがあるといっても RTC は通電されている。今回のようにショートしたところが RTC 周りだと結構やばい。
    • 外す際、力をかけない
      ランドが剥がれたらもう失敗確定。決して力をかけて外さない。
    • SDRAM を付ける前に ランド間のブリッジをチェックする。
      ブリッジがあると SDRAM を付けたあとではどうにもならない。いまはデジカメがあるので、(ちゃんと撮れるなら)写真のほうがわかりやすい。
    • 清掃する。
      写真をとっても良くわからないかも知れないので、綺麗にしておく。
      よく見ると、ハンダが玉になって 基板に付いていたりする。こういうのを取っておくためにも、綿棒を使って綺麗にする。


64MB 化したマシン(1 号機、識別シール 緑) が動いた !


SDRAM のハンダをつけ直したら立ち上がった。ケースにいれたところ、また動かなくなったので、再度やりなおしたら動いた。ケースに入れても OK 。



実をいうと、バッテリーを取り付けるあたりが、ホットボンドで汚いので、地道に取り除いたりしていた。ついでに、FM モジュールのパターンにハンダを盛ったりも。



さらに水晶周りも、ゴム系の接着剤で汚かったので剥がしたりもしてた。写真では、32.768 が見えている。右の水晶は、12.000。ちょっとやりすぎて足が外れたりしたので、つけ直している。

12.000 の 刻印 は下向きにしてしまったので見えない。

このマシンを Linux の移植ベースにしようと思う。

.. とか書きつつも既にこんな状態




デバッグ用に 1608サイズLED(,)を付けた ボードを作り それに接続するつもり。

    よく考えたら、2.2K のプルアップが付いている。H レベルで点灯するようにすると プルアップで点灯してしまうかも知れない。
    それに、I2C は、Hi-Z と Lレベルで通信する。H レベルにするのは、まずいケースがあるかも知れない。。

    L で点灯するようにした。電流制限抵抗は、 300Ωにした。
    ( 3.3 - 1.7 ) / 300 : 5.3mA の計算なのだが、これでも明るすぎる。1KΩでも良いのかも知れない。


シリアル TxD は使わない。引き出すのは出来そうだが耐久性に難がある。あと、シリアルに頼らないデバッグに挑戦したい。

改造メモ

電子工作で、どんな改造をしてみたいかのメモ:

  • カップリング コンデンサ の付け替え (A-33)
    47uF を 100uF にする。
    低音が出るようになるか 見てみたい。
    P5-5 も 47uF でダメだが 抵抗の変更も合わせてする必要あり。

  • SDRAM 換装 (A-33)
    調子に載って A-33 も改造する。2 台の A-33 のうち 1 台は 32MB に。
    バッテリーのもちは、確実に悪くなるが Linux を動かしたい以上 やむを得ない。
    残り 1 個の 64MB は温存。Linux が動いたものの中で選択。

  • I2C のプルアップ抵抗の取り外し(A-41)
    忘れていた。A-41 の 2.2KΩ を 外して 10KΩにするか 、外したままにする。( A-33 は付いていない -- どうするか考えて統一しよう)

  • I2C 引き出し (P5-5)
    まずは、不明なFM ラジオモジュールの解析ができるか練習。
    うまくいけば、謎IC の解析にも挑戦。

  • SDRAM 換装 (8bit-64MBx2)
    これはあきらめてはいない。が、Linux が動き 実際に 64MB で不足するところまで来たら考える。
    候補は、2 段にするスペースがある P5-5 か A-33/A-41(新たに買うかも) 。(Neo Slim 3000は液晶が上に載るので無理)

  • E705A の USBBOOT アダプタ。
    買ってはみたが死蔵状態。USBBOOT は、USB デバイスの線を外に引き出さないと不可能。分解しなくとも 端子は出ている。この端子をどうやって引き出すか悩んでいたが、microSD/SDカード 変換を分解すると、使えそうな 端子が出てきた。
     - SDカードソケットの端子使ったほうが良いかも。ソケットは、100均 の SDカードリーダー分解しても取り出せる。

    これも PMPでLinuxが動いた後の話。


追記: ところで、増やした RAM は、オリジナルのファームウェアで役に立つのだろうか?

基本的には、役に立たない。なぜなら 汎用マシンではないからだ。搭載されているメモリで動作するように作られているわけだし、それ以上は使おうとしても使えない。

ただし、DISK のキャッシュ (PMPだから MicroSD/SDカードのキャッシュ)があり先読みしているとすれば、役に立つかもしれない。実際 MicroSD/SDカード から動画を再生すると、時々息継ぎみたいな現象が起きる。これが直ると嬉しいといえば嬉しい。

それはともかく、次のことをしなければ、使えるものも使えないだろう。

  • SDRAM の設定。Jz47xx では EMC に対して行う。設定しなければ、メモリは使えない。通常この処理は ブートローダの仕事。なぜならば、カーネルを ロードするために 必要だからだ。そして、設定を変えることはできない。
  • メモリ量の カーネルへの通知。カーネルによっては自分で調べるかも知れないのだが、通常そのような無駄なことはしない。もちろんブートローダの仕事。


さて、こういうことを調べるにはどうしたらよいのだろう?

まずは、ブートローダを逆アセンブルしなければならない。バイナリの逆アセンブルは厳しいので、一旦アセンブラを通す。

  • 適当な Cファイルを作って、-S オプションで アセンブラソースを作る。
  • バイナリを 変換する プログラム( or スクリプト)をつくり、
       .byte  0xXX,0xXX,0xXX ... 
    という形式にする。
  • 最初に作ったアセンブラソースの 中身を抜いて 変換したデータと入れ替える。
  • コンパイルして、mipsel-linux-objdump -d で逆アセンブルする。

こういう手順で作れるのだが ... それをどうやってみるのか?


  • EMC の BASE アドレス は、0xb3010000 である。
  • mips では 32bit を一度にロードすることはできず、

    lui 0x3b01

    という風にする。
  • 逆アセンブルしたものに対して 0x3b01 というパターンを探す。


探してみると A-41 では 9 ヶ所出てきた。... そういえば Neo Slim 3000 は 32MB だ。どうなっているのだろう? .. と思い見てみると ... 8 ヶ所。そのうち 前の 4ヶ所は アドレスが一致。

ソースのベースが同じなのだろう。設定自体は たぶん簡単で バッチも作れそう。... だが、カーネルへの通知は難しい。2 つのブートローダを完全に理解できれば、あるいは可能かも知れない。

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