#floatcontents
 * SheevaPlugで遊ぼう [#cacbc772]
 #anno1(2009-12-15 : この記事はMarvel社のSheevaPlug Development Kitについて書かれています)
 
 - &color(red){''作成中'' -- もうちょっとまとまったら徐々に再構成します};
 
 最近話題のMarvell社のSheevaPlug Development Kitを購入したので設定などのメモ。~
 SheevaPlugに関しては情報がネットにあふれていますのでその辺りを参照していただくとして、このページでは実際のアップデート手順などをメモしておこうと思います。Linux PCを使ってしまうと簡単なのですが、私の自宅にはありません(組み込みボードのALIXはありますが)ので、VirtualBox上のLinux環境で作業を行う方法をメインにしたいと思います。でも、Windowsだけでもできそうな感じ・・・~
 SheevaPlugの設定メモはネット上にいくらでも存在するので私の作業メモみたいな感じですが・・・
 
 #ls2_1(どぶお/SheevaPlugで遊ぼう!/,new,display=hierarchy,relative=true,date)
 
 ** 構成 [#h6a8e50f]
 この記事で想定している構成は以下のものです。
 - 対象とする読者
 -- 最低限のLinuxの知識がある遊び人
 - 必要なハードウェア
 -- それなりのWindows PC (私の場合はPentium4 3.2GHz / 1GB / WinXP)
 -- Linuxがある方が何かと便利ですが
 
 ** 内容 [#a1423dc3]
 私も入手して日が浅いので最低限以下のことを取り上げてみます。
 - シリアルコンソールでのログイン -- TeraTermを使います
 - U-Bootのアップデート -- LinuxからOpenOCDにより更新します
 - カーネルのアップデート -- ネットワーク経由で更新します
 
 ** シリアルコンソールでのログイン [#n7971ed0]
 シリアルコンソールでのログインはWindows PCからでも行えます。
 
 *** デバイスドライバの展開 [#pdf78bd4]
 まずはデバイスドライバを用意しておきます。付属のCDまたはplugcomputer.orgからSheevaPlug_Host_SWsupportPackageWindowsHost1.2.zipをコピーして適当なディレクトリに展開します。展開するとWindowsHost/WindowsTeraTermUSBDriver.zipができるのでさらに展開します。これで作成される''CDM 2.04.16_SHEEVA''ディレクトリがデバイスドライバのディレクトリになります。
 
 *** Windowsからの認識 [#hbdf90e1]
 SheevaPlugをコンセントにさし、デバッグ用ポートにUSBケーブルをつなぐとWindowsで認識されます。認識されるとデバイスドライバの場所を聞いてきますので先ほどの''CDM 2.04.16_SHEEVA''ディレクトリを選択します。
 
 *** TeraTermで接続 [#lb04d8de]
 うまく認識できたらTeraTermのシリアルポートで接続します。
 
 * メモ途中 [#jce00b4d]
 ** jffs2イメージをループバックでマウントする [#ba0829f6]
 SheevaPlugのルートファイルシステムはjffs2イメージで提供されていますが、SDカードにコピーしたかったのでループバックにマウントして展開しました。
 
 *** マウント [#n2a2b1ab]
 ubuntu-9.0.5.Release.jffs2のerasesizeは0x20000(131072)Bytesなのでマウントするときにその値を使います。よく知らなかったのですがerasesizeを適切な値にしないとファイルをまともに扱えないので注意!(jffs2を使う人には常識?)
  # modprobe jffs2 <-- 環境によっては必要かも(私のVine 4.2/5.0では不要でした)
  # modprobe mtdblock
  # losetup /dev/loop0 ubuntu-9.0.5.Release.jffs2
  # modprobe block2mtd block2mtd=/dev/loop0,131072
  # mount -t jffs2 -o ro /dev/mtdblock0 /mnt/disk
 
 *** アンマウント [#xb3bda35]
  # umount /mnt
  # rmmod block2mtd
  # losetup -d /dev/loop0
 
 ** SDカード上のuImageでブート [#h967960e]
 SDカード上のuImageを読み込むにはパッチを当ててビルドされたU-Bootまたは3.4.23あたりが必要です。私は3.4.23をビルドして使いました。~
 &color(red){[[plugcomputer.orgのフォーラム>http://plugcomputer.org/plugforum/index.php?topic=1134.0]]によると3.4.27ではSDカードからのブートではBad Data CRCエラーが出ると報告されています(私も同じ現象でした)。従って3.4.23を使う方が無難なようです。};
  Mervell>> setenv bootargs console=ttyS0,115200 rw root=/dev/mmcblk0p3 panic=10
  Mervell>> mmcinit
  Mervell>> ext2load mmc 0:1 0x0800000 /sheeva-2.6.31.8-uImage
  Mervell>> bootm 0x0800000
 
 *** 解説 [#bde5653f]
 > ''mmcinit''
 <
 SDカードデバイスを初期化する
 
 > ''ext2load'' '''interface''' '''dev[:part]''' '''[addr]''' '''[filename]''' '''[bytes]'''
 <
  Mervell>> ext2load mmc 0:1 0x0800000 /sheeva-2.6.31.8-uImage
  2777768 bytes read
 SDカードデバイス0のパーティション1(先頭パーティション)からsheeva-2.6.31.8-uImageをアドレス0x0800000に読み込む
 
 > ''bootm'' '''[addr [arg ...]]'''
 <
  Mervell>> bootm 0x0800000
 アドレス0x0800000に格納されたアプリケーションイメージでブートする
 
 ** 変数 [#z92bf1d8]
 ブートパラメータなどのメモ
 |>|~NANDからLinuxを起動|
 |TOP:||c
 |bootargs|rootfstype=jffs2 console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 panic=10|
 |bootcmd |nand read.e 0x800000 0x100000 0x400000; bootm 0x800000|
 |>|~SDカードからLinuxを起動|
 |bootargs|console=ttyS0,115200 rw root=/dev/mmcblk0p3 panic=10|
 |bootcmd |mmcinit; ext2load mmc 0:1 0x800000 /sheeva-2.6.31.8-uImage; bootm 0x800000|
 
 ** カーネルモジュールの追加ビルド [#b927eccf]
 #anno2(2009-12-26)
 SheevaPlugのuImageはhttp://sheeva.with-linux.com/sheeva/から取得可能で、DevKitに標準でついてくるuImageよりもたくさんの機能やモジュールがありますが、それでもやはり不足している場合があります。そんな場合のカーネルモジュールの追加ビルド方法をメモしておきます。
 
 *** 目的 [#n6d36ba3]
 Windowsで使用するハードディスクなどをマウントしようとすると、そのままではコードページの関係で日本語が文字化けします。そのためにはcp932に対応している必要があるのですが、上記のサイトのuImageやモジュールでは残念ながら無効にされています。ファイルシステムでcp932を使うために必要なモジュールnls_cp932.koを追加ビルドしてみます。~
 ストレートな方法ではカーネルの再構築を行えばいいのですが、非力なSheevaPlugでビルドするので必要なモジュールのみビルドします。ちょっとしたモジュールの追加ならSheevaPlugでも現実的です。もちろん高速なクロスコンパイル環境があるなら再構築でいいと思いますが&worried;
 
 *** ソースの取得 [#od48b174]
 + [[kernel.org>http://kernel.org/]]より必要なバージョンのカーネルソースを取得します。今回は2.6.31.8を使用しました。
 + http://sheeva.with-linux.com/sheeva/より同じバージョンのコンフィグファイルを取得します。ここでは''2.6.31.8/sheeva-2.6.31.8.config''です。
 + 必要ならpatchesディレクトリよりパッチを取得します。今回は無関係そうだったので無視しました(いいのかな?)
 
 以上で必要なファイルがそろいました。
 
 *** ビルドする [#r2fb4b4b]
 そんなわけでSheevaPlug上でビルドします。あらかじめbuild-essentialをインストールしておきましょう。
  % tar jxvf linux-2.6.31.8.tar.bz2
  % cd linux-2.6.31.8
  % cp sheeva-2.6.31.8.config .config  <-- 名前を変更
 コピーした''.config''ファイルのモジュール設定の部分を修正します。修正箇所は以下の通りです。
  2315: # CONFIG_NLS_CODEPAGE_932 is not set  (修正前)
 
  2315: CONFIG_NLS_CODEPAGE_932=m             (修正後)
 
 修正後、ビルドします。
  % make oldconfig
  % make fs/nls/nls_cp932.ko
 以上で目的のモジュール''nls_cp932.ko''が作成されます。なお、sheeva-2.6.31.8.configを使用しないとモジュールをロードしたときに''Invalid module format''と怒られてロードできないので注意してください。
 
 *** ロードする [#ye17649f]
 rootになってロードします。
  # /sbin/insmod nls_cp932.ko
 無事読み込めたらOK。
 
 *** インストール [#y19c013e]
 ちゃんとした手順があるのかもしれませんがとりあえず手動でビルドしたファイルをインストールしました。~
 modules.depにファイル名を追加しておくとmodprobeで読み込めるようになります。
  # mkdir /lib/modules/2.6.31.8/kernel/fs/nls
  # cp nls_cp932.ko /lib/modules/2.6.31.8/kernel/fs/nls/
  # vi /lib/modules/2.6.31.8/modules.dep  <-- modules.depを修正
 
  230 /lib/modules/2.6.31.8/kernel/fs/autofs/autofs.ko:
  231 /lib/modules/2.6.31.8/kernel/fs/nls/nls_cp932.ko:  <-- このあたりに追加
  232 /lib/modules/2.6.31.8/kernel/drivers/watchdog/softdog.ko:
 以上で(多分)インストールできました。
 
 *** おまけ:日本語ファイル名を含むFATのマウント [#g16602ac]
  # mount /dev/sda1 /mnt/disk -o codepage=932,iocharset=utf8
 modules.depの設定をしておくと、自動でnls_cp932を読み込んでくれるので、ShiftJISの日本語ファイル名も意識せずに使えます&smile;。
 
 ~
 以上の手順を応用すれば不足しているモジュールだけをビルドして追加することが可能になります。
 
 ** コメント [#h993b900]
 何かあればコメント下さい&smile;。
 - modules.depにモジュール名を追加するには # depmod -a でOKです。 --  &new{2010-02-21 (日) 21:06:33};
 -- ありがとうございます。何かコマンドがあるはずだと思ってましたが、助かりました(^^) -- どぶお &new{2010-02-22 (月) 13:45:14};
 
 #comment