2010年09月14日

ソースをシュリンク

Linux のソースコードは大きい。bzip2 を固めたものでも 61MB もある。これを展開すると 420MB にもなる。

    420MB は、du で調べた値。ファイルシステムの消費量としてみる場合は、展開する前後で df で調べる。ext3 で試してみると ... 414MB で差はあまりなかった。ext3 は良いが、VFAT の microSD に 閲覧用として展開すると ひどいことになりそう。

ディスクスペースを使うのも問題だが、これだけのファイルを作ったり消したりするのは、SSD や (SD/microSD) ではやりたくない。

さらに diff をとったり grep するのに、対象ファイルが多いのは 遅くて不便。あと、grep で関係ないファイルがヒットすることも無くなる。-- これができると便利なときがあるかも知れない。(常に便利とは限らない)

... というわけでシュリンクした ソース tree を作ってみた。

方針として、ファイルを変更しないという条件を付ける。変更すると 差分が違ったりして diff を見るのが面倒になるだけでなく、何度も同じことをするのが億劫なのだ。自動化するツールがないとやってられない。

さて、どのようにやるか ...

ソースコードの依存関係は、ビルドした後 .xxx.cmd ファイルに含まれている。(注意:ビルドするときに作られるので、モジュールも含め 一度完全にビルドしないといけない)

.xxx.cmd ファイルを cat で全部くっつけて、sort したものをまず作る。


cat `find . -name .*.cmd -print` | sort | uniq > file

こんな感じ。

できたファイルを エディタで 編集する。 $(wildcard ...) から始まるものと ホストのファイル を削除すると ... ソースコードがある ディレクトリのヘッダファイルが先頭になる。そして相対パスの ソースコードが続き $(deps...) で始まる行になるので、$(deps ...) 以降を削除する。

これを元にして

  • 一部 .. が含まれているので手動で変更。
  • 絶対パスを linux からの相対パスに変更(スクリプト等で変換)。
  • 最後の スペース + \ を削除(スクリプト等で変換)。
  • モジュールは .mod.c とかになっているので .mod を 削除

という作業をする。

できたものに対して sort + uniq すると 2000 行ほどのファイルになる。

これが第一のファイル群。


tar -zcvf ../file1.tar.gz `cat file`

などとして、tar で固める。

次に Kconfig* Makefile* Kbuild* を tar で固める。

tar -zcvf ../file2.tar.gz `find . -name Kconfig\* -print` `find . -name Makefile\* -print` `find . -name Kbuild\* -print`


これが第二のファイル群。これも 2000 個ほどになる。


あと scripts と arch/mips/boot と drivers/video/logo を tar で固める。

tar -zcvf ../file3.tar.gz scripts arch/mips/boot drivers/video/logo

これが第三のファイル群。

TOP ディレクトリを作成し、第一〜第三のファイル群を展開。

コンパイルしてみる。

まずは、make distclean がエラーにならないか確認。.. たぶん

    include/asm が シンボリックリンクになっていないのでエラーになる。asm を消す。

これで通るはず。

次に make zImage してみると ...

  • make は進むが、arch/x86/include/asm/unistd_32.h がないと言われるので、コピーしておく。
  • 次に kernle/timeconst.pl がないと言われるのでコピー
    これでだいぶ進むが ..
  • drivers/char/cp437.uni がないといわれるのでコピー。fs/nls に nsl_cp932.c nsl_cp936.c nsl_cp437.c のどれかはないはずなので ついでにコピーしておく。
  • drivers/char/defkeymap.c がないと言われる。defkeymap.c_shipped と defkeymap.map をコピー
    これで .. zImage まで作成できたはず。


さて、これはこれで良いのだが ... config を変更するとファイルが足りなくてエラーになる。

第一のファイル群を作成するときに、複数の config で 作ると良い。

作成中の JZ4725B 用の config と lyra から YAFFS2 を抜いた config で 作った シュリンク版とオリジナルの規模比較

tar+bz2 のサイズ 展開後サイズ ファイル数
オリジナル    61.5MB 420MB 29652
シュリンク版 7.4MB 63MB 5770


展開後サイズで 15 % 程 (ファイル数で 20% ほど) に縮小できた計算。

    ファイル数が相対的に多いのは、余計な Kconfig/Kbuild/Makefile が含まれているため (平均ファイルサイズが小さくなる) 。

    必要なものだけ 選び出すスクリプトを作れば、多少減らせるのかも知れない。さらに自動で編集してくれて、本当に必要なものだけに出来るのであれば、それを使っても良いとは思っている。--- だがそういうのを作るは面倒だしいまのところはパス。


ファイルのリストを linux-2.6.31.3-ingenic-r108-shrinked.files.gz に置いておく。参考まで。

追記:

arch にある Kconfig とか があるのでターゲットでない arch も残しているわけだが ... 試してみたら

    ia64 mips s390 um x86

を残せば良さそう。

試し方は、1つのディレクトリを mv で rename して make distclean が通るかどうかを見る。エラーになれば消せない。

最終的には、実際にカーネルをビルドしてみる。だめなら tar ファイルからファイルを戻す。

まぁそこまで消せたとしても 減るファイル数は知れている。
drivers にディレクトリが沢山あるのでこちらのほうが効いてくる。-- だが subdir の Makefile が drivers/Makefile からインクルードされているので、ファイルの編集をしないと消せない。( arch は基本 TOPみたいなものだから 例外を除いて消すことができる。)
posted by すz at 00:14| Comment(0) | TrackBack(0) | Jz47xx(Linux)

2010年09月09日

configのチェック

Jz4725B 用のカーネルを作るには、正しい config ファイルが必要。他の Jz47xx のボードの config は参考にするものの、自分用の config を 作っていかないといけないと考えている。

とりあえずは、f4750l_defconfig をベースにしているが、デバイス周りは全然だめだと思うし、参考にする ボード を 1 つ決めておこうと思う。

Jz4730 のものは古そうなので除外。Jz4750D は laptop みたいなものがターゲットのように見えるので除外。Jz4750 は良さそうだが、機能が多いので むしろ Jz4740 のほうが良さそう。

というわけで、Jz4740 に どういうものがあるかまずチェック。

  • leo SUSPEND, UBI が disable
  • lyra SUSPEND, UBI が定義されている。
  • pavo SUSPEND, UBI が disable
  • virgo SUSPEND が disable


どういうボードなのか理解したわけではないが、lyra を基準にしてみようと思う。

まずは、 f4750l のチェック。あとで lyra との違いをチェックしようと思う。

一般的な設定:CPU関係

    CONFIG_JZ_FPGA=y -- JZ4725B は FPGA ではないから 外したいが、なにをするのに使っているかチェックした後にする。

      使っていない。外してよい。

    CONFIG_CPU_HAS_PREFETCH=y -- prefetch を持っているが果たして性能が上がるのか? SDRAM は、BANK を使いこなすと アクセスをオーバラップさせてスループットを向上できるが、Jz47xx では BANK が上位ビットで 使う物理ページがランダムにならないと オーバラップできない。その条件は 使っているうちにランダムに近くなるのでクリアできそうだが。そもそも Jz47xx のメモリコントローラに オーバラップできる機能があるのか疑わしい。
    それでも どうせアクセスするようなデータなら prefetch しておくのは有効かも知れない。Linux が動いた後の話になるが、外してどう性能が変わるか見てみたい。

    CONFIG_HZ_100=y -- HZ=100 なのか。これも覚えておこう。

    CONFIG_ARCH_HIBERNATION_POSSIBLE=y
    CONFIG_ARCH_SUSPEND_POSSIBLE=y
    CONFIG_PM=y
    CONFIG_PM_SLEEP=y
    CONFIG_SUSPEND=y
    CONFIG_SUSPEND_FREEZER=y
    # CONFIG_HIBERNATION is not set

    このあたり、サスペンドがちゃんと動くかどうかをチェックする時のキーワード。

    ところで、SIMD 命令の XMUが使う 専用のレジスタについて、カーネルは感知しないことになっているようだ。CONFIG がなにもない。-- 1 プロセスが使うことのみが前提で、それを守る仕組みもないから自己責任で使うことになる。

    Linux カーネルで でコンテキスト切り替えしてくれたら、描画ライブラリでも使えるし、カーネルでのメモリコピーにも使えるのに とか思う。
    ただ、フローティングポインタレジスタの制御ように、最適化しないと使わないプロセスの プロセススイッチが遅くなってしまう。
    でも、そういうコードを作るには、情報が足りていない。

    JZ4725(無印)の config があった。(dipper)

    CONFIG_JZ4725_DIPPER=y
    CONFIG_SOC_JZ4740=y
    CONFIG_SOC_JZ4725=y

    なんて定義している。

    CONFIG_JZ4725B_NS3K=y
    CONFIG_SOC_JZ4750L=y
    CONFIG_SOC_JZ4725B=y

    なんてするのが良いのだろうか?



一般的な設定: Linux


    FAT_DEFAULT_CODEPAGE=437

    CONFIG_NLS_CODEPAGE_437=y
    CONFIG_NLS_CODEPAGE_936=y
    # CONFIG_NLS_CODEPAGE_932 is not set

    このあたり修正しておくべき。

    CONFIG_NET

    NET は入れる。いれないのは論外だと思うが、例えば lyra は入っていなかったりする。

    CONFIG_NFS_FS=y
    CONFIG_NFS_V3=y
    CONFIG_NFS_V3_ACL=y
    CONFIG_NFS_V4=y
    # CONFIG_NFS_V4_1 is not set
    CONFIG_ROOT_NFS=y
    CONFIG_NFSD=y
    CONFIG_LOCKD=y
    CONFIG_LOCKD_V4=y
    CONFIG_NFS_ACL_SUPPORT=y
    CONFIG_NFS_COMMON=y
    CONFIG_SUNRPOC=y
    CONFIG_SUNRPC_GSS=y
    CONFIG_RPCSEC_GSS_KRB5=y

    NFS は使いたいが、V3 までで良い。V3_ACL もいらない。
    NFS を root にできるようにしておく。
    NFSD/LOCKD は module で良い。

    # CONFIG_CIFS is not set

    CIFS は、モジュールで いれておく。PC 側で共有設定すると、PC のファイルにアクセスできる。こちらの設定は、実際に使っている PC 用のものを参考にする。


次に、lyna で定義されているが、f4750l で定義されていないもの。調べかたには、diff に対して lyra 分を grep し、 "=y" を grep する観点と f4750l 分を grep し、"not set" を grep する観点の 2 つがある。

まずは、lyna で "=y" となっているもの

    CONFIG_JZ4740_LYRA=y
    CONFIG_SOC_JZ4740=y
    CONFIG_KALLSYMS_ALL=y
    CONFIG_FREEZER=y
    CONFIG_PM=y
    CONFIG_PM_SLEEP=y
    CONFIG_SUSPEND=y
    CONFIG_SUSPEND_FREEZER=y

    ここまで 一般的なもの。SUSPEND 関連はコピーする。KILLSYMS_ALL は 勝手に y になった。

      CONFIG_CPU_FREQ_JZ=y
      CONFIG_CPU_FREQ=y
      が無くなっていることに気がついた。

      arch/mips/Kconfig (の Power Management の上) に

      215 +menu "CPU Frequency scaling"
      216 +
      217 +config CPU_FREQ_JZ
      218 + tristate "CPUfreq driver for JZ CPUs"
      219 + depends on JZSOC
      220 + default n
      221 + help
      222 + This enables the CPUfreq driver for JZ CPUs.
      223 +
      224 + If in doubt, say N.
      225 +
      226 +if (CPU_FREQ_JZ)
      227 +source "drivers/cpufreq/Kconfig"
      228 +endif
      229 +
      230 +endmenu

      が入っていなければならない。
      これをいれた上で、
      CONFIG_CPU_FREQ_JZ=y
      CONFIG_CPU_FREQ=y
      CONFIG_CPU_FREQ_TABLE=y
      CONFIG_CPU_FREQ_STAT=y
      CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
      CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
      CONFIG_CPU_FREQ_GOV_USERSPACE=y
      とする。

    CONFIG_MTD=y
    CONFIG_MTD_CONCAT=y
    CONFIG_MTD_PARTITIONS=y
    CONFIG_MTD_CHAR=y
    CONFIG_MTD_BLKDEVS=y
    CONFIG_MTD_BLOCK=y
    CONFIG_MTD_MAP_BANK_WIDTH_1=y
    CONFIG_MTD_MAP_BANK_WIDTH_2=y
    CONFIG_MTD_MAP_BANK_WIDTH_4=y
    CONFIG_MTD_CFI_I1=y
    CONFIG_MTD_CFI_I2=y
    CONFIG_MTD_BLOCK2MTD=y
    CONFIG_MTD_NAND=y
    CONFIG_MTD_NAND_JZ4740=y
    CONFIG_MTD_NAND_MULTI_PLANE=y
    CONFIG_MTD_HW_RS_ECC=y
    CONFIG_MTD_NAND_IDS=y

    ここまで MTD 関連。Jz4750 用も見た上でいれる。

    CONFIG_INPUT_MOUSEDEV=y
    CONFIG_INPUT_MOUSEDEV_PSAUX=y
    CONFIG_INPUT_EVDEV=y

    PSAUX は入れないが 他は入れておこう。

    CONFIG_RTC_JZ=y
    CONFIG_JZCHAR=y
    CONFIG_JZ_TPANEL_ATA2508=y
    CONFIG_WATCHDOG=y
    CONFIG_JZ_WDT=y
    CONFIG_FB_JZLCD_4730_4740=y
    CONFIG_JZLCD_AUO_A030FL01_V1=y
    CONFIG_I2S_ICODEC=y

    このあたりは JZ4750 も見ていれてみる。

    CONFIG_USB_GADGET_DEBUG_FILES=y
    CONFIG_USB_GADGET_JZ4740=y
    CONFIG_JZ_UDC_HOTPLUG=y
    CONFIG_UDC_USE_LB_CACHE=y

    USB GADGET は入れる。

    CONFIG_EXT3_FS=y
    CONFIG_EXT3_FS_XATTR=y
    CONFIG_JBD=y
    CONFIG_UBIFS_FS_LZO=y
    CONFIG_UBIFS_FS_ZLIB=y
    CONFIG_UBIFS_FS_DEBUG=y
    CONFIG_YAFFS_FS=y
    CONFIG_YAFFS_YAFFS1=y
    CONFIG_YAFFS_YAFFS2=y
    CONFIG_YAFFS_ECC_RS=y
    CONFIG_YAFFS_AUTO_YAFFS2=y
    CONFIG_YAFFS_DISABLE_CHUNK_ERASED_CHECK=y
    CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
    CONFIG_DEBUG_FS=y

    EXT3 は入れる。UBIFS は モジュールにする。YAFFS2 は入れない -- できるだけ多くのエリア を UBI にする予定で、UBI の上に YAFFS2 は載らない。載るのは一般のFS か UBIFS 。

    CONFIG_REED_SOLOMON=y
    CONFIG_REED_SOLOMON_ENC8=y
    CONFIG_REED_SOLOMON_DEC8=y

    これはなんだろう?


f4750l で not set として出てくるもの。上記を除く。

    # Thu Sep 9 12:49:31 2010
    # CONFIG_JZ4740_LYRA is not set
    # CONFIG_POSIX_MQUEUE is not set
    # CONFIG_TASKSTATS is not set
    # CONFIG_AUDIT is not set

    #
    # Networking options
    #
    (net 関係は 量が多いのでザックリ省略)
    lyra は NET なしらしい。NET なしではちょっと困る。

    # CONFIG_FB_JZ4750_LCD_USE_2LAYER_FRAMEBUFFER is not set
    # CONFIG_FB_JZ4750_TVE is not set
    # CONFIG_FB_JZ4750_SLCD is not set
    # CONFIG_JZ4750_LCD_SAMSUNG_LTP400WQF01 is not set
    # CONFIG_JZ4750_LCD_SAMSUNG_LTP400WQF02 is not set
    # CONFIG_JZ4750_LCD_FOXCONN_PT035TN01 is not set
    # CONFIG_JZ4750_LCD_INNOLUX_PT035TN01_SERIAL is not set
    # CONFIG_JZ4750_LCD_TOPPOLY_TD025THEA7_RGB_DELTA is not set
    # CONFIG_JZ4750_LCD_TOPPOLY_TD043MGEB1 is not set
    # CONFIG_JZ4750_LCD_TRULY_TFTG320240DTSW_18BIT is not set
    # CONFIG_JZ4750_LCD_TRULY_TFT_GG1P0319LTSW_W is not set
    # CONFIG_JZ4750_SLCD_KGM701A3_TFT_SPFD5420A is not set
    # CONFIG_JZ4750D_VGA_DISPLAY is not set

    LCD は、JZ4750 用は別のものとしてあるらしい。後回し。

    # CONFIG_USB_G_SERIAL is not set

    あたらしい USB GADGET 。モジュールで 入れる。
    -- ただ USB GADGET は 1種類しか使えないはず。そうなると G_ETH しか選ばないのだが ...


      USB GADGET には、USB_CDC_COMPOSITE というものがある。

      説明には、CDC Ethernet(ECM) + CDC ACM(serial) の機能だそうだ。昔からあるものは、E_ETH だが、これも CDC Ethernet 。

      CONFIG_USB_CDC_COMPOSITE=m にしといたほうが良さそう。

        ... どうも 複合デバイスを作るためのフレームワークがあるようだ。f_xx.c u_xx.c g_xx.c という風に機能やら何やらを分離しているように見えるし、config.c というのも独立している。



    # CONFIG_CRYPTO_DEFLATE is not set
    # CONFIG_CRYPTO_LZO is not set
    # CONFIG_CRC16 is not set


作ってみた。myconfig-100908.gz

これについてのメモ:

  • CONFIG_JZ_FPGA=y を外し忘れてた。
  • CONFIG_J4750L_NS3K とかボードの定義はしたものの使ってない。-- 出来たら同じバイナリにしたいし削るかも。
  • CONFIG_JZ_UDC_HOTPLUG=y は関数が足りないのでリンクできず外した。
  • CONFIG_KEYBOARD_JZ=y は コンパイルエラーになる。
  • CONFIG_MTD_NAND_MULTI_PLANE=y をしてるのは少数だったので外した。
  • CONFIG_MTD_HW_RS_ECC=y とか ECC 関係はよくわからない。とりあえず JZ4750 の方を参考にして定義した。

    -- HM は Hamming の略、RS は Reed-Solomon の略ということが分かった。そして JZ4750 や JZ4725B は 4/8/12 bit BCH ECC をサポートしており
    CONFIG_MTD_HW_BCC_ECC=y
    CONFIG_MTD_HW_BCC_8BIT=y
    とするのが正しいらしい。
posted by すz at 22:24| Comment(0) | TrackBack(0) | Jz47xx(Linux)

2010年09月08日

オーバクロックとメモリ性能

dingoo A320 で使われているのが、Jz4740。180nm プロセスルールで、仕様では、360MHz。DINGUX では、クロックを変更できて 400MHz 前後まではクロックを上げられるらしい。メモリは、SDRAM 32bit アクセス。SDRAM のクロックは、CPUのクロックの 1/3 が普通で、400MHz なら 133MHz 。

それに対して、Jz4725B は、160nm プロセスルール。 データシートではやはり 360Mhz になっている。メモリは、SDRAM 16bit アクセスしかできない。

前に書いた内容の焼き直しだが、同じクロックの場合、どれぐらい性能的に不利なのか考察してみよう。


    Jz47xx の場合、キャッシュラインのサイズは Iキャッシュ/Dキャッシュ共に 32 バイトなので、通常 32バイト単位での READ/WRITE になる。
     - Linux で CONFIG_MIPS_L1_CACHE_SHIFT=5 という風に設定しているし、32 バイトなのは間違いない。

    そして、Programmers Manual に CPU がどのようなアクセスをするかの記載がある。

      SDRAM は、1,2,4,8-beat の burst アクセスができる。32bit アクセスなら 1 回のアクセスで済むわけだ。16 bit アクセスの場合 たぶん 2 回の 8-beat アクセスをする。ただし、2 回目は 同じ ROW なので少し速い。

      CL=3 だとして、32bit アクセスの場合 32 byte の READ/WRITE は 16/15 クロック。16 bit だと 16 クロック+11/12 クロック。

      • CL=2 の場合、READ -2/WRITE -1 にできる。(同じ ROW なら READ -1/WRITE 0)。 166MHz 品の SDRAM を使っている場合、133MHz CL=2 が可能(な場合が多い)。
        ここは、133MHz CL=2 を前提にする。
      • 32bit アクセスは 14 クロック、16bit アクセスは、25 クロック。


      そうすると 32 bit アクセスの Jz4740 に対して Jz4725B は最大 25/14 = 1.79 -- 1.79倍 遅いことになる。ただし、まったくキャッシュにヒットしない場合の性能差。

        帯域に変換してみよう。133MHz のクロックで ずっと 2バイト読み込めるとすれば、254MB/sec 。32 bit アクセスの場合 254 * 16/14 = 290MB/sec 。16 ビットなら 254 * 16/25 = 163 MB/sec 。

      では、実際はどれぐらい違うのか?

      仮に n% ヒットするとする。

      100 命令実行し キャッシュがヒットした場合 1 クロックで実行できているとする。(100 - n) 個の命令は、メモリアクセスの分待たされるとする。そして、メモリアクセスは、追い出して読み込む動作とする。さらに、SDRAM のクロックは、CPU クロックの 1/3 に設定されているとする(CPU 400MHz に対して SDRAM 133MHz)。

      100% なら 100 クロックで終わるところが...

      32 bit アクセスの場合は、14 * 2 * 3 * (100 - n) クロック 余分に時間がかかる。 16 bit なら 25 * 2 * 3 * (100 - n) クロック。

      n が 99 なら 184:250 。99.9 なら 108.4:115.0。
      n が 90 しかないとすると 940:1600 。

      動画の再生のヒット率は、かなり高いとは思うが、よくは分からない。仮に 90% だとすると Jz4725B は、1.36 倍 遅いことになる。99% なら 1.06倍 。


    さて、最大のクロックは プロセスルールに比例するとする。

    Jz4740 の 180nm に対し Jz4725B は 160nm だから Jz4740 が 400MHz なら Jz4725B は 450 MHz 。1.13 倍 速い。

    速く動かしたいソフトのヒット率が 99% ぐらいなら相殺できそうな感じ。-- でもそううまいこと行くかどうか。

    いろいろ眉唾ものの仮定を入れているので、結論も眉唾だが、必要なデータが揃えば大分分かってくるとは思う。-- ただ、そのときは結果が分かっているはず。上記の考察は結果を分析するとき役にたつ程度だろう。

    他の見方をしてみよう。90% しかヒット率がなければ、32 bit アクセスでも 940 クロックかかる。これが 99% にできると 184 クロックで済む。実に 5.1 倍も速くなるのだ。

      32bit アクセスでも メモリアクセス 1 回が 84 CPU クロック。チューニングに於いては、まずメモリアクセスを減らすのが重要だ。

    さらに言うと十分チューニングされた(動画とかエミュレータ)ソフトなら 90% しかヒット率がないということはないはず。もし、90% だったら オーバクロックに期待するより真っ当にチューニングしたほうが良い。

    ただし、ブラウザとか巨大ソフトは例外。遅くともチューニングしきれないし.. そもそも動かそうとするのが間違っていると考えることにしよう。

    ちょっと動画について考察

      IPU を使うとして、動画のためにどれぐらいのメモリ帯域を使うのだろう?
      640x360 のデータを YCbCr(4:1:1) として 30fps で出力するとする。640x360x30x (4+1+1)/4 = 10MB/sec これは read-write になるから 帯域としては x2 の 20MB/sec 必要。入力は1/10 に圧縮されているとすれば、1MB/sec 。
      で、前のフレームを参照するとすれば、10MB/sec でも読み込む。(こちらはダーティにしないので 帯域も 10MB/sec)
      残りが全部キャッシュに載るはずはないのだが .. ここまでで 31MB/sec 。ちなみに IPU を使って 400x240 R5G6B5 に展開しているとすれば、読み込み 10MB/sec , 書き出し 5.8MB の帯域を脇で使っていることになる。さらに、フレームバッファも 5.8MB/sec で読み込んで 外部に出力している。入力データ 1MB/sec も どこかから読んで DMA で WRITE しているはずなので 足しておこう。
      そうすると CPU の邪魔をしている要因として 22.6 MB/sec の帯域が使われている計算になる。

      ここまでで、使っているメモリ帯域は、53.6 MB/sec 。全部で 163 MB/sec しかないのだから結構な割合だ。

      キャッシュには Iキャッシュもある。16KB しかないから当然足りないのだが、処理ブロック毎にループしているはずで、1 ループで載り切らないことがない限り問題にしなくとも良い。

      あとは、データ。ワークとして使う領域がある。16KB しかないキャッシュに載るとは思えないが、あまり メモリとの出し入れが多いと メモリ帯域を食いつぶしてしまう。さらに カーネルやら サウンド処理やら動いているわけで、余ったメモリ帯域で 動いてくれないといけない。

      ざっと見て相当に厳しそうだ。Jz4755 などは、32bit アクセスで 768p が再生できるとしているので メモリ帯域が足りなくなる とはあまり思わないのだが ... 相当にチューニングしないと Jz4725B で 360p の再生は難しいのではないかと思えてきた。

      もちろん CPU として、能力が足りているかどうか という問題もあるのだが、キャッシュにデータが載らなければ CPU は動けない。メモリのほうも重要なのだ。


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

2010年09月05日

jz_ubcomm

条件がそろったので、そろそろ Linux の方に手を出していこうと思う。

まずは、ingenic から提供されている Linux をビルドしてみる。

だいぶ前に qi-hardware 経由で 取ったスナップショットだが、

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

kernel.org の linux-2.6.31.3 を展開した上に files-2.6.31.3-ingenic-r108.tar.gz を展開して、linux-2.6.31.3-ingenic-r108.patch.gz をパッチすればよかったはず。

次に config 。JZ4725B は、JZ4750L だと思うので、これを y にしている arch/mips/configs/f4750l_deconfig をベースにすることにして .config にコピー。

で、make menuconfig とかして make zImage とかすると なにか出来る。

ただし、f4750l は、評価ボードですらない よく分からない ものみたいなので、ビルドできただけでは 動かない。少しづつ修正していこうと思う。

修正 1) drivers/char/jzchar/Kconfig

JZ4750L だけ仲間はずれなので、追加しておく。

ここまでが準備。本題は コンソールドライバの作成。

USBBOOT に組み込んだプロトコルを使って コンソールの代わりをさせるためのドライバを作成しなくてはならない。

    一から作るのは面倒だからベースとなりそうなドライバを探してみたところ bfin_jtag_comm なんてドライバがあることが分かった。

    まずは、bfin_jtag_comm.c を jz_ubcomm.c にリネームして、drivers/char/jzchar に置く。

    次に namespace だけ 変更。 変更するということは 命名しなくてはならない。"JZ USBBOOT COMMUNICATION CONSOLE DRIVER" ということで ファイル名を jz_ubcomm.c , prefix を ubcomm/UBCOMM にしようと思う。

    で、drivers/char/jzchar の Kconfig と Makefile を bfin_jtag_comm とかを参考にしながら追加。

    一応ビルドできることを確認。


ここまでが第二の準備。形式だけ整ったドライバが出来た。

いよいよ 中身をみて変更していく。

Linux とのインターフェイス

Linux とのインターフェイスには、3 段階ある。ひとつは通常の TTY 。もうひとつは、console としての登録。最後に 初期化完了前の インターフェイス。

ここが最も行数が多い。そして、元のドライバには全部揃っている。

通常の TTY として登録するには、struct tty_driver に必要なものをセットして、tty_register_driver() で登録する。

tty_driver には、関数テーブルもあって、open,close,write,flush_chars,write_room,chars_in_buffer,wait_until_sent といった関数を用意して 登録する。

コンソールとして登録する場合は、struct console に必要なものを セットして register_console() で登録する。必要なものの中には、TTY ドライバも含まれる。

初期化中のメッセージを 表示するには、struct console に 初期化中に使う関数をセットしなければならない。登録の方法は不明。
(作っておくだけでよいような気がするが詳しくは知らない)

基本は、TTY ドライバ。これがちゃんとできれば良さそうな感じ。

bfin_jtag_comm でどのような処理をしているか見てみる。

まず、jtag 経由の通信は、一度に大量のデータを扱うものではないようだ。よく分からないのだが、4 バイトづつデータをおくっている。

4バイトづつでは、大量のメッセージを直接扱えない。一旦バッファリングして、カーネルスレッドで徐々に送り出すようになっている。( 割り込みは使っていない )

USBBOOT では、バッファのサイズを 4KB にしているが もっと大きくもできる。大きなバッファを、USB で一度に 吸いだすようなことは問題ないが、stage2 の関数を定期的に call してやらないと USB の処理自体が止まる。また、ホスト側のプログラムが read してくれないと表示はできない。問題なのは PANIC 。カーネルが止まった後でも ポーリングがされないと USB が動かない。

このあたりの性質の違いを考慮すると

  • console(TTY) への write は、直接 通信エリアのバッファーに追加していくようにして、ローカルなバッファは持たないようにする。
  • カーネルスレッドは利用するが、メインは stage2 関数の ポーリングにする。

こんな感じで処理を作るのが良さそう。たぶんオリジナルよりさらに簡単な処理になるはず。
ただし PANIC 後どうするのか? これは調べないとわからない。

PANIC 処理について:

panic の本体は kern/panic.c

panic したしたあと、panic_notifier_list に登録されている関数を順次 call するようになっている。-- これは 1 回限りなので使いにくい。

あと、panic_blink という 関数ポインタがあり、reboot するまでの間 1msec 間隔で call するようだ。

この関数、誰も使っていないように見える。これを使おう。

とりあえずは、make zImage で、なにか出来た。一応 途中まで動く可能性があり、メッセージが見える可能性があるはじめてのものだ。

だが、成功すればメッセージが出るが、ダメだとなにも起きない。-- これでは デバッグのしようがないのだ。

メッセージが出るまで、デバッグのために使えるのは、LCD のバックライトのみ。

バックライトを使ってどこまで動いたか調べないと。

まずは、起動シーケンスのおさらい

1) zImage の自己解答後の最初のエントリ -- kernel_entry (arch/mips/kernel/head.S)
2) start_kernel (init/main.c)
 3) setup_arch (arch/mips/kernel/setup.c)

setup_arch に来るまで、結構 start_kernel で関数を call している。

さて、backlight を点灯させる関数を作成して、start_kernel の先頭で call するようにしてみた。

... NG 。まだ、マシン依存のコードは動作していないにも係わらず 点灯してくれない。そうなると .. zImage の作り方自体に問題があるのかも知れない。

    まず、zImage は 0x80600000 にロードする。それは正しい。で、zImage が動作すると、decompress_kernel を call して、カーネルを展開する。

    展開アドレスは、vmlinux の 先頭アドレスと同じ 0x80010000 。展開が終わったら vmlinux の開始アドレスである kernel_entry に制御を渡す。

    これだと 0x80010000(offset 64K) - 0x80600000(offset 6M) の間に、カーネルと initrd が入らなければならないという条件になる。そして (展開後の)カーネルのサイズは、4MB +α。なかなか厳しい。

    心配なのは、スタックはどこに取られるのか? stage2 を壊してしまわないかということ。zImage の 展開部分は、スタック用のエリアを配列で持っているから大丈夫。vmlinux 自体も似たようなもので、init_thread_union (arch/mips/kernle/init_task.c) 上に取られる。

    もうひとつ心配なのが、上記の アドレスやサイズが正しく設定されているかどうか。

    zImage のスタートアップでは、

    la a0, __image_begin
    la a1, IMAGESIZE
    la a2, LOADADDR

    という風に ビルド時に定数が埋め込まれる。この値が実際どうなのか というと次のようになっていて正しい。

    -DIMAGESIZE=1792767
    -DKERNEL_ENTRY=0x800144f0
    -DLOADADDR=0x80010000


initrd のサイズを気にする必要はあるが、正しそうだ。

もうひとつ可能性がある。点灯は一旦するが、初期化で消されてしまうケース。(どういうケースはよく分からないが)

とりあえず 点灯後無限ループしてみたところ ... start_kernel の先頭にいれた jz_backlight() で点灯した。

-- とりあえずは、Linux に制御が渡ったので 一安心。

次に setup_arch を call する所まで行くかどうかを試したが.. ダメ。

どこまで動くか jz_backlight() を入れる場所を変更しながら 動かしてみると ..

:
boot_init_stack_canary();

cgroup_init_early();

local_irq_disable();
early_boot_irqs_off();
early_init_irq_lock_class();
-- OK
lock_kernel();
tick_init();
-- OK
boot_cpu_init();
-- NG
page_address_init();
-- NG
printk(....);
setup_arch();



static void __init boot_cpu_init(void)
{
int cpu = smp_processor_id();
/* Mark the boot cpu "present", "online" etc for SMP and UP case */
set_cpu_online(cpu, true);
set_cpu_present(cpu, true);
set_cpu_possible(cpu, true);

boot_cpu_init() は、このようになっている。smp_processor_id()は、0 に展開されている。set_cpu_online() などの関数は、ただの bit 操作。最終的には set_bit() になる。

この程度のものがなぜ動かないのか?

ちょっとここで スナップショットを取っておく。動かないけれども 。


(つづき)
page_address_init() も単に データの初期化で、普通なら 動作するのが期待できるコード。で、次に最初の printk を call している。そうすると既に console の最初の初期化が call されていることになる。

posted by すz at 23:25| Comment(0) | TrackBack(0) | Jz47xx(Linux)

2010年09月02日

P5-5 (PMP3100後継機)

以前 PMP3100 を勢いで買ったのだが、予想に反して Jz4725(無印)だった。

Jz4725(無印) も Jz4725Bも おなじようなものだと思っていたのだが、調べるうちに 全然違うことが分かってきた。Jz4725(無印) は、Jz4740 ファミリーで、Jz4725B は Jz4750 ファミリー。
Port のマッピングが ファミリーで 全然違うので、Jz4725(無印) と Jz4740 は同じカーネルにできる可能性があるが、 Jz4725(無印) と Jz4725B は同じにできない。




そのうち、後継機の P5-5 が FocalPriceから出たので気になっていた。DealExtreme で PMP3100として売られているのも実は P5-5 だと知ったので、ひとつ入手しておくことにした。

    後継機と言っても ハードウェアは、CPU を載せ替えて、ボタン や スイッチなどの印字を 妥当なものに修正しただけに思える。
    -- 最初の PMP3100 は、HOLD, ON/OFF の表示が逆 。あと、2つめの イヤホンジャックに AV-OUT と印字されていた。
    CPU を載せ替えるのは、たぶん入手できなくなったから。
    ファームウェアも前のが動かないし、刷新することになったのだろう。

なにかものを作る場合、だれも持っていなさそうな aneca をターケットにするより 数が出て 安定供給されそうな P5-5 をターゲットにしたほうが良いのだ。

aneca は自分が気に入ったからターゲットにするのだが、気が済んだら P5-5 もターゲットにしたいと思う。

まだ入手しただけだが、Jz4725B なのは確認できた。あとはメモリサイズを一応確認してみる。ついでにメモリが 32MB になったりしてると嬉しい。


    ちょっと 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


    4K Page の K9XXG08UXM (2GB) だった。

    次は RAM サイズ。USBBOOT の cfg ファイルに

    BUSWIDTH = 16
    BANKS = 4
    ROWADDR = 13
    COLADDR = 9

    という設定がしてあって

    SDRAM Total size is 32 MB, work in 4 bank and 16 bit mode

    というメッセージがでる。で、この情報を元に CPU の SDRAM 設定をする。CPU は、32MB だと思ってアクセスするわけだが、実際に 16MB しかない場合、データ が 循環する。bank が 上位 2 bit になるので、8MB が実は 4MB + 同じデータの 4MB ということになる。

    W9812G6PH-6 を使っていて 16MB しかないのが明らかな A-41 でまずは確認。

    0x81c00dd4 : 00 00 1c 3c 2c 60 9c 27 21 e0 99 03 d0 ff bd 27
    0x81800dd4 : 00 00 1c 3c 2c 60 9c 27 21 e0 99 03 d0 ff bd 27

    次に A5-5 。... 結果はまったく同じだった。これで RAM 容量は 16MB だと分かった。

    ところで、... 16MB 用のマシン に 64MB の RAM を入れるとどうなるのだろう? OK そうなのだが、A12(pin 18) に配線されているのが条件。PMP3100 だが写真を見ると SDRAM の方に配線されているから 問題ないはず。


よくよく考えると、16MB では DINGUX 並のことはできない。RAM の換装が必須だが 電子工作が趣味ならともかく、普通の人が RAM の換装などできるはずがない。そうすると ターゲットにする意味がなくなってしまう。 -- ただ、このマシンは 裏蓋をあけるとすぐ RAM にアクセスでき、周りにスペースもあるので 換装自体は 最もやりやすい。最初に RAM 換装してみようと 思っているマシンだったりする。

GPIO の 解析


    簡単そうなのが、microSD のセンスと イヤホンのセンスだったので同じことをやってみる。


    初期状態
    PAPIN: 0000ffff
    PBPIN: 823f5f0c
    PCPIN: ffdfdcff
    PDPIN: fd7fffff

    microSD なし PCPIN: ffdfdcff
    microSD あり PCPIN: ffcfdcff
    ありで PC20 が L に変化

    phone1 あり -- 変化なし
    phone2 あり -- 変化なし


    分かったのは、microSD のみ。デフォルトの pullup を落とすとかしないと分からないのだろうか? それとも コントローラ経由?

    さて PC10 からの PWM は 110111 (MSB が PC15)のビット列。
    これを見るとバックライトは、PC13/PWM3/UART-RxD のように思える。
    実際やってみると当たり。-- まぁこれは 選択枝がないようなもの。... それはともかく、コントーラの制御に UART を使っているものとばかり思っていたのだが違うのかも知れない。


すぐわかるのはここまで。他はどうしよう。

    課題1 PHONE1/PHONE2 のセンス

    Linux が動いてからでも遅くない。とりあえずパス。

    課題2 ボタンの制御

    これはどうやったら分かるのだろう? 配線もわからなければ、制御するための プロトコルも分からない。

    こういうのに近いものがあるとすれば ... A-330 のワイヤレスコントローラか。受信部にマイクロコントローラが付いているところから よく知られているコントローラ互換のように思えるのだが ...

    ロジアナ使うにしても できることは、コントローラ自体の PIN の変化が分かるだけ。分析すれば どのように制御しているかは分かるだろう。で、GPIO がどう配線されているかを見つけるのはどうしよう。... テスターで頑張ればなんとかなるか。

    課題3 スピーカー出力切り替え

    これも 後回しで問題ない。

    課題4 PHONE の ポップノイズ対策 (ないと思うがあるかも知れない)

    課題5 LCD の制御

    LCD のつなぎ方は、割と決まっている。特に 2.8 inch なら A-320 などと 同じはず。-- と思ったが、A-320 の 新しいタイプ ILI9331 は SLCD(SmartLCD: HSYNC/VSYNC を使わない) 接続だそうだ。

    確かめてみることはできるだろう。DINGUX の hwinit を参考にすれば 良さそうだ。... ソースコードの情報は、dingoo-linux の ここ。svn でダウンロードできる。


    課題6 MicroSD の CS

    MSC1 は、CLK/CMD/D0 のみ。CS は GPIO でやることになっているようだ。そうすると PIN を見つけないと MicroSD が使えない。

    これは基本機能なので重要だ。なんとか見つけないと。... と思ったのだが、どうも SPI モードとは違うらしく 上記の線だけで良いのかも。


付録 PMP3100(旧機種) の基板写真


P5-5 JZ4725B ピンアサイン表 (作成中)

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

Jz4725B

? 2 PD18 LCD_PCK(LCD)

? 48 PC15 PWM5

? 54 PC20 WAIT(SRAM)
? 55 PC22 CS2/MSC0_D3

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

? 68 ADIN1

x 84 PPRST(RTC)
o 85 PB31 WKUP(RTC)
x 86 PWRON(RTC)

x 100 BOOT_SEL0
x 101 BOOT_SEL1
? 102 PD23 LCD_SPL(LCD)
? 103 PD22 LCD_CLS(LCD)

? 105 PD25 LCD_REV(LCD)

? 107 PD24 LCD_PS(LCD)
x 108 PD20 LCD_VSYNC(LCD)
x 109 PD19 LCD_HSYNC(LCD)
? 110 PD18 LCD_DE(LCD)
? 111 PD17 LCD_D17(LCD)
? 112 PD16 LCD_D16(LCD)



P5-5 JZ4725B 判明ピン
バックライト:
o 57 PC13 PWM3/UART0_RxD(UART) H で ON
microSD センス:
o 54 PC20 WAIT(SRAM) L で microSD あり


JZ4725B 調査対象ピン

制御候補

? 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 01:30| Comment(0) | TrackBack(0) | Jz47xx(機種解析)

aneca A-33

またもや買ってしまった。





今度は、aneca A-33 -- FocalPrice だと 37.80 ドル

実際に買ったところは、everbuying で もうちょっと安い 33.93 ドル。-- まぁ有名でないし勧められるかどうかわからないので、ForcalPrice の方を先に紹介しておく。

追記 10/10/15: everbuying は売り切れた。

    2-3 回利用してみたが、対応は悪くない。ただ 品切れになったから姉妹ショップから買えとか変なことを言ってきたりする。安いのも B級品とかで 品質が悪いのかも知れない。
    あと、受け取りまで やたら時間がかかる。20 日以上が普通で FocalPrice よりひどいかも。

33.93 ドルだと 87 円換算で 3000円を切るレベルの値段。これで 16:9 400x240 のディスプレイと FLASH 4GB のモデルが手に入る。

ただ、これは FM ラジオもスピーカーも付いていないようだ。で、なぜかストップウォッチが付いている。

    使わないものは、ないほうがスッキリする。ただ FM ラジオのパターンは線を引き出すために付いていて欲しい。-- taobao で売っているのには、FM が付いているからパターンはあるようだ。ちなみに、バッテリーは 600mAH だそうだ。

ボタンは、サイドに 5 つと、液晶面に 1 つ。A-41 より 1 つ多い。

電源スイッチも反対側のサイドに付いている。たぶん例によってハードスイッチ。-- 開発するには、ソフトで電源を切るタイプ(A-320 など)より便利。

A-41 と同じ背景だし おなじ Jz4725B なのだろう。メモリは 16MB のはず。(PMP 機能だけならそれ以上は積まないだろう)

aneca でのファームウェアはカスタマイズのレベルが高かった。これも同じはず。

    ひどい日本語が修正されているし、カレンダーもまとも。
    フォントのサイズも変更されてて、ちゃんと見栄え良く画面に収めるようにしている。
    あと SJIS で埋め込んだ ID3タグがちゃんと表示されるし、EBOOK も UTF-8 なら表示される。(.. これは P5-5 でも OK だからFWのベースに入っているのだろう)
    メニューもなにか増えている。ロックができたりするし。

H.264 は無理だが xvid 程度の動画を見たり、mp3 を聞くなら実用として使っても便利そう。

改造とかの面でいうと、スイッチの配置からみて ボードはたぶん 筐体 の半分ぐらいで 取り出した場合コンパクトで良さそう。あと、液晶面のスイッチの周りになにか仕込むスペースがありそう。

... というわけで A-41 より気に入りそうな感じ。

こんな感じで、気に入りそうだとすぐ買ってしまっている。そのかわり Andoid とか Arduno(電子工作むけのボード)は、買わないのだ。これでよいのだ。(実は Android は1つ購入。だが、当面これだけの予定)

追記:入手できた。

大きさは、縦 9.8cm 幅 5.1cm 厚さ 1.0cm 。

    ちょっと iphone とかのサイズ比較。(ケースが使えるかの判断用)
     iphone4 : 115.2 mm x 58.6 mm x 9.3 mm
     ipod touch2 : 110mm x 61.8 mm x 8.5 mm
     ipod touch4 : 110mm x 58.9 mm x 7.2 mm

スイッチは左サイド 下 に電源スイッチ(スライドSW) 。右サイドに +/- , ←/→ , PLAY/PAUSE の 5 個。と液晶面 下に 1つ (M)。ケースはプラスチック。サイドは メッキしたプラスチック。

まずは、機能の確認。A-41 とまったく同じ。ストップウォッチなどないし、スピーカも付いている。電源スイッチも同じでただちに電源OFF にできる。あと気がついたのだが PLAY/PAUSE ボタンの長押しでシャットダウンする。そして、その状態から PLAY/PAUSE ボタンで電源ON する。

CPU は、予想どおり JZ4725B 。Mと書いてある 液晶面のボタンを押しながらUSBに挿すことで USBBOOT になる。


ケースはプラスチックで嵌め合わせ。精度は良さそうなのだが、なぜかサイドに隙間がある。おかげで分解は簡単で、裏蓋が簡単に外れた。



見ると バッテリーは 650mAH で A-41 と同じものが使われている。

(拡大)

基板は、A-41 より少し大きい感じ。スピーカーのところが U字型に切り抜かれている。FM ラジオモジュール用のパターンもある。あと、メモリは 16MB。

製造は、2010/8月 って 最近なのか。あ、下のコイルが欠けている。(よくあることだが、ちと残念)。メモリは、W9812G6PH-6 で FLASH は、29F32G08CBAAA とマーク (Micron MT29F32G08 ?)。

    メモリを換装するには、基板をはずさないといけない。ネジが 2 つあるのでそれを外すのか? 液晶を含めまるごと外れるような気がするのだが ...

    ここから先の分解は、ちょっと慎重にならないとマズそう。液晶のところを見たいのだが ... 今回はパス。

    ちなみに、もうひとつの方も裏蓋を開けているのだが、やはり 2010/8 月。箱が違ったので 1つは古いと思ったのだが違った。

    あとで気がついたのだが、簡単とか言いながら 裏から見て 左中央のツメを折ってしまっている。-- 破片が見つからないし、スキマがあったのはこれが原因かも知れず、最初からだったかも。あと、microSD が入っているとひっかかって裏蓋をはずせない。すぐ忘れてやってしまうので要注意。

A-41 と同じような感じ。回路的にもほぼ同じなのだろう。解析は楽そうだ。

満充電になると、充電のアニメーションが止まることに気がついた。充電中に電圧を測定しても満充電かどうか分からないはずなので、充電IC の 状態をセンスするために GPIO が割り当てられているはず。

    A-41 も調べてみたが、どうも同じようだ。PLAY/PAUSE ボタンでの 電源 ON/OFF も同じだった。-- そういえば WKUP ピンが割り当てられているのだった。 WKUP は、サスペンド/ハイバネーションからの復帰ができる。ハイバネーションといっても 状態をセーブしてなけれれば電源ON と同じ。

    この電源 ON/OFF 機能を知らなかったのだが、P5-5 も同じだった。Neo Slim 3000 にも 機能は付いていた。(OFF はできるが ON でハングアップする)。ボタンは、P5-5 が SELECT の位置 (電源マークあり) 。Neo Slim 3000 は L ボタン(これも電源マーク)

    それはともかく、普段は PLAY/PAUSE ボタンで 電源 ON/OFF するようにしていれば、アラーム機能も付けられるわけか。
    (ちなみに、ハイバネーションは電源 OFF と大差ないから消費電力は気にしなくて良い)

少々使ってみた。液晶は 3inch 432x240 。視野角は予想より狭い。
H.264 の 動画の再生は 400x226@30fps でも音ズレするのだが、動きが少ない場面ではちゃんと再生できている。640x360@24fps も見てみたが、明らかに遅くスローモーションのようになる。どうもフレームスキップはしてないようだ。

    Jz47xx は、SIMD 命令(XMU) を使ったソフトコーディック。いままで買った JZ4725B の挙動は全部同じなので コードが共通なのだろう。Jz47xx の潜在能力はもう少しあると思えるので、自作ソフトが動かせるようになったらチューニングしてみたい。
    あと、オーバークロックもしてみたい。180nm プロセスのJz4740 は 400MHz+αで動作するようだが、Jz4725B は、160nm でオーバークロック耐性が高いはず。400 x 180/160 = 450 なので 450MHz+α で動くかも知れない。

不具合はちょっとある。USB の接触が悪く。接続が切れたりする。これは、使っているうちに良くなるかも。

実は 2 つ買ったのだが、1 つはいくら充電しても 充電が進まないことが判った。バッテリーには過放電保護が付いているようだし 膨らんでもいないので、劣化が理由ではないかも知れない。-- 充電回路が変なのか?

    一晩充電したら、充電完了した。バッテリーが弱っていて予備充電状態が長かったのかも。

    追記: 接触は問題ないようだ。バッテリーも弱っている感じではない。

もうひとつ気になることがある。電源SW OFFで接続すると バックライトがチラつく。電源SW ON にすると それが収まる。この現象は両方で起きる。

電源スイッチが入っていると バッテリーからも電源供給するような回路でも入っているのだろうか?

    バックライトがちらつくのは、バッテリーの残量低下でも起きた。どうも 4 つあるうちの 1つ 2つが、電圧が低下すると消えるようだ。ちなみにバックライトは 並列で 昇圧回路は入っていないため、電圧の影響をうけやすい。

所感:

  • 基本は、A-41 と同じだが、表示できる面積と情報量が多い。Linux を動かす前提なら、情報量が多い方が嬉しい。
  • Bluetooth を付けてみたい。その前提ならプラケースの方が加工も楽だし、電波を通すし都合が良い。ケースは嵌めるだけなので、スライドさせる A-41 より 加工の自由度が高そう。

    ちなみに、デバイスを付けるとしても I2C しか I/O がない。シリアルさえ使えない。Bluetooth を付けるにも スレーブコントローラが必要。 こういうものでも、司令塔にはなれるので、ロボットとかの 制御に使えるかもしれない。
  • オーバクロックの面では、A-41 も A-33 も CPU の上の空間は空いている。P5-5 は バッテリーがあり、Neo Slim 3000 はすぐ LCD。SDRAM に関しても同じ。アルミケースの A-41 の方が放熱はしやすいが、A-33 も ケースに穴を空けてしまえば ヒートシンクさえ付けられるので 問題ない。
  • LCD の視野角が狭いのが残念。まぁ無理を言っても仕方ないし ..

    しばらく使って..

  • A-41 と比べてみたら低音が出ていないし、同じボリュームでも音が小さめ。-- カップリングコンデンサが 47uF になってたりしている。

  • メニューの移動で音が聞こえる。電源が弱いようだ。(A-41 は聞こえない)

  • A-41 は、持ち歩くとき ボタンを誤って押してしまうことが結構あったのだが、これはボタンがサイドだからかあまりない。

    サウンドは問題あるが、こちらのほうが使い勝手が良いようだ。

これと A-41 を本命として Linux の移植をしていきたい。

    換装用 メモリは、32MB 多数 と 64MB 2 個を確保。

    Linux を動かすマシンは 32MB 以上にするつもり。

    64MB は 開発に使うマシン優先。ひとつは、A-41 にしたい。

    -- 64MB は消費電流が大きいうえに、133MHz で クロックアップ耐性が低い。メモリが足りるなら 32MB にしたい。

さて、そろそろ簡単なところを解析.

NAND FLASH :


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


Page ID から 消去ブロック 512KB / ページサイズ 4KB 。
Plane ID から 16Gb プレーン x 2 = 4GB 。

ということが分かる。

バックライト は、PC13 (PWM3) で A-41 と同じだった。
あと、MENU と PLAY/PAUSE 以外の ボタンのどれを押しても PD17 が L になるのも、A-41 と同じ。


    default:
    PAPIN: 00008f83
    PBPIN: 823f7b3c
    PCPIN: ffdfdcff
    PDPIN: ffffffff

    M button:
    PDPIN: ffffffff (not pressed)
    PDPIN: ffdfffff (pressed)

    PLAY/PAUSE button:
    PBPIN: 823f7b3c (not pressed)
    PBPIN: 023f7f3c (pressed)

    MicroSD
    PCPIN: ffdfdcff (not inserted)
    PCPIN: ffcfdcff (inserted)


    A-33 JZ4725B 判明ピン
    バックライト:
    o 57 PC13 PWM3/UART0_RxD(UART) H で ON (A-41 と同じ)
    microSD センス:
    o 54 PC20 WAIT(SRAM) L で microSD あり (A-41 と同じ)
    ボタン MENU "M" :
    o PD21 LCD_DE(LCD) 押し下げで L (A-41 と同じ)
    ボタン PLAY/PAUSE "⇒II" :
    PB31 WKUP(RTC) 押し下げで L (A-41 と同じ)
    スピーカーAMP :
    PD18 LCD_DE(LCD)
    LCD : ILI9326 16bit SmartLCD 接続
      LCD RESET : PD23 LCD_SPL(LCD) (A-41 と同じ)
      LCD CS : PD22 LCD_CLS(LCD) (A-41 と同じ)

    要調査:
  • PHONE センス
    -- A-41 にはあったが、見つからない。なしでも実装できるようだからないのかも。
    カップリングコンデンサは、J476 になっている。周りの抵抗は 470 x2 と 330 x 2 。よく分からないものの 小容量 コンデンサ を使えるようにするための抵抗 と MIX 用?

      A-41 と同じイヤホンで比べてみたのだが、明らかに低音が出ていない。47uF ではダメで最低 100uF でないと。-- いずれ付け替えるつもり。

      あと、電源も弱いようだ。メニューを移動したとき、CPU が動作する音が聞こえる。-- まるで一昔前のパソコン。A-41 は聞こえない。

  • スピーカースイッチ
  • 満充電センス
    -- 存在しそうなことは分かった。しばらく使って GPIO の差分を見てみる。→ GPIO には変化なし -- 違うのか?
  • microSD CS (不要)
    -- Programming Manual に 1bit モードの記述がある .. ドライバもサポートしている(CONFIG_JZ4750_MSC1_BUS_1)。GPIO はどうも HOTPLUG_PIN (上記 MicroSD センス)のみを使うようだ。
  • スイッチセンス (+/ー/←/→ ) (PD17 - ADC?)
    -- ADC が使えるのは、Linux が動いた後なので解析は先延ばし。
  • LCDの接続。
    -- 接続自体は済みなので不要といえば不要。HSYNC/VSYNC を使う接続(Normal LCD)なら 初期化の方法だけ分かれば良い。コントローラを使う SLCD の接続(Smart LCD)なら コントローラの詳細を知る必要がある。

    追記:Smart LCD 接続。コントローラも判明。432x240 の ILI2326 。
    CS/RESET は、GPIO を使うが
     LCD RESET = 102 PD23 LCD_SPL(LCD)
     LCD CS = 103 PD22 LCD_CLS(LCD)
    だということが分かった。(A-41 も 同じピン割り当て)


追記:再度分解

液晶の接続を見るために再度分解した。

やはりネジは外す必要があった。あと、LCD の一部が弱く接着されていた。それ以外に固定しているものはなかった。




これは、全部を外したあとのケース。どうなっているか記録。



液晶は、0.8mm ピッチ 40 pin だった。HUARUI T-0052-B というものらしい。-- なんか NC が多い。
コンデンサ(CXX)やダイオード(DX) ばかりで抵抗がない。
バス幅などの設定はないようだ。
写真をじっくりみると、線が集中しているところ(8-30)、18pin 分と 7pin 分に分類できかも。-- 上の接続部分を見ると、そこで間がある 。通常 液晶の接続部は、COG の LSI と 1:1 に対応している。間があるということは、信号的にも分類が変わるかも知れない。要するに 18pin 分が DB0-17 ではないか?
それはともかく、LSI 上の配列と信号の配列には相関性がある。ILI9325/ILI9326 ともに LSI の配列は、

RESET
VSYNC
HSYNC
DOTCLK
DEN (0: enable RGB interface )
Data bus (DB17-DB0)
RD
WR
RS
CS

の順で並んでいる。A-41 のコネクタもこの順。おそらく A-33 も順番だけは、これとほぼ同じはず。

いくつか分かったのでメモ

1 o NC (YU)
2 o NC (XL)
3 o NC (YD)
4 o NC (XR)
5 o GND
6 (RESET ?)
7 o NC
8 (CS?)
9 (RS?)
10 VCC ?
11 (WR?)
12 (RD?)
13 o GND (DB0?)
14-21 DB1-8?
22 o GND (DB9?)
23-30 DB10-17?
31 ?
32 o NC → GND
33 NC
34 ?
35 o GND
36 o LED-A
37 o LED-K → GND
38 o LED-K → GND
39 o LED-K → GND
40 o LED-K → GND


  • HSYNC/VSYNC/DOTCLK/DEN を入れるには信号線が足りない。
  • GND に接続されているピンの関係から DB1-8,DB10-17 の位置を推測した。上記の順と逆順なら、8-12 に CS/RS/WR/RD の順で配置されていそう。そうなると 31-34 のあたりは、LCD によっては、DEN/DOTCLK/HSYNC/VSYNC が配置されているのかも。
  • ILI9326 とか ILI系なのは間違いなさそうだ。あとは、6,8-12,14-21 をロジアナで調べればはっきりするはず。



    これはボタンのところ。一応記録。ボタンに関係するものは、2-3 個のように思えるのに沢山載っている。よく見ると Power 系のデバイス -- 大きなコンデンサや ダイオード 三端子のなにかがある。



    再組み立てに失敗。液晶がずれた。そういえば、ネジもつけ忘れた。で、やり直してみたが、似たような感じになってしまった。

    -- SDRAM をつけたら真面目に組むことにして 当面このままにしよう。
    -- 全部はばらしていないもうひとつの方も 左と下が 1mm ほどずれている。よくよく考えれば、基板を固定すれば LCD の位置はほとんど変えられない。もともとだったとして納得しよう。

    追記:写真集(1号機)

    いくつかパーツを外している。(12MHz Xtal , スピーカアンプ横コンデンサ , カップリングコンデンサ, スピーカー, バッテリー , LCD)

      現在不動状態
    • 写真を取るために、ホットボンドを剥がしたりしていたら、クリスタルの足がもげてしまった。小型の 12MHz の水晶はどこにも売っていなくて焦ったが、使わなくなったカードリーダに入っていた。
    • スピーカーアンプ横コンデンサも 清掃でもげてしまった。
    • それ以外に、32.768 kHz 水晶のランドが剥離。となりの 10MΩ(106) に付けている。
    • (判らないが)スピーカー 用の端子も剥離しかけ。(ハンダ吸い取り線でやってしまった。)
    • カップリングコンデンサは交換途中。
    • 動かないので、LCD を剥がしてしまった。ちょっと乱暴にやったのとハンダ吸い取り線での清掃で、LCD の端子も 剥離しかけがいくつかある。

      動いても LCD を付けないで、調査用にするつもり。
       - 予備を発注 (3,4号機)












    ランド剥離したところについてのメモ


      この 2カ所だが、スピーカーアンプのところは 完全には剥離していない。今後 スピーカを使うつもりもないのだが 一応 瞬間接着剤かなにかで貼りつけておこうと思う。
      問題は 32.768 kHz 水晶。どうも CPU との間を切ってしまっているように見える。

      CPU の 水晶の PIN は、この写真の 右の方 -- ランドしか見えていないピン(81:RTCLK) その左どなり(82:RTCLKO)。

      コンデンサは、106 の下と 左上の白いやつ。CPUから来た線が、 上のコンデンサ,水晶,106(の左端子) に分かれるところを剥がしてしまったらしい。ちなみに 下のコンデンサは、水晶の足と106 と接続した上で 右の抵抗(222)を通して CPU(82:RTCLKO)に接続されている。


    追記:写真集(2号機)




    2号機 も改造した。内容は、バッテリーを外してコネクタを付け、ケース側に 別のバッテリーを接続するというもの。スピーカーも外している。

    • 注意! 中華バッテリー自体危険なものであり、改造はさらに危険な行為。十分な知識とリスクの覚悟がなければ 扱ってはいけない。
       参考:別記事「中華バッテリーについて」

    • 付けたバッテリーは、BC50 (750mAH , $2.46) 2 個並列。

        BC70 (1000mAH, $3.13) というのもある。厚みが 4mm → 6mm と増えるが 底面は同じサイズ(45mm x 37mm) のようだ。
        BC50/BC70 は、端子が横方向なので、ニコイチで向かい合わせることができて都合が良い。

      並列と言っても、保護回路を外して生のバッテリーにした上で、並列にし、別の保護回路を付けている。
       - 別の保護回路にしているのは、元の保護回路は、他の中華バッテリーと違うので信用できないと思ったから。
        実際やばいようだ。
       - わざわざこうやって並列にしているのは、むき出しにしたケース間の電位差をなくすため。ただし、ケースは (+) 側なので、結局絶縁が必要。
       - 工作する際は、ショートに気を付けている。とくに生のバッテリーがショートすると超危険(燃えたり、爆発さえする恐れあり)。
       - 並列にする際には、 抵抗で一回接続して、電圧が同じにしている。
       - 容量が 1500mAH になった計算だが、本当に それぐらいありそう。起動しっぱなし (アイドル、LCD OFF) で 36H ぐらいもった。

    • 青緑なのは、0.3mm 厚 SMDプロトタイピング基板 (100円)
       - 合わせ目を隠す + バッテリーのガードが目的。

    • 金色なのは、ポリミドテープ ($2.19)
       - 絶縁と バッテリーの汚れ(のりで汚い)を隠すのが目的。

    • ケーブルは、スピーカー用の穴を広げて そこから内部に配線。

    • ケースにバッテリーを付けたのは、内部に回路を仕込めるスペースを確保する目的もある。

    • 出来上がりの サイズを見ると 底面が 45mm x 80mm -- A-44 にも合うようにできそう。今度は、BC70 で試してみよう。 (買えなかったし、やばそうな気もするのでパス)

    • 電圧を調べてみた。
       - シャットダウン 3.44V
       - 満充電 4.17V
      ちゃんと制御できているようだ。
    • 動画再生時間 は、(明るさ 4で) 6 時間ちょっと。
    • 時計が出ている画面で backlight ON (明るさ 4) だと 9時間30分 (+α)

      • LED Off だと 36H で ON だと 9.5H 。実際に 1500mAH とすると、Off 42mA / On 158mA で 差が 116mA もある。昇圧はしておらず 4 個なので LED は たぶん 60mA ぐらい。
      • フル稼働だと 6.3H として 238mA 。LED ON からの 増加は 80mA 。

        適当な計算だが、目安にはなるとおもう。

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

    2010年08月31日

    USBBOOT で hello world

    オリジナルの usbboot は、いろんな機能が足りない。このカテゴリでは、usbboot の改造とかについて書いていこうと思う。

    目的は、Linux カーネルの直接ブート と (カーネルにドライバを入れることでの)カーネルのメッセージの取得。

    そのための機能は、一応仕込んだ。これからテストしてみようと思う。

    プログラム:


    SDRAM へのプログラム(ファイル) のロード:

      オリジナルは、1 回の転送サイズ (MAX_LOAD_SIZE) を 12KB に制限していて とても遅いので、とりあえず 256KB に変更。

      サンプルとして DINGUX の dual_boot インストーラの zImage を ロードしてみた。

      ちゃんと ロードできたかどうかは、SDRAM のメモリをダンプする mread というコマンドを作成し xburst_stage2 にもプリミティブを作ってテストした。ちなみに ファイルに書き込む mdump というコマンドも作る予定だが、まだ作っていない。


      usbboot :> load
      Usage: load (1) (2) (3)
      1:SDRAM start address
      2:image file name
      3:device index number
      usbboot :> load 0x80600000 zImage.bin 0
      start:::::: 0x80600000
      Total size to send in byte is :3256320
      Loading data to SDRAM :
      CPU data: Boot4750
      Load last address at 0x80600000
      0x80640000
      CPU data: Boot4750
      Load last address at 0x80640000
      CPU data: Boot4750
      Load last address at 0x80680000
      CPU data: Boot4750
      Load last address at 0x806c0000
      :
      CPU data: Boot4750
      Load last address at 0x80900000
      usbboot :> mread
      Usage: mread (1) (2)
      1:start address
      2:length in byte
      usbboot :> mread 0x80600000 256
      CPU data: Boot4750
      Reading from 0x80600000 length 0x100....

      0x80600000 : 21 80 80 00 21 88 a0 00 21 90 c0 00 21 98 e0 00
      0x80600010 : 92 80 04 3c 00 b0 84 24 92 80 05 3c 40 54 a5 24
      0x80600020 : 00 00 80 ac fe ff a4 14 04 00 84 24 92 80 1d 3c
      0x80600030 : 40 54 bd 27 60 80 04 3c 20 40 84 24 31 00 05 3c
      0x80600040 : 20 6f a5 34 01 80 06 3c 60 80 1f 3c 60 00 ff 27
      0x80600050 : 60 80 1a 3c 98 19 5a 27 08 00 40 03 00 00 00 00
      0x80600060 : 21 20 00 02 21 28 20 02 21 30 40 02 21 38 60 02
      0x80600070 : 18 80 1a 3c 10 0b 5a 37 08 00 40 03 00 00 00 00
      0x80600080 : 08 00 00 10 60 80 08 3c 9c 00 08 25 00 a0 09 3c
      0x80600090 : 25 40 09 01 08 00 00 01 00 00 00 00 00 80 1a 3c
      0x806000a0 : 00 80 1b 3c 00 40 7b 37 80 ff 7b 27 00 00 41 bf
      0x806000b0 : 20 00 41 bf 40 00 41 bf 60 00 41 bf 00 00 40 bf
      0x806000c0 : 20 00 40 bf 40 00 40 bf 60 00 40 bf f7 ff 5b 17
      0x806000d0 : 80 00 5a 27 60 80 08 3c e4 00 08 25 08 00 00 01
      0x806000e0 : 00 00 00 00 08 00 e0 03 00 00 00 00 00 00 00 00
      0x806000f0 : 08 00 e0 03 00 00 00 00 08 00 e0 03 00 00 00 00
      usbboot :>


    ロードしたプログラムの実行:

      オリジナルでも go コマンドがある。これは引数なしで、アドレスを call する。
      Linux の boot を考えると 引数 と コマンドラインが必要。不定値では都合が悪い。go コマンドを改造し コマンドラインの設定と 引数として渡すようにした。

        詳しく書いておくと コマンドラインを含む通信エリアというのを定義していて、通信エリアの先頭が argv になるようにしている。
        プログラムが 対応していれば、USBBOOT のプロトコルを使って メッセージを返せるようにしている。

      これをテストするプログラムを xburst_stage1/2 を参考に作ることにした。

      target.ld:
      これはプログラムの アドレスを決めるもの ... と思って良い。
      stage1/2 の違いをみると MEMORY のところだけなので、開始アドレスを 0x80600000 にした。サイズは適当で良さそうだが、最低 16MB の RAM があり後ろ 4MB に stage2 があるとして 6MB にした。

      UTPUT_ARCH(mips)
      ENTRY(_start)
      MEMORY
      {
      ram : ORIGIN = 0x80600000 , LENGTH = 6M
      }
      (後略)


      head.S:
      これはスタートアップを定義するもの。c_main に jump するのだが、c_main が return すれば、USBBOOT に制御が戻るはず。とりあえずは、stack を設定しないバージョン。

      .globl _start
      .set noreorder
      _start:
      #if 0
      /*
      * setup stack, jump to C code
      */
      la $29, 0x80bffff0 /* sp */
      #endif
      j c_main
      nop


      ビルド:

      xburst_stage1/2 の Makefile を変更しただけ。こんな風にビルドしている。

      ipsel-linux-gcc -O2 -fno-unit-at-a-time -fno-zero-initialized-in-bss -mips32 -fno-pic -mno-abicalls -c main.c -o main.o
      mipsel-linux-ld -nostdlib -EL -T target.ld head.o main.o msg.o -o xburst_hello.elf
      mipsel-linux-objcopy -O binary xburst_hello.elf xburst_hello.bin
      mipsel-linux-objdump -D xburst_hello.elf < xburst_hello.dump
      mipsel-linux-objdump -h xburst_hello.elf < xburst_hello.map
      mipsel-linux-nm -n xburst_hello.elf < System.map


      確認:

      objdump を使って xburst_hello.elf を見てみた。

      mipsel-linux-objdump -d xburst_hello.elf

      Disassembly of section .text:

      80600000 <_start>:
      80600000: 04 00 18 08 00 00 00 00 00 00 00 00 00 00 00 00 ............
      ....

      80600010 <c_main>:
      80600010: 0818003f j 806000fc
      80600014: 00a02021 move a0,a1
      ...

      806000fc <msg_init>:
      806000fc: 3c028060 lui v0,0x8060
      80600100: 03e00008 jr ra
      80600104: ac4401a0 sw a0,416(v0)


      ちゃんとロードアドレスが、0x80600000 になっていて、その先頭が entry になっている。

      _start が ディスアセンブルされていないが、

      .type _start, @function
      :
      .end _start

      を入れることで ディスアセンブルされるようになる。

      それはともかく、これが動くかというと ... 制御が渡った後に戻ってこない。


      usbboot :> go
      Usage: go (1) (2) (3)
      1:start SDRAM address
      2:device index number
      3:command_line
      usbboot :> go 0x80600000 0
      CPU data: Boot4750
      Load last address at 0x81d08130
      Executing No.0 device at address 0x80600000
      usbboot :>
      usbboot :> boot
      Error - can't retrieve XBurst CPU information: -19


      ほとんどなにもしていないのにもかかわらず戻ってこない。.. メモリに書き込んでいるぐらい。

      次のステップとして

      • メッセージを追加しての USBBOOT への return 。
      • ポーリングすることで、メッセージを出力。

      を考えているのだが ...

      原因を調べて直さないと次のステップに行けない。

      それはともかく ... こういう風に USBBOOT を使って任意のプログラムを動かせるようになれば、ちょっと大規模な マイクロコントローラのような使い方もできるようになる。ライブラリがないのがつらいところだが、Cortex-M3 とか SH-2A とかのボードを使う感覚でプログラムを作ってみるのも、面白いかもしれない。
      なにしろ、LCD や サウンド、microSD(or SD) 、バッテリーが最初から付いているのだ。メモリも最低クラスが 16MB -- 十分ではないか。

      もうひとつ嬉しいのは、ボタンとか LCD などデバイスの使い方をさがすのに USBBOOT の拡張に頼らなくて済むという点。プログラムを書いて動かしてみれば良い。ちゃんと return してくるなら reboot もしなくて済む。

      このあたりの目的には ロード + 実行のコマンドを作って使いやすくしておきたいところ。検討しておこう。

    プログラム:


      動かない原因を調べるために。stage2 で 実際に実行しているところを コメント化して 実行直前の データを取ることにした 。

      ところがこれも動かない。いくつかの処理を call しているので どれが関係するのか調べていったところ ...


      jz_writeb(USB_REG_POWER,0x0); // High speed

      このコードを入れると動かなくなることが分かった。

      UDC (USB Device Controller) の Power Manegement レジスタだそうだが、何をしようとしているか不明。

      したいことは、UDC の状態を変更せず 戻れることだから、不要そうではある。


      Execute program at 0x80600000
      Command line: aaa bbb ccc ddd eee fff


      さて、stage2 での "go" 直前の状態。-- アドレスと Command line の設定はうまく行っている。

      これで 実際に実行するように変更する。そして stage2 内に仕込んだ hello() を実行してみる。

      32MB だと stage2 の先頭アドレスは 0x81c00000 になる。hello のアドレスを mipsel-linux-nm で調べてみると 0x80001610 。


      go 0x81c01610 0

      とすると

      Execute program at 0x81C01610
      Command line:
      hello world

      なんて表示された。今度は 実際のプログラム... の前に バイナリの作成について ..

      stage1 は、作成時に決めた固定のアドレスにロードするが、stage2 はリロケータブル。リンクのオプションは同じだが、target.ld が違う。

      stage1:
      _gp = ABSOLUTE(.);
      stage2:
      _gp = ALIGN(16);
      _got_end = ABSOLUTE(.);

      の違いがある。で、stage2 では、c_main でなにかおまじないをしている。
      リロケータブルなバイナリは作ってみたいとは思うが最初はパスして、stage1 流で行く。


      usbboot :> msg
      usbboot :> load 0x80600000 hello.bin
      usbboot :> go 0x80600000 0

      Execute program at 0x80600000
      Command line:
      comm_area addr:0x81D070E0
      proc_func addr:0x30783009
      XXXXXXX hello world XXXXXXX
      argc = 0x00000002
      argv[1] :



      さて、hello.bin を動かしていて、気がついたことがある。
      ロードしなおしても前のプログラムが動いてしまうのだ。

      原因は、icache の flush 忘れ。もともと 2 回以上実行することを想定していないのかも知れない。

      とりあえず。usb_main の先頭と同様に __icache_invalidate_all() を入れることで 解決した。

      次の課題は、hello.bin からのポーリング。果たして動くのか ...
      というと動かなかった。

      リロケータブルなバイナリの call はみな t9 にアドレスを入れてそこに call している。


      806000a0 <msg_proc>:
      806000a0: 3c028060 lui v0,0x8060
      806000a4: 8c420290 lw v0,656(v0)
      806000a8: 10400006 beqz v0,806000c4 <msg_proc+0x24>
      806000ac: 00000000 nop
      806000b0: 8c590010 lw t9,16(v0)
      806000b4: 13200003 beqz t9,806000c4 <msg_proc+0x24>
      806000b8: 00000000 nop
      806000bc: 03200008 jr t9
      806000c0: 00000000 nop
      806000c4: 03e00008 jr ra
      806000c8: 00000000 nop


      この msg_proc は、関数ポインタとして 登録されている udc4740Proc() を call するもの。

      関数ポインタを使った call は t9 を使って call することはクリアしている。

      うーん何が悪いのだろうか?


      Execute program at 0x80600000
      Command line:
      comm_area addr:0x81D070F0
      proc_func addr:0x47200A0D
      XXXXXXX hello world XXXXXXX
      argc = 0x00000002
      argv :0x81D070F0
      proc_func addr :0x47200A0D

      関数ポインタの値を表示したところ、答えが出ていた。不定値が入っている。よくよく見れば。関数ポインタに代入していなかった。

      これで、hello.bin の中から 10 回 udcProc を call して return しても正しく動くようになった。

    これで hello world は、一旦の完成だが、 Jz47xx で動かした プログラムについてのメモを載せる予定。

    一応 Linux を移植しようと思っているので、この状態で実用的なものを 自作しようとはお持っていない。基本的に テストプログラムを走らせるつもり。

    ただテストといっても いろいろ考えられる。装置の解析が第一としても、XMU を使ったプログラムを動かして動作を確認するとか、オーバクロックしてどこまで動くか調べるとか 。

    プログラム:

    • WK7: usbboot-wk7.tar.gz

      テストプログラムの追加。tests に 01_hello / 02_backlight / 03_portout を作成した。

      01_hello は今まで作ってきた hello world 。
      02_backlight は、PWM のポート に対して 出力に設定するもの H と L が出力できる。( パラメータで指定 )
      03_portout は、02_backlight を汎用化したもの。PA0 〜 PD31 までの範囲の ポートに対して 出力 (H/L) と 入力(Z) を設定できる。

    • WK8: usbboot-wk8.tar.gz

      ECC の仕組みが多少分かったので、cfg を修正。あと、32M/64M の改造をしたのでそれ用の cfg も追加。

      周波数を確認するために、tests/04_hz を追加。portout ベース。
      228MHz で動作している場合、port を 1Hz の周期でブリンクする(はず)。

    • WK10: usbboot-wk10.tar.gz

      tests/05_memtest/ -- メモリテストのプログラムを入れた。

        メモリがちゃんと読み書きできるかのテスト。0x8001000 から stage2 まで (END - 4MB) の領域のうち、プログラム用のエリア (0x80600000 - 6MB) を除いた部分をテストする 。

      • SDRAM のデータを ファイルに書き込む mdump を作った。


    • WK11: usbboot-wk11.tar.gz

      A-41 の LCD にアクセスするプログラムをいれた.
    posted by すz at 21:51| Comment(0) | TrackBack(0) | Jz47xx(USBBOOT)

    2010年08月25日

    tcc89xx (E7002とか)

    ハイエンドの 中華PMP には Telechip tcc89xx を採用したものが多いのは知っていたのだが、android も tcc8902 を採用し 2.1 対応のものが出てきている。

    SmartQ V5/V7 も Telechip らしく 草分け的存在かも知れない。



    コストパフォーマンス的には、E7002 (green-tool で 17250円) か。海外なら リスクがあるものの 2 割ほど安い 159.99 ドル とかがある。

    ちょっと気になってきたのでメモ。
    気になった要素は、

    • Chip に USB や SD からの Boot 機能がある。
       文鎮になってもリカバリが可能そう。
        これは重要。元に戻せることが確信できないといじるのが怖い。
    • android 2.1 対応。
       対応しないチップがある以上やはり魅力
       CPU は ARM11 (ARM1176JZ)
        キャッシュは L2 なしで L1 16KB+16KB
    • H.264 1080p に対応
       動画プレイヤーとしても十分使える。
       贅沢を言わなければ末永く使えそう。
       動画アクセラレータを使うには、メーカのサポートがないと厳しい。
        SmartQ 5 (S3C6410) はイマイチだったので気にしている。
        Jz47xx は、ソースコードまで手に入るのだが高性能とは言えないのが残念。
    • 画面を回転してももっさりしない(はず)
       グラフィックエンジンで 90°回転できる。
       SmartQ 5 (S3C6410) はもっさりだったので気にしている。
    • Linux ソースとか データシートが拾ってこれた。
       リンクすると 削除されたりするかも知れないので リンクしない。
       ヒントは、TWS89x_v800_Doc.zip とかが置いてあるところ。


    といったところ。

    ファームウエアには、linux.rom, ramdisk.rom and tcboot.rom が含まれるものらしい。(rootfs も必要そうだが)

    そういう構造をしているのは、

    など。Telechip がベースを提供しているなら みな構造が同じのような気がする。

    usbboot の方法は、拾ったデータシートには書いてなかった。
    SmartQ_V5/V7_partition_recovery_howto が参考になりそう。
    T56 の情報は、ここにあるらしい。

    まぁ、これをいじるのも楽しそうではある。だが時間がいくらあっても足りなさそうなのでパスか。



    ちょっとメモ:ixsoon E6500

    リンク見ると CE 6.0 or android 2.1 のマシン。800MHz だそうだ。これも telechips tcc8902 っぽい。

    「これ」とか 230 ドルぐらいするのが多いのだが、妙に安いところがある。「これ(134 ドル)」 と 「これ (143 ドル)」。なんか怪しげ。それはともかく この怪しげなのには、telechips 720MHz と書いてある。(他だと Marvell と書いてあるところもあるのだが、2.1 は出せてないはず。) それにしても値段の違いはなんだろう? カメラとか GPS とか option が違う?

    追記:10/09/07 E7002 の アルミシェルタイプが出てきた。




    プラシェルは分解が難しいらしく、買うならアルミシェルと考えていた。(放熱効果より 分解が最優先。-- 絶対分解するから)。これは、E7001 初代アルミシェルと同じ。

    green-tool でも 予約を開始している (17,999 円 送料無料)。
    aliexpress だと これとか。162.16 ドル x PayPalUSDJPY(86.3648) = 14005 円。1 万超えるから 消費税を請求されるかも知れない(+700円)。あと国内の場合ショップによっては ACアダプタが変更になっているかも知れない。それに海外からの購入は、リスクが追加される。初期不良とか面倒だし。さらに言うと、専用ケース国内用ACアダプタ+プラグ変換ケーブルを一緒に買えない .. とかのデメリットもある。
    -- あまり得ではないかも知れないのだが ... やはり値段を見てしまう。この値段なら ... だいぶ欲しいような。

    (追記) Pandawill Gpad G10 (Free Shipping USD $148.19 ) が同じものらしい。アルミバックの色も選べるし、唯一 firmware の アップデータを提供している。ケースも売っているし、もし同じものが欲しいなら、ここがお薦めかも。

      で、ポチってしまった。そして、その日のうちに発送のメールが。あとは、はずれを引かないことを願うのみ。

      9/6 オーダで、9/7 発送で トラッキングID(RRxxxxxxxxxCN) が載ったのだが ... 9/18 現在、まだトラッキングできない。引き受けがでれば、+数日で入手できるはずなのだが ... それまでが長い。

      9/19 ... 来るとは思えないので、返金要求を出してみた。
      そうしたら、The goods have been entering Japan. Online you can check. なんて言われて拒絶された。

      といわれても、追跡できないのには変わらないので、もう一度返金要求を出してみたら... 返事がないかわりしばらくして 追跡できるようになった。昨日の日付で。

      来るんだったら、まぁいいや。

      9月19日 14:38 国際交換支店(SHENZHEN CHINA)から発送。
       - こうなれば あと数日。
       - それにしても ショップ自体 SHENZHEN だから SHENZHEN 出るまで 12日か。
      9月22日 12:24 国際交換支店(成田)に到着。
       - ついに日本にきたー。
      9月23日 9:00 税関検査中
      9月24日 13:15 国際交換支店から発送
      9月25日 6:57 到着 XX支店
      9月25日 持ち出し中

      - きたー。
      - 消費税は徴収されなかった。

    そういえば、SmartQ V5 の廉価版の V3 も出てきた。110 ドル+送料? 。-- 4.3 inch だが小さいのが良いなら これが良いかも知れない。

    aliexpress だと、これが $116.49 x 1 + $16.61(@EMS) = $133.10 。

    ファームに関して老舗が出している安心感というものあるし..
    ちなみに、V5 との差

    V5 V3
    OS Linux/Android/WinCE Linux/Android
    CPU TCC8900 600MHz TCC8902 720MHz
    Bluetooth あり なし
    メモリ 256MB ←
    FLASH 2GB ←
    Battery   2000mAH ←
    サイズ 119×78×14 ←

    うーん悪くないなぁ。こっちにすれば良かった。

    E7002 の情報:


    • 【APad】中華パッド/Androidタブレット【iped】wiki: E7002

      タッチパネルが フィルムタイプだそうだ。割れないのが嬉しかったりする。 (E7001 だが分解しようとして割った例があった)

      バッテリーのもちは、wifi使わないで連続3時間。wifi 使うと2時間ってところらしい。

      性能比較 なんてページがあって A81-E(Cortex-A8 600MHz ,TI OMAP3 3530) に比べて もっさり と書かれている。

      まぁ 動画だけはちゃんと見れるのを選択基準にしたから、それでも良いのだが .. ちょっと気になる。

        TI の OMAP3350のページに情報がある。TCC8902 は、16KB/16KB の L1 しかないが、256KB の L2 も積んでいる。アクセラレータは、DSP (こっちも L1/L2 をもっている) による ビデオアクセラレータ と POWERVR SGX グラフィックアクセラレータ。

        CPU の差は、同じクロックで 2 倍ぐらい?(L2 があるのがでかい) -- だが 画面表示は CPU だけでは判断できない。

        TCC8902 でも Image Overlay Mixer と 2D/3D Graphic Processor を積んでいる。CPU にも VFP はある。(ARM1176JZFS) 。

        OMAP3350 に勝つことはないにしても .. アクセラレータを使いこなせてない可能性は一応ある。-- 今後に期待しよう。


    そろそろファームウェアのダウンロードとかの情報を探してみる。

    お、これか?

      【android】oPad系列 M700 M701 X5A【7インチ】
      215:名無しさん@お腹いっぱい。:2010/08/28(土) 11:01:28 ID:X8U4nuOD
      ファームウェア#370きてるね
      帰ったら入れてみるわ
      http://www.androidtablets.net/forum/specific-tablets/\
      288-apad-w-android-2-1-telechips-tcc8902-pandawill-\
      g10-wiipad-slim-plus-hipad-m701-8.html#post5360

      【パチモン】中華 Androidタブレット/Apad/山寨iPad 6枚目
      276 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2010/09/19(日) 20:49:06 ID:jl3PNKcr
      >>273
      E7002もファーム#98で800個以上作られてビックリしたが、
      最新ファーム#121では10個まで減ったけど作られてる。
      何なのかは、まだ意味不明。



    上記のページ firmwares for HaiPad M701 / Pandawill G10 (/ Moonse E7002) に こんな情報が

      --
      How to update with USB boot mode
      1) start FWDN V7 on PC, then add lk.rom, tcc8900_mtd.img(, and NAND Data.fai).
      2) power off and slide switch on
      3) press & hold HOME icon button(act as MENU button)
      4) connect USB cable (microSD slot side <-> PC)
      5) wait boot splash image("I love you" or "HAIPAD") is displayed on screen
      (lk.rom is loaded into device and started FWDN mode now. you can release HOME button.)
      6) start flashing

      --
      How
      to update with FWDN mode
      1) start FWDN V7 on PC, then add lk.rom, tcc8900_mtd.img(, and NAND Data.fai).
      2) power off and slide switch on
      3) plug AC adapter
      4) press & hold POWER button(front button), then press & hold HOME icon button(act as MENU button) *immediately*
      boot sequence should be stopped at boot splash image("I love you" or "HAIPAD"). you can release POWER/HOME button.
      5) connect USB cable (microSD slot side <-> PC)
      6) start flashing

      ----

    USB BOOT でアップデートできるなら、まずは安心。

      追記:USB BOOT を使うときは、サイドのボタン 2 つを押しながら 液晶面のメニューボタン長押しで電源投入。

    ところで FWDN V7 ってツールの名前か?

      ググってみると、結構情報が見つかる。

      で、FWDN V7 というのは、どこからダウンロードするのだろう?
      画像検索したら、SmartQ V7 の説明ページに行き着いた。-- さすが老舗。

        画面の画像を見ると、Boot Loader, Kernel Image, Ramdisk File のファイルを指定している。あと Target には MTD もあるがファイル指定はない。

        このツール書き込みはできるが、バックアップは取れないのだろうか? .. だとすると、(絶対に動く)公式のファームを 1つは手にいれておかないと安心できない。

      それはともかく、"VTC Driver Installer" がキーワードらしい。これは、SmartDevices のダウンロードセンターのツール(工具)にも入っている。

    ファームウェアは、とりあえず 9/18 の kernel #121 ってのをダウンロードしてみる。サイズは、61.94MB, SHA1:59FCA856479553E63F64F3325128429F1E1D94C4

      ようやくダウンロードできた。中をみると(ドキュメントを除いて)

      VTC Driver Installer v5.00 for 2000_XP.EXE
      VTC Driver Uninstaller v5.00 for 2000_XP.EXE

      FWDN_V7_v2.10.exe
      FWDN_V7_CFG.ini

      tcc8900_mtd.img 121MB
      NAND Data.fai 730KB
      lk.rom 1.1MB

      といったファイルが格納されていた。FWDN_V7 などは同梱されていたのか。

      ところで、これはどういうものなのか? CFW ? .. とか思ったのだが.. 違った。
      HaiPad M701 の公式ファームウェアで、ダウンロードセンターからリンクされてた。

      .. ただ、買ったのは、HaiPad M701そのものでもなく、同じものとされる Moonse E7002 でもなく、同じと思われる MID-70-R7 である。本当に使えるのか不安はある。

      追記:HapPad M701/Moose E7002 とは ファームウェアの互換性がないらしい。

      使えそうなファームウェアの情報は、
    • SLATEDROID: New ROM or new device? StyleFlying T72
    • Digital8.org:StyleFlying T72 (aka E7002)
      あたりを見ると
      MD5 Checksum: 935025399ec7dd0e41573c703ffcf5dc
      のファイルが見つかる。

      注意) firmwares for HaiPad M701 / Pandawill G10 (/ Moonse E7002) には、

      XXX do NOT use these firmware on StyleFlying and new Gpad G10
      XXX if you have these models, try firmware for StyleFlying.
      XXX of course, no warranty!

      というコメントが追記されていて、StyleFlying の firmware のリンクが付いている。
      StyleFlying T72/Pandawill Gpad G10(new)と互換性があるようだ。(追記/コメントも参照)


    追記: ついにきた。

    • 梱包は丁寧で箱はほとんど痛んでいない。
       - 箱には、

        android 2.1
        o WiFi o 3G o HDMI o 1080P o 3D GAME

      と書いてある。
       - HDMI に出力できるタイプもあるが、これは違う。
       - もちろん 3G もない。


        MDMI 付きはこんなタイプ。(もちろん買ったのとは違う)

    • 中身は、本体以外に、イヤホン、 ACアダプタ USB ケーブル(mini-B)、 HOST 用 USB ケーブル(miniB - A Type メス)。

    • ACアダプタは、5V 1500mA 例の細いプラグ

    • 本体は、E7001 アルミシェルそのままの形状。

       - なんか バッテリーが固定されていない感触でゴトゴトする。
      - ただしあくまでも感触。よくわからない。
       - どうでも良いことだが、裏のロボットマークが上下逆だった。

    電源を入れてみる。--

      初期状態での言語は英語。まずは何が入っているのかチェック。

      • モデル番号 Android for StyleFlying TCC8902 MID
      • ファームウェアバージョン 2.1-styleflying-ver1.11
      • カーネルバージョン 2.6.29 root@lty #177
      • ビルド番号 20100913.192532

       - ビルドが 9/13 ! -- それなら発送が遅れたのもやむを得ないか。
       - HaiPad M701のファームが使えるか試したいところだが、上記のファームウェアを入手しないことには不安。
       - StyleFlying とは何? -- Telechips MID StyleFlying T72 これ?


    とりあえず動画を見てみる。

    • H.264 は、720p の動画しか用意できなかったのだが、全く問題なし。

    • あと手持ちは、低解像度の Xvid ,mpeg2 。結構綺麗かも。

      ちょっと使った範囲では、普通に使えている。A81-E(Cortex-A8 600MHz ,TI OMAP3 3530) に比べて もっさり と書かれていたが、別に気にならないレベル。

      • ホームから、アプリのメニューをタブで引き出すとき、ちょっとスムーズでないかも。

      • 縦横の切り替えは、画面が瞬時に切り替わるが、それまで間がすこしある。

      • 動画のサムネイルの表示はもっさりだったが、microSD の読み込み性能が原因みたいだからやむを得ない。

      来るまでは SmartQ V3 にすればよかったとか思ったが、7inch でのスムーズな動画をみると、これで良かったと思える。

      使い込むと不満も出てくるのだろうが、いまはよくわからない。動画さえちゃんと見れれば、とりあえず満足。

      • ... とか書いたが、ソートが 日付でしかできないようだ。
        しょうがないので、MSYS にもある touch コマンドで並べたい順の逆順で 日付を更新した。.. 当然スクリプトを作って行ったのだが、間に 3 秒間の間隔を置くようにした。

        .. あとサムネイルでのリスティングしかないような... これは最初に表示するときは、読み込みするので遅いのだが、キャッシュして以降は高速にするようになっている。... だがちょっとしたことで、全リドローするのだが、これが もっさり感がある。

        PMP と同じような作りで良いのだが.. なかなか難しいのだろうか?

        動画用のプログラムは 2 つ入っているのだが、ちょっとだけ挙動が違う。映画じゃない方は、Gセンサーに追従して、方向を変える。

      • 具体的な数字はよくわからないのだが、バッテリーが思ったより持つ感じ。ただし、充電時間も長い。3 時間でも 70% とか。
        ちなみに、充電ランプは 赤。

      • 電源スイッチのように見えるスイッチは、何?OFF でも電源が入る。で、OFF では Gセンサーが効かない。
        -- 単に Gセンサー ON/OFF(縦横固定) のようだ。

      • market は入っているがまだ使っていない。
      • 結局 専用ケースプラグ変換ケーブル を買うことにした。ケースがないと液晶を割りそうで怖い。付属ACアダプタは使えるが、やはり 認可品(PSEマーク付き)にしたほうが良い -- アダプタ自体は SmartQ 5 と 兼用できるので持っていて変換ケーブルは予備。(買うとしても秋月の小さいのを買うつもり)

      • ギャラリーで見える写真が消せない。端末の初期化をすると設定だけ戻るが、写真は消えていない。しかも 空きエリアが減る。
        内蔵ディスクのアクセスも USB からできないし。。。

        これに限らず andoroid のカスタマイズが甘いように思える。ファームウェアのアップデートに期待。



    Android SDK について

    買った E7002(もどき)を とりあえず USB につなぐとドライバーを要求される。

    なんでも Android SDK にドライバが含まれるそうなので、ここからダウンロードしてみた。

    で、SDK Maneger を動かしてさらに "SDK Tools" と "USB Driver for Windows" を ダウンロードするらしい。

    どうせなら .. ということで、2.1 だけ コンポーネントと サンプル あと API ドキュメントもダウンロード。

    深みにはまるつもりはないが、どんなものなのか見てみたい。


      usb_driver に android_winusb.inf があったので指定してみたがダメ。

      E7002(もどき)は、PID_DEED だったので追加したら、なんか認識された。端末のほうは、USBデバッグが接続されました。なんて表示された。

      ;
      ;StyleFlying
      %SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_DEED
      %CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_DEED&MI_01

      これで不明なデバイスはなくなったが、SDK を使わない限り関係ないようだ。あと、インストールしなくとも 2 つの USB ディスクが認識される。.. だが使おうとすると ディスクをいれろと言われる。なにか設定しないとダメなのだろうか?

      ちなみに 端末側に 2 つの USB があるが 右に接続するものらしい。(左は HOST 専用で USB 1.1 のはず)


    メモ: android で作れるものか見当も付かないのだが... ちょっと。

      tcc8902 のデータシートを見ると、ハードウェアエンコーダもまた付いている。動画を取るためのものだと思うが、H.264 1280x720@24fps の能力だそうだ。
       - H.263 , MPEG4-ASP も対応していて、1280x720@30fps。
       - まぁ tcc8902 だけじゃなくて、OMAP3350なども当然可能なのだろうけど。

      ひょっとして、動画変換ソフトを作れるだけの能力があるのではないだろうか?

      デコーダーとリソースを共有していると思うので、デコードと同時には動かないと思うが、それなりに強力な能力なのかも知れない。

      ただ実際に作るには、API がないと無理。カメラがありエンコーダーの機能を使うのだろうが、エンコードだけ API として分離されていないと。


    追記: 2010/11/14 入手可能なファームウェア

    もとから入っていたファームウェアは、

    • モデル番号 Android for StyleFlying TCC8902 MID
    • ファームウェアバージョン 2.1-styleflying-ver1.11
    • カーネルバージョン 2.6.29 root@lty #177
    • ビルド番号 20100913.192532

    というものだが、New Styleflying Romsによると 現在ダウンロード可能なのは、

    この 2 種類。-- ここみると

      Tested, both work fine. from 51szb is Sept 20 date (#225) and the one from panadawill is Oct 15, 2010 (#301). I am sticking with panadawill.

    と書いてあって心強い。9/20 のは コメントで fun さんに 紹介してもらったのと同じ #225。

    さらに..
    なんて情報が。

    ところで StyleFlying ってメーカ名だったのか

    • Super-Android MID なんてのも作っている。

    • リンク先には、サポートしているビデオフォーマット一覧があるが、こんなに詳しいのは初めて見た。同じ Telechips TCC89xx だから 買った E7002 モドキも同じなのだろう。

    • リンク先には、英文 pdf もある。見ると パーツの原価一覧まである。Flash , camera 以外の 主要パーツの合計が $64.84 。結構するものだ。

        上記には、ケース代や基板代すら含まれていないから 製造原価だけで $100 超えそうなかんじ。firmware も StyleFlying にまかせることになるのだろう。作って売るだけとは言え製造メーカーもなかなか厳しい商売のようだ。

    • 気になるのが License CHIP 。これなしでは、firmware は動かないしくみらしい。-- styleflying のファームウェアの 開発元はここだけで、他にはないということか。

    ちょっと pandawill というところが気になった。これだけフォーラムがしっかりしてるなら信頼できるのかな。Gpad G10 をサーチしてみたが、結構安い(Free Shipping USD $148.19 ) みたいだし、お薦めなのかも。

      MID/UMPC/Nnotebook Accessories というところをみると、バッテリー(3200mAH 79mmx68mmx5mm) とか売っている。LCD や タッチパネルとかも。
      -- ちょっと覚えておこう。

    追記 2010/11/15 : ついに firmware update

    これが成功すれば、後々おかしくしても元に戻せるわけで、一度はやっておく必要はあると思っていた。
    が、失敗すれば 特に困っていないのに 使えなくなってしまう。
    リスクは大きいが、自信が出来たので踏み切った。
      準備:
      オリジナルの情報は既にメモしたが、念のため MAC アドレスも一応メモ。
      バッテリー残量確認: 60% 残ってた。十分と判断。

    ファームウェアは、#301 (10/15 版)

      (VTC driver はインストール済み)
      FWDN_V7_v2.09.exe を立ち上げる。
      lk_gpad.rom , app.rom, splash.rom を この順番で add 。
      (NAND Data.tmp もあるが パス)
      この状態で ケーブルを接続(PC - USB 右)

      右サイドの ボタン2 つを押しながら 電源ボタン長押し。
      → ダイアログがでてメッセージがなにやら出た。
      (すぐクローズするので読めず)
      → 本体は、GPAD の画面。
      (オリジナルは、ロボットの絵なので流し込んだ lk.rom 起動)

      Start ボタンを押すと次のように進んだ

      Download Session - Start!
      Device Init Complete! - (3sec 82)
      Devices SerialNumber 000000EC4CB8xxxxxxxxxxxxxx (だいぶ長い)
      Write BOOT - Complete - (25sec 35)
      "MTD AREA Write" - Complete - (2min 5sec 32)
      "MTD AREA Write" - Complete - (0sec 70)
      "D:\xxx\app.rom" Check CRC- Complete - (2min 16sec 96)
      "D:\xxx\splash.rom" Check CRC- Complete - (0sec 75)
      Download Session Complite! (1st)
      [ERROR] CFwdnPort::FWDN_Command: Fwdn Command Failar (0/32)
      (赤文字: .. あと 2 行ぐらい)

      赤文字になった状態では本体の電源は既に切れている。

      なにはともあれ、Session Complite したので 普通に電源投入。
      → スタート画面が GPAD に変わり、あとは普通に立ち上がってきた。

    新しくなった端末情報を確認。

    • モデル番号 Android for M1E for Styleflying
    • ファームウェアバージョン 2.1-update1
    • カーネルバージョン 2.6.29 #301
    • ビルド番号 Styleflying Ver.20101015.173726

    だいぶ表記は変わったが期待したもの。あと MAC アドレスは変更なかった。

    あと全体について、
    プリインストールのアプリケーションは大分入れ替えがあったようだ。
    (中国国内向けのがなくなり、Speed FORGE 3D が入ったり 色々)
    システムは基本的には同じ。だが、多々改良されているようだ。(よくわからない)

    これで、ようやく自分のものになった気分になれた。
    あと これからは、E7002 モドキではなく GPad G10(モドキ) と呼ぶことにする。

    追記 2010/11/18 :ファームウェアのファイルをチェック

    ようやく いじれるようになったので、ちょっと調べてみることにした。
    対象は 9/20 版 (#225) と 10/15 版(#301)。

    入っているファイルは、

    • lk_gpad.rom (1MB +α)
    • app.rom (148 MB)
    • NAND Data.fai (1.7MB) (#301 は NAND Data.tmp: 1.3MB)
    • splash.rom (#301 のみ: 768KB)

    これらの ヘッダーを dump したり、fun さんに教えてもらった tccutils でチェックしてみた。

    • lk_gpad.rom

      これは、ブートローダ? #225 と #301 では同じものだった。
      また、ヘッダーの形式が他のファイルとまったく違う。

      変更する理由はないから、中身について気にしなくて良さそう。

    • app.rom

      [HEADER] RAW_IMAGE MTD という 文字が ヘッダーに埋めこまれている。
      tccpack.c を見ると、3 種類のファイルが入っているらしい。
      それぞれには 0x10 バイトのヘッダが付き どういうファイルかのタイプが設定されている。

      01 : boot.img (5MB)
      02 : system.img (138MB)
      03 : recovery.img (5MB)

      boot.img と recovery.img は同じ形式で ANDROID! で始まる。たぶん ブートパラメータ+カーネル+initrd
      system.img は、root ファイルシステム(yaffs2)の イメージ。

        boot.img/recovery.img 詳細

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

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

    • splash.rom

      [HEADER] RAW_IMAGE MTD という 文字が ヘッダーに埋めこまれている。
      データは 以下の 1つ。
      05 : splash.img

      800x480 16bpp(R5G6B5 LE) の 画像 + 2バイトがデータ。
      自分で作れば 起動画面を変更できそうだ。

    • NAND Data.fai

      [HEADER] FILESYSTEM_IMAGE TCC FAT IMG V0.1 NAND Data で始まるデータ
      DISKSIZE 0xce800000 (3304MB) PART_CNT 0x01 の 情報が続く。

      0x60 のヘッダから MBR を含む DISK イメージが入っている。DISK イメージは、FAT32 でフォーマットした初期データ。


      000060 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00
      000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      *
      000230 00 00 0b 00 00 00 20 00 00 00 e0 3f 67 00 00 00
      000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      *
      000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

      ここまでが、MBR -- 0x55 0xaa が目印。
      情報は、

        Partion 1 id 0x0b = W95 FAT32
        Start 2
        Last 0x673fe0 = 6766560 (3383280KB = 3304MB - 16KB )



      000270 00 40 00 00 00 00 00 00 00 40 1a 00 00 00 00 00
      000280 eb 5a 90 4d 53 44 4f 53 35 2e 30 00 02 20 18 00 MSDOS5.0
      000290 02 00 00 00 00 f8 00 00 20 00 20 00 00 00 00 00
      0002a0 00 3c 67 00 74 06 00 00 00 00 00 00 02 00 00 00
      0002b0 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00
      0002c0 00 00 29 00 00 00 00 00 00 00 00 00 00 00 00 00
      0002d0 00 00 46 41 54 33 32 20 20 20 00 00 00 00 00 00 FAT32
      0002e0 00 20 20 20 20 20 20 20 20 20 20 20 00 00 00 00

      ここらへんが FAT32 の ヘッダ。(0x280 から)
      - 16バイトずれているから 0x270 は、別の意味のヘッダ?
      mount してみると

        Size: 3381120 (KB)
        Used 16 (KB)
        Available 3381104 (KB)


      GPad は、4GB なのだが、買ったやつは 2GB と書かれていた。4GB 用の データでは 書き込めないかも知れない。その場合は 自分でイメージを作らないといけないかも知れない。
       - ひょっとしたら 他の機種用の NAND Data.fai が使えるかも。

      #301 の NAND Data.tmp とサイズが違うのだが、足りない分は all 0 の データ。
      CRC とかあるはずだが、足りない分は all 0 と見做すのかも知れない。


      000060 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00
      000270 00 40 00 00 00 00 00 00 00 40 1a 00 00 00 00 00

      これ、オフセットと サイズではないか? MBR は 0 から 0x200 バイト。
      で、イメージは、0x400 から 0x1a4000 バイト(1680KB)。
      そして、1680KB + 0x280 (= 1720960) が正しいファイルサイズで、#225 の NAND Data.fai のサイズに一致する。

      だいぶ分かった。が、CRC が入っているのかどうか? このあたりも調べないといけない。
      後ろのデータはすべて分かったので、あるとすれば 先頭のヘッダ。


    こういう物ということは分かった。それぞれデータ形式が違うから FWDN_V7 での add の順番を気にする必要はないのだろう。

    また、RAW_IMAGE MTD の id は、mtd のパーティション番号だろう。RAW_IMAGE といっても OOB(の badblock情報とか書き換え回数) までは初期化しなさそうな気がする。そうなっているから、yaffs2 のイメージを RAW_IMAGE で書いても問題ないのだろう。

    FAT32 だけは、RAW_IMAGE ではない。下位レイヤに UBI が入っていて ウェアレベルリング を担当しているのだろう。UBI を含む RAW_IMAGE にすると DISK 領域全体のデータになってしまうからまずいことになりそうだ。

    カスタマイズするには、yaffs2 の system.img を展開して編集し 再作成するというのが手順っぽい。ちょっと面倒な感じだが、好きなようにカスタマイズできそう。
    あと、お手軽な方法として、initrd をいじる という方法があるかも知れない。
    posted by すz at 17:43| Comment(40) | TrackBack(0) | 日記

    2010年08月20日

    jz47xx 開発計画(計画の修正)

    Neo Slim 3000 or A-41 で Linux を動かすつもりなのだが、全然進んでいない。

    理由は面倒だから。動いたときの満足感がイメージできていなくて面倒だとばかり感じてしまう。

    ここで、なにが一体面倒なのか書いて(そうすることで実は面倒じゃないじゃないかと思える場合が多々ある)、 実現できると何が嬉しいのかについても書いてみる(動機の強化)ことにする。

    なにが面倒なのか?

    Linux は既にあるのだ。コンパイルもできている。面倒なのは、シリアルコンソール。これがないと動作の確認も最初のオペレーションもできない。だが、0.4mm ピッチの IC から線を引き出さなくてはならず、自分のスキルでは実現ができない。

    そうなると、シリアルコンソールに代わるものを用意しないといけない。で、usbboot のプロトコルを改造して メッセージのやりとりが出来るようにしようと考えている。

      こうなると u-boot - linux の通常起動は無視して、usbboot - linux の直接boot をすることになる。

      面倒1: メモリマップ

      どこにロードしてどうやってパラメータを渡すのかをちゃんと設計しなければならない。そして障害になるのが、xburst_stage2 ブートローダの ロード場所と 使用しているバッファ(1MB もある)

    さて、メッセージのやりとりは、PC 側のプログラム(usbboot) がポーリングすることで 行うことになりそうだ。

    面倒2:ポーリングの方法

    普通ポーリングする場合 select システムコールを使ったりするのだが、USB を使うための ライブラリ libusb には select を支援するための機能がない。

    timeout を使ってビジーループにすれば実現できるのだが、作法的にどうか? というのがあって躊躇している。マルチスレッドにするのも手なのだが、Windows でも動かしたいし OS の違いを吸収するのもまた面倒だったりする。

    面倒3:Linux のシリアルコンソール代替ドライバ

    いま考えている方式だと、xburst_stage2 で usbboot が動いている状況を USB をリセットすることなく Linux に引き継いでもらわないと うまくいかない。

    なので、xburst_stage2 相当をつくり直して Linux に組み込むことになる。これが面倒で面倒で。

      xburst_stage2 を破壊しないようにして、 xburst_stage2 に callback のエントリーを加えたほうが楽でスマートなように思えてきた。

      メモリは無駄に使うことになりそうだが、ここは目をつぶろう。

      ちなみに、Linux のメッセージの出力は、メモリに書いて callback を呼び出すことになりそう。入力は ポーリングになると思う。シリアルドライバもポーリングできるようになっていたと思うので、たぶんあまり悩まずに作れる。

    これができると何が出来るようになるのか?

    まず、シリアルコンソールだけが使える Linux が出来るわけだ。

    これで何ができるかというと 立ち上げメッセージが見える。だが、root を mount するところで panic することになる。

    panic するところまで確認できたら、initrd を作って root にして いくつかのコマンドを用意すれば、デバッグができるようになる。

    SD カードは ドライバが動くと思うので、次の段階では SD カードを mount して ストレージが使えるようにする。

    次に LCD のドライバ。LCD の初期化の問題さえクリアすれば、LCD もまた動かせるはず。LCD が動けば、シリアルコンソール以外にメッセージを見る手段ができたことになるから、xburst_stage2 を開放して、usg-gadget で Network を通す。

      詳しく書くと、
      1) Linux から callback しないようにする。
      2) xburst_stage2 が使っていたメモリを linux が使うように組み込む。
      3) usg-gadget ドライバを組み込む。
    • 1) - 3) を連続実行する手続き(スクリプト?)を シリアルコンソールから実行するとともに usbboot を 終了する。(切り替えに失敗するとなにも出来ないので shutdown か?)
    • Jz47xx 側で dhcpd を動かすと PC 側の設定なしで、(ローカル IP を使った)Network の接続はできる。

    ここまでくると普通に Linux が動いているのに近くなる。login もできるだろうし、nfs を使ったりもできる。

    で、このあたりから始めるのが、Neo Slim 3000/A-41 固有のドライバの作成。.. といってもボタンぐらいのはず。

    装置固有のドライバが捗らなくても、やれることは多い。システムをつくり上げるために色々ビルドしなくてはならないし、サスベンドとかもある。

    それに、正規の boot も やらないと。u-boot についても 同じように シリアルコンソールの代替をすることからやれば良い。

    これができると何が嬉しいのか?

    とりあえず最終形態ではなく、usbboot から Network が使える前後まで来たらなにが嬉しいか。

    まず嬉しいのは、開発できるものが複数になること。あきたり、行き詰まったりしたら別のことをやれば良い。

    性能を調べても良いし、オリジナル ファームウェアがどう FLASH を使っているのか調べたりしても良い。u-boot の移植でも良いし。

    あと、ここまで来れば立派な開発環境になるというのも嬉しい。メモリを付け替えて 64MB にして ビルド三昧とか。-- 64MB でも全然足りなさそうだが、足りないのは gcc の CPU パワーと ld(リンカ)のメモリが第一。これを 外の IA マシンにやらせればなんとかなるはず。(ただ、それの前提として nfs でファイル共有が必要なはず)

    あと、USB-gadget での Network は Windows でも出来る。SD が使えさえすれば、PC でも動かすことは出来るようになる。cifs を入れれば PC との共有(PCがサーバ)もできるし 箱庭のようなシステムを構築することも出来る。

      SDL 1.2を使えば Windows でも グラフィックの表示は簡単にできそうだ。
      Jz47xx のフレームバッファを抜いてきて Windows で表示させれば、LCD が動かない場合でもデバッグは出来そうだ。こういったのは機種依存がないので、意外と便利かも知れない。

      あと SDL は、スレッドを提供している。SDL に全面依存して作ると楽かも知れない。-- Jz47xx 自体も SDL つかうことになりそうだし。

      では最終形態ではなにが嬉しい?

      まぁものを作るネタがあればそれだけで嬉しいのだが、どういうものにつながっていくかイメージしておけないと ..

      デバイスを追加したりする改造をしない前提ならば、入力は マイクと USB device しかないのだ。マイクを無視すると、PC と接続してデータを取り込むような使い方が第一。PC と接続している間は PC を使えばよいわけで、持ち歩く前提なら、データを見ることしかできない。動画や音楽はそれなりのレベルになっているわけで、嬉しい点を見つけるとすれば、がんばって不満な点をなくせるということになる。
      あと、中華PMP の EBOOK 機能は貧弱なので、それが充実すると 嬉しいかも知れない。
      PDF viewer とか その他 viewer を充実できると まぁ嬉しいから そのあたりが嬉しい点。

      あと、PC と接続して PC だけではできないことをする という可能性が残っている。
      追加ディスプレーというのが そのひとつ。嬉しくないかも知れないが要素の1つ。
      あと、セキュリティーの理由などで PC ではできないことをできるようにする観点がある。PC のセキュリティーをすり抜けるとかそういうことではなく、共用PC におきたくないデータを置くとか .. 共用PC にはインストールしなくないアプリケーションを動かすとか ... まぁそういうもの。Linux を動かすこと自体も この範疇かも知れない。こういう使い方では、PC でできることをあえて PMP 上で動かす必要はない。また、画面を PC に出すなど、PC のリソースを利用できる。

      マイクも なにか利用できるアプリケーションがあるかも知れない。音声認識するには十分なパワーがあるはず。音紋とかで誰と会っていたか/何をしていたか記録するとか .. で、秘書ソフトと連携させて ... なんてのは難しいだろうか。

      もし、Jz4755 などで カメラが利用できるなら、スタンドアロンでできることが増えるかもしれない。マイクよりカメラはさらに難しいと思うので、マイクさえ十分な利用ができないなら、なくても別にかまわないかも知れない。


    追記: メモリマップについて


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

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


      xburst_stage1 は、0x80002000 (先頭 +8KB) にロードされ、xburst_stage2 は、後ろ 4MB にロードされる。メモリのサイズは、SDRAM の設定情報から計算している。

      xburst_stage2 のスタックは、start address + 0x3ffff0 (4MB の終わり) に設定。1MB のバッファ(Bulk_buf) は、配列で 普通に BSS 上に取られる。

      ちなみに、xburst_stage1/stage2 共に 先頭は jump命令 + nop。
      その後の 32バイトにパラメータが設定される。

      こういう構造をしているので、Linux は 先頭の方にロード可能。usbboot のプロトコルでシリアルコンソールを使う場合は、後ろの 4MB は使わないようにする。

      使わない場合は、全部のメモリを使えるが HOST側 が usbboot 使えなくなったことを知っていないと まずい。

      あとは、linux に対するパラメータを (u-boot が)どのように渡すのか調べないと。

      これは、普通の関数呼び出しと同じで a0-a3 にパラメータをいれて jump する。文字列を渡すからその領域は 割り当てておかないといけないが。

        prom_argc = (int) fw_arg0; // a0
        prom_argv = (char **) fw_arg1; // a1
        prom_envp = (char **) fw_arg2; // a2

        だそうだ。envp は jz47xx では未サポート。prom_init_cmdline() で argc,argv を元に、arcs_cmdline に cmdline を再構築する。スペースでくっつけていくだけだから アーギュメントは command_line のイメージ 1 個でも良い。
        なお COMMAND_LINE の最大サイズは 256 バイト。


      ロードするアドレスは、ビルドするときに決まる。

      dingoo-linux だとどうも 0x80600000 らしい。

        zImage は、0x80600000 にロードされ、先頭アドレスから実行する。実行すると、0x80010000 〜のアドレスに vmlinux.bin と initrd を展開して制御を渡す。パラメータは、セーブしておいて、同じパラメータを vmlinux.bin に渡している。

      ちなみに u-boot は 0x80100000 。

      ところで、xburst_stage2 とかのメモリを Linux に渡して使えるようにするには、どうしたら良いのだろう。
      initrd のメモリを開放するとかは出来るから、方法はあるはずだが、スマートな方法を取りたい。

        reserve_bootmem(__pa(initrd_start), size, BOOTMEM_DEFAULT);
        free_bootmem(__pa(initrd_start), size);

      こういう使い方をするらしいのだが、

        void __init free_bootmem(...

      と __init 属性が付いているから 初期化終了後は、free_bootmem は使えない。まぁ initrd も後で開放できるからなにか方法があるのだろう。
      重要なのは、usbboot のときは、後ろの 4MB について reserve_bootmem しておくこと。メモリーサイズ自体を -4MB とすると再利用するとき困る。

    追記: シリアル コンソールドライバ

      多くの SoC の シリアルは、8250 の拡張の 16550A と互換性を持っている。linux では、8250 ドライバが一手に引き受けているようだ。

      Jz47xx でも

      CONFIG_SERIAL_8250=y
      CONFIG_SERIAL_8250_CONSOLE=y
      CONFIG_SERIAL_8250_NR_UARTS=2
      CONFIG_SERIAL_8250_RUNTIME_UARTS=2

      なんて定義をして、汎用ドライバを使っている。

      さて、シリアルのふりをして CONSOLE にも登録できるドライバを用意しないといけないわけだがどうしよう。

      とりあえず drivers/char/Kconfig を見て CONSOLE になれる変なドライバをさがしたところ bfin_jtag_comm.c というのを見つけた。どうも kthread を作ってポーリングしているようだし、マネして作れば良さそうに思える。ライン数は 365 行であまり規模が大きくなさそうだし、いけそうだ。

      これを drivers/char/jz_char に移し、jz_usbboot_comm.c とかにして 変更していけば、良さそう。

      ところで、コールバックのエントリをどこに置くか?

      stage2 の先頭 の jmp 命令の次に 4x8 のエリアをパラメータエリアとして使用している。ここには、fw_args 構造体をコピーするのだが、fw_args 構造体のサイズは 4x7 分。もう 1 エントリ付け加えることができる。また、start, size というメンバがあって、これは未使用。-- すくなくとも 初期化は不必要にできる。
      このあたりに callback 関数のアドレスを入れておけばよさそう。

    追記: SDL 1.2

      ソースコードをダウンロードして configure するだけで MinGW 版はビルドできた。

      これが、libusb と MSYS コンソールの stdout をスレッド環境で使えるなら言うことはないのだが...

        ちなみに SDL 自体は グラフィックを提供するだけで、メニュー 、ダイアログなどは提供しない。それどころか フォントの描画すら提供していない。

        でも Jz47xx のフレームバッファを表示するだけならそれで十分。
        メッセージは出力したいが、MSYS コンソールに出力できるなら、それでもいいかと思う。log とか取るの楽だし。

        もし、フォントを表示するなら、DINGUX と 互換になるようにしたほうが良さそう。これは別途考える。


      試してみると全然だめ。

        gcc -o testkeys.exe testkeys.c -g -O2 -I/usr/local/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main -DHAVE_OPENGL -L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows

      こんな風に testkeys はビルドされるのだが、なにもメッセージがでない。

      ... 調べてみると Windows は、stdout.txt , stderr.txt に出力されるものらしい。で、環境変数を SDL_STDIO_REDIRECT=0 としておくと reopen されないみたいに見える。

        あ、できた。環境変数設定することで MSYS コンソールでも コマンドプロンプトでもちゃんと stdout が出力された。
        あとは、スレッド使って usbboot と SDL 画面の 両立ができればいけるか。

      • ちなみに、使用している qi-hardware 版 usbboot は、Linux 以外で コンパイルできることを考慮していないから 先に移植しないと。
        さらに、ちょっと面倒なことに confuse も 入れないといけない。
        mingw での confuse の ビルドは、ここ参照。
        とりあえず ... ここまでの環境を usbboot-wk4.tar.gz に置いておく。
        Linux だと動くけれども MinGW だとビルドできるものの usb_claim_interface で エラーになったりするのが現状。
        ( ちなみに inf ファイルは 0x4750 も通すように修正)


    追記: ちょっとメモ

      Linux 2.6.30 あたりのカーネルは、mm/migrate.c が含まれている。なにをするものかというと、ページを動かして連続領域を確保しようとするもの。今までは 4KB のページの数倍 -- 16KB でも厳しい状況があったのが、取れるようになる。ただ、128KB とか 数MB (システムの 10% とか) とかの連続領域を作ってくれるのかどうか? ちょっとわからない。目的が違うから厳しいような気もする。
      MB クラスの 連続ページが取れると、IPU用メモリの動的アロケートができるのだが ... そうすると動画を使わない場合は メモリが多少増えて嬉しいのだ。 360p -- 仮に 640x360 だとすると IPU を使うには たぶん 256KB/64KB/64KB の 3 つの連続領域が 取れる必要がある。720p なら 1280x720 として 1MB/256KB/256KB が必要そう。PMPみたいなシングルタスクに近い使い方なら取れるような気もするし無理なような気もする。--- うーんわからない。

      最後の 4MB を HIGHMEM にできないかな。HIGHMEM だと slab 置けないから 確実にメモリを追い出せるような気がする。

      ちなみに、オリジナルの処理は、初期化時に __get_free_pages() を使って 4MB を予約している。予約したエリアは jz_imem_base に保存される。
      ここから メモリ領域を 割り当てるのは proc を使って行う。

      ... usbboot を使ったときは、当初は使えず Network でつないだ後に 使えるようになる ... といった仕様で十分そうな感じ。
      そういうふうにすれば、jz_imem_base の設定ぐらいで事足りる。

      こういう風に しておいて、後で migrate の機能を使って動的に確保できないか試す ... のほうが手順的に楽そう。

    usbboot (stage2) → Linux への制御の渡し方

      どうやって Linux に制御を渡すのか について整理しておく。

      stage2 は初期化が終わると 無限ループで udc4740Proc() を実行する。その延長で いろんなコマンドの処理を行う。コマンドの中には VR_PROGRAM_START1(未実装) と VR_PROGRAM_START2 がある。

      VR_PROGRAM_START2 は、渡ってきたコマンドパケットに含まれる アドレスを パラメータなしで call する。( アドレスは USB の wValue , wIndex を使っていて パラメータを入れる余裕はない )。

      もしリターンしてきたら、処理を続行する。Linux に処理を渡したとすれば、もちろんリターンせず Linux がスタートすることになる。

      で、Linux のドライバで (USB Device ドライバを 使うことなく) udc4740Proc() をポーリングしてやれば、Linux が動作しながらも USBBOOT のプロトコルを受けられることになる。

        Linux のカーネルは 仮想アドレス を使う。stage2 の アドレスが変わってしまうと 暴走する。.. のだがたぶん大丈夫だろう。(未確認)

        udc4740Proc() は、再帰的に call されることになる。再帰自体は問題ないが、一回リターンして 再度 call されるのと比べると いくつか実行されない処理が出る。

        • rx_size = 0 が実行されない。

        両方 2 度 同じ処理をしても問題なさそうなので、処理をする前に 実行しておいたほうが良いかもしれない。( 不要かも知れないのだが、面倒なので調べていない )

      さて、ポーリングするだけだと、メッセージをやりとりすることはできない。メッセージがどこに置いてあるか の情報を Linux が知る必要がある。それも登録しておけば ... Linux から メッセージの送受信のコードが書ける。

      ついでなので、パラメータとして渡すコマンドラインも 同じように登録しておいて あらかじめ送り込んでおき、a0,a1 に常に設定するようにしたら良いかも知れない。(ただし、登録エリアが少ないので、メッセージの置き場所を構造体にしておく)

    追記:を !


      Subject: [PATCH v2 00/26] Add support for the Ingenic JZ4740 System-on-a-Chip
      Date: Sat, 19 Jun 2010 07:08:05 +0200
       (中略)
      This patch series adds support for the Ingenic JZ4740 System-on-a-Chip.

      The JZ4740 has a mostly MIPS32 compatible core (no on cpu timers) and many on
      chip peripherals like RTC, NAND, MMC, OHCI, UDC, ADC, I2C, SPI, AC97, I2S, I2S
      Codec, UART and LCD controller.

      The JZ4740 is mostly used in eBooks, PMPs and hand-held consoles.
      This series contains patches for the Qi Ben NanoNote clamshell device as the
      inital supported device.
       (後略)

      こんなメールを見つけた。JZ4740 用のコードを メインストリームにマージしようとしているのか?
      Ben NanoNote とか の名前が出ているし ingenic 版から jz4750系とかをザックリ切り捨てた qi-hardware 版みたいだ。(dingoo-linux とも違う)

      まぁベースとして入ってくれると 差分が分かるから jz4740 は今のところ 関係なくても 嬉しいかも。


    MIPS のマシンについて

    ARMと比べて MIPS のマシンは種類が圧倒的に少ない。安価でLinux を動かすのに向いているものは、さらに少ない。

    Jz47xx の 中華PMP と比べてどうなのか..ちょっとチェックしてみた。

    • linkstation HD-HLANv2

      バッファローのNAS 。CPU IDT 79RC32H434-400BC (MIPS32 4Kcコア, 400MHz)、メモリ 64MB (DDR, 16bit)。

      玄箱でNetBSDを動かす Linkstation-mipsel に情報がある。ブートログをみると キャッシュは、8KB/8KB で小さい。


        total memory = 65536 KB
        avail memory = 60584 KB
        mainbus0 (root)
        cpu0 at mainbus0: 400.00MHz (hz cycles = 2000000, delay divisor = 200)
        cpu0: MIPS 4Kc (0x1800a) Rev. 10 with software emulated floating point
        cpu0: 8KB/16B 4-way set-associative L1 Instruction cache, 16 TLB entries
        cpu0: 8KB/16B 4-way set-associative write-back L1 Data cache


    • La Fonera

      La Fonera wiki に機種の情報がある。

      FON2100E/FON2200/FON2201
       Atheros AR2315 183 MHz , Memory 16MB (SDRAM 16bit)

      FON2202
       Atheros AR5315 183 MHz , Memory 32MB

      FON2305E/FON2405E(FONERA SIMPL) -- iphone のおまけ(非売品)
       RT3050(24KEcコア,320MHz), Memory 32MB(SDRAM 16bit), FLASH 2MB(SPI-FLASH mx25l1605d)

       -- Hot Tuna Labsでは、FON2405E を解析しているようだ。
       -- FON2405Eの中身

       シリアルが付いているのがいいな。FLASH は裏の 16pin っぽい。.. 見覚えがあるマーク -- シリアルFLASH じゃないか? 

       シリアルFLASH なら 8pin-DIP ソケット付けて差し替えなんてのが可能かも。
       FON2202 もシリアルFLASH だった。裏の 16pin の IC

       ETHERNET はあるけど ストレージ がないのは厳しいな。FON2305E だと USB のパターンがあるらしいけど。

        FON2305E の写真を見たら... USB 以外に NAND FLASH のパターンもある。載せ替えできる シリアル FLASH/NAND FLASH/SDRAM 全部持っている。これも楽しいかも。


       これで遊ぶなら SeevaPlug のほうがはるかに良さそう。


        U-Boot 1.1.3 (Jan 6 2010 - 07:10:30)
        Board: Fonera
        DRAM: 32 MB
        relocate_code Pointer at: 81fac000
        spi_wait_nsec: 3e
        spi deice id: c2 20 15 c2 20 (2015c220)
        find flash: mx25l1605d
        raspi_read: from:41030000 len:1000
        Using default environment
        ##### The CPU freq = 320 MHZ ####
        SDRAM bus set to 16 bit
        SDRAM size =32 Mbytes
        Please choose the operation:
        1: Boot system code via Flash (default).
        2: Load system code then write to Flash via TFTP.
        3: Entr boot command line interface.
        booting from flash
        ## Booting image at bf020000 ...
        :
        :
        mx25l3205d(c2 20160000) (4096 Kbytes)
        mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
        ramips_mtd: kernel size is 613787
        padded kernel is 00096000
        Creating 6 MTD partitions on "raspi":
        0x00000000-0x00010000 : "uboot"
        0x00010000-0x00020000 : "boardconfig"
        0x00020000-0x00200000 : "image"
        0x00020000-0x000b6000 : "linux"
        mtd: partition "linux" doesn't end on an erase block -- force read-only
        0x000b6000-0x001f0000 : "rootfs"
        mtd: partition "rootfs" doesn't start on an erase block boundary -- force read-only
        mtd: partition "rootfs" set to be root filesystem

      ... シリアルFLASH でも MTD 使っているのか。

    • OpenMicroServer

      49800円? (2006年 当時)

      CPU Alchemy Au1550 400MHz
      Memory 128MB(PC133 SDRAM), FLASH 16MB

    ... CPU 的には遜色ないようだ。(MIPS でも 高価なものだと GHz 以上の CPU とか SMP dual-core とかあるが、ここでは対象にしない。)

    Jz47xx の 中華PMP はネットワークがないのが弱みだけれども、FLASH が多いのは嬉しい特徴なのかも知れない。

      ホストがあれば、USB (Device) 経由でネットワークをホストにつなげられるのだが、スタンドアローンで動かすサーバ用途は厳しい。

    メモリはどれも少なく開発マシンとしては厳しい。意外にも Jz47xx の Netbook (128MB)がまともな方かも。

    -- 128M化改造は、意味がありそう。あきらめないでおこう。

      ARMなら SheevaPlug とか 玄柴(SATAつきSheevaPlug) が 512MB 積んでいるから開発もできるのだが ...SDRAM で 256MB とか 512MB はコスト的にとても厳しそうだ。

      一応 128MB + SWAP があれば、自力で (まともな)ディストリビューションをビルドできる。64MB だと無理かもしれない。

    いま現在 MIPS で高性能かつ安価なマシンとして、Jz47xx の中華PMP , Netbook は有力な存在のようだ。

    もうしばらくすれば、次世代の Jz476x とか Jz48xx とかが出てくる。(Linux に入っている)。Jz47xx は当面遊べそう。
    posted by すz at 23:02| Comment(0) | TrackBack(0) | Jz47xx

    電子ブックメモ

    dealextreame で 電子ブックも売り出した。型名は E003 メモリ 128MB/FLASH 2GB で、ともに 94.40 ドル。



    -- これは aliexpress で扱っている GR-B701 108.98 ドル と同じもののように見える。

    GR-B701 のスペックには CPU が書いてあって RK2729 (500MHz) だそうだ。メモリも GR-B701 は 256MB になっている。

    画面は どちらも 普通の TFT 。E-ink ではない。

    aliexpress を見ていると E-ink のパネル自体が高価らしく 製品は 200 ドル前後のものが多い。



    一番安そうなのが、HW-EB05i $79.38 + $39.26 = $118.64 。5 インチ E-ink で RK2706B,64MB 。



    気になるのは、やはり Jz47xx を使ったもので、GR-B605 185.61 ドル。Jz4740 64MB だそうだ。バッテリーは、交換できるらしく 1500mAh(NOKIA BP-4L) と書いてある。

    E-ink の場合 バッテリーの持ちについての表示は、8000 screen refresh みたいに書くようだ。

      どうも、screen refresh には(イメージの展開もあるし)電力が必要らしいのだが、それ以外の状態も(CPUとか)電力を使うものらしい。ある 電子ブックのスペックには 20mA とか書いてある。それなら 2000mAH でも 100 時間しか持たない。携帯の待ち受けみたいなものか。
      省電力を完璧にすれば、その何倍、何十倍も持つのだろうけど。

    なんか良さそうではあるのだが、Jz47xx が気になるのはいじるのが前提。そうなると Openinkpot でサポートしている Hanvon WISEreader N516-W のほうが良いのではないかとも思える。ただし、値段は $242.11 + $24.88 = $266.99 と結構する。



    CPU は Jz4740 だしメモリも 64MB 。FLASH は 少なく 512MB 。同じようなものだが、8-level gray scale(N516)/ 16-level gray scale(GR-B605) の違いがあるし 移植しないと GR-B605 は動かなそうなのが惜しい。

    まぁこんなふうに気になってはいるのだが、当面買うつもりはない。Neo Slim 3000 (or A41) を自由に扱えるようにするのが先。


      追記:最新の Ingenic のカーネルソース Tree を見ていたら E-Book サポートが入っていた。E-Ink コントローラ として、Epson S1D13521 と Metronome/8track というものをサポートしている。このあたりのコントローラを使っているものならなんとかなるかも知れない。


    追記:EB70



      唯一 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 までダウングレードした感じだ。でも欲しかったりする。(でも、今まで余計なものを買いすぎた。自粛しよう)


    ちなみに、Linux が動きカーネルをいじれそうなのは、Jz47xx 以外だと ARM になる。RK2806 とか S3C6410(SmartQ 5) とかならなんとかなるかも。




    そういえば、S3C6410 を採用した android 端末もある。7” Touch Screen TFT LCD Google Android 1.6 Tablet PC $142 だそうだ。メモリ 256MB と OTG/HOST 別々の USB に魅力を感じる。aliexpress の MID703 $137.89 と似ている。オプションの WCDMA Module 付きらしい HCY7003 が $189.47 。あと バッテリーは 7.4V 1800mAH , AC アダプタ 12V,1A らしい。(3000mAH ではないはず。)

    RK2806 ベースのほうが良いような気もするが、縦表示と動画のサポート状況が満足できる範囲なら買いか? -- といっても買わないつもりだが。

    色々みていくと Marvell の CPU を採用した android タブレットも出ているようだ。"Marvell 166 800MHz" なんて書いてあったりするが どうも PXA166 のようだ。ややこしいが ARMADA 100 シリーズで cpu core は Sheeva (SheevaPlug/豆Sheeva とか LinkStation などで採用している。)。ちなみに 前身の Feroceon core は スーパースカラで Sheeva もスーパースカラ。

    L2 キャッシュも載っているし、普通の ARM 800MHz よりはかなり高速だろう。(L2 付き Cortex-A8 なら負けそうだが)。 Marvell だから ソースコードも公開されているはずだし。周辺装置も WMMX2 コプロセッサ / Ethernet MAC / PCIe / Qdeo ICR? などなにやら盛りだくさん。こっちのほうが面白そう。

      ただ、FLASH を壊してしまうと JTAG でないと復旧できない。
      jz47xx は USBブートが可能だし、S3C6410 は SDカードからのブートが可能。こういうのと比べるといじるときのリスクが大きい。
      RK2808 は、8KB の ブートROM を積んでいるのだが、詳細は知らない。

        aPad を初期化してみる (1) (2) を見るとUSBブート出来るような気がするが、ブートローダでやっているかも知れないし 完全ではないかもしれない。まぁ RKAndroidTool.exe さえ起動すれば、FLASH を書き換えられるから、リカバリできるようだ。

      Telechip tcc8902 は、USBブートが可能。

    SUNLIKE MID-704 $144.33 + $39.26 = $183.59 ってまだちょっと高いか。

    いずれ 2.1 or 2.2 対応してくるだろうからそれからでも検討しよう。

      普通に使うなら、tcc8902 , android 2.1 の E7002 (green-tool で 17250円) か。海外なら リスクがあるものの 2 割ほど安い 159.99 ドルがあるが ...

      拾った tcc8900 のデータシートをみると H.264 のハードウェアコーデックがある。あとグラフィックエンジンに 90°単位の回転の機能がある。動画も強いし、 画面の回転も楽勝っぽい。キャッシュは L2 なしで L1 16KB+16KB 。CPU は ARM11 (ARM1176JZ)。
      動画は、1080p がいけるようだし、将来的にも十分なような気もする。贅沢を言わなければ末永く使えそう。
    posted by すz at 20:19| Comment(0) | TrackBack(0) | 日記