2013年01月25日

i.MX53 Quick Start BoardでLinuxを動かす (2)

前記事に続いて、i.MX53 Quick Start BoardでFreescale配布するLinux BSPを動かした際の記録(備忘録)を書いていく。

今回の作業で参照したドキュメントは以下のとおり。

 ltib_build_host_setup.pdf : LTIB Build Host Setup
 i.MX53_START_Linux_BSP_UserGuide.pdf : i.MX53 START Linux User's Guild
 i.MX53_START_Linux_BSP_Release_Note.pdf : i.MX53 START 11.09.01 Linux Release Notes


●LinuxのブートSDを作成する

前記事までで、LTIBを使って、Linux BSPから以下の3つが作成できた。

 U-Boot(ブートローダー)イメージ
 カーネルイメージ
 rootファイルシステム(rootのユーザーランド・ファイル群)

すべてLTIBディレクトリ直下のrootfsというディレクトリの中に作成される。これらをmicroSDメディアへ書き込んで、IMX53QSBでブート可能な形式のSDを作成すれば、今回の作業の最終目的はほぼ達成できたことになる。上のBSP User's Guideドキュメントの「7. Using a Linux Host to Set Up an SD/MMC Card」という節にその手順が記載されている。

まずは、4GBのmicroSDとUSBカードーリーダを用意した。そして、U-BootイメージをSDへ書き込むために、下のコマンドを実行した。
 $ cd <LTIB directory>
$ cd rootfs
$ sudo dd if=u-boot.bin of=/dev/sdb bs=512
$ sync

ddコマンドを使っているということは、上のコマンドはSDのブートセクタにu-boot.binを書き込んでいるんだな。ちなみに、すでにu-boot.binを書き込み済みのSDに再度同じファイルを書き込む場合は、次のコマンドを使わないとならないようだ(上のコマンドだと、既存のパーティションテーブルが消えてしまうのだろう)。
 $ sudo dd if=u-boot.bin of=/dev/sdb bs=512 seek=2
$ sync

続いて、カーネルイメージをSDへ書き込むために、下のコマンドを実行した。
 $ sudo dd if=uImage of=/dev/sdb bs=512 seek=2048
$ sync

最後に、rootファイルシステム(rootfs)をこのSDへ書き込むが、その前にパーティションを作成する必要がある。次のコマンドでfdiskを起動して、
 $ sudo fdisk /dev/sdb

下のように、開始セクタ=8192〜終了セクタ=最終セクタの領域を持つパーティションを作成した。
 Command (m for help): p

Disk /dev/sdb: 4004 MB, 4004511744 bytes
124 heads, 62 sectors/track, 1017 cylinders
Units = cylinders of 7688 * 512 = 3936256 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2e0e4e51

Device Boot Start End Blocks Id System

Command (m for help): u
Changing display/entry units to sectors

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First sector (62-7821311, default 62): 8192
Last sector, +sectors or +size{K,M,G} (8192-7821311, default 7821311):
Using default value 7821311

Command (m for help): p

Disk /dev/sdb: 4004 MB, 4004511744 bytes
124 heads, 62 sectors/track, 1017 cylinders, total 7821312 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2e0e4e51

Device Boot Start End Blocks Id System
/dev/sdb1 8192 7821311 3906560 83 Linux
Partition 1 does not end on cylinder boundary.

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

さらに、fdiskで作成したパーティションを初期化するために、下のコマンドを実行した。
 $ sudo mkfs.ext3 /dev/sdb1

rootfs用パーティションの作成と初期化が終わったら、一旦SDを取り外して、再度挿入し直した。Ubuntuではリムーバブルメディア上の初期化済みのパーティションは自動的にマウントされる。挿入したSDのパーティションのマウントポイントは、次のコマンドで確認できる。
 $ df -h

Ubuntuでは/media以下にリムーバブルメディアのパーティションがマウントされる。SDのパーティションのマウントポイントを確認した後、下のコマンドを実行して、rootfs全体をそのパーティションへコピーした(/media/SD-Volume-ID_FS_UUIDがマウントポイントと仮定)。
 $ cd rootfs
$ sudo cp -rpa [A-z]* /media/SD-Volume-ID_FS_UUID
$ sync

これで、ブートSDは完成だ。

●Linuxシステムの起動テスト

ブートSDができたので、さっそくこのSDで起動するか試してみた。上で作成したSDをIMX53QSBのmicroSDスロットに挿入し、VGAポートにモニタを接続して、ワクワクしながら、ボードの電源を投入(ACアダプタを接続)してみた。
IMG_2781_1-IMX53QSB_LinuxBSP_L2.6.35_11.09.01_Booting_VGA-20130123.jpg
「おっ、Linuxペンギン・ロゴが出たぞ。よし、やったぁ」と思ったのもつかの間、それ以上のブートシーケンスがまったく表示されない。「なぜ???」。

もしかすると、ブートシーケンスはシリアル側に出力されるのかも。それならばと、IMX53QSBのシリアルポートとMacをストレート・シリアルケーブルで接続した状態で、ボードの電源を再投入してみた。すると、下のようにブートシーケンスの表示が始まった。
IMX53QSB_LinuxBSP_L2.6.35_11.09.01_ZTerm-Scrnshot09-855x782
そして、最終的に、下のようにLinuxのログインプロンプトが表示された。「おー、やったぜ。セルフおめでとう。パチパチ」。
IMX53QSB_LinuxBSP_L2.6.35_11.09.01_ZTerm-Scrnshot10-855x782
しかし、せっかくボード上にVGAポートが在るのに、こちら側にブートシーケンスが出力されないのは納得いかん。この程度の問題なら、ちょっと調べれは解決できそう予感もするし・・・。

さーてと、気を引き締めながら、ここでシリアルへ出力されている上のブートシーケンスを良く観察した。うーん、最初の方はU-Bootの出力みたいだ。「Hit any key to stop autoboot: 」の箇所で3秒のカウントダウンが表示されるのが気になったので、このメッセージが出力された瞬間に任意のキーをタイプしてみた。すると、ブートシーケンスが停止して、下のようなU-Bootのコマンドプロンプトが表示された。そして、さらに「printenv」というコマンドを入力してみた(山勘で「help」と入力したら、U-Bootのコマンド一覧が表示されたので、このコマンドの存在を知った)
IMX53QSB_LinuxBSP_U-Boot_Output_ZTerm-ScrnShot22-855x782
うーん、やっぱりこのU-Bootの環境変数に上の問題を解決するヒントがありそうだなぁ。この後の経過は端折ってしまうが、i.MX Communityというサイトでいくつかのキーワードを組み合わせて検索したら、この問題の解決方法が見つかった。下のコマンドでU-Bootの環境変数を追加・変更すれば、VGA側にもブートシーケンスが出力されということが判った。
 > setenv vga 'video=mxcdi1fb:GBR24,VGA-XGA di1_primary vga'
> setenv bootargs_base 'setenv bootargs console=ttymxc0,115200 console=tty0 ${vga}'
> saveenv
> reset

下の写真が、VGAポートに接続したモニタにブートシーケンスが表示されている様子。
IMG_2791_1-IMX53QSB_LinuxBSP_L2.6.35_11.09.01_Booting_VGA-20130123.jpg
IMG_2788_1-IMX53QSB_LinuxBSP_L2.6.35_11.09.01_Booting_VGA-20130123.jpg
また、ドーターボードのHDMIポートへブートシーケンスを出力するには、下のコマンドを実行すれば良いことも判った。
 > setenv hdmi 'video=mxcdi0fb:RGB24,1024x768M@60 di0_primary hdmi'
> setenv bootargs_base 'setenv bootargs console=ttymxc0,115200 console=tty0 ${hdmi}'
> saveenv
> reset

上の二組のコマンドを実行すると、U-Bootの環境変数は最終的に下のような値になる。
 bootdelay=3
baudrate=115200
loadaddr=0x70800000
netdev=eth0
ethprime=FEC0
uboot=u-boot.bin
kernel=uImage
nfsroot=/opt/eldk/arm
vga=video=mxcdi1fb:GBR24,VGA-XGA di1_primary vga
hdmi=video=mxcdi0fb:RGB24,1024x768M@60 di0_primary hdmi
bootargs_base=setenv bootargs console=ttymxc0,115200 console=tty0 ${hdmi}
bootags_nfs=setenv bootargs ${bootargs} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
bootcmd_net=run bootagrgs_base bootargs_nfs; tftpboot ${loadaddr} ${kernel}; boom
bootags_mmc=setenv bootaggs ${bootargs} ip=dhcp root=/dev/mmcblk0p1 rootwait rw
bootcmd_mmc=run bootargs_base bootargs_mmc; mmc dev 0; mmc read ${loadaddr} 0x800 0x1800; bootm
bootcmd=run bootcmd_mmc
stdin=serial
stdout=serial
stderr=serial
ethact=FEC0

この状態で、VGAポートにブートシーケンスを出力したければ、次のコマンドを、
 > setenv bootargs_base 'setenv bootargs console=ttymxc0,115200 console=tty0 ${vga}'
> saveenv
> reset

HDMIポートにブートシーケンスを出力したければ、次のコマンドを実行すれば良い。
 > setenv bootargs_base 'setenv bootargs console=ttymxc0,115200 console=tty0 ${hdmi}'
> saveenv
> reset

ちなみに、U-Bootの環境変数の説明はBSP Release Notesにちゃんとに書かれてある。上の問題を解決した後でこのことに気がついた。「やっばり、マニュァルやドキュメントには先にひと通り目を通しておかないとダメだよなぁ」という教訓を味わった事例になってしまった。

●未解決の問題

ブートシーケンスの出力先をVGAやHDMIポートに変更する件についてはこれで解決できたが、じつは、未解決の問題点がいくつかある。以下がそれ。
 
 (1) 「cp: write error: No space left on device」というメッセージが出力される。
 (2) 「mount: mounting usbfs on /proc/bus/usb failed: No such file or directory」というメッセージが出力される。
 (3) シェルのログインプロンプトが表示されない。

いずれの問題も上に掲載したVGAのブートシーケンスの写真で確認できる。シリアル出力ではOKなのに、VGA/HDMI出力ではこれらの問題が起きるのが不思議だ。じつは、本記事を書いている時点で、残念ながら、(2)と(3)の問題はまだ解決できていない。これらの問題の解決方法はそのうち見つかるだろうと思っているので、いまは放っておくことにした。組込みLinuxをやっていると、こういう事は良くあるので、まぁ、焦らないが吉というこで・・・。

取りあえず、上の(1)の問題の解決方法だけは判った。/etc/rc.d/rc.conf内の下の項目の値を「8192k」に変更すれば良いみたいだ。変更前の値は「512k」になっている。
 TMPFS_SIZE = 8192k

この問題の解決方法もi.MX Communityで検索して見つけた。

未解決の問題点が残ってしまったが、これでIMX53QSBへのLinux移植は一応お終いということで。
タグ:Freescale i.MX
posted by とみやん at 14:05| Comment(0) | TrackBack(0) | Embedded Linux > その他
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

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


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/61710451

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