2010年06月25日

Aneca A-41

focalprice.com で PMP を見ていると Neo slim 3000 と同じ画面のものがあるのに気がついた。

いろいろ見ているとどうも Aneca というところの製品が多い。

明らかに同じ画面なのが、A-33 , A-41, A-9 。ちょっとカスタマイズしただけっぽいのが、A-7 , A-32 。

    ちなみに Aneca のサイトを見てみると、A-32 には CPU が 4725B と書いてある。おそらく全部 Jz47xx なのだろう。タッチパネルでない安いモデルは、Jz4725 (か新しいのは Jz4725B) だろう。上位機はわからない。H.264 サポート してたら Jz4755 とかかも知れないが Ingenic に OTG はない。OTG と書いてあるのは違うのだろう。

    あと A-39 と A-57 は、RK2706 系列だそうだ。全部が J47xx ではないようだ。





これは、その中でも気になった Aneca A-41。 -- 33.8 ドルと安いのも良いのだが、2.4 inch でコンパクト(5cm x 9cm x 1cm) なのが良い。

電子工作のベースに都合がよさそうなので欲しくなった。

ちなみに、黒もあるのだが、メニューが違う。旧製品なのか?

    ところで、この A-41 をググってみると focalprice より安いところが見つかった。everbuying.com というところで A-41が 30.24 ドル。free-shipping なのは同じ。--- どうも Aneca 全般が安いようだ。-- 有名ではないようだからリスクはあるが、ここにしようかと思う。

    ちなみに A-33 というのも良さそう。400x240 で 4GB 内蔵で 33.93 ドル。4GB なら A-41 でも 33.81ドルだから お得な感じ。

      追記 10/10/15: everbuying は、A-41(2GB , 黒/ピンク) , A-33 とも売り切れた。

    もうひとつ気になるのは、A-56。 45.79 ドルとちょっと高めだが 400x240 タッチスクリーン。ひょっとして VX747 もどき? JZ4740 なら欲しい。-- これは違った RK2605A だった。

    追記: 結局注文したのだが、shipping のオプションに +10 ドルのやつと +15 ドルのやつがあった。free-shipping は 7 日〜 27日(だったか)かかるそうで船便かも知れない。

    とりあえず記録:
    6/25 注文
    6/30 shipped になり追跡番号が載った RTxxxxxxxxxHK (国際通常書留)
    7/2 日本郵便のサイトに追跡情報が載った 7/2 香港 で引き受け
    7/5 国際交換支店から発送
    7/6 国際交換支店に到着 -- 通関検査待ち
    7/8 受け取り


さて、最近こんなものばかり集めるようになってしまった。A-41 でいったい何がしたいのか? 良くわからなくなったので整理してみる。

CPU は Jz4725 , RAM は 8MB or 16MB を想定している。もし、CPU が違ったなら 以下は論外なので注意。

所有しているのは、Neo Slim 3000 と PMP-3100 。(A330 もあるが、とりあえずは 対象外)。ソフトを作って遊ぶにはこれらで十分なのだ。なのにもかかわらず違うものが欲しいわけだ。

不満のひとつは、外観がゲーム機だということ。全然別のことをしていても、ゲームをしているように見えるのがちょっと嫌。だから持ち歩くには、できたら タッチパネルタイプか MP3 タイプのほうが嬉しい。

なので、A-56 とか A-41 が気になった。--- これがたぶん いちばんの理由。

次の理由は、電子工作観点。外観がゲーム機だと ボタンのスペースの分基板が大きくなる。単なる CPU ボードとして見れば コンパクトなほうが嬉しい。

で、なにをしたいのか。

まずは、普通のPMP レベルの機能を組み込んだ装置に仕立てたい。そうしておけば、欲しい機能を自分で組み込めるし、チューニングしたりして より実用的にできたりする。Jz4725 クラスでも 360p の H.264 ぐらいは 表示できてもおかしくないはず。

次に入れたい機能は、アラーム時計の機能。これを入れるには、おそらくサスペンドをサポートした上で RTC の API を組み込まないといけない。回路的に サスペンドしても無意味なほど消費電流が多いかも知れないのだが ... まぁやってみないことには。

あと、PC 接続時の環境。普通電源 Off の状態で USB に接続すると勝手に電源が入る。このときに別の環境が立ち上がるようにしておいて、スタンドアローンのときとは違うものになるようにしたい。

たとえば PC に画面を飛ばす機能 ... これは PC から USB を介してメモリを抜ければ それで良いはず。DMA もできるはずで PMP 側に負荷はかからない。逆も簡単なはず。これを作るのに X やら VNC やらは使わない。できれば USBBOOT のプロトコルに仕込んで ブートローダでも使いたいところ。

あとキーボードも使えるようにするとか。で、このコネクションを壊さずに ネットワークとして接続できると 嬉しい。

まぁこういうのは、Neo Slim 3000 と共通だしそっちでやるかも。

電子工作観点だと まずはメモリの換装。256Mbit の SDRAM なら壊れた 玄箱から取ってこれる。8bit 幅の 512Mbit x2 はリスキーなので、その後。

あと BlueTooth は付けたい。シリアルで接続できるモジュールがお手軽で良さそうなのだが、シリアルが空いているとは限らない。空いていても信号を引き出せるとは限らないし悩ましいところ。それに装置の値段に吊り合わないぐらい高かったりするし。

    bluetooth は、wii 用が安い。それは こっちの記事に書いた。
    ただ、これが使えるようになったとしても問題がある。筐体に入れるスペースが全くない。裏蓋アルミだし、工夫するにも難しいところがある。ううむ。

ついでに書くと いろいろなセンサーも。I2C ならなんとかなりそうだし、こっちのほうがお手軽か。

CPU ボードとして見た場合、液晶を外すことになる。そうしないと十分な信号線を引き出せない。

    デバイスを bus に接続する場合、SRAM インターフェイスを使うものらしい。で SRAM インターフェイスは、ほとんど SDRAM と共用。CS1/CS2 を使って 切り分けるのだが CS1/CS2 も NAND FLASH と共用。 -- NAND FLASH を 2 個載せた場合は、この方法は使えないということだが、まぁ SDRAM のピンから 手配線で 信号線を 引き出したくはないので パス。

    LCD を使う場合は、Smart LCD を使うと write は、キューイング付きの DMA が使えて高速にできる。 read は GPIO を使うしかなく遅い。

    割り込みは、GPIO なら割り込みに設定できるらしく、心配いらない。

... まぁ CPU ボードとして使うには ちょっと I/O が貧弱で 高速なデバイスが使えそうにないのが残念。

しかし... 30.24 ドル(paipalのレートが 92円ぐらいだから 2800円弱) で バッテリーと LCD が付いた CPUボードが入手できるわけで、コストパフォーマンスはすごく良い。

    ちょっと taobao で検索してみた。ANECA ではヒットしないが、安耐克 で見つかった。

    2GB が 155 元/4GB が 200 元 だった(どちらも送料含まず)。1 元 15円とすると 2300円/ 3000円ぐらい。思ったよりは中国国内との価格差が小さい。... というか 4GB は逆転しているような。

    ところで、こちらのスペックには FM ラジオ( 87.5-108MHz)が載っている。-- すくなくとも I2C ( と linein ) は簡単に引き出せそうだ。

    ところで mahdi T552 265元 が気になる。
    4GB 4 inch 480x272 液晶 そして CPU は Jz4755 。

    ここのレビュー分解写真がある。jz4755 なのは 間違いない。

      売っているところをひとつ見つけた。ここ 値段は、$79.80 。Free shipping だが、 Registered Airmail $15.74 というのを見ると不安になる。Express Shipping (3-5 days) - $16.74 が良さそう。-- それはともかく 高い。もっと安いところはないものか。

      ちょっと計算してみた。
      taobao 代行業者の グッズエイト を通すと ... ( 265元 + 中国国内送料 約20元 + EMS送料 60元 ) x 15.5(元→円) + 手数料 500円 = 約 5800円。( これ以外に振込料金 )。

      一方、 ownta.com で Free shipping で妥協すると $79.80 x 83.5 = 約 6700円 。

      思ったほどは安くなかった。... だが、数種類のものをまとめ買いするなら 代行業者は格安かも。

    微星(msi) MT-V656 というのも Jz4755 だそうだ。3 inch で、4GB が 230 元。タッチパネルのように見えるがどこにも書いていないし、画面がボタンタイプと同じようだから違うのだろう。TV-OUT は 付いているし、H.264 は当然のようにサポートしている。

    ちなみに、タッチパネルの MT-V660 というのも出ているが、こちらは RK2806 。値段も 100 元以上高いようだ。

    .. なかなか色々あるようだが、1 万円近くなってしまうと Android のほうが良さそうに思えてくる。とりあえずは安物でいいか。

    MP4 プレイヤー と CPU の対応表を見つけた

    これを見ると、Jz47xx は少ない。


A-41 到着:

備品は、イヤホン、USB ケーブル、AC アダプタ(USB 口)

ちょっと使ってみた範囲では、Neo Slim 3000 とほぼ同じ。ただし ボタンの数が違うので操作性は違う。手持ちの H.264 FLV は 再生するが、やはり音ずれ。

ボタンの数は 5 つ (M , ←, →, II , VOL) -- クリック感がある。HOLD はない。電源スイッチ Off ですぐ切れるのも Neo Slim 3000 と同じ。

あと FM はメニューになかった。

電源OFF の状態で、M ボタンを押しながら PC の USB に挿し込むことで USBBOOT になった。デバイスは Jz4750 として見えているから Jz4725B だろう。

本体の裏蓋は アルミ。ネジ 1 つを外しスライドさせることで外せる。(microSD をいれていると引っかかる。注意)



メインボードは、全体の 3/5 ぐらいを占める。(サイズは 54mm x 45mm ) 空いているところはバッテリーのスペース(30mm)。あと、メインボードを U字型に切り取って スピーカが1つ はめ込まれている。

CPU は 予想通り Jz4725B 。メモリは W9812G6PH-6 (128M bit = 16MB) 。NAND FLASH は表からは見えない。

FM はモジュールを付けるためのパターンだけがあった。ここから I2C を引き出すのは簡単(なはず)。ただし I2C ではなく SPI での制御かも知れない。未確認なので 決めつけないほうが良いかも知れない。

    その他コメント:
    イヤホンジャックの近くに C107 とマークされた コンデンサが2つ載っている。カップリングコンデンサ 100uF 。値は十分で低音がでないという問題はなさそうだが、たぶん積層セラミックなので 音が歪む。 。-- 黒いパッケージでもタンタルがあることが分かった。そして 3216 / 6.3V は 100uF まである。例えば Rohm の TCTAL0J107M8R 10個で 840円。( ちなみに 47uF の TCA0J476M8R は、10個で 345円 -- だいぶ値段が違う。)

    5本の IC は、右下の 2つと、右上 スピーカーの下の 1 つ。あとスピーカーの左に 8本足。
    右下の2つのうち左のそばに インダクタがあることから これが主電源用(1.8V)の 電源IC だろう。右下の上は USB の近くだから たぶん充電制御用 IC 。右上のもうひとつは、たぶん LCD バックライト用 で、8 本足は スピーカーアンプ。

    それ以外には、3端子の IC がほとんどない。スピーカの下に 1 つ見えるだけ。-- これは何か分からない。ダイオードかも知れないし、レギュレータかも知れない。あるいは、スイッチの機能の MOS FET かも。マークが読めればだいたい判明するが、写真ではちゃんと写っていない。

    写真を撮り直した。
  • 1号機: 64MB 換装後の基板
  • 2号機: 32MB 換装後の基板
    部品がもうすこしはっきり見える。

    MicroSD の左の SOT23-5 は A2IK 、コイルの下にある SOT23-5 は A18T 。

      A2IK は、G9091 ? (G9091 は、LOD で 最大 300mA もれ電流 65uA )。互換性があるのは XC6204 , XC6219 らしい。( 最大 300mA のタイプは 型番に E 〜 H が付く)
      出力は 5番ピンだから、そこの先 .. 右上の 大きめのコンデンサが出力につくコンデンサ。入力は 1 ピンで たぶん 左の 下から 2 番目の小さめなコンデンサが 入力に付くコンデンサ。

      A18T はコイルが付いているし、数字から 1.8V の core 電圧用の 電圧下降型 DC/DC コンバータ IC 。

        周りにダイオードがないから たぶん同期整流型で、Torex XC9236 , Fairchild FAN5307 , Semtech SC189と同じ ピン配置。

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

      100uF の周り には、330 (33Ω) が 4 つある。あと 472(4.7K) が 2 つ。2 個セットの抵抗はこれぐらいか。




バッテリーは、3.7V/650mAH model:YZ453046 (43mm x 29mm) 。ケーブルが付いている基板の裏には、なにかチップが載っている。過放電保護ぐらいはしてそうだ。サイズがぴったりなので、将来交換するときに代替品を探すのに苦労するかも知れない。

    これを殻割りしたらどうかな。5cm x 3.3cm x 0.5cm だから 無理かも。でも、2.38 ドルだし試す価値はあるかも。
    あるいは これ 2.46 ドル 4.5cm x 3.8cm x 0.5cm -- こっちは幅がきつそう。
    置けるスペースは、最大 45mm x 30mm どちらも無理そう。

まぁこんなものだろう。JZ4725B なのはちょっと嬉しい。メモリは少ないが 必要なら交換するつもりだから無問題。

ところで 2.4 インチ LCD はどういう接続になっているのだろう? コントローラ内蔵の いわゆる Smart LCD なのだろうか?それとも Jz47xx では一般的な ビデオタイプなんだろうか?

これを調べるには まずメインボードを外さないといけない。

メインボードは、3 つのネジ穴があるが、ネジは 1 つしか付いていない。いいかげんだなと思いながらネジを外したが、取れる気配がない。よくよく見たら 基板に ツメが 左右 2 つあってそれで ケースに固定されていた。ちなみに基板はすごく薄い。0.8mm かそれ以下。

ツメを外したところ、LCD とバッテリーが付いたままで外れた。



ボタン周りをみたところ、予想どおり タクトスイッチだった。だが予想外なことに タクトスイッチの空きパターンが沢山ある。
○マークつきが 4 つあり、それと重なるように超小型のタクトスイッチのパターンも配置されている。

どうもいくつかの製品をカバーしているようだ。-- だが 2.4 inch の製品など他には無いような..

    同じ信号のボタンの配置を変えられるだけなら魅力はないが、もし使っていない信号が引き出されているなら 電子工作で使えるかも知れない。覚えておこう。

    その他のコメント:

    7002 とマークされた 3端子の IC と、t1A 99 と読める 3端子の IC が2つ使われている。7002 は Nch MOS FET の 2N7002 ? t1A は、NPN Tr ?




さて液晶側を見てみる。液晶の裏は、薄いシートが貼ってあるだけ。バックライトの光が透き通るところから(まともな)反射板ですらない。

そこにバッテリーが(相当に強力な)両面テープで貼りつけてある。剥がすと シートが剥がれそうなので、ちょっと浮かして覗くぐらいにしておいた。

LCD は例によって 0.8mm ピッチのコネクタが基板に直付け。pin 数は 40pin 以下のようだ。たぶん 36 pin 。

    思い出した。2.4 inch のフォトフレームに付いていた
    AF240E1-36B V2.0(R1) DOU // AF240E1-36C V1.0(R2) DOU
    と同じようなものかも知れない。結局ピン配置は分からなかったし機能も分からなかった。
    そういえば、そのとき見つけた "Universal Firmware" というやつは、LCD の型番じゃなく コントローラのID を入力していた。
    動くように接続されているわけだから 事情は同じかも知れない。
    ふうむ。型番らしきものはフレキにあったから、それをメモって コントローラのID を知ることが最初のステップか。

    これと同じっぽい。型番の一部しか覚えていないのだが ...240T36... となってた。そうか 9325 なのか。

    ちなみに、9325 とは、ILI9325 のこと。aitendo で売ってた TFT液晶モジュール(2.4"/Touch付き) もコントローラ自体は同じ。ただしピン配置が違うし、使える機能も違う(はず)。

    36pin タイプの データシートが見つかった。型番は、"MB-TFT-24-S3D-S", "TS024HAADD02-00", "MI0240JT" ググレば 見つかるはず。


    1-3 NC
    4 IM3(0: 16bit 1:18bit)
    5 NC
    6 RESET
    7 VSYNC
    8 HSYNC
    9 DOTCLK
    10 DEN (0: enable RGB interface )
    11-28 Data bus (DB17-DB0)
    29 RD
    30 WR
    31 RS
    32 CS
    33 GND
    34 VCC
    35 LED_K
    36 LED_A

  • 3 つデータシートを見つけてどれも同じなので、間違いなさそう。
  • 1-3,5 pin の NC は、果たしてそうなのかどうか ... 。IM0-IM2 が割当たっていてもおかしくない。... とか思ったが、写真を見れば、シルクでの説明付きのジャンパが。
  • ポイントは DEN で、Smart LCD と ビデオタイプの動作を切り替える。
  • ちなみに LED は 4直列 とかで高電圧。

  • Smart LCD 制御ということは分かった。-- それならば、LCD の CS/RESET が分れば制御できる。テスターで調べたところ
     LCD RESET = 102 PD23 LCD_SPL(LCD)
     LCD CS = 103 PD22 LCD_CLS(LCD)
    だということが分かった。

  • 追記:写真を取り直した。


    chiprise Ver.AC / Date:10/02/02 / Project:XA2418

    と印字されている。これが基板のバージョン。ググると chiprise は様々な PMP で 見られるみたいだ。実際にボードを設計・製造しているメーカー?

    それはともかく、その上の配線パターン。付き合わせると VSYNC/HSYNC/DOTCLK が くっついていて、WR/RS/CS がちゃんと配線されている。... ということは SmartLCD だ。ちなみに DB16/DB17/RD もくっついている。

    どうやって初期化するのか調べる必要がある。ILI9325 or ILI9328 が有力だが、他のコントローラかも知れない。


そんなことより驚いたのが、NAND FLASH 。1 個しか付いていないのだが、2個目のパターンがあって 端子が スピーカーをまたいでいる。-- 要するに IC の端子の間の部分が切り取られている。ひょっとして、2 個使う製品では U 字型には切り抜かないのだろうか?



追記: バッテリーのケーブルを外せば 開くことができる。開いたので記念写真。汚れがひどいので 一応清掃。



こちらは 2 台目。違う液晶が使われていた。

ちょっと SXD0002 でググってみたら、aj262_v9 2010.1.13 というボードに使われていたことが分かった。さらに aj262_v9 2010.1.13 と FPC でググると ..

aj262-v8 LCD: FPC-TTHJ17UO - 9328

というのが見つかった。まぁよくわからないが、とりあえず ILI9328 を仮定しておこう。(コントローラが重要なのは SmartLCD 接続のとき )

ちょっと USBBOOT してみる

usbboot :> nquery 0 0
CPU data: Boot4750
ID of No.0 device No.0 flash:
Vendor ID :0xec
Product ID :0xd5
Chip ID :0x14
Page ID :0xb6
Plane ID :0x74
Operation status: Success!

まぁこれは 4K Page の K9XXG08UXM であることを示している。

次にボタン

usbboot :> gpior
gpio_read:
CPU data: Boot4750
PAPIN: 00000000
PBPIN: 823f7d0c
PCPIN: ffdfdcff
PDPIN: ffffffff
--- M button ---
usbboot :> gpior
gpio_read:
CPU data: Boot4750
PAPIN: 00000000
PBPIN: 823f7c6c
PCPIN: 7fdfdcff
PDPIN: ffdfffff
---- > button ---
usbboot :> gpior
gpio_read:
CPU data: Boot4750
PAPIN: 00000000
PBPIN: 023f758c
PCPIN: ffdfdcff
PDPIN: fffdffff
---- < button ----
usbboot :> gpior
gpio_read:
CPU data: Boot4750
PAPIN: 00000000
PBPIN: 823f766c
PCPIN: ffdfdcff
PDPIN: fffdffff
--- II buttun ---
usbboot :> gpior
gpio_read:
CPU data: Boot4750
PAPIN: 00000000
PBPIN: 023f7c2c
PCPIN: ffdfdcff
PDPIN: ffffffff
--- VOL button ----
usbboot :> gpior
gpio_read:
CPU data: Boot4750
PAPIN: 00000000
PBPIN: 823f7d8c
PCPIN: ffdfdcff
PDPIN: fffdffff

うーん実を言うと良くわからない。

PB31 WKUP(RTC) が 1 → 0 : > と II
PC31 BOOT_SEL1(USB-BOOT 設定)が 1 → 0 : M
PD17 LCD_D17(LCD) が 1 → 0 : < と > と VOL
PD21 LCD_DE(LCD) が 1 → 0 : M

なんか マトリックスになっているような感じ。マトリックスなら片側が 出力でないと わからないだろうし ...

それにしても ... WKUP をうまく絡めて来るな。

LCD のバックライト

    PCPIN: ffdfdcff

    で、PC15-11 は、1101 となっているわけだ。

    PC13 だけ L になっているので怪しいと見て

    gpios 77 0

    としたところ (77 は PC (32 x 2) + 13 ) バックライトが点灯した。

    で、この PC13 の機能は、UART_RxD 。UART は使えないということ。逆に考えると UART_RxD まで使っているということは、空いているポートはないのかも知れない。


センス系。

    よくよく考えると microSD の抜き差し や イヤホンの抜き差しを 検出するのに PORT を使っているはずで、これは簡単に 特定できる。先に 調べておいたほうが良さそうだ。


    micro SD あり PCPIN: ffcfdcff
    micro SD なし PCPIN: ffdfdcff

    イヤホンあり PDPIN: fdffffff
    イヤホンなし PDPIN: ffffffff

    これで

    microSD あり: WAIT/PC20 が L レベル
    イヤホンあり: LCD_REV/PD25 が L レベル

    というのが判明した。


ボタンの解析その2

    上記の結果ボタンを押すとなにか変化があるポートは、BOOT_SEL1 を除くと

    PB31 WKUP(RTC) が 1 → 0 : > と II
    PD17 LCD_D17(LCD) が 1 → 0 : < と > と VOL
    PD21 LCD_DE(LCD) が 1 → 0 : M

    それを除いた候補のポートは、

    48 PC15 PWM5/A18(SRAM) (出力では?)
    102 PD23 LCD_SPL(LCD)
    103 PD22 LCD_CLS(LCD)
    107 PD24 LCD_PS(LCD)
    112 PD16 LCD_D16(LCD)

    いろいろなパターンを試してみたのだが、M を押すと いつでも PD21 が L になっている。-- たぶん M は専用 PORT なのだろう。

    PB31 WKUP(RTC) も II を押すといつでも L 。これも専用なのだろう。( >で変化すると書いたが間違い )

    のこるボタンは 3 つのみ。
    この 3 つの何を押しても PD17 が L になる。

    変化する以上ボタンに関係するのは確かだが、どういう意味があるのだろう?

    もしや ... PD17 は共通出力で 出力 H にすべきなのを 出力にしていないから、スイッチに負けて L になっているのではないか?

    だとすると、PD17 を 出力 H にすれば、なにか変化するはず ... と思ったのだが、なにも PORT は変化しない。よもや、ADC で受けているとか。--- ADC は 2 つあって 1つはバッテリーの電圧測定と決まっているが、もう1つは未使用のはず。

    これもまぁいいや。2 つ分かっただけでも収穫。-- デバッグに利用できる。

バッテリー充電回路の謎

    (写真は、A41写真集を参照)
    表側の写真で 5pin 以上の IC が何に使われているか見当が付いたのだが、その中に バッテリー充電用 IC は含まれていない。バッテリー充電用の回路すら表側にはなさそうな感じ。

    専用IC なら なにもしなくても充電されるので安心なのだが ... 使っていないとなると、どうやって充電しているのか調べる必要あある。

    で、裏側(液晶面)の写真を見ると ... SOT23 が 4 つある。左から A5sSH , t1A(99) , t1A(99), 7002 。

    A5sSH の資料は見つからなかったのだが、A1sSH = AO3401, A2sSH = AO3402 らしいのだ。そうすると A5sSH は AO3405 かも知れない。AO3405 は Pch MOS FET 。

    t1A(99) は、たぶん 1A だけ読んで 一般的な NPN Tr 。

    7002 は 2N7002 (Nch MOS FET) ?

    まぁよく分からないのだが、充電を On/Off できるとすれば、Pch MOS FET が必要で、A5sSH が怪しい。... そうだとして、PORT は何が割りあたるのか? PWM できる ピンを使うのではないか? だとすれば PWM5 ?

    あと気になるのが、USB 横の ダイオード(S4) + 1R5 。安物のフォトフレームは、ダイオード + 4R7 という簡易充電回路で、常に充電するしろものだった。これは、満充電が検出できるから 充電を Off できるはずなのだが、充電そのものは、ダイオード(S4) + 1R5 なのかも知れない。

    あと、満充電が検出できるためには、充電中は、バッテリーを使用しないのが条件のはず。これは バッテリー と 外部電源に それぞれダイオードが入っていれば実現できる。

      A-33 について
      A-33 も兄弟機なので 同じような感じ。ただし表にほとんど載っている。

      8pin 4890
      SOT23-5 A2JB A2JB D19m(+インダクタ)
      SOT23 7002 A5sSH t1A(99) , t1A(99)裏





A-41 JZ4725B ピンアサイン表 (作成中)

凡例 : x 割り当てに選択の余地がないピン
o A-41 固有の割り当てで判明したピン
. A-41 固有の割り当てだが不明なピン
? 不明なピン

Jz4725B

? 2 PD18 LCD_PCK(LCD)

? 48 PC15 PWM5

o 54 PC20 WAIT(SRAM)
x 55 PC22 CS2/MSC0_D3

o 57 PC13 PWM3/UART0_RxD(UART)
o 58 PC12 PWM2/UART0_TxD(UART)
o 59 PC11 PWM1/I2C_SCK(I2C)
o 60 PC10 PWM0/I2C_SDA(I2C)

o 85 PB31 WKUP(RTC)

x 100 BOOT_SEL0
x 101 BOOT_SEL1
o 102 PD23 LCD_SPL(LCD) (LCD RESET)
o 103 PD22 LCD_CLS(LCD) (LCD CE)

o 105 PD25 LCD_REV(LCD)

? 107 PD24 LCD_PS(LCD)
x 108 PD20 LCD_VSYNC(LCD) = SLCD WR
x 109 PD19 LCD_HSYNC(LCD) = SCLD RS
? 110 PD18 LCD_DE(LCD) (SPEAKER ?)
. 111 PD17 LCD_D17(LCD)
? 112 PD16 LCD_D16(LCD)



A-41 JZ4725B 判明ピン
バックライト:
o 57 PC13 PWM3/UART0_RxD(UART) H で ON
イヤホンセンス:
o 105 PD25 LCD_REV(LCD) L でイヤホンあり
microSD センス:
o 54 PC20 WAIT(SRAM) L で microSD あり
ボタン "M"
o PD21 LCD_DE(LCD) 押し下げで L
ボタン "II"
PB31 WKUP(RTC) 押し下げで L
LCD RESET :
PD23 LCD_SPL(LCD) SLCD インターフェイス
LCD CS :
PD22 LCD_CLS(LCD) SLCD インターフェイス
SPEAKER :
PD18 LCD_DE(LCD) (? A-33 と同じなら)
JZ4725B 調査対象ピン

制御候補

? 48 PC15 PWM5/A18(SRAM)

専用機能
o 57 PC13 PWM3/UART0_RxD(UART)
o 58 PC12 PWM2/UART0_TxD(UART)
o 59 PC11 PWM1/I2C_SCK(I2C)
o 60 PC10 PWM0/I2C_SDA(I2C)
? 68 ADIN1

電源制御
x 84 PPRST(RTC)
o 85 PB31 WKUP(RTC)
x 86 PWRON(RTC)

GPIO 候補
o 54 PC20 WAIT(SRAM)
o 102 PD23 LCD_SPL(LCD)
o 103 PD22 LCD_CLS(LCD)
o 105 PD25 LCD_REV(LCD)
? 107 PD24 LCD_PS(LCD)
? 110 PD18 LCD_DE(LCD) (SPEAKER ?)
. 111 PD17 LCD_D17(LCD)
? 112 PD16 LCD_D16(LCD)

関連記事:
posted by すz at 18:25| Comment(0) | TrackBack(0) | Jz47xx(機種解析)

2010年06月20日

SDRAMの換装方法(案)

Neo Slim 3000 でいろいろ遊ぶ計画はちっとも進んでいないのだが、また横道にそれて、メモリを増やすために SDRAM を換装する方法を検討してみた。

Neo Slim 3000 では 16bit 幅の 256Mbit SDRAM を 1つ使っている。

メモリを増やすためには、もとのを取り除いて 512Mbit SDRAM を付ければ良いわけなのだが、生憎 16bit 幅のメモリは高価(1個3000円以上)なうえに入手が難しい。NOTE-PC 用の PC133 SO-SIMM 512MB なら 3000 円程度で 入手できたのだが、8bit 幅。

これをなんとか使えると 32MB を 128MB まで増設できるのだが、どう配線するのか?



配線を示したのがこれ。赤と青のピンが 16bit 品の データバス。青のピンが 8bit 品の データバス。-- 親子にして、上になった SDRAM の 青を 赤のところにジャンパすれば良い。

具体的には

  • まず下になる SDRAM は、そのまま普通に付ける。

  • 上になる SDRAM の青のピンを水平になるように曲げる。
  • >のこりのピンは下と接触するように ランドを垂直にする。
    注意: 根元から曲げないこと、簡単にもげてしまう。ニッパで挟んで曲がっているピンを伸ばす。あと、曲げなくても出来そうなら曲げない方が良い。

  • 青以外を 下のピンにハンダ付け

  • 青を 赤のところにジャンパ


たぶんこうすれば OK 。SDRAM は 0.8mm ピッチで他と比べれば工作が容易。配線も単純だし、私でも出来そうな気がしている。

追記: あ、ダメかも知れない。DQM を無視していた。これでいけるのは、16bit 単位の read/write しかしない場合。(8bit 単位でアクセスできるようにするには ちょっと面倒)。 データシートを確認しなくては。

    と言うか普通にダメだ。これで無理やり動かすには、DMA を含めてすべてのバイトアクセスを排除しないと。-- メモリのキャッシュ経由のアクセスだけはバイトアクセスがないことを保証できるから、不可能ではないかも知れない。カーネル内部の(DMA を含む)メモリアクセスの範囲に限られるはず。

    でも、Low バイトと High バイトを分けて配線するのは極端に難しい。上、下、基板の3層を引き出して全部違うところに配線しなければならない場所がある。-- 私には無理だな。

    ではカーネルの方をなんとかする方針で検討してみよう。

    ところで、DQM は、UDQM の方に接続されている。16bit アクセス時は LDQM = UDQM だから read/write ともに問題ない。

    High バイトの Read では Low バイトのデータが 出力されてしまうが問題ないはず。Low バイトの Read では出力されないわけだから 正しく読めない。
    あと、High バイトの Write は Low バイトに違うデータが書きこまれ、Low バイトの write はデータが書き込まれない。

    こんな感じで、Write は、16bit 単位で書くしかない。ただ read はどうだろう。無駄にデータが出力されるだけだから 8bit アクセスが出来るようにできないだろうか? データシートを読んでいてもよくわからないのだが L 固定ではダメなのだろうか?

    なぜ気にするかと言うと IPU 。RGB の output は 16bit/32bit で問題ないはずなのだが 入力が 8bpp なので バイトアクセスが発生する心配がある。最適化してあれば 32bit アクセスしかしないと思うが分からない。

    ううむ。これは実験して確かめないとマズそうだ。

    -- ちょっとデータシートをチェックしてみた。

    DMA コントローラ:
     転送単位 8/16/32 bit, 16/32 byte (TSZ)
    利用する装置:UART,SSI,MSC(MMC/SD),AIC(AC97/I2S),TCU(タイマ),SADC(オーディオADC),SLCD(Smart LCD)

      転送幅が 8bit のものだけ grep してチェックすれば良さそう。
       DMC コントローラを利用しないのは、IPU。

      8-bit が関係するのは、DP/SP/TSZ のみ で、DP/SP は装置のポート幅だから関係ない。

      Linuxでの定義は、DMAC_DCMD_DS_8BIT 。

      これを使っているのは、ヘッダファイルの中では、
      DMA_8BIT_TX_CMD , DMA_8BIT_RX_CMD , DMA_16BYTE_TX_CMD, と __dmac_channel_set_transfer_unit_8bit() だけ。

      DMA_8BIT_TX_CMD/DMA_8BIT_RX_CMD はシリアルだからちょっと置いておいて .. __dmac_channel_set_transfer_unit_8bit() を使っている装置は、... sound/oss/jz_pcm_tlv320aic1106_dma.c だけだった。

      C ソースコードの中で、DMAC_DCMD_DS_8BIT を使っているのは dma.c で jz_set_dma_block_size() 。

      この関数を使っているのは、sound/oss/jz_ac97.c

      これは、AIC(AC97/I2C) を使うから Jz4725B は関係ない。

      シリアルは、ちょっと複雑。モードによって 8bit を使ったり使わなかったりするようだ。... たぶん、使うのだろう。

      結論としては、シリアルを使わないように config を設定した カーネルなら大丈夫(だろう)



ところで、こうやってメモリを増やしても 自動的に認識するわけではない。使えるように SDRAM の設定をして やらないといけない。なにもしないと(立ち上がらないということはないと思うが)、換装前のメモリしか認識しない。

SDRAM の設定をしているのがカーネルならカーネルを対応したものに置き換えないといけない。

この改造を 分解したり、文鎮になったりした Neo slim 3000 1号機にたいしてやってみようと思っている。

    その前に PMP-3100 で実験するかも。 あと A320/A330 などは 2 つの SDRAM を使っているので 256MB になる。 やってみて簡単ならトライするかも。



ところで、IC を外すには、サンハヤトの表面実装部品取り外しキット SMD-21 を使う。このキットも高価だが興味から既に買っていて死蔵しているので問題ない。

ただ注意点がある。

「ハンダ付け(半田付け)職人の はんだ付けblog」を見ると、低温ハンダで使われているビスマスは、もろくてクラックの原因になるそうだ。できればコテ先も使い分けした方が良いとのこと。当然だが、取り外した部品に付いた低温ハンダもできるだけ取り除いた方が良い。

なかなか面倒な話だが、まぁやってみようと思う。

追記: K4S511632D-UC75 2 個 と EM63A165TS-6G 10 個入手。

K4S511632D-UC75 は、64MB 133MHz 。 EM63A165TS-6G は 32MB 166MHz 。

SDRAM の数は十分になった。8bit x 2 の換装は諦めていないが、Linux を動かして よく理解した後にしようと思う。

最初は、簡単そうなので練習したい。使うのは当然 32MB の方。



Neo Slim 3000 は、ピンの周りが空いていて 簡単そうなのだが .. すでに 32MB だから除外。(しかも EM63A165TS-6G が既に載っている)



PMP3100 または P5-5 は、ピンのそばのチップが邪魔。裏蓋を開けただけの状態で 換装ができそうなのがメリット。

唯一の Jz4725(無印) である PMP3100 は カーネルを作るつもりはなく、換装しても無意味。P5-5 は いずれ Linux を動かすつもりなので、意味はある。

    P5-5/PMP3100 では、ボタン用に専用の IC を使っている。通信プロトコルの解析は、ファームウェアが動いている状態でロジアナをつなげないと無理(なはず)。

    ... そうなると ロジアナを当てるまでは無理なことはできない。
    後回しにするか ... もしくは PMP3100 で練習だけするか。

    あと Linux の P5-5 対応が終われば、PMP3100(Jz4725) 対応は、難しくはないのかも知れない。オリジナルカーネルの機能で変更するのは、MSC1(MMC/SD) の 1 bit インターフェイス対応ぐらい。でも、プライオリティは最低なのだ。



A-41 は、片方が基板の端だし 簡単そう。邪魔なバッテリーは LCD に貼りつけてあって剥がすのがやっかいなのだが、裏蓋を開けた状態で 換装できそう。( ちなみにボードを外しても液晶が付いてくるので 特に換装が簡単にはならない ) 。それに、Linux の移植は、A-33/A-41 を優先する予定で 意味もある。



A-41 も一見簡単そうに見える。が、ケースが邪魔なので 一旦ボードを外さないといけない(と思う)。... 経験を積めばあるいは簡単なのかも知れないが。

リスクについて

16MB しか載っていない PMP だと アドレス線 A12(pin 18) が配線されていないかも知れない。多分そんなことはないと思うのだが ... 確認してみないことには安心できない。

    たぶん、Jz4725B(pin 18) から (とにかく)線が出ているか、SDRAM に (とにかく)接続されていることが確認できれば、よいはず。


あと、8bit x 2 だと オリジナルの ファームウェアは動かない。それは良いのだが .. 電力的にも不安がある。

SDRAM は結構大食いで、EM63A165TS を例にとると operating current(burst mode) が 160mA も使う。Active Stand by でも 30mA (?) 。Self Refresh Mode に入ってようやく 3mA 。power-down mode にすると 1-2 mA 。2 chip になると x2 。A-41 に使われている (W9812G6PH に近い) W9812G6IH だと operating current(burst mode)が 120mA 。160mA でも随分増えているのに 320mA にもなったら果たして供給できるのだろうか?

K4S511632D-UC75 も調べてみた。operating current(burst mode) が 220mA と大分増えている。さらに refresh の瞬間は 400mA だそうだ。

入手した SO-DIMM に載っている 8bit 幅 512Mbit の SDRAM は、HYB39S512800A 。データシート(HYB39S512800AT) では、burst 145mA / Refresh 300mA @133MHz で少し少ないようだ。( ただし、burst は同じ測定項目ではない。1bank 4burst。 )

    A-41 の写真を見ると 小さめのコイルが 1 つしか見えない。それは 1.8V の core 用 のはず。 バックライト用がないことになるが、昇圧が必要ないのかも知れない。SDRAM も使う 3.3V は レギュレータなのだろうか?

    A-33 は、大きいのと小さいのが1つづつ。表示面積が大きいからバックライト用も 普通のタイプになったのだろう。やはり 3.3V はレギュレータだと思う。

    Neo Slim 3000 は裏に 2 個のコイルだが、core 用と バックライト用なのは ほぼ明らか。PMP3100 もコイルは 1 個。-- バックライトは昇圧が必要なかったような気がする。

    いずれも SOT23 サイズのレギュレータだとすると ... 200mA あたりが上限かも知れない。-- かなり不安になってきた。8bit x 2 など不安定でまともに動かないかも知れない。

    上記の電流値はすべて、4 bank 同時アクセスの最大電流。Jz47xx は、バンクを切り替えての使い方しかしないと思うので、少し減る。(EM63A165 だと 130mA/160mA) ... あまり安心材料にはならないが。
    ちなみに、上記は メモリ負荷最大のときの消費電流。平均消費電流は、メモリ負荷が下がれば減るし、クロック(Linux で負荷に応じて動的に変更できる)が下がっても減る。 

計画を見直す

    まず、8bit x 2 について

    -- 3.3V 電源 を強化しないといけないかも知れない。それができるスペースがあるのは、P5-5/PMP3100 と Neo Slim 3000 だが ... 放熱まで考慮するなら P5-5/PMP3100 が良さそう。

    64MB 化

    -- A-33/A-41 に対して 1 回試してみたい。

    32MB 化が成功したら、もうひとつの方でトライする。

    使ってみて不安定なら、外して Neo Slim 3000 に付けてみる。

    32MB 化 -- 上記の予定がないものに対して行う。A-33/A-41 でまずやってみる。(練習なし)

    EM63A165TS-6G を使う 32MB 化のマシンが 一番オーバクロック耐性が高いはず。持ち歩いて 動画を再生したい A-33/A-41 に向いている。

    64MB 化すると メモリは増える。開発マシンとして使うが、8bit x 2 の 128MB 化ができればそちらに移行する。だからつなぎかも知れない。


追記:入手した SDRAM を アルミホイルに貼り付けた。



左下の 2 つが 512Mb(64MB) 右下の 1 つは、静電気たっぷりな所に 一回落とした。

よく見ると、足が曲がっていたりするし、先端が欠けているように見えるところがある。(根元から取れているのはないようだ)。-- 写真では分からない。

矯正しないとまずそうだし、なくなってもかまわない (NC もしくは電源 PIN) かどうか確認しておかないと。

ちなみに、矯正できたかどうかは、変換基板 AE-SOP-56に当てて確認しようかと思う。




追記: 換装用 SDRAM の 入手について

512Mbit(16bit 幅) -- 高価か入手が難しい

  • デジキーで買うと ... MT48LC32M16A2P が 3317円。

  • バッファローの microDIMM MS133-128MY



    これが、K4S511632D を使っているらしい。ただ、最安値でも 6000円ぐらい。(価格上のメリットがない)

    (一般的に言って)最近は 容量が少ない BGA タイプ を多数載せるようになってきている。モデルチェンジしているかも知れないので 注意。

  • aliexpress

    一時期 aliexpress で 512Mbit の SDRAM を安く売っている shop があった。

    という値段付けで、2 個までなら $9 で入手できた。が、今は店を閉じているようだ。

  • taobao

    taobao を見ていると MT48LC32M16A2P を安く 扱っているところはある。だが、海外発送とか送金の点で利用が難しい。

512Mbit(8bit 幅) -- SO-DIMM から外す

    256MB PC133 の SO-DIMM は、8 chip しか載っていないから 8bit 幅で 512Mbit なのは確実 (ただし BGA 搭載タイプを除く)

  • これを日本で買うと 最安値が 3000円ぐらい。

  • ebay だと 送料無料で 20ドルぐらいである。

256Mbit(16bit 幅) -- 一般的で入手可能

    SDRAM のクロックは、普通 CPU_CLOCK の 1/3 。400MHz なら 133MHz 。CPU を 400MHz 以上に オーバクロックさせて動かすなら 143MHz 品か 166MHz 品が安心で、256Mbit は、143MHz/166MHz 品も入手できる。

  • デジキーで買う
    IS42S16160B-7TL が 143MHz で 951 円。-- 結構高い。

    US なら W9825G6JH-6 が 5ドル弱である。

    ただ、HYB39S256160FE が買えると 安いはず。(買えないが)

  • aliexpress
    チップを扱っているショップが 1つだけある。

posted by すz at 00:56| Comment(116) | TrackBack(0) | Jz47xx

2010年06月07日

IPUメモ

Jz47xx には IPU (Image Process Unit) というデバイスが付いている。これでいったいどういうことができるのかについてメモ。

簡単にいうと YCrCb のようなフォーマットのイメージデータを 拡大縮小し RGB に変換して転送する装置。これがあると高速化されるのは、mplayer のような動画ソフトと jpeg のデコード。

この処理は 3 つのデータに係数をかけて加算する処理を RGB の 3つに対して行うわけでかなり重い。さらに画面サイズに合わせて拡大縮小するとなれば 相当な処理量だ。これをハードウェアで行わせることが出来るわけでかなり嬉しい機能。

    ちょっと見積もってみよう。仮に 400x226@30fps の動画があったとすると、4MB/sec で YCrCb のデータができる。これを 16bpp の フレームバッファに書くとすれば 5.3MB/sec で書き出すことになる。Jz4725B では、16 バイトの READ/WRITE には 17 メモリクロックかかる(CPUクロックなら さらにx3)。単純計算で 7.6 % のメモリ 負荷。CPU でやるとすれば .. これの数割増しぐらいのメモリ負荷になるはず。仮に 10 % だとしよう。
    あと演算がある。演算量は、multi-add が 1画素あたり 9 だとして、24M 演算 /sec 。CPU が 400MHz だとして、CPU 負荷を 10% 使えるとすると 1 演算あたり 1.6 クロック使える。... これはかなり厳しい数字。仮に 10 % でできたとしても、上記の メモリアクセスと並列にはならない。(メモリ待ちの間 CPU は止まっている) 。結局 合計 20 % ぐらい使う計算になる。
    これがバックグラウンドになればかなり嬉しいわけだ。

ところが DINUX では disable カーネルがあって わざわざ使わないようにしていたりする。

どうもメモリーの使用量が増えるというデメリットがあって 32MB しかない A320 では無視できないらしい。

mplayer や jpeg を扱うソフトだけ enable すれば良いと思うのだが そういうわけには行かないようだ。IPU は 装置なので 物理メモリを扱う。入力・出力用のイメージは物理メモリで連続した領域でないといけない。一方アプリケーションは仮想メモリで 4KB 単位の page でメモリを割り付ける。使っているうちにフラグメント化されて、物理メモリで連続した領域がなくなってしまう恐れがあるので、リザーブしているらしい。

仮想メモリを移動して 物理メモリで連続した領域を確保する機能があれば問題ないのだが、linux にあったようななかったような... あったとしても使い方が難しいなら対応が後回しにされている可能性もある。

さて、もう少し詳しく機能を調べてみよう。

まず入力フォーマット。これは Y,U,V と名前がついた 3つのプレーン。それぞれ 8bpp でパラメータには、width,height 以外に stride があり、大きなイメージの一部を入力にできる。

入力は、YUV/YCrCb フォーマットの 4:4:4, 4:2:2, 4:2:0 , 4:1:1 をサポートしている。

出力は、R8G8B8 (32bpp) か R5G6B5,R5G5B5(16bpp) こちらも width,height 以外に stride がある。

変換終了は レジスタの値で分かるが割り込みも使える。

だいたいこんなところ。画像viewer などで オリジナルを 1回展開しておけば スクロールやズーム処理を コスト 0 で出来るから、積極的に使うと良いと思うのだが ... やはりメモリが問題か。

ちなみに この機能と MXU命令 を使えばかなり動画の性能が上がる。Neo Slim 3000 では H.264(400x226,30fps) を 遅いながらも再生できた。ただし、起動の時間が異常に長く 音ずれも尋常ではなく現状では実用的ではない。

このあたりが限界なのか?というとよくわからない。根拠はないが、ソフトのチューニングとオーバクロックで この程度ならなんとかなりそうな感じはする。

ちなみに、Xburst が 2つ載っていて さらに H.264 用のアクセラレータの video Engine を載せた jz4755 は別格かも。400MHz とクロックも上がっているし、 H.264 対応とか 1080p 対応とかを謳っているが本当にまともに再生できるのかも知れない。

    データシートによると jz4755 は single core に比べて 2 倍の動画再生性能だそうだ。そしてその性能は XGA (1024x768) の H.264 の 30fps 再生。ならば jz4725や jz4740 で 720x480 の H.264 の 30 fps が出来ても不思議ではない。

    ただし 期待は 700Mhz とか噂されている jz4760 。u-boot などにはコードがマージされているのでいずれは出て来るはず。

    jz4760 は、600MHz かも知れない。プロセスが 130nm だそうだ。ある記事によると jz4750 の機能に加えて DDR2(DDR) をサポートし、USB は OTG 対応。性能は ARM11 800MHz 相当だそうだ。

    まぁ ARM勢 と比べると明らかに差を付けられている感のある jz47xx だが、いじり甲斐はある。特に MXU 命令。難解だが使いこなせると bit 操作とかいろいろ高速化できるような気がする。気が済むまで遊んでみたい。

追記:IPU の使い方

IPU が使える状態では、IPU のために 4MB の連続領域がある。

まずこの 4MB を 4 つまでのエリアに分割する。

    リクエストは、/proc/imem に対して書き込む。
    結果を知るには、/proc/imem を読み込む。

    書き込み / 読み込み フォーマットは省略。

次に バッファーを IPU に設定する。

    同じように /proc/ipu に書き込むことで設定ができる。

    ちなみに、/proc にはimem,ipu 以外に 次のようなエントリーがある。imem1 以外はデバッグ用。

    • emc
      EMC -- External Memory Controller の情報が読める。
    • pmc
      PMC -- Power Manager Module の情報が読める。
    • cgm
      write することで、CGM -- Clock Generation Module の CPCCR -- Clock Control Register に書き込みができる。
      read すると CGM の様々な設定情報が読める。
    • udc (JZ4750L, JZ4750D のみ)
      udc hotplug と書いてある。udc は デバイス側の USB 。read することで、USB の抜き差しのメッセージが見える。機能はそれだけ。
    • tlb (JZ4750 のみ)
      read しかできない。ipu の設定と TLB が見える。
    • imem1 (JZ4750D のみ)
      jz4750d は、最大 16MB の imem に加えて 最大 8MB の imem1 を確保しようとする。
      jz4750 は、最大 16MB の imem を確保しようとする。
      この 2 つは普通に 128MB ぐらいのメモリがあることが前提なのか?


ところで.. imem1 がありダブルバッファにしているのは JZ4750D のみ。これって必要なのだろうか?

    普通に考えると、IPU の転送が終わるまでは、YCrCb のメモリにアクセスできない。上記で一例として 7.5 % という数字を出したが、これはメモリを占有できたときの値。CPU や フレームバッファやその他でメモリアクセスが起きれば それだけ遅れる。30% しか利用できないとすると 25% の時間がかかる。この間、データを展開できないのは厳しいかも知れない。

    例えば、上下の 2 つに分けて 上部が終わったら 上部が使えるようになる .. みたいなことをすれば 問題ないのだが、拡大縮小をしていた場合 合わせ目が綺麗になるのかどうか?

    やはりダブルバッファに対応できたほうが良いのではないだろうか? 上記の 400x226 のデータを例にすると 必要なのは、135KB ほどだ。4MB も取るなら 割り当てられる。

    実装方法としては、imem1 を作るよりは imem の分割数を増やしたほうが良いように思う。

あと、動画しか対象として見てこなかったが、画像にも使えるのだろうか?

    JPEG の出力は、YCrCb だから やはり同じように使える。4MB をフルに使って YCrCb のデータを置いておけば 拡大縮小 や View の移動は 簡単かつ高速にできる。
    これは他の Viewer についても 同じ。
    ページという概念があって、1 ページのサイズが 1200x1600 ぐらいまでなら 4MB に収まるから、同じようなことができるはず。
    2 ページ確保してのダブルバッファというのも良いかも知れない。-- この場合 1280x1024 x 2 ぐらいまで。
posted by すz at 20:29| Comment(0) | TrackBack(0) | Jz47xx(CPU)

Neo Slim 3000 が文鎮に

分解した Neo Slim 3000 を元に戻すことにした。

といってもちょっとだけ改造。青と赤のLEDを外す。光り方が安っぽい上に、PORT で制御するようになっていないので役に立たない。 dingoo なんかも LED が付いていないし。-- ハンダこての二丁使いで外すのは楽勝にできた。

次に外したバッテリーやらスピーカーの線をハンダ付けして、組み付け。ボタンが引っ掛かり気味だったので 靴磨き用のシリコンを塗っておいた。

さて、動作確認。このときは問題なく立ち上がった。-- バッテリーを外していたので時間が設定されていない。時間を設定して一旦電源を落とす。

次に USB につなげてみたのだが、画面がまくらなまま何も起きない。

ちょっとあせったのだが、→ボタンを押しての USB 接続で USBBOOT になることが確認できた。

一旦 USBBOOT にして電源スイッチを ON 。これで USB を抜き差ししても普通に USBBOOT になる。--- どうも電源周りは異常ないようだ。

よくわからないのだが、ファームウェアアップデートの最中に電源を切るようなことをしたとしか思えない。確か ファームウェアを U-Disk に置いていたから アップデートが動く可能性はあった。

まぁファームウェアが壊れただけなら問題ない。ちょうど USBBOOT を改造して、元のファームウェアバックアップして戻せるようにしようとしていた所だし、生きている二号機もある。改造に精を出すことにしよう。

... というわけで usbboot の調査。

まず USBBOOT は データ用に IN,OUT 2つの bulk エンドポイントを持っている。コントロール エンドポイントに コマンドを送り それにしたがって データ用エンドポイントを使って送受信する。

送受信できるデータの量は 最大 1MB 。制限があるが、これだけのバッファを確保している。チェックは特にしていないからこれ以上のデータを送るとどこか壊れる。ホスト側でチェックしないといけない。

NAND FLASH に書くコマンドは、NAND_PROGRAM。 これにはオプションがあって OOB_ECC を指定すると データ以外に OOB も書いてくれる。転送フォーマットは データ(1page) oob ... の繰り返し。

これに対応する 読み込みコマンドは NAND_READ_RAW 。これにも OOB_ECC オプションがある。

HOST 側は

Usage: nprog (1) (2) (3) (4) (5)
(1) start page number
(2) image file name
(3) device index number
(4) flash index number
(5) image type must be:
-n: no oob
-o: with oob no ecc
-e: with oob and ecc

という風に nprog を使って書き込みができる。-e オプションで oob の書き込みもできる。

ただし ファイルへ 読み込むコマンドはない。NAND_READ_RAWをするコマンド nreadraw はあるのだが 16 進ダンプするのみだし OOB_ECC も指定できない。なにより遅い。1 page に 1秒ぐらいかかる。あくまで目でみるためのもの。

... というわけで nreadraw を参考に 新しいコマンドを作る予定。

仕組みは分かったし どう改造すれば良いかも分かった。
... さて、実はもう一つ作りたい機能がある。

それは、シリアルがわりに使える機能。仕組みは上で書いたとおりなので Neo slim 3000 のプログラムから データをたれながす訳にはいかない。ホストからポーリングする必要がある。

... でどうするか。

コマンドを追加して、メッセージのサイズと場所をホストに教えられるようにする。メッセージがなければ サイズ 0 。

HOST はメッセージがあれば メモリーを読み込む。

... とまぁこんな風に考えてみたのだが ... 調べてみるとメモリーを読み込むコマンドがない。

どうも 全部作らないといけないようだ。ならば、メモリーを読み込むコマンドを作り、オプションとしてメッセージを指定できるようにしたほうが楽かも知れない。

仕様が変だと思われるかも知れないが メモリ空間、メッセージ用空間という考え方ならそれほど変でもない。ついでなので GPIO 空間というのを作っても良いかも知れない。GPIO も出力は設定できるが 読み込むコマンドがないのだ。

追記:

FLASH の内容をファイルにセーブする機能は出来た。だが、書き込む nprog が何故かちゃんと動いてくれない。イレースは 出来るから壊れていないと思うのだが ... 正しく書き込めないところが出ている。... ううむ 困った。

... やはりデバッグできないと困るので、シリアルで出力した内容を表示できるようにした。


    usbboot :> msg
    CPU data: Boot4750
    msg_read: 298 (1000)
    address is : 0x81C00000
    Address offset is: 0x01C00000
    GOT correct to : 0x81C06C40
    Init UDC
    GET_CPU_INFO: 0xFBBBFF7F
    GET_CPU_INFO: 0xFBBBFF7F
    Configuration: DS_hand_t!
    Borad_init! 0x00004750
    GET_CPU_INFO: 0x00004750
    SET ADDRESS: 0x00000000
    DATA_LENGTH: 0x00001000
    --- end
    usbboot :> msg
    CPU data: Boot4750
    msg_read: 79 (1000)
    0x00004750
    SET ADDRESS: 0x00000000
    DATA_LENGTH: 0x00001000orrect to : 0x81
    --- end


こんな感じ。4KB までバッファに溜められて、msg コマンドでそれを表示。

ポーリングして自動で 出そうかと思ったが、面倒なので とりあえずパス。

ついでに GPIO の 値も調べられるようにして、ボタンの割り当てが分かった。

なにも押さない状態:

    PAPIN: 0000bcdb
    PBPIN: 823f0401
    PCPIN: ffdf7cff
    PDPIN: ffffffff

この状態で ボタンを押すと該当ビットが 0 になる。

    L: B31
    R: D4
    up: D0
    down: D1
    left: D2
    right: D3
    ▲(up) : D11
    ×(down) : D10
    ■(left): D12
    ◯(right): D9
    power: NONE

Lボタンだけ LCD と共用になっていない。-- WKUP というピンで サスペンドからの復帰に使える。

    ちなみに、LCD の データが有効でないとき、ボタンの値を読むことができるが、正しい値を読むには、最後に LCD のデータを出力してから 少々時間が必要。end of frame interrupt というのがあるようなので、これを イネーブルして、割り込みでボタンの状態を見るようにするのだろう。イネーブルするには LCDCTRL レジスタ を操作する。

あと、SDRAM の内容をダンプする機能を作れば、だいたいデバッグできそう。(これで Jz4740 が Jz4750 として見えてしまう問題も解決できるはず )

ところで、GPIO のまとめで書いた ピンのマッピングは Jz4725 のデータシートを見て書いたのだが、Jz4725B と ポートのアサインが全然違うことが分かった。面倒なことだが、見直さないと。

追記: 原因は分かった

書き込めない原因はわかった。


    GET_CPU_INFO: 0x00004750
    SET ADDRESS: 0x00000280
    DATA_LENGTH: 0x00000080
    Request : NAND_PROGRAM!Skip a write fail block
    ... finished.

stage2 のプログラムがエラーを検出している。-- コードを見るとNAND の チップがエラーを返していたのだった。

    NAND 側のデータシートを見ると ...
    READ_STATUS コマンドを発行して、データバスに出てきたデータ
    busy flag (か FRB) をチェックせよみたいなことが書いてある。

    チェックはしているようなのだが、GPIO の Port を決め打ちで書いてある。... よくよく見てみると FRB の Port は、JZ4740/JZ4725 では PC30 , JZ4750/JZ4755/JZ4725B では PC27 だった。気まぐれに Port 番号の割り当てを変更したのではなく、アーキテクチャによって Port 番号が決まっているようだ。

なんども書いているわけではないから、製造時から bad block だったのかも知れない。安物だから bad block の率が高いのを安く仕入れているかも知れないし、有り得そうな話だ。

そうなると ... bad block を使わないようにする仕組みが必要になる。

U-Disk は、FAT でフォーマットしてあって何度も書き換えるから UBI なのだろう。

それは良い。立ち上がってからの話だし。フォーマットする 機能もあるし。

まず問題は、root これは ファームウェアのほとんどを占めるはずだから 60MB ぐらい。jffs2 を使ったり yaffs2 を使ったり するのに違いない とあたりは付けたものの offset と size がわからないとどうにもできない。

しかし、それ以前の問題もあった。bad block を回避するために カーネルや ブートローダまで 固定の位置に置いてないのかも知れないということ。

低レベルのプログラムで bad block を回避するために、例えば使っている データがあるブロックのリストを作って書いておくとか .. そういうことをしているはず。

確かに 2 台のマシンの nand を バックアップしたデータは 、結構違う。だが、2 台の差分ぐらいで データ構造がちゃんと分かるかというと疑問。

いったん復活させたかったのだが、労力ばかり多くなりそうなので 復活は打ち切り、サラのマシンとして扱おうと思う。

さて、次にやりたいことは?

ひとつは、Jz4740/Jz4725 で usbboot を使ったときに 正しく 認識できるようにすること ( なぜか Jz4750 と表示され 動作が不安定 ) -- 済

もうひとつは、neo slim 3000 の ブートローダを なんとかすること。LCDにメッセージも出したいし、USBBOOT で動かしたときは、USB から メッセージを取り出せるようにしたい。

.. その前にプログラムを ロードして実行する機能を確認しないと。

とりあえず ... ここまでの成果

  • usbboot-qi.tar.gz -- QI から取ってきたオリジナル(ベース)
  • usbboot-wk2.patch.gz -- ここまでの修正パッチ
  • usbboot-wk2.tar.gz -- tarball (configure 済みで サイズがでかい )

  • JZ4725B 対応

    ingenic のオリジナルをベースに 変更。( ちなみに ingenic オリジナルには JZ4760 対応が入っている )

  • コマンドの追加

    ndump (NAND FLASH をファイルに書き出す)
    gpior (GPIO の ピンの値を表示 )
    msg (シリアルに出した内容の取得)
    mread (SDRAM のダンプ )

  • fw_args.cpu_id の値(0x4750/0x4740) は、USB の プロダクトID から取ることにした。もう誤認しないはず。


ちょっと、どんな風に NAND FLASH を使おうか検討してみる。

  • まず、最初にブートする領域は 2 つある。最初の 8KB と次の 8KB 。最初のブロックが ECC エラーなら次のブロックからブートする。どちらにも同じ内容の stage1 ブートローダを書き込むことにしよう。

  • で、 8KB のどこかに パラメータブロックを置く。できれば fw_args と互換性がある形にしたい。これを見ればクロックやメモリの初期化が正しくできる。ロードする FLASH の アドレス変換をするテーブル(8KB) を作ることにして、1 エントリ 16bit とすれば 8KB で 4096個 入る。ブロックを 8KB にしてしまえば、全体で 32MB まで管理できる。

    ここの領域には、zImage と initrd を置く。32MB あれば複数の組みを置ける。普段使うものと、インストーラは置ける必要が出てきそうなので、ブートセレクタ機能がいりそう。

  • 残りの部分は rootfs と U-DISK 。両方とも UBI にして、上位に普通のファイルシステム。rootfs は ext3 で U-DISK は FAT32 とか。1 つの UBI にできると 全体を使って ウェアレベリングできるから swap とか書き換えの多い データも置きやすくなる。

    ... UBI の上に パーティション作れると良いのだが... あ、device-mapper とか使えば良いのか。md でも良さそうだし。

  • UBI 前提にしてしまうと、rootfs にブートローダがアクセスできないし、USBBOOT を使って UBI にアクセスするのも難しそう。
    -- そうなると インストーラカーネルを使って 初期化できないといけなくなる。

    実際に作ってみると違うものになりそうだが、こんな感じでどうだろう。

  • メモ1: 電源を入れたときに USB が刺さっていたら ... インストーラカーネルを動かして、そうでなければ通常のカーネルにしたらどうか。

  • メモ2:FATファイルシステムではダメなのか?

    まず先頭がいきなり書けなかった場合に対処できていない。ルートディレクトリや ファイルアロケーションテーブルも 基本的に固定の場所(全体をずらすことは可能だが、一般的でない)。

    仕様をわずかに変えたものは 既にFAT ではないし、かえって混乱しそうなのでやめたほうが無難。

    書き換えるには、消去ブロックサイズ ( 128 ページ )を一旦消して書き換える。ただし、未書き込みの部分に書く場合は ページ単位で書ける。--- この特徴なら 先頭の 128 ページ(4K ページだと 512KB) はあまり書き換えないように ファイルアロケーションテーブル相当は 512KB 以降に割り当てたほうが良さそうだ。

    もちろんこの領域はあまり書き換えないのが前提なわけだが、先頭ブロックが壊れるのはとても困るので、考慮は必要だろう。













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

2010年06月04日

E705Aというのをポチってみた

世の中 iped だの apad だの アンドロイド MID が人気だが、それとは全く関係ない 7inch Linux mini laptop E705A というのをポチってみた。

    追記: これは dealetreme でも扱いだした free-shipping 127ドル。



スペックは、

CPU JZ4750 XBurst CPU 32
Operation system LINUX
Memory 128MB DDRII
Storage Device 2GB NAND Flash ( 512MB/1GB optional )
LCDSize 7" PANEL
M+D36atrix 800*480
VGA NO NEED
LAN 10/100M Ethernet Access
WIFI 802.11b/g
Keyboard standard enlish 84 key,support external keyboard
Mouse&Touch pad build-in touch panel, set two shortcut key,and support usb port mouse
USB Port USB 1.1 *3.0
Card Port SD CARD
Build-in camera NO
Sound effect In focus Audio
Build-in stereo speaker
External Microphone,but only for record
Battery 1300MAH

値段は、$130.93 (送料無料)

CPU は MIPS(JZ4750) なので アンドロイド はどうやっても動かない。Lyumo Book のようなもの。

    ... というのは厳密に言うと間違い。
    http://bbs.imp3.net/thread-832943-1-1.html
    をみるとプロトタイプはあるようだ。

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

    May 05 2009 00:00 37037418 android-demo-jz.tar.bz2
    Feb 20 2009 00:00 7387614 ingenic-linux.tar.bz2
    Mar 20 2009 00:00 514445940 mid-src.tgz
    Jul 14 2010 16:06 69811279 mipseltools-gcc412-lnx26.tar.bz2

    ... といってもコレ用じゃないし、放置されているところを見ると諦めたのかも知れない。

開発用に MIPS というか Jz47xx の マシンが欲しかったのが購入動機。www.aliexpress.com が比較的安全らしいのと、近くで Lyumo Book を売っているところがないのもコレにした理由。

    実を言うと アンドロイド MID の人気と Lyumo Bookの人気のなさを見て 今後入手が難しくなるのでは? と思ってしまったのが今買った理由。
    でアレコレみてたら、最初にリンクした 7" Support WIFI netbookの方が(送料込みで)安いことに気がついた。どうも 300MHZ の VT8500(ARM)クラスの価格帯まで値段が落ちているようだ。

    ちょっとだけ気になるのが、build-in touch panel というところ。Touch Pad のことだと思うが少しだけ期待してみよう。

ちなみに、スペックには、JZ4750 と書いてあるが 信用はしていない。メモリが DDRII と書いてあるのだが JZ4750 でも DDR2 は サポートしていない。外部インターフェイスが Lyumo Book と同じだし、JZ4730 だったりするかも知れない。

まぁそれでも良いかと思っている。Jz4750 だと Video engine というのがあり、TV OUT 用の機能も付いているのだが どちらも使えないと思うし。あとは Mobile SDRAM に対応している点が違うのだが、性能が良くなるわけでもなさそうだし、そもそも使っていないなら関係ないし。

    "XBURST" で ググってみると EPC E700 というのがあり CPU は Jz4730 。E702 というのもあって CPU は Jz4740 。
    あれ? E705A は 本当に Jz4750 かも。

    あと、E702 のところに TESO (Linux ubuntu) と書いてあった。... なんだろう?

ところでコレ、MIPS を使いたいという特別な理由がない人には、あまり勧められない。Lyumo Book も もっさりだと専らの評判だし、JZ4750 だとしても基本性能はさほど変わらない。所詮 PMP 向けの CPU で、Video engine まで使いこなしてようやく動画だけ速くなる。

とりあえずメモ:


追記: E705A 到着

EMS のはずが UPS(配送:ヤマト) できた。500 円を徴収された。たぶん税金。(消費税?)

箱を開けてみたところ、黒の本体と 中国プラグの AC アダプタ とマニュアル。(白→黒の順で希望を書いて発注)。 AC アダプタは 出力 DC 9V 2A 、プラグ形状は PSP のと同じ(EIAJ#2)。入力は 100V-240V でプラグ変換があれば使えそうだが持っていない。あと マニュアルには、E7005 Linux Series と書いてある。

    9V の AC アダプタなら 秋月の これが良いのだが、在庫切れ。さては... 同じような仕様の M001 とかのせいで需要が急に伸びたな。しょうがない。飛び出ている部分を糸鋸で切り離し コードを引き出すか。

    ひょっとしたら 1.3A の これでも良いのかも。大体充電なしで 5W 充電しての使用なら 10W ぐらいだそうだ。9V 1.3A なら 11.7 W だが、100V での測定だから 1/効率 (= +25%) 余裕がある。

    ちなみに WK-J2 という変換ケーブルが使える。

    あ、ここで EKEN M001 用の AC アダプタを売っている。480 円と安いが 送料かかるし微妙。

さて、本体を眺めてみる。本体裏にシールが貼ってあり Easy PC E700 series と書いてあった。開いてみるとパームレスト左側にシールがあり、EASY PC E700 Linux Series とあった。その下にスペックのアイコン。JZ4750 360MHz / 128MB DDR2 / 2GB FLASH / 7inch WVGA / 802.11B/G 。



さて、やることがないのでバッテリーが入っているらしい裏側の蓋を開けてみる。

当然のようにバッテリーが入っていた。バッテリーはコネクタが付いていて、交換可能になっている。ただコネクタは奥まったところにあって外すのが難しいかんじ。バッテリーの印字は LB0102 PL3530155P 7.4V 2100mAh JA27 。-- 1300mAh でなくてよかった。100V 電源側で 5W だそうだ。無線LAN なしなら 3-4 時間ぐらいもちそう。

バッテリーを本体から出してみるとスロットのようなものが 2 つ見えた。覗いてみたところ基板とパーツが見えるだけで何らかのコネクタは付いていなかった。

つぎにインターフェイスのチェック。右側に USB Aメス x2 、左側は、マイクとヘッドホンジャックと SD のスロット。裏側には ACアダプタのジャックと Ether 、USB A メス。

一応電源を入れてみると... Loading と表示され 続いて mini laptop 。



しばらくして X が立ち上がってきた。



アイコンは、

  • Image Gallery
  • Word processor
  • PDF Viewer
  • Speadsheet
  • Star dictionary
  • Music player
  • media player (plays a .mov video fine)
  • calculator
  • IM chat
  • e mail
  • wireless
  • paint brusher (a paint/drawing program)
  • ebook reader
  • recorder
  • internet browser (works slowly but well)
  • text writer
  • snes

だそうだ。(自分では未確認)。上記以外に スタートメニューから起動するものがいくつかある。パッケージのインストールなんてものもあるが、どういうパッケージか見当もつかない。

    上の写真は、My 99 dollar cherrypal netbook computerから拝借した。どうも cherrypal africa という製品名で販売されたものと同じらしい。2009/12 頃にアナウンスされた外観(G400 と同じ)とは違う。-- たぶん新型。

    cherrypal africa と違う点はロゴがないところ。.. 普通 AC アダプタのマーク(極性表示)やら Ether, USB のマークやらが 印字されているのだが、よくみたらプラスチックに印字が一切ない。これって OEM元のサンプル?

バッテリーは 50% しかないのでちょっとだけ使ってみた。

設定できる言語は、英語・フランス語・中国語だけ。

CPUやメモリ に関する情報はわからない。わずかに分かるのは Linux 2.6.24 ベースということだけ。

ファイルブラウザも C: とかいうのを root にした情報しか見せてくれない。どうも アプリケーションを入れるどころか root にすらなれない予感。

たいへん困ったことになりそうだが、それはさておき分解して CPU を確かめることにした。

分解方法は、「日々是おやっとさぁ」とほぼ同じ。メインボードは違うが、筐体は非常に良く似ている。



まずはメインボードの表が見えた。RAM が 2 つ載っていて P3V56S40ETP とマークされている。これは 256Mbit の SDRAM だ。DDR2 というのは予想どおりウソ。jz47xx までウソかもしれない。-- 確認できるまで安心はできないものの VIA VT85xx だったら DDR2 のはず。

    VIA VT8500版 cherrypal africa (Win CE)の基板写真を発見。同じ筐体に入るメインボードのように見えるが裏側に RAM がない。あと アンドロイド版は cherrypal asia だそうだ。

2個しか見えていないのはあまり心配していない。Lyumo Book も 表裏 2 個づつなので 同じなのだろう。4 個なら 128 MB だ。

あと 基板には、WSNB0708_V1.0 2009-12-04 のシルク。

さて CPU を確かめるには、基板の裏を見なければならず、ヒンジの付け根のネジを外して完全にばらさないといけない。

ところで、root になったりするにはどうしたら良いのだろう? ちなみに jz4750 にも USBBOOT 機能はあるが、USB device のコネクタはない。あと SD Card からの boot 機能がある。ただし、ブートを切り替えるスイッチ/ボタンを見付ける必要がある。ben-nanonote はキーボードで USBBOOT になるからキーボードの可能性はあるが、汎用キーボードでは無理なのかも知れない。タッチパッドのボタンの方が可能性がたかい。

http://www.littlelinuxlaptop.com/3mx-4-0/

これが入ると嬉しいが 無理か。CPU が違ってもデバイスは同じに思えるのだが、GPIO の割り当てが違いそう。カーネルをなんとかして入れ替えるとかすれば ... あるいはユーザランドを使えるかも知れない。

やはりブートの方法を見付けておかないと...

さて、ここらで意を決して基板を外してみた。




CPU は、予想だにしなかった jz4757 -- 存在していたのか。データシートは、jz475x_ds.pdf で見てみると jz4755 と同じ CPU Core で デバイスが強化されたものらしい。

そのほかのデバイスは、FLASH と SDRAM (予想どおり裏にも2個) 以外だと

  • CS8900A -- 10BASET イーサネット

    ISA バスインターフェイスの古のチップ

  • GL850A

    4 port USB HUB

  • HT82B40R

    USB Low speed デバイスつきマイクロコントローラ。予想はキーボートの制御。



... 無線LAN がない。どうも LCD 側にあるようだ。インターフェイスはたぶん USB 。

なんというか、I/O 系は予想外にしょぼい。イーサは 10M だし、それ以外も多くが 1 つの USB 1.1 HOST にぶらさがっている。

100M のイーサをサポートしている jz4730 のほうがマシ。CPU が新しすぎて使いこなせなかったということか。

TV OUT も 高速シリアルも USB 2.0 HI Speed デバイスも使っていない。ちょっと残念な仕上がり。開発マシンとしてみた時は ネットワークが遅いのが残念なところ。これなら Neo Slim 3000 を無理やり 128MB にしたほうが便利かも知れない。

... といっても CPU の方は Dual-Core のはずだし Video-engine もあるし SIMD2 に強化されているし興味深くはある。

メモ:

  • Keyboad のコントローラが別にある ... ということは 特定のキーで SD BOOT なんて技も簡単にできそう。なんとなくだが Linux のドライバを作るのを嫌がったんじゃないかと思える。イーサの方はリファレンスデザインにあったと思うのでドライバがあるのだろう。

  • FLASH にインストールする手段が必要なはずで SD BOOT を使うのだろうとは思うのだが CPU の左下のパッドが気になる。JTAG + シリアルの可能性もあるが、USB device が出ていて USB BOOT なんて可能性もありそう。-- SD BOOT を探すのも程々にしておこう。



    (追記) パッド は左から 4pin(J5), 2pin(J1), 4pin(J4) 。しげしげ見ていたが J4 は 2 本の並行線が CPU から直接来ている。そして 線の元あたりに USB Device がある。... たぶん J1 が USBBOOT を有効にするスイッチで J4 は USB Device なのだろう。
    J5 も 2 本の平行線が来ているが 左の方から。そして 10K でプルアップかプルダウンされている。-- こちらはシリアルなのか?
    ところで、J5/J1 の側まで来てスルーホール(下2つ)に消えている線はたぶん I2C 。で、左の 8in IC(2つあるうちの下) に行っている。この IC なんだろう? ちゃんと見ておけば良かった。... なんとなく RTC を外付けしているような気がする。8in IC(2つあるうちの上)に水晶付いているし。そうなれば、もうひとつは、温度監視とか電圧センサ?

    そういうことはともかく、治具+USBBOOTで初期化するっぽい。そうだとすると SD BOOT の機能は作りこんでないかも。

  • VIA VT8500版 cherrypal africa (Win CE)を見ているのだが、完全に同一筐体のようだ。コネクタの配置も同じ。ただし、右上の 4pin コネクタが E705A の方には余分に付いている。VT8500 の方は無線 LAN がオンボードなのだろう。2 本の線を平行にして配線しているし、インターフェイスはやはり USB に思える。

    その左のコネクタは何だろう? タッチパネルだと嬉しいがっそんなことはないのだろう。外してみて不具合が起きるかどうかで何か調べられるかも。

  • USB HUB は、4port で 外部に 3 つ出ている。残る 1 つは無線LAN だとすれば他には使っていないことになる。ならば キーボードは PS2 ? タッチパッドも PS2 なのか? -- Libra という開発ボードには PS2キーボードが付くようなのでドライバはあるのだろう。

  • jz475x_ds.pdf には、jz4755 と jz4757 が記載されているのだが、Dual-core だという説明はない。ひょっとしたら video-engine がもうひとつの xburst-core なのかも。

  • 2009/12 に $99 PC としてアナウンスされた cherrypal africa には、Linux Type(jz47xx) と Win CE Type(VT85xx) の 2 通りがあったらしい。メモリは両方 128MB で 256MB というのはガゼ。
    で、Linux Type をやめて アンドロイドのものを新たに cherrypal asia として出したらしい。たぶん中身は VT8500 。

    VT8500 のノート型は $80 ぐらいまで値段が下がっているし、せめて 256MB か CPU のグレードアップがないと $99 は高い印象がある。

    ... それはともかく、jz47xx は売れていないからやめるわけで、残念なことだ。(世の中 ARM 一辺倒になるのは面白くないだけなのだが) -- メディアプレーヤーや イメージ viewer,PDF viewer あたりが使い勝手良ければ それだけで 値段分の価値にはなりそうなのだが

  • キーボード右下の zzz キーはサスペンドだった。... ちゃんとかどうか分からないが、動いている。動作は瞬間。あまりにも速いので不安になる。どれぐらい消費電力を落とすのかの方が重要だがまだ試していない。
    (追記)試したところ数時間で電源が落ちた。多分 液晶を Off しているだけ。

  • バッテリーのランプは、充電中を示すのだが、段々暗くなって最後には消える。なかなか良い。

  • メディアプレーヤー は、H.264 の FLV は対応してなかった。FLV 自体は対応している。IPU 使っているみたいに見える。でもフルスクリーンにしても、ファイルによっては周りに黒帯になったり...


それにしても... どうしようコレ。お手軽に開発マシンにしたかったのだが... いまのところプリインストールのアプリしか動かせていない。

ただ、これにもアプリケーションをインストールする仕組みはある。Application Manager というものだが、起動するとタイトルバーに IpkgViewer とでる 。ひょっとして OpenWRT とかの ipkg なのだろうか? ならインストールスクリプトで /proc の内容を ファイルに出力するとか出来るかも。

いじっていて野良パッケージはインストールできないようにしている可能性はある。そうなればお手上げ。まぁ無理なら諦めて ... Neo Slim 3000 に絞ろう。
    パッケージについて
  • http://7mc.org 経由で、CnMBook のサイトにパッケージが色々あることを知った。.info と それに指定してあるいくつかのファイルを使うタイプ。... だが 全然ダメ。
    Lyumo book などだったら OK なのかも。
  • OpenWRT のサイト http://downloads.openwrt.org から .ipk を拾ってきて SD カードに入れてみたら、ファイルブラウザで アイコンが出た。ダブルクリックすると Windows のような Setup 画面になった。 ... 適当に選んだものなので cansel したが、なんとかなりそうな予感。

    まずは、パーミッションとか ディレクトリ構成と ファイル一覧を作成するものを作ってインストールしてみたい。

まぁ、パッケージ使ってカスタマイズできなかったとしても、USBBOOT はなんとかなりそうだし。ちなみにパッド部分は、バッテリーのところにある隙間から見えている。治具が作れれば無改造でなんとか出来そう。



ところで、これは何だろう? E705A でググると ATS-E705A というのも見つかるのだが、そこにあった製品。やっぱり Xburst で 128MB なのだが 新しいのは 7inch で額縁が狭いということ。-- どうも液晶の方に合わせたキーボードを採用しているようだ。

7inch Mini Laptop としか記されてなく型番も付いていない。まぁ E705A を小さくしただけなら興ざめなのだが ちょっと気にかけておこう。



こんなのもある。これは aliexpress から買える。中身はともかく デザインは新しい。xburst も 色々新製品が出るのか。

ところで、なぜ jz47xx が気に入ったのか?

最初は、PMP で Linux が動く! という驚きから調べだしたわけだが...

  • 1. USBBOOT があり、FLASH を壊してしまっても復旧できる。

    これは改造とかして遊ぶ場合に重要なポイント。文鎮化したらゲームオーバだと ちょっと遊ぶのはちょっと無理。

  • 2. MMU があり普通に Linux が動く。

    個人的に 仮想記憶がない CPU は好きでない。

  • 3. 電子工作の対象になり得る。

    Jz4725B や Jz4755 は BGA でない。0.4mm ピッチで実際に作るのは厳しいとは思うが 工作可能な範囲。RAM も旧来の SDRAM で 0.8mm ピッチでいじれる範囲。

    400M Hz というのは、実用レベルからみると遅いわけだが、電子工作観点だと 最速レベルなのだ。

    ちなみに、CPU 単体も入手可能。jz4755 が 30元 jz4725B が 20元 だそうだ。

    チャイナモールでは、「MP3の部品のMP4の部品の君の正のJZは4725の主はJZ 4725 Bを訴えて」が 1010 円だそうだ。

  • 4. マルチメディア用 SIMD 命令。

    DSP ではなく CPU の機能拡張なのが良い。ちょっといじってチューニングできたりする。

  • 5. A320 以外のソフトがダメダメ

    これは、改造してみたいと思う動機になる。

  • 6. ハードが安い

    PMP-3100 とか Neo Slim 3000 とか 4000円ぐらいだし 安いのは敷居が低くて良い。

    あと、中華PMPを改造しても、咎められたりしないというのも利点。もとが オープンソースだし。

  • 7. 情報が(一応)手に入る。

    まぁ完全にオープンではないようだが、ググれば拾ってこれる。


こんなところか。何年かすれば事情が変わってくるのだろうが、しばらくは楽しめそう。
posted by すz at 04:21| Comment(2) | TrackBack(0) | Jz47xx

2010年05月24日

PMP-3100,A-330入手

勢いで買ってしまった PMP-3100,A-330が来た。

実をいうとこれらの小ささにまず驚いた。3.5 inch の Neo Slim 3000 を先に買っていたわけだが、なんとなく ひと周り小さいだけかと思っていたが、随分大きさが違う。あと意外だったのは、両方とも時計機能がないこと。Chip に RTC の機能はあるし、Neo Slim 3000 も時計があったので当然あるものとばかり思っていた。 -- ひょっとして、RTC に電源供給されていないのだろうか?ちょっと不安だったりする。

A-330 の分解写真とかレビューは、

にあるので割愛。DINGUX が動くらしいので リファレンスマシンとして使おうかと思っている。


さて問題の PMP-3100 。これは、一体どういうものだろう?

ちょっと使ってみたのだが、ファームウェアの機能はおそまつ。動画は、音ズレするし、エミュレータは GBA のみ。-- あまり使いものにならない印象。バッテリーの容量も少ないだろうし、実用として使いたい人にはまったく勧めることができない。しかし、Linux を移植してみたりして遊ぶには良い素材かもしれない。

次に USB-BOOT -- とりあえずは、A-330 で試す。電源 OFF の状態で B ボタン を押しながら USB に接続すると

  • JZ4740 USB BOOT Device

と認識される。もとの状態にするには、リセットボタンを押す。

PMP-3100 の方は、リセットボタンがない。元に戻せないならただちに分解してバッテリーを外す覚悟でやってみた。

電源 OFF の状態で START ボタンを押しながら USB に接続すると ..

  • JZ4740 USB BOOT Device

と認識された。で、USB を抜けば電源が切れた。なんのことはない。電源を OFF にできるから RESET ボタンは不要だったわけだ。

... ということは Neo slim 3000 もそうなのか? 

やってみたところ 同じように電源が切れた。

これで、ハードの改造なしでいろいろ試せそうだということは分かった。-- たとえ文鎮にしてしまっても電源だけ切って後日リベンジとかも可能。

さて一応分解してみる。

... 驚いたことに、CPU は Jz4725 (無印) だった。Jz4740 か!と期待してしまったので残念な結果だ。メモリには SAMSUNG K4S281632I-UC75 と印字されている。128Mbit -- 16MB だ。-- なんかダメダメだ。

ちなみに TV-OUT 周りの回路は裏にはない。おそらく表側なのだろう。... といってもスペースがないはず。謎だ。

あとバッテリーは、3.7V 800mAH 。これはそんなものだろう。

Jz4725(無印) は良いのだが、メモリが 16MB しかないのは残念。Linux で遊ぶにもちょっと厳しい。

    Jz4725 の無印と B の違いは、SD の 速度と、USB-BOOT の仕様ぐらいなはず。だからあまり気にならない。メモリは 256Mbit のものに換装する手はあるが、面倒だしコストが余分にかかる。

    新しいはずなのに ... 残念なスペックだ。

残るは、電子工作での素材か。液晶を剥がして 別のなにかをつなぐとか... 1mm ピッチのはずだから 線を引き出すのは楽かも知れない。

... というわけで PMP-3100 はお蔵入り。Neo slim 3000 でいろいろ出来るようになったら復活させるかも。

とりあえず、記念写真。



ケースを開けたところ。スピーカとかバッテリーのケーブルの接続場所の確認用。



バッテリー 3.7V 800mAH



基板のみの写真。バッテリー固定のための両面テーブ が SDRAMと FLASH の上に貼りつけてあった。この跡を綺麗にしようとゴシゴシしたら、IC の 印字も一部消えてしまった。

ところで、シリアルの線が出ている。... ということは、なにかの機能でつかっているということだ。それは何?

    シリアルは、57,58 ピン。CPU の下側 の右のエリアで 1 本だけスルーホールに消えている線があるがこれが 57 ピン。58 ピンはすこし下まで伸びてからスルーホール。



基板を外して表の写真。右下の 14pin の IC は印字が消されている。... ボタン処理用の IC だと思うのだが ... なにか見当がつかない。I2C の GPIO だったり、ワンチップマイコンだったりしそう。 それにしても TV OUT 用の IC は見えない。やはり謎。ひょっとして Neo Slim 3000 も TV OUT がついているのだろうか?

    通信にシリアルを使っているのではないかとも思える。例の 57,58 ピンが、14 pin の IC に接続されているかも。

それはそうと基板には、

    SmartChip
    SC928M105_V0.2
    2009.12.26

なんて印字がある。



ボタンの裏側。もとに戻すときの参考用。

オリジナルのファームウェアも使い物にならないし、壊しても惜しくないので、逆に開発用にしようかとも思ったのだが、ボタン処理用の IC があると解析するのが嫌だなぁ。

追記:PMP-3100 の後継機




focalprice から PMP-3100の後継機 が出ている。

見て分かるのは、

  • ファームウェアが Neo Slim 3000 のと同じ見栄えになった。
  • ON/OFF や HOLD → の表記 が逆になっていたのが訂正された
  • AV OUT の表記が ヘッドホンマーク + FM に変更 (これも訂正)

こんなかんじ。ひょっとしたら CPU が JZ4725 → JZ4725B に変更されたかも知れない。

    理由は JZ4725 は製造していないと思うから。CPU の変更にともなって ファームウェアの バージョンアップを余儀なくされたのかも知れない。さらにいうと ファームウェアが変わったために メモリも 増えることになったかも知れない

まぁ何も変わっていないのかも知れないのだが ... 少なくとも 時計機能は付いているので、良くはなった。


追記: dealextreme の PMP-3100 は P5-5 だった。

水色 全部箱に P5-5 と書いてある。
ユーザ投稿の写真を見れば、時計も出ている。

レビューには、There is an alarm clock なんて書いてあるが、さすがに アラーム機能は無理だろう。それはともかく、ファームウェアのベースが neo slim 3000 や aneca A-41 と同じに なったのなら、GBA 以外のエミュレータ機能はともかく、PMP としてはまぁ使えるはず。

追記: とりあえず入手した。CPU は Jz4725B になっていた。これはすぐわかる。(電源OFFで)右の ESC ボタンを押しながら USB に挿すと JZ4750 USB Boot Device と出る。(Jz4725 なら JZ4740 USB Boot Device)

メモリのサイズが増えているかどうかは いろいろやってみないとわからない。-- たぶん USBBOOT の cfg を大きい方に間違うと動かないから分かるはず。



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

2010年05月19日

MXU命令メモ

Jz47xx の XBURST アーキテクチャには、MXU 命令という マルチメディア用の命令セットがある。

これが使えるのと使えないのでは、画像や動画のデコード性能が随分違うはずだと思うので、ググってみた。

どうも QI のメーリングリストの情報が 一番整理されているようだ。



どうもこれが ingenic が公開しているすべてらしく、どういう 命令があるのか 一覧すら公開されていない。

命令の 一部の名前は分かったので、それでググってみると ..


がヒットした。

dingoowiki.com の方を見ると 一覧と MXU 命令を 使うために すべきことの情報がある。

gp32x.com には、よくわからない 一覧になっているが、mxu_as (という awk スクリプト)を解析して どのように変換しているかの情報になっているらしい。

これらの情報をみても、それぞれの MXU 命令がどういう動作をするのかはっきりとは理解できない。

定義を理解するには、jz_mxu.h を見るのが一番のように思う。

jz_mxu.h には、命令に 1:1 に対応したマクロが定義されている。MXU を使う場合は、asm 命令を使用するが、MXU なしだとそれに相当する C コードにする。

これをみれば、どうやって使うのかは分かる。あとは、mxu_as 。これは、jz-crosstools-src.tar.bz2 に含まれているらしいのだが ... 66MB もある。このなかの misc/mxu_as だけを見れば良い。

とりあえず、mxu_as と jz_mxu.h を 以下に置いておく。


さて、まずは、mxu_user_guide_EN.pdfDevelopment:MXUをあわせて 見てみる。


  • 60 の SIMD 命令セットがある。(SIMD 命令は全部で 60なのはマニュアルに書いてあった)
  • xr0 - xr16 の 17 個の XMU レジスタがある。それぞれは 32bit 。
  • xr0 は、zero レジスタで 常に 0 。xr16 は コントロールレジスタ。
  • XMU 命令を使うためには xr16 の bit0 を 1 にしなくてはならない。

    • mxu-instructions-listの方は 58命令分しか解析していない。足りないのは、D16ABS , S32ABS 。

    • Jz4755 などで拡張された SIMD2 命令セットは、114 命令 (差分 54命令)だが、どうも mxu_as に拡張部分も定義されているようだ。
      jz_mxu.h には、SIMD(無印) の分しか定義されておらず、分かるのは拡張された命令の名前だけ。



ということらしい。

で? 60 個もあるという 命令はどんなものなのだろう? 

まずは、Development:MXU を見ると

  • ロード・ストア 10 種類
  • 加減算 12 種類
  • 乗算 9 種類
  • その他の算術演算 11 種類
  • シフト・シャッフル命令 16 種類

60 種類にはなっておらず 合計 58 種類が記載されている。でもよくよく見ると モードがいくつかあるようで、別々の命令として考えると種類は爆発的に増える。

それはともかく、いったいどれぐらい加速されるのだろう。あまりSIMD 命令は知らないのだが、1 命令での結果の数でカウントしてみることにする。

加減算系統だと、Q16 とか Q8 とかがあって たぶん 最大 4 つ。32bit でも D32 とかあるから 加速されるようだ。

乗算系だと D16 とか Q8 があるから 一応最大 4 つ。ただし、乗加算もあるから x2 と考えると 8つ。

1 クロックで実行できるものなのかどうか不明だが、一応 通常命令より 8 倍ぐらい高速化できるものだという風に思うことにしよう。



ところで、簡易アセンブラしかないような状況というのは分かったが、Linux での対応はどんな感じなのだろう?

見てみたのだが、どうも MXU レジスタのセーブ・リストアするようなところはないように思う。

たぶん、MXU 命令を使うプロセスを 1 つに制限しないと誤動作する。PMP だし 普通はそんな心配はいらないわけだが、うっかりするとまずいかも。

posted by すz at 23:56| Comment(0) | TrackBack(0) | Jz47xx(CPU)

2010年04月19日

USB-BOOT

そろそろ USB-BOOT をやってみたい。

まずは、USB-BOOT の stage1/stage2 を動かすこと自体が目標になる。

Jz4725 を使っている SAKC も ブートはできているようだから

を理解して 実行してみることが最初のステップか。

とりあえず、ここに書いてある通りにして git で取ってきてまとめたもの

をベースにすることにする。

まず USB-BOOT させてみる。→ キーを押しながら USB に差し込むと Linux から次のように見える。

    T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 7 Spd=480 MxCh= 0
    D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
    P: Vendor=601a ProdID=4750 Rev= 1.00
    S: Manufacturer=Ingenic
    S: Product=JZ4750 USB Boot Device
    C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA
    I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=50 Driver=(none)
    E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Jz4725B にも関わらず ProdID=4750 。String も "JZ4750 USB Boot Device" 。

あと Bulk エンドポイントが In/Out の 2 つあることがわかる。

さて 次のようにビルドした usbboot を動かしてみる。

    export PATH=$PATH:/usr/mipsel-linux-uclibc/bin
    export PATH=$PATH:/usr/mipsel-linux-uclibc/usr/bin
    export CROSS_COMPILE=mipsel-linux-
    export ARCH=mips
    ./autogen.sh
    ./configure --prefix=/usr --sysconfdir=/etc
    make
    make install
    cd xburst_stage1
    make
    cp xburst_stage1.bin /usr/share/xburst-tools
    cd ..
    cd xburst_stage2
    make
    cp xburst_stage2.bin /usr/share/xburst-tools
    cd ..


で動かすといきなりエラー。src/ingenic_usb.h の PRODUCT_ID が 0x4740 になっているためだった。0x4750 にしないと少なくとも動かない。

ここでかなり不安になったのだが、とりあえずは 修正して 動かしてみると...

    # ./usbboot
    usbboot - Ingenic XBurst USB Boot Utility
    (c) 2009 Ingenic Semiconductor Inc., Qi Hardware Inc., Xiangfu Liu, Marek Lindner
    This program is Free Software and comes with ABSOLUTELY NO WARRANTY.

    Now checking whether all configure args valid: YES
    Current device information:
    CPU type is Ingenic XBurst Jz4740
    Crystal work at 12MHz, the CCLK up to 252MHz and PMH_CLK up to 84MHz
    SDRAM Total size is 32 MB, work in 4 bank and 16 bit mode
    Nand page per block 128, Nand page size 4096, ECC offset in OOB 12, bad block offset in OOB 0, bad block page 127, use 1 plane mode
    usbboot :>

お! とか思ったが、/etc/xburst-tools/usbboot.cfg をチェックするのを忘れていた。

だいたい Ben-NanoNote と同じはずで、ちょっとみた範囲では修正する必要はないように見える。

で、Now checking ... のメッセージは usbboot.cfg をチェックしているだけ なのがわかりちょっとがっかり。

ちょっと コードをチェックして bulk に read したときメッセージを出すようにしてみた。

    usbboot :> boot
    CPU data: JZ4750V1
    CPU not yet booted, now booting...
    Loading stage1 from '/usr/share/xburst-tools/xburst_stage1.bin'
    Download stage 1 program and execute at 0x80002000
    CPU data: JZ4750V1
    Loading stage2 from '/usr/share/xburst-tools/xburst_stage2.bin'
    Download stage 2 program and execute at 0x81c00000
    CPU data: JZ4750V1
    CPU data: Boot4750
    Booted successfully!
    CPU data: Boot4750
    #bulk_read: 8
    #00 00 00 00 00 00 00 00
    Configuring XBurst CPU succeeded.
    usbboot :>


CPU data: Boot4750 というメッセージは stage2 が出している。
要するに stage2 が動いて メッセージを変えたということらしい。あと bulk_read が その後初めて動作する。それまでは control エンドポイントでの通信。

それは良いとして、4750 用のコードが動いてしまっているようだ。これはまずいかも。Ben-Nanonote など 4740 のコードが動くはずで、動作を確認できていないコードが動作しているっぽい。

さて、4750 かどうかは、fw_args で判断している。要するに usbboot のプログラムが送り込んだ情報をもとに している。

さらに調べると、その情報は 結局 JZ4750V1 の情報を 引き継いでいる。

で、JZ4750V1 のまま動けば良いのだが ... stage2 の処理は なんかいろいろ違うのだった。

    それは置いておいて... USB device はどうやって使うのか調べようとしたのだが ... Programming Manual に 記載がないことが判った。まぁ Linux のドライバ見れば判ることだからあまり気にしないが ...

    ところで、stage2 に切り替わっても別段 USB をリセットしたりはしないのかも知れない。stage2 で USB を乗っ取るということか。ポーリングベースなら、切り替えの手続きもなしでいけそうだし。

    そうすると→ブートローダ→カーネルと処理を切り替えても最初の USB コンフィグのまま使えるのかも知れない。

    Linux の USB デバイスドライバを組み込まなければ そのまま使えるんじゃないだろうか? だったらコンソールとして使えるかも知れない。

で 無理やり 0x4740 に変更してみたら .. stage2 が動かない。-- ううむ 困った。

(続き)

実をいうと、NAND FLASH にアクセスできない問題が出ている。

nquery -- query NAND flash info

というのが動かないと先はないのだが、

    usbboot :> nquery 0 0
    CPU data: Boot4750
    ID of No.0 device No.0 flash:
    Vendor ID :0x0
    Product ID :0x0
    Chip ID :0x0
    Page ID :0x0
    Plane ID :0x0
    Operation status: Success!
    usbboot :>

となってしまうのだ。

stage2 が動いている以上、なんとかできるはずなので、調査から。

まず、ブートシーケンスの理解から

    1. NAND Boot の場合

  • 0x1FC00000 - 0x1FC01000(内部ROM)
    から起動して、NAND FLASH から Boot する場合、FLASH の最初のエリア(size 0x2000) を SDRAM 0x8000000 にロードする。もし ECC が正しくなければ、次のエリア(offset 0x2000) を SDRAM にロード 。これの ECC も正しくなければ STOP 。ロードが OK なら 0x80000004 に JUMP 。

  • 0x8000000 - 0x80002000 (First Stage Loader)
    U-BOOT を 0x80100000 に ロードして 先頭(0x80100000) に JUMP。

    2. USB Boot の場合

  • stage1 program and execute at 0x80002000
  • stage2 program and execute at 0x81c00000


ところで SDRAM の領域のベースアドレスは、ソフトで決めることができる。初期状態は、0x20000000 にマップされている?とかするので、要注意。

さて、どうするのか正しいのか? 困ってしまったのだが ... ググってみると

ingenic usbboot は対応済みなことがわかった。

たとえば stage1/fw/board_4750.c

ソース的には board_4750.c を変更して対応している。その中で 4725b かどうかを 特定の場所を参照して判断している。

( ( * (volatile unsigned int *) 0xB00F0000 ) & 0x80000000 )

どうも qi-hardware のものは 基本的に Ingenic オリジナルから再構成しているようだ。だいぶ別物になっているような印象。

ただ、jz4725b 対応は上記だけのようなので、ちょっとマージしてやってみる。

    usbboot :> nquery 0 0
    CPU data: Boot4750
    ID of No.0 device No.0 flash:
    # bulk_read: 8
    # 20 d5 94 25 44 00 00 00
    Vendor ID :0x20
    Product ID :0xd5
    Chip ID :0x94
    Page ID :0x25
    Plane ID :0x44
    # bulk_read: 8
    # 00 00 00 00 00 00 00 00
    Operation status: Success!
    usbboot :>

なんということだ。あっさり動いてしまった。で、Page ID を見ると 消去ブロックサイズ 256KB / ページサイズ 2KB だとわかる。

あと usbboot.cfg が 違うので 修正。

これで NAND FLASH が覗けるようになったかも。上記の bulk_read の 表示を削って使ってみることにした。


    usbboot :> nreadraw 0 2048 0 0
    ==== CPU data: Boot4750
    Reading from No.0 device No.0 flash....

    0x00000000 : ff 55 55 55 55 55 55 55 ff ff ff ff 01 00 11 04
    0x00000010 : 00 00 00 00 21 e0 e0 03 00 00 e9 8f 21 e0 20 01
    0x00000020 : 00 80 1d 3c 00 40 bd 37 00 80 19 3c b8 06 39 27
    0x00000030 : 08 00 20 03 00 00 00 00 00 00 00 00 00 00 00 00
    0x00000040 : 1b 43 02 3c 83 de 42 34 19 00 82 00 0f 00 02 3c
    0x00000050 : 10 20 00 00 40 42 42 34 82 24 04 00 1b 00 44 00
    :
    :
    0x000007e0 : 21 20 04 02 ff ff 84 24 5c 02 00 0c b0 15 45 24
    0x000007f0 : 00 80 02 3c b0 15 43 90 54 00 73 14 00 80 03 3c
    Operation end position : 0
    usbboot :>

コマンドには、nread/nreadraw/nreadoob がある。読み出す位置の指定はページ。

nread と nreadraw の違いがよくわかっていないのだが .. とりあえずあちこちダンプしてみた。


    nquery 0 0
    nreadraw 0 2048 0 0 ff 55 55 55 55 55 55 55 ff ff ff ff 01 00 11 04
    nreadraw 1 2048 0 0 7c 15 62 8c 18 00 40 10 21 80 00 00 00 80 14 3c
    nreadraw 2 2048 0 0 21 10 80 00 c3 28 02 00 2b 10 aa 00 0a 00 40 10
    nreadraw 3 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 4 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 5 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 6 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 7 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 127 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 128 2048 0 0 80 80 1f 3c 00 00 ff 27 00 90 80 40 00 98 80 40
    nreadraw 129 2048 0 0 10 00 b0 8f 08 00 e0 03 28 00 bd 27 57 03 20 0c
    nreadraw 130 2048 0 0 01 00 42 34 25 20 82 00 00 00 e4 ac 00 01 03 3c
    nreadraw 131 2048 0 0 00 00 43 90 06 00 6a 91 26 18 69 00 ff 00 63 30
    nreadraw 132 2048 0 0 44 03 0c 36 48 03 42 34 54 03 10 36 00 00 a5 ae

    nreadraw 150 2048 0 0 03 16 02 00 a2 a0 62 a0 0b 00 03 24 03 00 43 10

    nreadraw 160 2048 0 0 2b 20 a6 00 02 00 00 15 1b 00 68 00 0d 00 07 00
    nreadraw 161 2048 0 0 08 25 82 80 d3 ad 00 00 c1 95 00 01 01 00 00 00
    nreadraw 162 2048 0 0 1c 00 00 00 18 00 00 00 04 00 00 00 05 00 00 00
    nreadraw 163 2048 0 0 00 00 00 00 00 00 00 00 80 80 00 00 00 00 00 00

    nreadraw 164 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 165 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 175 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 200 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 255 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

    nreadraw 256 2048 0 0 00 02 00 00 00 04 00 00 00 20 00 00 66 03 00 00

    nreadraw 511 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 512 2048 0 0 00 02 00 ff 00 02 00 ff 00 02 00 ff 00 02 00 ff
    nreadraw 513 2048 0 0 00 02 00 ff 00 02 00 ff 00 02 00 ff 00 02 00 ff
    nreadraw 514 2048 0 0 00 02 00 ff 00 02 00 ff 00 02 00 ff 00 02 00 ff
    nreadraw 515 2048 0 0 00 02 00 ff 00 02 00 ff 00 02 00 ff 00 02 00 ff

    nreadraw 1024 2048 0 0 00 02 00 ff 00 02 00 ff 00 02 00 ff 00 02 00 ff
    nreadraw 2048 2048 0 0 00 02 00 ff 00 02 00 ff 00 02 00 ff 00 02 00 ff
    nreadraw 4096 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 8192 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 16384 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

    nreadraw 32768 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 32769 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    nreadraw 32770 2048 0 0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

頭から 6KB 弱?の stage1 ブートローダがある。ブートの仕組みからいうと 8KB x 2 にしそうなものだが、1つしかない。

128 ページから 163 ページまで(72KB) 何かが入っている。stage2 ブートローダ?

あとは、256 ページから(offset 512KB) にも。カーネル? 

さらに 512 ページ (offset 1024KB) からもなにか。.. あとはよくわからない。

それはともかく、0xff が続くデータは ファームウェアのファイルには入っていなかった。RAW イメージではなかったのだろう。

さて、なにをするにも NAND FLASH のバックアップを取っておきたい。だが、いまあるコマンドは ページ単位で データをダンプするのみ。バックアップ専用のコマンドなどないようだ。

作るのは簡単そうなのだが、意図的にそうしているような気もするし ... どうしよう。

とりあえずは、

  • 情報量を減らすため、nreadraw (など) で同じデータがあれば、続く状態は表示しないように変更。
  • アドレスの値が ページ内オフセットだったのを 絶対アドレスに変更 (ただし 4GB まで)
  • 繰り返しを指定できるように変更。

という改造をしてみた。

で、やってみたのだが、なんだがすごく遅い。1 秒に 2 ページぐらいの速度。これで 頭の 128MB を バックアップしようとすれば 10 時間ぐらいかかる計算。

ところで、nread と nreadraw の違いがわからない。他に readoob というのがあって、冗長データが読めるのは分かるのだが ...
説明には、

  • nread read NAND flash data with checking bad block and ECC
  • nreadraw read NAND flash data without checking bad block and ECC

nreadraw は、ECC をみない生のデータで、nread は、ECC を見て? bad block と代替したデータ? それともエラーになる?

どうもよくわからないが、同じ内容のようなので OK か。

ところで、OOB は Out of band というそうだ。2K ページ毎に 64 バイトある。ECC を このエリアに置くことになっているらしい。-- 内部ROM もチェックしているようだからどう置くかも決まっているのだろう。

... というわけで nreadoob でダンプしてみた。

  • パターン1) 頭の方

    0x00000000 : ff ff ff fa 75 f3 2c d5 cb 81 ac f6 84 c2 78 46
    0x00000010 : 13 c5 c4 08 38 3e d9 69 e7 59 d6 4c be e0 2f f1
    0x00000020 : 2c 58 fc ec 32 c7 b2 5c f8 25 50 ec ea 86 0b a5
    0x00000030 : 9d 40 44 27 31 b2 d4 ff ff ff ff ff ff ff ff ff

  • パターン2) 未使用

    0x00001800 : ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    *

  • パターン3) 後ろの方

    0x00110000 : 00 5f 02 ff 00 5e 01 ff 00 5d 00 ff 00 5c 00 ff
    0x00110010 : 00 5c 00 ff 00 5c 00 ff 00 5b 00 ff 00 5a 01 ff
    0x00110020 : 00 59 03 ff 00 58 04 ff 01 56 02 ff 02 55 00 ff
    0x00110030 : 02 55 00 ff 01 54 00 ff 01 54 00 ff 00 53 00 ff

  • パターン4) 後ろの方-- 未使用?

    0x0014c800 : 00 02 00 ff 00 02 00 ff 00 02 00 ff 00 02 00 ff


未使用のページは、0xff のままになっている。これで書き込んだことがあるかどうか判断できそうだ。

dual-boot を考えて そういうページに、自作のデータを置くようにすれば良いのだろう。

あと、あるところから 4 バイト単位で最後が 0xff になる特徴あるパターンになっている。そういう特徴があるものの中でも "0x00 0x02 0x00 0xff" で埋められているものもある。これは何だろう?

ちなみに、nreadraw で取ったデータにも 同じようなデータが見受けられる。

    使っているページを調べるために、nreadraw で取ったデータを見ていたのだが、文字列が入っていたりした。

    どうも OOB のデータではないようだ。使い方を間違っているのか?
    ... ただ、違ったとしても ページを使っているかどうかの判断には使える。


追記:JZ4750L VOLANS board

JZ4750 というのがどうにも気になっていたのだが ...

Ingenic の VOLANS 評価ボードというのは JZ4725B らしい。

当然のように対応済みなのだが、u-boot や linux では JZ4750L として扱っている。

キーワードだけ並べるとこんなかんじ。

  • VOLANS development board(ver:1.1, Jz4725B based)
  • linux : arch/mips/f4750l_defconfig
  • linux : arch/mips/include/asm/mach-jz4750l/board-f4750l.h
  • U-Boot(1.1.6) : board/volans

dingoo-linux と qi の両方とも JZ4750L の扱いは適当そうなので、Ingenic のカーネルとU-BOOT をちゃんと取ってこないとダメっぽい。

linux の方は取ってこれているので、board-f4750l.h を見てみると...

    GPIO_SD1_VCC_EN GPE4
    GPIO_SD1_CD_N GPC14
    GPIO_USB_DETE GPD6
    GPIO_DC_DETE_N GPD7
    GPIO_CHARG_STAT_N GPD15 (使っていない.. かも)
    GPIO_DISP_OFF_N GPD25 (LCD_REV ?)
    GPIO_LCD_PWM GPE14 (PWM4)

SD0 を除くと 上記の GPIO を定義している。別のボードの定義なわけだが、リファレンスだし、変更する理由がなければ変更しないかも知れないので参考にはなる。また、ピンアサインは変えても機能そのものを削ると ソースも直さないといけないので 素直に 対応しているかも知れない。ちなみに、想定していなかったピンは、

  • USB_DETE:

    USB に電源が供給されているかどうかを判断する(USB_UDC_HOTPLUG)のに必要。

  • GPIO_DISP_OFF_N:

    ディスプレーを OFF するのは LCD_DE ではなかったのか? あるいは(MOS FET の)電源スイッチ用?

  • GPIO_CHARG_STAT_N

    充電IC の LED 用のピン(/CHRG) に接続する。L で充電中。赤LED は充電を示すのではなく 外部電源の意味なので関係ない。

    どこにも接続されていないように見えたが GPIO につながっているのかも。

ぐらいか。

いろいろやらないといけないとしても、どのようにやるのが正しいのかということが分かったのは収穫。

ところで、f4750l_defconfig の中に CONFIG_JZ_FPGA=y なんて記述があり、FPGA を載せたボードなのか! .. なんて思ったのだが、ググると

    support f4750l(on fpga) board for jz4750l

なんて記述を見つけた。FPGA を載せたのではなく、LSI の開発前に FPGA に 載せたということらしい。

追記:本当に正しく読めているのだろうか?


0x00000000 : ff 55 55 55 55 55 55 55 ff ff ff ff


これは先頭のイメージで、0x80000000 にロードされて、0x80000004 から実行されるはず ... なのだが どう見ても命令のパターンには見えない。

とりあえず (いろいろやって) objdump で 逆アセンブルしてみた。


0: 555555ff 0x555555ff
4: 55555555 0x55555555
8: ffffffff 0xffffffff
c: 04110001 bal 14
10: 00000000 nop
14: 03e0e021 move gp,ra
18: 8fe90000 lw t1,0(ra)
1c: 0120e021 move gp,t1
20: 3c1d8000 lui sp,0x8000
24: 37bd4000 ori sp,sp,0x4000
28: 3c198000 lui t9,0x8000
2c: 273906b8 addiu t9,t9,1720
30: 03200008 jr t9
34: 00000000 nop
...


0xc 番地ぐらいからは 命令っぽいが、やはり 0x4 とか 0x8 番地は命令ではない。

あと、これはブートコードの先頭かというとそれらしい。スタックを 0x80004000 に設定しているみたいだし。

ひょっとしたら、0x80000004 番地に jump するのは古いチップだけで、JZ4750 以降は 0x80000010 番地とかに変わっているのかも知れない。

stage2 の調査



usbboot の stage2 のコードを見てみることにする。

main.c は 初期化を行ったあと usb_main() を call している。

usb_main() は、udc.c (USB Device Controller) にあり、ここですべてのコマンド処理をしている。

コマンド処理を見るまえに、ディスクリプタを見てみる。

  • ここでは、Vendor ID = x0601a , Product ID = 0x4740 固定で Product ID = 0x4750 は使っていない。
  • エンドポイントは、bulk エンドポイントが 2 つ。最大パケットサイズは 512B 。
  • String は、"A00A00A00A00" を返す ... とっても適当。


自分では usb を reset していない。HOST が USB を reset しない限り この ディスクリプタに切り替わらない。そして 0x4750 専用にした usbboot の方が動かなくなるはず。(ココ重要)

要するに一応は定義してあるもののダミー。

次に USB の処理を見てみる。

usb_main() では、udc4740Proc() を繰り返し call しているだけ。udc4740Proc では、USB_REG_INTRUSB, USB_REG_INTRIN, USB_REG_INTROUT というレジスタの内容を見て、処理を行う。

処理を行う関数は 次の 3 つ。

  • EP0_Handler()

    コントロール エンドポイントの処理。ベンダーリクエストの パケットに対してそれぞれの処理をする関数を呼び出すようになっている。

  • EPIN_Handler()

    Host から見て IN だから 送信のハンドラ。
    強制的に バッファのデータを送出するのは Handshake_PKT() ?

  • EPOUT_Handler()

    受信のハンドラ。

    送受信は、Bulk_buf というバッファに対して行われる。

    半二重でしか使っていないということ。Bulk_buf の操作は boothandler.c でしか行われていない。

    何に使っているかというと ...

      NAND_OPS_Handle()
      NAND_QUERY:
      NAND_READ_OOB:
      NAND_READ_RAW:
      NAND_READ:
      NAND_PROGRAM:
      SDRAM_OPS_Handle()
      SDRAM_LOAD:

    大量のデータ送受信は、バルク転送を使うらしい。


さて、仕組みをしってなにをしたいのか? ... というと、シリアルコンソールの代わりをするものを作りたいわけだ。

USBの処理は go した時点で用済みなわけだが、新たに動作するプログラムでも stage2 のようにして USB デバイスのコードを入れてやれば バルクエンドポイントをシリアルのように使って通信できるはず。ただし、usbboot の方も改造して go したあと 端末モードのように動作させる必要がある。
posted by すz at 20:42| Comment(0) | TrackBack(0) | Jz47xx

2010年04月15日

Neo Slim 3000 GPIO まとめ

dingoo-linux は A-320 の GPIO の解析を ここでまとめている。

同じようにまとめておかないと、よくわからなくなるので、ここを使って記録していこうと思う。

まず、Neo Slim 3000 は Jz4725B を使用している。128 ピンもある LQFP なのだが、SDRAM や LCD など 決まったピン割り当てがあるので、自由になるピンは意外に少ない。

例えば、自由になりそうな PWM は、PC15/PWM5 のみ。ここから LCD のバックライトが これに割り当たっているのではないかと推測できる。

    実際に PC15/PWM5 であった。初期状態は L 。これを H にすると バックライトが点灯。


それ以外でも 自由になりそうな GPIO は 数本しかないようだ。これだけ厳しいと ボタンを LCD のデータ線と共有するのも理解できる。

ちなみに 最低限度必要そうな GPIO は、

  • ボタン -- 詳細不明だが、LCD のデータ(PD0-PD15)と共用
  • スピーカー アンプ ON/OFF
  • バックライト LED ON/OFF (+PWM)
  • SDカード CS
  • DC電源のセンス
  • アナログスティック制御 (たぶん GPIO 1つと ADC 1つ)
  • LED 左 (赤) (ハード結線)
  • LED 右 (青) (ハード結線)
  • 電源スイッチのセンス (WKUP/PB31のはず)
  • 電源 OFF (PWRON のはず)

ぐらいか。GPIO で 5 個必要そうだが、自由になりそうな GPIO の数も(TxD/RxDを除くと) 8個 しかない。

上記以外でも GPIO を使っている可能性がある。思いつくのは、

  • POPノイズ低減
    Ben-NanoNote の回路図をみたが イヤホンを直結せずに MOS FET スイッチを入れていた。MOS FET らしきものはないようだから、可能性はなさそうだ。
  • ソフト I2c
    FM ラジオの制御を I2Cインターフェイスではなく GPIO で行っている可能性がある。GPIO が余っていればそうしてもおかしくはない。... のだが、よく考えたら FM ラジオモジュールの裏まで I2C の線が来ているのは確認済み。わざわざ別の線を付ける理由はないので、I2C を普通に使っているはずだ。

    補足:

    LED は ソフトで制御していなかった。USB-BOOT の時点で点灯している。
    電源の制御自体も GPIO ではなく専用の線がある。

    左右 LED メモ:



    右のLED, 左のLED の順。両方 左から アノード-カソード。LED のサイズは 1608。

    右のLED は青で抵抗が 102(1KΩ)、左のLED は赤で 201(200Ω)。抵抗が逆ではないかというのはサテオキ、左に注目すると太い線 - 抵抗 - LED と接続されている。この太い線はたぶん USB から供給される 5V そのもので GPIO で 供給されているかどうかを GPIO でセンスしているはず。

    FMラジオモジュールメモ:



    チップは違うが、FMレシーバモジュール(AR1010)を ストロベリーリナックスで扱っている。データシートを見るとピンアサインは、

    1 アンテナ (右上)
    2 N.C.
    3 L-OUT
    4 R-OUT
    5 GND (右下)
    6 VCC (左下)
    7 Write/Read
    8 Busmode (L: I2C / H: SPI)
    9 Clock
    10 Data (左上)

    となっている。(左右逆の番号割り当てなので注意) SPI を使うピンの余裕などないとすれば、I2C を使っているはずで、それは Busmode の電圧で判断できる。ピンアサインが合っているとすれば、6(VCC) と 8 が同じではないのでたぶん GND -- なら I2C のはず。 L-OUT/R-OUT はアナログなので、LINEIN に入るのではないかと思えるが、未確認。

    I2C でアクセスするレジスタの仕様は AR1000 なら サンプルコードから推測できる。使用している RDA5807P と互換性があるのかどうかは不明。RDA5800C なら aitendo で扱っているのでデータシートは入手できる。仕様が RDA5807P と近いことは想像できるが、どれぐらい違うのかは不明。

    ところで、RDA5800C はデータシートの情報だけでは 動かないそうだ。→ 参考
    ChaN さんのサンプルプログラムを参照しないと扱えない。RDA5807P は、データシートすら入手できていない。なかなか使うのは難しそうだ。まぁこういうのは最後にしたほうが良さそう。

    アナログスティック周り:

    ADC が 1 つしかないのに、2個必要になるアナログスティックをつなげているのが不思議だったのだが.. どうも SOT23 のIC が 3つあるところに接続されているようだ。



    IC の マークは、A2sSH , As1SH, WW1 -- 調べてみるとどうも A2sSH が Nch MOS FET(AO3402 互換?), A1sSH が Pch MOS FET(AO3401 互換?), WW1 が ショットキーバリア ダイオード2 個入り(BAT54C 互換?) らしい。

    実際の回路はわからないが、この組み合わせなら 1つの GPIO で切り替えられそうだ。

    電子工作しているとデスクリート IC が相対的に高いので、アナログ SW などを使ったりするのだが、こうやって 3 つも使っているのを見ると恐ろしく単価が低いのかも知れない。

    LED ドライバ周り:



    この IC が バックライト LED 用の DC/DC コンバータ。1番 pin がダイオードに接続されていて LX 。2 番 pin が GND 。裏には 22uH のインダクタ。12 Ωと低い抵抗値の抵抗があり、電流制限用に思える。バックライト LED は、 2 並列 2 直列 みたいだから 40mA ぐらい流すはず。そう仮定すると FB の電圧は 12 x 0.04 = 0.48V となるが、ちょっと中途半端。

    それはともかく、どうも aitendo で扱っている XZ5121のような IC のようだ。..とすると PWM 制御用の GPIO は 4 番 pin に接続されているはず。-- 0 Ωのジャンパが入っていたりしてどうもそれっぽい。

    ところで、XZ5121 のように OVP 端子がある IC でないと 定電流駆動は危険。LCD なしだと電圧が上がりすぎて コンデンサや IC そのものが壊れてしまう。まぁ大丈夫だと思うが 一応コンデンサの両端の電圧をチェックしておいた方が良いかも知れない。

      あまり信用できないテスターなのだが、5V ぐらいだった。とりあえずは大丈夫そうだ。


    電源制御のピンについて:

    RTC には、次のようなピンがある。


    84 PPRST(RTC) - power on reset / reset
    85 WKUP(RTC)/PB31 - wakeup signal after power down
    86 PWRON(RTC) - power on/off control of main power.


    WKUP は普通 電源ボタンに接続されるようだ。で PWRON は 出力で 電源ON は L レベル。--- GPIO を探さなくとも 電源を切ることができるのはありがたい。

    PPRST は いわゆるリセット。だがスイッチはないので、パワーオンリセット だけしか使えない。

    ... ブートプログラムやカーネルのテストで途中で暴走したりすれば、リセットもできず 電源も切れないことになりそうだ。WDT - Watch Doc Timer 機能は RTC に あるが、最初はなにもないところから始めるし --- バッテリーがない方が便利そうだ。ある程度まで行けば 、(Reset がわりの)電源断に頼らないようにできるだろうが...

      WDT reset がかかって立ち上がってきたときに、電源スイッチが Off側だったら電源を切るとかすれば、安心できるか。

      そういう対策は必要だが、それを作るまで裸のままというのもどうかと思う。よくよく考えれば バッテリーの線にスイッチを付けてしまえば、ソフトで対応しなくともバッテリー自体は切れる。

      RESET をどう引き出すか悩んでいたのだが、これなら電子工作としては難しくないし ... これでいいや。

    Nand Flash メモ:

    ピンをどういう風に接続するのものなのか Board_Design_Guide から

    49 PC9 A16(SRAM)/AL(NAND) → ALE
    50 PC8 A15(SRAM)/CL(NAND) → CLE
    51 PC29 FWE(NAND) → WE#
    52 PC28 FRE(NAND) → RE#
    53 PC27 FRB(NAND) → R/B#
    55 PC22 CS2(SRAM) → CE# (?)
    56 PC21 CS1(SRAM) → CE# (?)

    + DATA D0 - D7


    NAND FLASH 用のピンは全部使っているようだ。それに加えて CS1 or CS2 を CE# に接続するらしい。で、NAND FLASHは 空きパターンもあるから たぶん CS1/CS2 両方使っている。

    そういえば... 不要になった eeePC の 4GN/8GB SSD モジュールがいくつかある。K9GAG08U0M が 2 つ載ったやつと 4 つ載ったやつ。

    0.5mm ピッチなので 0.8mm ピッチの SDRAM より載せ替えが難しいが覚えておこう。4GB にもできるかも知れない。-- だからといって格別便利になったりはしないと思うが 壊した時修理できる可能性がある。自分でカーネルを作ったりすれば愛着が湧いたりするので、重要かも。

    SDRAM メモ:

    SAKC も参照してみたが、次の配線になるはず。

    10 PB16 DCS(SDRAM) → CS#
    11 PB17 RAS(SDRAM) → RAS#
    12 PB18 CAS(SDRAM) → CAS#
    13 PB19 SDWE(SDRAM)/BUFD → WE#
    14 PB20 WE0(SDRAM) → DQML
    15 PB21 WE1(SDRAM) → DQMU
    16 PB24 CKO(SDRAM) → CLK
    17 PB25 CKE(SDRAM) → CKE

    D0-D15 → D0-D15
    A0-A12 → A0-A12
    A13 → BA0
    A14 → BA1

    空いているピンなどはないようだ。ちなみに、512Kbit の SDRAM にしたとしても同じピンアサイン。

    そういえば、512Mbit (16MB x 8bit x 4bank) の SDRAM x 2 なら 2 段マウントで 128MB になるかも。0.8mm ピッチとはいえ 8bit 分ジャンパしなければならないから工作的に難しいが Jz4725B が対応しているかどうかぐらいは調べておこう。

      Jz4725(B) 自身は Column 12bit /raw 13bit/4 bank まで対応している。上の SDRAMは column 11bit / raw 13 bit 。

      この設定は、ブートローダで行う。linux カーネルは基本触らない。ブートローダがメモリにロードするわけで そのときには設定済みでないといけないわけだ。

      RESET 時の設定というものもある。上位アドレスはつかえないが、とりあえず下位だけはアクセスできるような設定のようだ。

      実をいうと チップ取りを目的に 512MB の SO-DIMM を買ってしまった。中古でなく新品が3000円ぐらいだったのだが、中身は 8bit の HYB39S512800A x 8 だった。いずれトライしてみたい。

      ところで 元々付いている SDRAM は、256Mb (4M x 16bit x 4bank)。column 9bit/row 13bit 。

      ついでに書いておくと BANK は常に最上位ビット。したがって Jz4725(B) はインターリーブできない。


    LCD用ピンアサイン:

    2 PD18 LCD_PCK(LCD)
    108 PD20 LCD_VSYNC(LCD)
    109 PD19 LCD_HSYNC(LCD)
    110 PD21 LCD_DE(LCD)
    LCD_D0 - D15 => R5G6B5

    GPIO候補

    102 PD23 LCD_SPL(LCD)
    103 PD22 LCD_CLS(LCD)
    105 PD25 LCD_REV(LCD)
    107 PD24 LCD_PS(LCD)
    111 PD17 LCD_D17(LCD)
    112 PD16 LCD_D16(LCD)

    LCD 用のピンは全部は使っていない。使っていないピンは GPIO として使われているはず。



    そのあたりの写真。右から 97,98... と並んでいる。
    102,103 は見えない。105 ,107 はすぐ上でスルーホール。111,112 も見えない。



    裏からみた写真。上に伸びているのが BOOT_SEL1 で 右のスルーホール。で、105,107 がその右に並んでいるはずなのだが、裏からみても見えない。

    Smart LCD 用のピンについて :

    電子工作ネタになるが、高速な I/O をしたいとするならば、LCD のコネクタを使う以外にないので、ちょっと調査してみた。

      Smart LCD は、コマンドがあるタイプの LCD 。コマンドかデータは (9bit シリアル以外は) RS 線で 指定する。サポートしている機能は、データを一方的に送るのみで READ 系はサポートしていない。必要なら GPIO を操作して読み込めということだろう。

      サポートしている Smart LCD はパラレル以外に シリアルも。


      109 PD19 LCD_HSYNC(LCD) → SLCD_RS
      108 PD20 LCD_VSYNC(LCD) → SLCD_CS
      2 PD18 LCD_PCK(LCD) → SLCD_CLK (Serial Only)
      113 PD15 LCD_D15(LCD) → SLCD_DATA (Serial Only)


      Smart LCD を使う場合は、LCD のピンが上のように切り替わる。LCD のピンが切り替わるだけだから、改造して LCD のコネクタの先に別の装置を接続するようなときに、Smart LCD も直結できる。パラレルなら SLCD_LCK しか物理的には余らないが、コマンドが 16bit とは限らないので、FPGA などを使う場合 RS を使って多重化できる。また、シリアルを使えば、D0-D14 が別の目的に使えることになる。

      ちなみに、LCD でも 8bit-Serial RGB というモードもある。D0-D7 に R/G/B を順番に出力していくモードで、D8-D15 を別の目的に使える。(ちなみに このタイプは、Ben-NanoNote で使われている)

      あと IPU を使用する場合、サポートできるフレームバッファのフォーマットは R8G8B8 とか R5G6B5 とかに限られる。smart LCD の場合好きなように使うと IPU が使えないかも知れないので注意。


    TV OUT 用のピンについて :

    JZ4725B のデータシートには TV エンコーダの機能などない。ボードを見ても TV OUT 用のチップは載っていない。

    にも関わらず、TV OUT のメニューがあったりする。また、"PMP-3000" という ベースが同じ 製品 の仕様には TV OUT があったりする。

    さらに "PMP-3100" は、"PMP-3000" より少しだけ高い価格で JZ4725B を使っていると思えるのだが、TV OUT 用のコネクタまで持っている。

    また、Linux などでは JZ4725B は JZ4750L として管理している。そして、JZ4750 , JZ4755 は TV エンコーダというハードウェアを持っていたりする。

    これはどういうことだろう? ちょっと気になったりしている。

    SDカードセンス:

    カードを入れてみると GPIO の状態が変わった。PD14 が L になっている。

    おどろいたことに、SD カードのセンスなんてものまで LCD の出力と共用していた。

    まとめ



      Neo Slim 3000 JZ4725B ピンアサイン表 (作成中)

      凡例 : x 割り当てに選択の余地がないピン
      o Neo Slim 3000 固有の割り当てで判明したピン
      ? 不明なピン

      Jz4725 Jz4725B
      x 1 PD0 LCD_D0(LCD)
      x 2 PD18 LCD_PCK(LCD)
      x 3 GND
      x 4 VDDCORE(1.8V)
      x 5 PB3 A3(SDRAM)
      x 6 PB2 A2(SDRAM)
      x 7 PB1 A1(SDRAM)
      x 8 PB0 A0(SDRAM)
      x 9 PB10 A10(SDRAM)
      x 10 PB16 DCS(SDRAM)
      x 11 PB17 RAS(SDRAM)
      x 12 PB18 CAS(SDRAM)
      x 13 PB19 SDWE(SDRAM)/BUFD
      x 14 PB20 WE0(SDRAM)
      x 15 PB21 WE1(SDRAM)
      x 16 PB24 CKO(SDRAM)
      x 17 PB25 CKE(SDRAM)
      x 18 PB12 A12(SDRAM)
      x 19 PB11 A11(SDRAM)
      x 20 GND
      x 21 VDDCORE(1.8V)
      x 22 PB9 A9(SDRAM)
      x 23 PB8 A8(SDRAM)
      x 24 VDDIO(3.3V)
      x 25 GND
      x 26 PB7 A7(SDRAM)
      x 27 PB6 A6(SDRAM)
      x 28 PB5 A5(SDRAM)
      x 29 PB4 A4(SDRAM)
      x 30 PB13 A13(SDRAM)
      x 31 PB14 A14(SDRAM)
      x 32 PA8 D8(SDRAM)
      x 33 PA9 D9(SDRAM)
      x 34 PA10 D10(SDRAM)
      x 35 PA11 D11(SDRAM)
      x 36 PA12 D12(SDRAM)
      x 37 PA13 D13(SDRAM)
      x 38 PA14 D14(SDRAM)
      x 39 PA15 D15(SDRAM)
      x 40 PA0 D0(SDRAM)
      x 41 PA1 D1(SDRAM)
      x 42 PA2 D2(SDRAM)
      x 43 PA3 D3(SDRAM)
      x 44 PA4 D4(SDRAM)
      x 45 PA5 D5(SDRAM)
      x 46 PA6 D6(SDRAM)
      x 47 PA7 D7(SDRAM)
      ? 48 PC15 PWM5
      x 49 PB16 A16(SRAM)/AL(NAND)
      x 50 PB15 A15(SRAM)/CL(NAND)
      x 51 PC29 FWE/MSC0_D1
      x 52 PC28 FRE/MSC0_D0
      x 53 PC27 FRB/MSC0_D2
      ? 54 PC20 WAIT(SRAM)
      x 55 PC22 CS2/MSC0_D3
      x 56 PC21 CS1
      ? 57 PC13 PWM3/UART0_RxD(UART)
      ? 58 PC12 PWM2/UART0_TxD(UART)
      ? 59 PC11 PWM1/I2C_SCK(I2C)
      ? 60 PC10 PWM0/I2C_SDA(I2C)
      x 61 PD28 MSC1_D0(MSC)
      x 62 PD26 MSC1_CLK(MSC)
      x 63 PD27 MSC1_CMD(MSC)
      x 64 EXCLK(CPM)
      x 65 EXCLKO(CPM)
      x 66 VDDIO(3.3V)
      x 67 PBAT/ADIN0
      ? 68 ADIN1
      x 69 VSSADC(CPM)
      x 70 VDDADC(CPM)
      x 71 AVDDPLL(CPM)
      x 72 AVSSPLL(CPM)
      x 73 VDDPLL(CPM)
      x 74 VSSPLL(CPM)
      x 75 VDDA(USB)
      x 76 RREF(USB)
      x 77 VDDUSB(USB)
      x 78 DM0(USB)
      x 79 DP0(USB)
      x 80 VSSUSB(USB)
      x 81 RTCLK(RTC)
      x 82 RTCLKO(RTC)
      x 83 VDDRTC(RTC)
      x 84 PPRST(RTC)
      x 85 PB31 WKUP(RTC)
      x 86 PWRON(RTC)
      x 87 VDDHP(CODEC)
      x 88 RHPO(CODEC)
      x 89 VSSHP(CODEC)
      x 90 LHPO(CODEC)
      x 91 VDDLHP(CODEC)
      x 92 VSSCDC(CODEC)
      x 93 VDDCDC(CODEC)
      x 94 VREF(CODEC)
      x 95 VDDCDC2(CODEC)
      x 96 VSSCDC2(CODEC)
      x 97 LLINEIN(CODEC)
      x 98 RLINEIN(CODEC)
      x 99 MICIN(CODEC)
      x 100 BOOT_SEL0
      x 101 BOOT_SEL1
      ? 102 PD23 LCD_SPL(LCD)
      ? 103 PD22 LCD_CLS(LCD)
      x 104 VDDIO(3.3V)
      ? 105 PD25 LCD_REV(LCD)
      x 106 GND
      ? 107 PD24 LCD_PS(LCD)
      x 108 PD20 LCD_VSYNC(LCD)
      x 109 PD19 LCD_HSYNC(LCD)
      x 110 PD18 LCD_DE(LCD)
      ? 111 PD17 LCD_D17(LCD)
      ? 112 PD16 LCD_D16(LCD)
      x 113 PD15 LCD_D15(LCD)
      x 114 PD14 LCD_D14(LCD)
      x 115 PD13 LCD_D13(LCD)
      x 116 PD12 LCD_D12(LCD)
      x 117 PD11 LCD_D11(LCD)
      x 118 PD10 LCD_D10(LCD)
      x 119 PD9 LCD_D9(LCD)
      x 120 PD8 LCD_D8(LCD)
      x 121 PD7 LCD_D7(LCD)
      x 122 PD6 LCD_D6(LCD)
      x 123 PD5 LCD_D5(LCD)
      x 124 PD4 LCD_D4(LCD)
      x 125 GND
      x 126 PD3 LCD_D3(LCD)
      x 127 PD2 LCD_D2(LCD)
      x 128 PD1 LCD_D1(LCD)



      Neo Slim 3000 判明ピン

        バックライトの制御
      48 PC15 PWM5/A18(SRAM)
        SDカードのセンス
      114 PD14 LCD_D14(LCD)
        "L" ボタン
      85 PB31 WKUP(RTC)
        "R" ボタン
      124 PD4 LCD_D4(LCD)
        "↑" ボタン
      1 PD0 LCD_D0(LCD)
        "↓" ボタン
      128 PD1 LCD_D1(LCD)
        "←" ボタン
      127 PD2 LCD_D2(LCD)
        "→" ボタン
      126 PD3 LCD_D3(LCD)
      101 BOOT_SEL1
        "▲" ボタン
      117 PD11 LCD_D11(LCD)
        "×" ボタン
      118 PD10 LCD_D10(LCD)
        "■" ボタン
      116 PD12 LCD_D12(LCD)
        "○" ボタン
      119 PD9 LCD_D9(LCD)

      Neo Slim 3000 調査対象ピン

      バックライトの制御候補

      ? 48 PC15 PWM5/A18(SRAM)

      専用機能
      ? 57 PC13 PWM3/UART0_RxD(UART)
      ? 58 PC12 PWM2/UART0_TxD(UART)
      ? 59 PC11 PWM1/I2C_SCK(I2C)
      ? 60 PC10 PWM0/I2C_SDA(I2C)
      ? 68 ADIN1

      電源制御
      x 84 PPRST(RTC)
      x 85 PB31 WKUP(RTC)
      x 86 PWRON(RTC)

      GPIO 候補
      ? 54 PC20 WAIT(SRAM)
      ? 102 PD23 LCD_SPL(LCD)
      ? 103 PD22 LCD_CLS(LCD)
      ? 105 PD25 LCD_REV(LCD)
      ? 107 PD24 LCD_PS(LCD)
      ? 111 PD17 LCD_D17(LCD)
      ? 112 PD16 LCD_D16(LCD)
      + UART ?
  • posted by すz at 21:39| Comment(0) | TrackBack(0) | Jz47xx(機種解析)

    UBIFS とは?

    前の記事で、どうも UBIFS を使っているらしいと書いた。

    もう一度 README-JZ の図を貼るが


    +-----------+ +-------------+ +-------------+
    | YAFFS2 | | UBIFS | | FAT or EXT2 | Filesystems
    +-----------+ +-------------+ +-------------+
    \ | / \
    \ | / \
    \ | / \
    \ | +-----------------+ +-----------------+
    \ | | UBI Block Layer | | MTD Block Layer |
    \ | +-----------------+ +-----------------+
    \ | / /
    \ | / /
    \ +-------------+ /
    \ | UBI | /
    \ +-------------+ /
    \ | /
    +-------------------------------------------+
    | MTD |
    +-------------------------------------------+
    |
    +--------------------+
    | nand_base.c |
    +--------------------+
    |
    +--------------------+
    | jz4740_nand.c |
    +--------------------+

    jz47xx のような組み込みチップで使っている NAND FLASH は、生の FLASH なので、ウェアレベリング機能などはない。そして、使う側から見て 普通の USB DISK に見える機能が見えていて FAT で ファイルシステムが作れるようになっている。

    その間に ウェアレベリングをする機能がないと、特定の ブロックばかり書き換えられて FLASH がすぐダメになってしまう。

    ウェアレベリングをする機能を提供しているのが、どうも UBI Block Layer というもので、基盤の機能を提供するのが UBI 。

    UBIFS は、内部で使われるファイルシステムで、UBIFS - UBI の二階層の構造。これとは別に YAFFS2 という FLASH 向けファイルシステムはいっている。( ちなみに Linux で 有名な JFFS2 という FLASH 向けファイルシステムは、数 GB といった 大容量フラッシュを想定して設計されていないらしく、推奨していないようだ。)

    どういう基準でどちらを使うのかよくわからないが、UBI Block Layer 必須のシステムなら UBIFS を使った方が整合性が良さそうな気がする。

    ところで、Linux-2.6.32 だと UBIFS は標準でサポートされている。下位レイヤの UBI も drivers/mtd/ubi にあるようだ。

    さて、UBI とは、UBIFS というのは具体的にどんなものなのだろう? そして u-boot は UBIFS からのブートを サポートしているのだろうか?

    カーネルの Documentation/filesystems/ubifs.txt があり、その翻訳が JFプロジェクトでされている。

    ubifs.txt によると さらに詳しい情報は、UBIFS - UBI File-SystemUBIFS FAQ and HOWTO のページになる。

    とりあえず知りたいのは、オリジナルファームウェアの構造。UBIFS だと目星をつけたとして、どうやって中を見るのだろう?

    FAQ をみると、「How to extract files from an UBI/UBIFS image?」 というそのものズバリなエントリーがあって、


      # Create an 256MiB emulated NAND flash with 2KiB NAND page size
      # (you should see the new MTD device in /proc/mtd)
      modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa \
      third_id_byte=0x00 fourth_id_byte=0x15

      # MTD is not LDM-enabled and udev does not create device
      # MTD device nodes automatically, so create /dev/mtd0
      # (we assume that you do not have other MTD devices)
      mknod /dev/mtd0 c 90 0

      # Copy the contents of your image to the emulated MTD device
      dd if=ubi.img of=/dev/mtd0 bs=2048

      # Load UBI module and attach mtd0
      modprobe ubi mtd=0

      # Mount UBIFS
      mount -t ubifs /dev/ubi0_0 /mnt/ubifs



    と書いてある。要するに nandsim というカーネルモジュールが必要で それを使って実際に ubifs で mount するということらしい。

    さて、Vine-5.1 にこれらは入っているのだろうか? どうも UBIFS は、linux-2.6.27 で入って Vine-5.1 も linux-2.6.27 。
    ビルトしてくれていれば入っていることになる。

    で、みてみると ...

      drivers/mtd/nand/nandsym.ko
      drivers/mtd/ubi/ubi.ko
      fs/ubifs/ubifs.ko

    嬉しいことにちゃんと入っている。

    ちょっとこれで、ファームウェアの中が覗けるのかどうか、調べてみよう。

    ... それ以前の問題として id_byte って何?という疑問が。

    2GB 8bit の K9XXG08UXM のデータシートが入手できたので見てみたところ ...

    • 1st 0xec
    • 2nd 0xd5
    • 3rd 0x14
    • 4th 0xb6
    • 5th 0x74

    • と 5 つもあった。1st がベンダーID , 2nd がプロダクトID 。
      3rd は、チップのタイプ

        bit 7 : cache program - 0: Not support 1: support
        bit 6 : interleave program - 0: Not support 1: support
        bit 5-4 : 同時にプログラム可能なページ数 - 0:1 1:2 2:4 3:8
        bit 3-2 : セルタイプ - 0:SLC 1:MLC(2bit) 2:MLC(3bit)
        bit 1-0 : 内部チップ数 - 0:1 1:2 2:4 3:8


      0x14 なら 普通の MLC 。

      4th は、ページのサイズとか 消去ブロックサイズ。

        bit 7 : アクセスタイム? 0:低速 1:高速(25ns)
        bit 6 : ビット幅? 0:x8 1:x16
        bit 5-4 : 消去ブロックサイズ 0:64KB 1:128KB 2:256KB 3:512KB
        bit 3 : 0
        bit 2 : 冗長データサイズ(512B あたり) - 0:8バイト 1:16バイト
        bit 1-0 : ページサイズ 0:1KB 1:2KB 2:4KB 3:8KB


      0xb6 だと 消去ブロックサイズ 512KB ページサイズ 4KB 。冗長データサイズは、4Kのページあたり 16x8 = 128B 。

      5th は、容量に関する情報

        bit 6-4 : プレーンサイズ 0: 64Mb .. 4:1Gb 5:2Gb 6:4Gb 7:8Gb
        bit 3-2 : プレーン数 0:1 1:2 2:4 3:8


      0x74 なら 8Gbit x 2 で 16Gbit/2GB 。

      それは良いのだがこのパラメータをそのまま入れたら nandsim が 落ちてしまった。--- ううむ。

      さらに ファームウェアは RAW データではないかも知れない。
      先頭は確かに RAW データっぽいのだが、UBIFS の magic が見つけられなかった。UBI の magic も見つけられないし。

      それに ... UBI はパーティション別に構築するものっぽい。

      .. というわけで良くわからなく...
    posted by すz at 21:36| Comment(86) | TrackBack(0) | Jz47xx