2012年01月16日

Jz47xx アンドロイドカーネルソース

アンドロイド用のカーネルソースがついに手にはいった。

    http://bbs.imp3.net/thread-10520163-1-1.html 

    ものはここ。カーネルだけでなく Android のソース で 333MB 。教えてくれた fun さんに感謝。

    一見すると不完全なソースに見えるが、Ingenic は前から 標準カーネルに上書きするソースだけを提供している。これもまた、ベースとなる 2.6.32.9 に上書きすれば良いはず。

    さて、まず確認したいのは、defconfig がどうなっているか? ベースとなるものがないとビルドするのは大変なのだ。

    arch/mips/configs を見ると

    • pisces_defconfig
    • npm701_defconfig
    • npm701_ab_defconfig
    • maple_defconfig

    がある。pisces というのは、Ingenic が出している リファレンスのボード(だと思う)。npm701 は novo7 basic のこと。2 種類あるのは何だろう? maple は何?

    ともかく、basic 用はビルドできそうだ。ひとまず安心。paladin は分からないが、なんとかなりそうな気がする。(カーネルは共通という気もするが まったく未確認)

      npm701 : CONFIG_NPM701_V_1_0=y
      npm701_ab: CONFIG_NPM701_V_1_1=y

      npm701 用カーネルの ver 1.0 と ver 1.1 の違いということで、npm701_ab を使うのが正しそう。paladin で使えるものなのかどうかは、コード見ても分からないはず。bootimg の中のカーネルだけ basic 用を 入れて動けば 共通かどうかは確認できる。

      追記: V_1_0/V_1_1 の違いは、カーネルの違いではなく ボードの違いだった。V_1_0 はたぶん Basic のプロトタイプで GPIO の割り当てもだいぶ違うようだ。このノリだと GPIO の割り当てが変わってしまっていると思えるから、Paladin 用カーネルは 作るのが難しそう。

      この割当は、arch/mips/mach-jz4770/boards/npm701/npm701.h に定義されている。一例をあげると次のような割り当てがある。

        GPIO_SD2_VCC_EN_N
        GPIO_HA2605_INT
        GPIO_VOLUMEUP
        GPIO_OTG_ID_PIN
        GPIO_HDMI_INT_N

        GPIO_LCD_PWM
        GPIO_USB_DETE
        GPIO_CHARG_DETE
        GPIO_CHARG_SET
        GPIO_LCD_VCC_EN
        GPIO_TP_DRV_EN

      要するに内部デバイスの 状態とか 電源ON とか ボタンとか そういうものの GPIO 割り当て。V_1_0 と V_1_1 でも結構違うが、basic と paladin の基板はまったく違う。GPIO 割り当ても随分違うことを覚悟しないといけない。

      Linux が動いている実機があるわけで、このうちのいくつかは、割り当てを見つけ出せるだろう。最悪はそういう努力をして 見つけていけば良いのだが ... 新機種もあるし コードを貰えるように努力した方が実りが多そうだ。

      ちなみに見つけるには、いろいろヒントがある。出力ピンは 、GPIO が出力に設定されているはずだし、割り込みに使うピンは、そういう設定がされているはず。デバッグメッセージもヒントになるものがあるかも知れない。これらで条件を絞った上で、実際の動作での状態変化を見る。... といっても簡単な話ではないが。

    さて、次にチェックするのは、どんな機種用のコードがあるか?
    arch/mips/jz4770/boards には上記のものがあるが、jz4760 と jz4760b もある。

      jz4760 /jz4760b
    • z800
    • lynx
    • lepus
      (のほかにもいくつか)

    4760/4760b 共に同じ機種がある。lepus は Ingeic が出している リファレンスのボードだが、lynx (jz4760) は Ronzi A3 , lynx (jz4760b) は、ramos V65PRO のはず。

      CONFIG_JZ4760_RESET_HIBERNATE=y
      CONFIG_TOUCHSCREEN_JZ4760=y
      CONFIG_FB_JZ4760_ANDROID_IPU=y
      CONFIG_FB_JZ4760_ANDROID_LCD=y
      CONFIG_JZ4760_ANDROID_LCD_USE_2LAYER_FG=y
      CONFIG_FB_JZ4760_ANDROID_TFT=y
      CONFIG_JZ4760_HDMI_DISPLAY=y
      CONFIG_JZ4760B_AOSDC=y

      本題とはあまり関係ないのだが、JZ4760 と共通のものが結構ある。FB や IPU が同じなのは、ユーザランドも基本同じということで結構嬉しかったりする。

    本当にビルドできるのかどうか分からないものの Ronzi A3/V65PRO 用のコードがあるのはうれしい。IQQ M1 はないようで残念。

    なぜカーネルソースを待ち望んでいたか .. というと 改造したいからだ。改造したい内容は Android として使う以外の用途も想定している。

    とりあえずやってみたいこと。

    • USB gadget に ether を追加

      Linux マシンや Windows に USB でつなぐことが多いのだから、その間 Network も HOST からルーティングしたい。

      単独のデバイスだと SmartQ でやったことがあるが、Android として使うのなら、複合デバイスとして 作り直さないといけないかも知れない。設定レベルでできるものなら嬉しいが、まずはソースを見てみないと。

    • NFS や CIFS クライアント , NFS サーバ

      こういったものは、Linux マシンとして使うためには便利なのでビルドしたい。既存のカーネル用のモジュールとして作れるかどうかは、config 見てみないとはっきりしない。

    • binfmt_misc

      これあると開発には便利なはず。組み込んでおきたい。

    • USB ドライバ

      どれだけ標準に組み込まれているのか分かっていないが、足りないものはあるだろう。既存のカーネルは module にしていないように思えるが、これまた調べていない。

        defconfig を grep して整理してみると ...

          CONFIG_USB_HID=y

          CONFIG_USB_SERIAL=y
          CONFIG_USB_SERIAL_GENERIC=y
          CONFIG_USB_SERIAL_OPTION=y
          CONFIG_USB_SERIAL_VIA=y

          CONFIG_USB_NET_AX88772A=y
          CONFIG_USB_NET_CDCETHER=y
          CONFIG_USB_NET_DM9601=y
          CONFIG_USB_NET_QF9700=y
          CONFIG_USB_NET_NET1080=y
          # CONFIG_USB_ACM is not set
          # CONFIG_USB_SERIAL_PL2303 is not set
          # CONFIG_USB_SERIAL_FTDI_SIO is not set
          # CONFIG_USB_SERIAL_PL2303 is not set

          CONFIG_USB_STORAGE=y
          CONFIG_USB_STORAGE_DATAFAB=y
          CONFIG_USB_STORAGE_FREECOM=y
          CONFIG_USB_STORAGE_ISD200=y
          CONFIG_USB_STORAGE_USBAT=y
          CONFIG_USB_STORAGE_SDDR09=y
          CONFIG_USB_STORAGE_SDDR55=y
          CONFIG_USB_STORAGE_JUMPSHOT=y
          CONFIG_USB_STORAGE_ALAUDA=y
          CONFIG_USB_STORAGE_ONETOUCH=y
          CONFIG_USB_STORAGE_KARMA=y
          CONFIG_USB_STORAGE_CYPRESS_ATACB=y

          CONFIG_USB_BELKIN=y
          CONFIG_USB_ARMLINUX=y
          CONFIG_USB_NET_ZAURUS=y
          CONFIG_USB_VBUS_POWER_CALLBACKS=y

        HID は入っているし、USB メモリや 有線 Ethernet も 大丈夫そう。シリアルは貧弱で ACM すらない。かわりにどうでも良さそうなものが入っていたり。

        基本的に =m がほとんどない。そのため、デバイスを追加するのには module だけの addon ではなく、カーネルも置き換えが必要そう。

      とりあえずは、この程度。USB デバイスになる機能は、PC では使えないから 興味深い。

      そのほかだと何だろう?

    • 充電を 50% ぐらいで止める機能

      こういうのがあると良いような気がする。バッテリーを常に充電するのはどうかと思うので。
      開発用専用には バッテリーを外してしまっても良いかも知れないのだが ... Paladin などは、USB からの電力共有だけで動くのかどうか? Rozi A3 は問題ないのだが、殻割りしないといけないし、UPS としての機能が使えないというのも もったいない。

      ところで、なぜ充電中に 残量が分かるのだろう? ときどき充電を止めて測定している? ならば、話は簡単なのかも知れない。

    Wifi と USB

      Ronzi A3 の Wiki は、USB ドングルの中身のようなモジュールが メインボードにつけられている。これを外すことは簡単で Wifi が使えなくなる代わりに USB の HOST 専用 ポートを 1 つ確保できる。たぶん V65PRO も同じ。

      novo7 新機種の legend には、USB HOST の標準コネクタ(Type A メス)がついている。

      よく知らなかったのだが、内臓 Wifi は USB ではなさそう。SDIO ? ちなみに これのドライバは、ソースコードもなく module になっている。

        CONFIG_JZ4770_MSC0_BUS_4=y
        CONFIG_JZ4770_MSC1_BUS_4=y
        CONFIG_JZ4770_MSC2_BUS_4=y

        3 つの SD/MMC が Enable になっている。たぶんこれ。
        (fun さんのコメント 参照 MSC0 : internal Flash / MSC1 : Wifi / MSC2 : microSD )

      そうなると basic や paladin では USB HOST は空いていることになる。... あ、basic には 2 個目のカメラがあった。ちゃんと調べれば分かると思うが、解像度の高いほう (basic では back ) は Jz4770 直付けで 解像度の低いほう は USB だと思う。

      ちなみに、basic は、ここに殻割りを含めた詳細な記事があるのだが、基板の裏 (液晶と反対側)に シリアルらしき パッドがある。

      paladin はどうなのだろう? 探してみているのだが、分解写真を見つけられていない。まぁ、自分で殻割りしてみれば良いのだが、だれか分解するだろうと思って他力本願になっている。

      追記:fun さんに教えてもらった URL に paladin の分解写真がある。


      内部には、USB 引き出し用らしき 4pin コネクタのパターンがある。これは改造の楽しみがありそう。

        追記: 違うかも。抵抗膜式タッチパネルも 4pin で この位置ならそれもあり得る。その場合は、JZ4770 の専用端子に接続されていることになる。GPIO の機能もあれば 他の使い方もできそうだが、残念ながら アナログ専用。

        端子のピッチは、1.0mm (か ひょっとすると 0.8mm) 。適合するコネクタは、フラットケーブル用のような気がする。たとえば これとか。そうであれば、ますます タッチパネルのような気がしてくる。

        そうであっても、カーネルがイジれれば工夫次第でなにかに役に立つかも知れない。たとえば、8 個〜10個のボタン入力(同時押し可能)ぐらいには使えそう。



      こちらは全体。液晶のコネクタに互換性があるものが出れば、入れ替えることも可能かも知れない。ちなみに basic や aurora とは全然違う。(advanced II/elf とも違うのだろうか?) taobao では、結構リプレース(or 修理)用の液晶モジュールが出ているから、後に解像度などが違うものが手に入る可能性も皆無ではない。

      追記: paladin の裏側



      paladin を分解する人がボチボチ出て来ている

      この写真は、裏側をしっかり撮ってくれているのでありがたい。

      よく見れば UART2 TXD と UART2 RXD のシルクが見える。端子は、USB コネクタ近くの 3 つのランドらしい。

    カーネル開発のすすめ

      Jz47xx を使った basic / paladin は、カーネル開発に向いている。USBbootTool を使えば、いつでも元に戻せるから、たとえ動かないカーネルを作ってしまったとしても 文鎮になるリスクは少ない。( ただし、カーネルはなんでもできてしまうから、ハードウェアを壊してしまう可能性がないわけではない。そうなれば、元に戻せても意味はなくなる。)

      一般的に Android は ブートローダ と recovery.cpio.img さえ生きていれば、壊れたカーネルを書き込んでも 元に戻せはする。だが、署名つきの update.zip を作成しないと、作ったカーネルを試せないし 少々手間が増える。それも面倒だが、ブートローダ か recovery.cpio.img が壊れてしまえば、元に戻すのが とても困難になる。

        普通の SoC だと、JTAG という機能で ブートローダ を書きこんだり しなくてはいけないのだが、専用の装置と ツールが必要で 敷居が高い。

        Jz47xx のように 簡単に復旧できる ものは、少数派。

        novo8 の AMLogic AML8726-M は、SD card から 復旧できるようだが、カーネルソースが 入手できるものなのかどうか?

        TeleChips tcc8803/8902 は、USB からリカバリーできるし カーネルソースも入手可能だが、このチップを採用したタブレットは、今は あまり人気がない。

        ついでに書いておくと、Jz47xx を採用した機器は、ほぼ 特定のボタン+リセット で USBbootTool が使えるようになっている。 殻割りなど特殊なことをする必要もない。これは、SoC メーカの Ingenic が このツールを公開していて 十分認知されているのが理由として大きい。

      そして、jz47xx タブレットは、いまのところ NAND Flash を直接使うのではなく、SD カードの中のコントローラを通してアクセスしている。

      これも メリット。SD カードが中に入っているようなものなので、UBI とか yaffs2 とか 一般的ではないレイヤー を使わなくても済む。

        NAND Flash を直接扱うと、構成に関する情報の扱いが面倒なのだ。何回書き換えたかといった情報や代替ブロックの情報を壊さないようにしないと 。

      これらの特長があるので、basic / paladin は カーネルをいじるのに向いているのだ。

      Ronzi A3 や V65Pro もまた 向いてはいる。ただ、入手したカーネルソースでビルドできるかどうか分からない上に Android として動かすには ユーザランドとの互換性とかがあるので、敷居が高そう。Ronzi A3 / V65PRO はまだ入手できるのだが、ファームウェアがアップデートされない。いずれ入手できなくなることを考えると あまり労力をかけたくなくなる。

      追記:いくらかさわって分かってきたのだが、これは 基本 Android 2.2 用のカーネルなのだ。basic/paladin は これをベースに変更していって ICS に対応させたと言える。そうであれば、Ronzi A3/V65Pro 用カーネルはビルドできそうだ。そして flash/sdcard へのアクセスが遅い問題が解決されているかも知れない。インターフェイスの変更にしても、Ronzi A3/V65Pro は、カメラはもとより 3G-sensor すら持っていない。変更があったとしても関係ないだろう。... となると これらも試してみたくなる。

    カーネルビルドを試す(1)

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

      これを linux-2.6.32.9 に適用した上で android2.2-npm701-r9738/kernel のファイルを上書き。

      次にクロスコンパイル環境だが、android-ndk-r6m-linux を使うことにしよう。

        設定するのも面倒なので、toolchains/mips-linux-android-4.4.3/* を /usr に コピー。

        方法は、tar で一旦固めて展開した。
        例:

        tar -C /opt/android-ndk-r6m-linux/toolchains/mips-linux-android-4.4.3 -cvf XXX .
        tar -C /usr -xvf XXX

      で、最初のトライ

      # export CROSS_COMPILE=mips-linux-android-
      # arch/mips/configs/npm701_ab_defconfig .config
      # make oldconfig
      (プロンプトが出るが、とりあえず全部 デフォルト)
      # make

      結構進むのだが、arch/mips/kernel/process.o で

      121: Error: unrecognized opcode `s32i2m xr16,$2'

      でエラー。これは MXU 命令だ。(以前書いた記事

      arch/mips/include/asm/mxu.h で使っている。

      ... 昔のカーネルにはなかった MXUレジスタ (16 個) のセーブリストアが入っている。
      それはともかく mxu_as を as の前にフィルタとして実行すれば良いのだが、さて。

      最初は、ビルドできるかどうかの確認を優先して、arch/mips/include/asm/cpu-features.h の cpu_has_mxu を 0 に固定することにした。

      これでともかくも ビルドは通る。make zImage も OK 。

      ところで、make clean/make distclean はエラーになる。これは、arch/mips/mach-jz4770/boards/Makefile に 存在しない board が含まれているためで、編集すれば OK。

    ファイルを整理

    カーネルビルドを試す(2)

      さて、mxu はどうしよう。

      as をいじくるよりも cc1 の方が楽だと気がついた。cc1 は必ず 標準出力に 出力するから。

      /usr/libexec/gcc/mips-linux-android/4.4.3/

      ここに cc1 があるとする。cc1 を cc1.org に rename して、同じディレクトリに mxu_as を置く。

      そして

        #!/bin/sh

        DIR=`dirname &0`

        $DIR/cc1.org $* > /tmp/$$-xxx
        egrep -i '(S32I2M|S32M2I)' /tmp/$$-xxx > /dev/null
        if [ $? == 0 ]; then
        $DIR/mxu_as < /tmp/$$-xxx
        else
        cat /tmp/$$-xxx
        fi
        rm -f /tmp/$$-xxx

      こんなスクリプトで cc1 を置き換える。わざわざ XMU 命令があったときのみ mxu_as を使うようにしている。よくわからないのだが、こうしないと エラーが出るものがあるのだ。

      このやり方は 適当だから カーネル専用。あまり良い方法でもないが、兎にも角にも MXU 対応カーネルはビルドできるようになった。

      結局編集しないといけないのは、arch/mips/mach-jz4770/boards/Makefile のみになった。

      追記:簡単に分かるとこだけ。
      drivers/usb/gadget/f_mass_storage.c:
       NPM701_V_1_1 だと npm701 にならない。
      arch/mips/mach-jz4770/boards/npm701/npm701-misc.c
       get_board_type() で npm701 という文字列をリターンしている。
       (Paladin のとき修正忘れに注意)

    シュリンク版カーネルソースリスト

      FILES-SHRINKED-BASE-ingenic-2.6.32.9.txt
      というのを作ってみた。

      npm701_ab_defconfig でビルドする際に使用するファイルのリストで、このファイルだけを tarball にすると 10MB ほど になる。

      もっとも config を変更すれば、必要なファイルが増えるので、これを完全に信用するのではなく、ベースとして使う。

      ビルドすると 依存関係のファイルが .xxx.cmd という名前 (xxx はファイル名) で作成されているので、ここから スクリプトで抽出した 使用ファイルと ベースをマージすれば、かなり 信用できる リストになる。

      作ったリストを元に一旦 tarball を作り、ビルドと distclean ができるか確認するようにすれば、完全なものになる。足りないファイルが出るかも知れないが、手動で対応できる数になるはず。

      何故こんなものを作るかというと、改造したものの tarball を小さくしたいため。あと grep して検索するときに、関係ないファイルが出るのを防ぐ目的もある。tarball を作らなくとも リストだけ作っておくのも 有用だ。

    カーネルソースコードを見てみる(1)

      バッテリーをたとえば 50% までで止める ... なんてことはできるのだろうか?

      drivers/power/jz47xx_battery.c
      arch/mips/mach-jz4770/boards/npm701/npm701-misc.c

      このあたりが実際のコードらしいのだが ... 充電を止める機能は実装されていないようだ。
      どうも 充電中と放電中で、% を求めるパラメータが違うだけらしい。

      さらに、CHARG_DETE , CHARG_SET 共に使っていない。USB か DC から電源供給されれば、即充電中 ということになるようだ。

      したがって、今のコードは 充電を止めることはできない。では CHARG_SET をなんとかすれば、止められるのだろうか? これをやってみるためには、充電 IC を確認して そもそも止めるために なにをするのか調べないと。

      あと、スリープしたときには、INPUT_PULL 状態になる。PULLUP か PULLDOWN かは ピンによって決まっている。(npm701v11-pm.c より) 充電を止めるなら、この状態設定も対応しないといけない。

      結論としては、CHARG_SET が機能すれば、コードを書いて対応させることで そういう機能を作れるかも知れない。... といったところ。

    paladin GPIO 調査(1)

      徒労に終わるような気がするが、簡単に調べられるものは調べてみよう。

      まず、実機の /proc/interrupts を cat してみる。... と GPIO に割り当てられたものがすぐ分かる。これでただちに 10 個。

        73: 48262 GPIO mma8452
        94: 2 GPIO end call key
        120: 0 GPIO jz-msc (gpio)
        123: 5348 GPIO ldwzic_ts
        178: 1 GPIO volum down key
        206: 0 GPIO otg-id-irq
        211: 0 GPIO jz47xx_battery_act8600
        221: 0 GPIO volum up key
        230: 1 GPIO menu key
        233: 0 GPIO back key


        npm701 は、GPIO_OTG_ID_PIN GPE14 となっているのだが、paladin は、206 = (6 * 32) + 14 。GPIO が 64 オフセットされていると仮定すると 同じ GPE14 。

        MSC2_HOTPLUG_PIN=GPIO_SD2_CD_N=GPB24 だが、jz-msc も GPB24 。

        GPIO_MMA8452_INT1 は GPA9 だが、mma8452 も GPA9 。ただし、INT2 の方はない。
        GPIO_GT801_INT は、GPB27 だが、ldwzic_ts も GPB27 。

        けっこう互換性があるのかも ... ただ、まだまだある。

      あと、/proc/jz47xx_battery/info
                                        
        capacity: 100
        max_vol : 4050000
        min_vol : 3600000
        dc_chg_max_vol : 4150000
        dc_chg_min_vol : 3740000
        usb_chg_max_vol : 4050000
        usb_chg_min_vol : 3675000
        battery_mah: 4000
        dc_charg_ma: 750
        usb_charg_ma: 400
        update_time: 1326873997
        curve:
        -- NULL --

      これで、npm701-misc.c の jz47xx_battery_info の値が分かった。ただ、npm701-misc.c の値とはちょっと違う。
      basic 実機の jz47xx_battery_info も違った。

        capacity: 99
        max_vol : 4080000
        min_vol : 3600000
        dc_chg_max_vol : 4120000
        dc_chg_min_vol : 3720000
        usb_chg_max_vol : 4120000
        usb_chg_min_vol : 3675000
        battery_mah: 4000
        dc_charg_ma: 750
        usb_charg_ma: 400
        update_time: 1326894417
        curve:
        -- NULL --

      次に実機どうしの dmsg の違いから

        basic:
        jz_i2c0 jz_i2c0.0: JZ4770 i2c bus driver.
        jz_i2c1 jz_i2c1.1: JZ4770 i2c bus driver.
        jz_i2c2 jz_i2c2.2: JZ4770 i2c bus driver.
        i2c-gpio i2c-gpio.3: using pins 153 (SDA) and 156 (SCL)
        i2c-gpio i2c-gpio.4: using pins 6 (SDA) and 3 (SCL)
        i2c-gpio i2c-gpio.5: using pins 103 (SDA) and 102 (SCL)
        Device 0x5a with i2c speed:100K
        act8600_power:
        1 26 1
        4 87 1
        5 49 1
        6 57 0
        7 57 0
        8 36 0
        --
        input: jz-gpio-key as /devices/platform/jz-gpio-key/input/input0
        input: jz-remote as /devices/platform/jz-remote.2/input/input1
        Device 0x62 with i2c speed:100K
        input: ha2605_key as /devices/virtual/input/input2
        input: touchscreen as /devices/virtual/input/input3
        --
        jz_lcd_panel: AT070TN93_panel_probe(): board_pin: LCD_POWERON=0, LCD_RESET_PI
        N=139.
        panel AT070TN93 selected
        --
        mmcblk0: mmc0:0002 CHYUA 3.69 GiB
        mmcblk0: p1 p2 p3 p4
        --
        HDMI-GPIO_I2C: SCL(32*3 + 6), SDA(32*3+7)
        HDMI reset pin :(32 * 0 + 0)
        HDMI hotplug pin :(32 * 3 + 4)
        HDMI hotplug Level: 1 ,connect_active(0)
        HDMI driver in HDMI_HOTPLUG mode !
        HDMI ite6610_drv_probe done!
        HDMI ite6610 driver register done!
        --
        sensor_name:gt2005 id:0 facing:0
        ===gc0308_power_down==
        sensor_name:gc0308 id:1 facing:1
        default is gc0308
        CIM--- get new page!
        CIM--- get_max_mem_size
        CIM--- preview size = 1800KB
        CIM--- capture size = 3750KB
        CIM--- mem_size=12750K
        CIM--- order=12
        Virtual Driver of JZ CIM registered
        android init
        android_probe pdata: 804c11c4
        --
        Gt801 touch screen init!
        Device 0x55 with i2c speed:100K
        input: gt801_ts as /devices/virtual/input/input6
        gt801_ts 2-0055: Start gt801_ts in Interrupt mode
        gt801 ts probe suscess!

        paladin:
        jz_i2c0 jz_i2c0.0: JZ4770 i2c bus driver.
        jz_i2c1 jz_i2c1.1: JZ4770 i2c bus driver.
        jz_i2c2 jz_i2c2.2: JZ4770 i2c bus driver.
        i2c-gpio i2c-gpio.3: using pins 153 (SDA) and 156 (SCL)
        Device 0x5a with i2c speed:100K
        act8600_power:
        4 87 1
        5 49 1
        6 57 0
        7 57 0
        8 36 0
        --
        input: jz-gpio-key as /devices/platform/jz-gpio-key/input/input0
        Device 0x 1 with i2c speed:200K
        input: ldwzic_ts as /devices/virtual/input/input1
        input: jz_touchscreen as /devices/virtual/input/input2
        --
        jz_lcd_panel: AT070TN93_panel_probe(): board_pin: LCD_POWERON=0, LCD_RESET_PI
        N=139.
        panel AT070TN93 selected
        --
        mmcblk0: mmc0:0002 CHYUA 7.40 GiB
        p1
        mmcblk0: p1 p2 p3 p4
        --
        android init
        android_probe pdata: 804b0564

      とりあえず気になったとこを抜き出してみた。

      act8600_power が違うのが気になったが、HDMI I/O 用だったかも。
      タッチスクリーン関係がだいぶちがう。あと i2c-gpio の数。

      android_probe pdata は何の値? 後で調べないと。

      GPIO の割り当ては極力同じになるようにしている印象がある。デバイス関係の違いの方が不安になってきた。

      /sys/platform/devices の違い

        i2c-gpio.4
        i2c-gpio.5
        ite6610-drv.0
        jz-remote.2
        jz_cim.0

        power
        uevent

      ITE6610 は、HDMI 関係。jz-remote は、リモコン。

      cmdline の比較

      basic : mem=224M@0x0 mem=128M@0x30000000 console=ttyS2,57600n8 ip=off
      root=/dev/ram0 rw rdinit=/init memcfg=512M
      rd_start=0x80A00000 rd_size=0x000F1C13 cpu_version=4770v1
      paladin : mem=224M@0x0 mem=128M@0x30000000 console=ttyS2,57600n8 ip=off
      root=/dev/ram0 rw rdinit=/init memcfg=512M
      rd_start=0x80A00000 rd_size=0x000F1CA8 cpu_version=4770v1

      rd_size が違う。これはどこに書きこまれているのだろう? mbr-xboot.bin だとすると paladin の 1.2 GHz 化は、ちょっとまずい。

        これは、mbr-xboot.bin で実際のサイズを元に計算しているから大丈夫だった。


      あと、4770v1 って何? ひょっとして 40nm 版は v2 なのか?

    作ったカーネルを試す (basic)

      USBbootTool:n7b_burn_tool.zip も使える。
       - 右のチェックボックスのチェックを外すと、指定したものだけを書き込む。
       - mbr-xboot.bin , boot.img のみの書き換えも OK

      mkcfw-v65-2.1.zip の src にあるツールで zImage を入れ替えた boot.img を作り 試してみたところ ...

      不完全なドロイド君が表示されたあと 画面が黒(バックライトは付いている)に。

      元の boot.img にしたら、普通に立ち上がった。(元に戻せることの確認)

      そもそも ツールがダメかも知れないので、動くboot.img を バラす → boot.img の再作成で確認しないと。

      厳密にはちょっと違うが、再構築しただけの boot.img は立ち上がった。

        元のやつは、0x240 からの SHA_DIGEST の後ろ 0x260 から 8 バイトの データが入っている。これだけが不一致。

      そうなると、カーネルが全然ダメということに。シリアルとかつなぐの面倒だしどうやって進めよう?。

      FB 変になっているし、まずは、mem の指定が対応しているか見てみよう。

    4.0.3 のファームウェアのカーネル

      Paladin でのサスペンドが調子悪いので、4.0.3 のファームウェア(2 回目のリリースのやつ)からカーネルだけを取ってきて boot.img を作りなおしたものを試してみることにした。

      なんとなく動いているので、adb で dmesg を見たら ...

        Linux version 3.0.8-svn649 (yliu@android10) (gcc version 4.3.2 (Sourcery G++ Lite 4.3-51) ) #3 PREEMPT Fri Jan 13 17:59:41 CST 2012
        bootconsole [early0] enabled
        CPU revision is: 2ed1024f (Ingenic Xburst)
        FPU revision is: 00330000
        CPU clock: 1200MHz
        PCLK: 200MHz
        Memory clock: 200MHz
        H1CLK: 400MHz
        H2CLK: 200MHz
        AUX clock: 400MHz
        REG_CPM_PSWC1ST = 0x00000017
        REG_CPM_PSWC2ST = 0x0000000b
        REG_CPM_PSWC0ST = 0x00000000
        REG_CPM_PSWC3ST = 0x00000000
        JZ4770 NP_M702 board setup
        Power Management for JZ

      カーネルが fake じゃない 3.0.8 になっていた。

      wifi の モジュールはそのままなので

        Version magic maybe different, please check!!!
        dhd: Unknown symbol dma_map_single (err 0)
        dhd: Unknown symbol dma_alloc_coherent (err 0)
        dhd: Unknown symbol dma_free_coherent (err 0)
        dhd: Unknown symbol alloc_etherdev_mq (err 0)
        dhd: Unknown symbol dma_unmap_single (err 0)

      なんてエラーが。折角カーネルソースを手に入れたのに、動かす前に時代遅れとは ...

      まぁ今まで 3.0.8 に見せかけて動かしてきたのだろうから、インターフェイスは同じかも知れないし、Ronzi A3/V65Pro は 3.0.8 では逆に困ったりするかも知れないし。

      3.0.8 のソースが手に入るまで、もう少し調べていこうかと思う。

      ところで、この カーネル 3 つのドライブが見えるようになった。増えたのは CDドライブ。

      あと、ちょっと試してみたが、動画は具合が悪い。scanning が出たまま動画が再生され終了できなくなった。非互換なところもあるみたいなので、4.0.3 のユーザランドで古いカーネルというのは無理がありそうだ。

    Ronzi A3 用 (JZ4760-lynx) がビルドできないか試す。

      Ronzi A3 は、defconfig がない。あればビルドできるのか? という気もするのだが、ちょっとやってみた。

    • config-n7b-tst1.txt (ベースにした basic 用 / ビルドはできたが動かない)
    • config-a3-tst1.txt 作ってみたもの。

      ただ、 arch/mips/mach-jz4760/boards/lynx/lynx-misc.c で、コンパイルエラーが出る。

      __wifi_power_on()/__wifi_power_off() のところ だが、とりあえず これをコメント化してみると ...

      なにやら ビルドできたのだった。だが、ベースとした basic 用すら動かないわけで、動くことはまず期待できない。それでも ビルド出来たというのは進歩なのだから、ここに記録しておく。

      さて、どうやってデバッグしていこう。まぁ、basic 用を動かすのは、第一歩だから それをやるとして ...

        とりあえずは、adb だけ動かす ramdisk イメージを作って 状態を見れものなのかどうか 調べる。これがクリアできれば、なにが問題なのか分かるかも知れない。

        だめなら、デバイスをどんどん減らしていく。adb だけ動かせるようにして、後はモジュールとか。usb device と adb のドライバは、普通は確実に動きそうなものだが .. これでもダメなら、他の手を考えよう。

        うまくいくようなら、A3 も同じやり方で試す。

      こんなところか。ちなみに、Ronzi A3 をばらしてみると ... 4 つのパターンが並んでいるところがある。たぶんシリアル。最悪はここにシリアルつなぐとなんとかなるかも知れない。

      あとは、LCD に なんとか表示することができるかも知れない。panic した後も表示をしつづけるような仕組みを入れないといけなさそうだが ...

      昔にトライしていた libusb 版 usbboot を使ってカーネルのロード / メッセージの表示ができるようにするとか ... ただ、これはうまくいかなくて途中で放置しているし、JZ4770 用をマージしないといけないので 敷居が高い。
posted by すz at 22:07| Comment(5) | TrackBack(0) | Jz47xx(Linux)
この記事へのコメント
mmc0がemmcでmmc1がwlanでmmc2が外のmicroSDカードだったと思います。cameraはどこだったかな...今手元にないのですが、dmesgみればわかると思います

個人的には、最近のCPUはNAND/USB/SDCARDからbootできる機能があるのは多いのではという印象です(有効になってるかどうかは別として)

ソースの残りの(元の)部分は、貰った人に聞いたら、聞かれないから出してないけどべつに秘密じゃないよって事なんで、素の2.6.32.9と違うようならアップロードします。git clone中...
(ソースあっても忙しくて何もしてないです^^;)
Posted by fun at 2012年01月17日 08:42
https://android.googlesource.com/kernel/common.git
には2.6.39と3.0しかないですね...
Posted by fun at 2012年01月17日 08:45
あ、paladinの分解記事はここにあります
http://bbs.imp3.net/thread-10540339-1-1.html
「素のandroid-2.6.32」探し中...
Posted by fun at 2012年01月17日 08:57
一応は、ビルドまで出来るようになりましたが、足りないソースに他の機種用のファイルがあります。arch/mips/configs や boards に追加があったら是非。

Posted by すz at 2012年01月17日 23:08
MIPS/kernel-commonのandroid-2.6.32と手元のソースを比較しましたが、完全に同じものでした。
ついでにlinaroにもAOSPのandroid-2.6.32のミラーっぽいのがあったので比較してみましたが、これまた同じでした。
NOVO7Bの2.2のソース(のkernel部分)は、AOSPのandroid-2.6.32にかぶせて使うもの、という事ですね。

kernel以外のandroidの部分のソースもありますが、こっちはたぶんMIPS Android 2.2と同じなんだと思います。
Posted by fun at 2012年01月17日 23:44
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/53119949
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック