2009年10月5日月曜日

make uImage と crosstool-ng

昨日、BeagleBoard 上のセルフコンパイルで Linux カーネルをビルドできるようになりました。というか、実はまだ BeagleBoard 用のカーネルではなくて、Debian ARM の標準カーネルなんですけど。vmlinux までは無事に生成できて、mkimage を動かしてみようと思ったのですが、ふと vmlinuz は要らんのか、と思いつきました。BeagleBoard の mkimage サンプルが、vmlinuz を使っているからです。

Linux カーネルについては、昔ちょっとだけ勉強したような気もするのですが、vmlinuz とか bzImage とか、忘れました。今日、会社の昼休みに U-Boot のドキュメントとか読んでみたのですが、mkimage の要求もよく分かりません。しかしいろいろググっていたところ、Linux のカーネルビルドで make uImage とかできることが分かり、そちらを試してみようと思っています。

さて。家に帰ってから早速 make uImage してみようと思ったのですが、やはり BeagleBoard 上でのセルフビルドには時間がかかります。一番の原因は、プロセッサの処理速度というよりも、ローカルディスクの容量と速度が不十分なことです。今は、カーネルソースを NFS サーバーに置いているのですが、やはりローカルディスクに敵いませんし、/tmp が SD カード上というのも(フラッシュメモリは書き換えに弱いので)不安が残ります。tmpfs を使えば良いのでしょうが、今度はメモリサイズが気になります。最終的にはセルフコンパイラの恩恵に与るとしても、普段の実験には Celeron 1.8GHz を使いたいと思いました。

そんな訳で、改めて crosstool を試してみることにしました。昨日の実験で、Linux カーネルのビルド方法を少しずつ思い出したのも、その決断を後押ししています。

最初、crosstool の 0.43 を試してみたのですが、なんと gcc が -march=armv7-a というオプションを受け付けないことが判明しました。どうも、GCC のバージョン 4.1.0 では古すぎるようです。再度ググってみたところ、今は crosstool-ng というのがあるそうで、そちらを試すことにしました。ng と言っても、無印 crosstool とはかなり違うようで、いきなり configure && make install が必要になったりしました。(後で分かりましたが、Linux カーネルのビルドを真似しているようです。)

crosstool-ng 1.4.2 のインストール後、

$ ct-ng arm-unknown-linux-gnu
$ ct-ng menuconfig
$ ct-ng build

としてみたのですが、途中で gcj がなんとかと言って落ちました。おおお、Java は要らん、Java は! という訳で、今度は ct-ng menuconfig で、Java と Fortran の選択を外してみました。再度 ct-ng arm-unknown-linux-gnu build したところ、今度は autoconf や automake のバージョンが古いといって怒られます。さらに、glibc-cvs-2.9 とかいうのを拾いにいって失敗したり、いろいろ苦労しました。結局、tar.gz から autoconf 2.60 と automake 1.10.2 をインストールし、さらに menuconfig で調整した結果、今のところかなり順調にビルドが進んでいます。

果たして、crosstool-ng は無事にインストールできるのでしょうか。そんでもって、BeagleBoard 用のカーネルのクロスビルドはできるのでしょうか!?

後記 1

とりあえず、セルフ環境での make uImage はうまく行きそうです。まだ、Debian ARM のカーネルで試しただけですが。

後記 2

crosstool-ng 1.4.2 での armel コンパイラは無事にビルドできました。最適な環境かどうか、また、今のところ BeagleBoard のカーネルがビルドできるかどうか不明ですが、とりあえず crosstool-ng 1.4.2 用の .config ファイルをここに置いておきます。

2009年10月4日日曜日

セルフ環境でカーネルビルド

土日は、BeagleBoard のセルフ環境でのカーネルビルドを実験しました。とりあえず、Debian のサイトから Linux-2.6.26 のソースを入手しました。しばらく手間取りましたが、カーネルをビルドできました。

今度は、BeagleBoard で実際にブートできるカーネルをビルドしてみようと思います。道のりは長いですが、頑張ります。

2009年9月26日土曜日

Wi-Fi が繋がって、快適に!

CIMG6854_ret ようやく、BeagleBoard に Wi-Fi でログインできるようになりました。ここまで、長かったーーー。今日は、焼肉パーティでもするかな?

昨日までに、USB Ethernet で接続できることを確認したのですが、今日は USB Wi-Fi で接続できるようになりました。WPA2 も OK です。OpenSSH デーモンを動かしたので、ssh でのログインも OK です。さっき、gcc をインストールして、簡単なコードをコンパイルできることも確認しました。

まずは Linux 2.6.28 のカーネルモジュール

先日、カーネルをグレードダウンしたので、まずはカーネルモジュールからインストールしました。現状、ネットワークが繋がっていないので、SD カードの ext3 を他のホストからマウントして、.deb ファイルを書き込みます。以下を入手してきて、インストールしました。

  • linux-image-2.6.28-oer23_1.0lenny_armel.deb
同時に USB Wi-Fi のファームウェア

同時に、USB Wi-Fi zd1211 のファームウェアも入手します。ここにいろいろ書いてありますが、私の場合は、以下を dpkg -i でインストールするだけで OK でした。あ、そうそう。後で必要になるので、iwconfig などをインストールしておきます。

  • http://ftp.debian.org/debian/pool/non-free/z/zd1211-firmware/zd1211-firmware_2.21.0.0-0.1_all.deb
  • wireless-tools_29-1.1_armel.deb
  • libiw29_29-1.1_armel.deb (← wireless-tools が要求します)
WPA, WPA2 を使う場合は、さらに以下が必要です。

  • wpasupplicant_0.6.4-3_armel.deb
  • libpcsclite1_1.4.102-1_armel.deb
  • libdbus-1-3_1.2.1-5+lenny1_armel.deb
zd1211-firmware 以外は、ここなどから入手できます。

Wi-Fi の設定とか

以下、WPA2 を使うことを前提としています。まず、WPA2 の事前共有鍵を設定します。SSID を foo、事前共有鍵のフレーズを korehahimitsuda と仮定します。

# wpa_passphrase foo wpa_passphrase > /etc/wpa_supplicant/wpa_supplicant.conf
次に、そのファイルをエディタで開き、次のように追記します。(実は、よく分からないで書いています。できたら、マニュアルを参照してください。)

network={
        proto=WPA WPA2
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        ssid="foo"
        #psk="korehahimitsuda"
        psk=...
}
次に、/etc/network/interfaces に追記します。(auto lo の後ろに、wlan0 を書き加えています。)

auto lo wlan0

iface wlan0 inet dhcp
        wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
これで、ifup wlan0 で Wi-Fi に繋がりますし、OS を再起動すれば自動的にネットワークが設定されます。

なお、OpenSSH の設定例は巷に溢れていますので、ここでは割愛させて頂きます。

autoboot のディレイ変更

U-Boot で、起動後の一定時間後に OS をブートするようになっているのですが、デフォルトは 10秒で、なんとも長いと思っていました。これを設定で変更できることが分かり(← 気づくのが遅い)、変更しました。

OMAP3 beagleboard.org # setenv bootdelay 3
OMAP3 beagleboard.org # saveenv
保証外でしょうけど、ここを参考にしてしまいました。

2009年9月25日金曜日

git で、linux-omap-2.6 の追っかけ

git の使い方を少し覚えたので、まずは linux-omap-2.6 と openembedded の「追っかけ」をすることにしました。linux-omap-2.6 は、枝の構造が複雑で、というか CVS に比べて枝の作成が容易なためか、枝の全貌を理解することは、ほとんど不可能です。とりあえず、昨日インストールしたカーネル v2.6.28-79d042a-oer23 のソースと、その前後関係を摑めるようにしました。

この辺を真面目に追いかけようとすると、Linux 2.6 のリポジトリ(特に ARM 周り)、linux-omap-2.6 のリポジトリ、BeagleBoard 向けのパッチを全てフォローしなくてはならず、それはほとんど無理な作業です。とりあえず、動けば正解のアプローチで、のんびりやろうと思います。

明日は、ネットワーク設定をして、カーネルのセルフコンパイルができるようになれば良いと思います。(そこまで進むのは無理かも)

2009年9月24日木曜日

Debian で Ethernet が繋がるようになった

今日の作業で、ようやく、BeagleBoard 上の Debian ARM で TCP/IP できるようになりました。これで、今後はシリアルケーブルなしにデバッグができるようになります。つーか、ネットワーク繋がらなくちゃ何もできないのですが。

先日までのトライで、lenny/v2.6.29-58cf2f1-oer44.1 を起動できるようになったものの、BeagleBoard (リビジョン B6)で USB (ハブ)を認識できないという問題を抱えていました。今日は、とりあえず、片っ端からいろいろなカーネルを立ち上げ、問題の切り分けをしてみました。(もしかすると、USB OTG ケーブルの問題なのかも知れませんが、極細の IC クリップがないとテスタを当てられないので、放置しています。いずれ余裕ができたら、もうちょっと切り分けしてみようと思います。)

まずは、Lenny 最新の v2.6.31-52a962f-ang3.1 を試してみます。しかし、カーネルの起動途中で固まってしまう現象にぶつかりました。今度は少し戻って、v2.6.29-58cf2f1-oer45.1。これは、上記 oer44.1 とほぼ同じ動作になります。

ここで、かなり行き詰まりを感じたのですが、v2.6.28 系列も試してみることにしました。これが少し億劫だったのは、上記サイトに、もはや v2.6.28 系列が置かれていないということです。アーカイブを探したところ、こちらのサイトに古いバージョンが置かれていることが分かりました。問題は(大したことではないが)、そこに uImage は置かれておらず、.deb ファイルから vmlinuz を展開し、そこから U-Boot の mkimage で uImage を生成しなくてはいけないという点です。以下、備忘録です。

まず、lenny/v2.6.28-79d042a-oer23 の .deb ファイルをダウンロードします。ここから入手できます。次に、これを展開します。.deb ファイルは(私の知る限り) ar フォーマットになっているので、次のように展開します。

$ ar xf linux-image*.deb
中から data.tar.gz というファイルが出てくるので、そこからさらに boot/vmlinuz-2.6.28-oer23 というファイルを取り出します。

ここからは、U-Boot の mkimage というツールが必要です。ここの説明にあるように QEMU 上で Debian を動かし、そこで mkimage するのが簡単ですが、QEMU と実世界(?)の間でファイル交換が必要になります。私は、QEMU 上の Debian から、ホストに sftp をかけてファイルを交換しました。mkimage が使えるようになったら、次のようにします。

$ mkimage -A arm -O linux -T kernel -C none -a 0x80008000 \
-e 0x80008000 -n "Linux" -d ./vmlinuz-2.6.28* uImage
できた uImage は、sftp で再び実世界に戻し、何らかの方法で SD カードの VFAT パーティションに書き込みます。(パーティションの作成やフォーマットには、ここにある video tutorial を見て、GParted を使うのが簡単です。慣れれば、例えば VFAT のフォーマットには mkdosfs -F32 -v /dev/sdf1 (注意: デバイス名は、作業環境に依存します)とかすれば、OK です。)

私の場合は、これで無事に USB ハブと USB-Ether アダプタ LUA-U2-KTX を認識できました。以下に、関連する dmesg を示します。

Linux version 2.6.28-oer23 (root@debian-armel) (gcc version 4.3.2 (Debian 4.3.2-
1.1) ) #1 Wed Apr 8 15:30:01 UTC 2009
CPU: ARMv7 Processor [411fc082] revision 2 (ARMv7), cr=10c5387f
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: OMAP3 Beagle Board
Memory policy: ECC disabled, Data cache writeback
OMAP3430 ES2.1
SRAM: Mapped pa 0x40200000 to va 0xd7000000 size: 0x100000
(略)
musb_hdrc: version 6.0, musb-dma, otg (peripheral+host), debug=0
musb_hdrc: USB OTG mode controller at d80ab000 using DMA, IRQ 92
(略)
musb_hdrc musb_hdrc: MUSB HDRC host driver
musb_hdrc musb_hdrc: new USB bus registered, assigned bus number 2
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
(略)
musb_hdrc: version 6.0, musb-dma, otg (peripheral+host), debug=0
musb_hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine (X), bulk split (X),
 HB-ISO Rx (X), HB-ISO Tx (X), SoftConn)
musb_hdrc: MHDRC RTL version 1.400 
musb_hdrc: setup fifo_mode 4
musb_hdrc: 29/31 max ep, 16384/16384 memory
musb_hdrc: hw_ep 0shared, max 64
musb_hdrc: hw_ep 1tx, max 512
musb_hdrc: hw_ep 1rx, max 512
musb_hdrc: hw_ep 2tx, max 512
musb_hdrc: hw_ep 2rx, max 512
musb_hdrc: hw_ep 3tx, max 512
musb_hdrc: hw_ep 3rx, max 512
musb_hdrc: hw_ep 4tx, max 512
musb_hdrc: hw_ep 4rx, max 512
musb_hdrc: hw_ep 5tx, max 512
musb_hdrc: hw_ep 5rx, max 512
musb_hdrc: hw_ep 6tx, max 512
musb_hdrc: hw_ep 6rx, max 512
:musb_hdrc: hw_ep 7tx, max 512
musb_hdrc: hw_ep 7rx, max 512
musb_hdrc: hw_ep 8tx, max 512
musb_hdrc: hw_ep 8rx, max 64
musb_hdrc: hw_ep 9tx, max 512
musb_hdrc: hw_ep 9rx, max 64
musb_hdrc: hw_ep 10tx, max 512
musb_hdrc: hw_ep 10rx, max 64
musb_hdrc: hw_ep 11tx, max 256
musb_hdrc: hw_ep 11rx, max 256
musb_hdrc: hw_ep 12tx, max 256
musb_hdrc: hw_ep 12rx, max 256
musb_hdrc: hw_ep 13tx, max 256
musb_hdrc: hw_ep 13rx, max 4096
musb_hdrc: hw_ep 14shared, max 1024
musb_hdrc: hw_ep 15shared, max 1024
musb_hdrc: USB OTG mode controller at d80ab000 using DMA, IRQ 92
USB-Ethernet のほうは、こんな感じです。

eth0: register 'asix' at usb-musb_hdrc-1.1, ASIX AX8817x USB 2.0 Ethernet,
00:07:40:xx:xx:xx
udev: renamed network interface eth0 to eth1
明日以降、今度は USB Wi-Fi に挑戦し、それがうまく行っても行かなくても、本筋の作業に戻ろうと思います。さて、寝るとするか…。

2009年9月23日水曜日

とりあえず、ケーシング

CIMG6839 ケースに収まっていないと、いろいろと作業性が悪いので、家に転がっていたプラケースに収めてみました。電源の取り回しが悪いので、大容量の 5V 電源を使い、ボードと USB ハブに電源を分配する予定です。

フォロワー