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 ハブに電源を分配する予定です。

NetBSD でも git clone できるようになった

久しぶりの日記です。

先日まで、NetBSD 3.1.1 上の git で git clone ができなかったのですが、新たにインストールした NetBSD 5.0.1 上で、git clone できることを確認しました。根本原因は追究していないのですが、おそらく依存するツールのバージョンの問題ではないかと推測しています。カーネルの相違というのは、あまり関係なさそうな気がするのですが。

いずれにしても、NetBSD 3.1.1 は保守が終わってしまっているので、パッケージ管理者やメーリングリストに照会するのもおかしな話なので、黙って 5.0.1 に移行しようと思います。

2009年9月16日水曜日

昨日の Debian

昨日の Debian 環境構築の詳報です。つーか、備忘録です。

SD カードイメージの作成

QEMU 環境で仮想ディスクイメージにインストールした Debian ARM を、SD カードに焼きました。qemu-system-arm が生成した img ファイルを、loop device に接続してマウントし、中身を tar.bz2 に吐き出します。問題は、img ファイルに FAT32 と ext3 のパーティションが入っているのに、loop デバイス自身はパーティションを認識する能力がないらしいことです。しようがないので、fdisk をかけてパーティションのオフセットを調べて、それを使ってマウントしました。例えば、次のような感じです。

$ fdisk 1gb.img
Command (m for help): u
Changing display/entry units to sectors

Command (m for help): p

Disk 1gb.img: 0 MB, 0 bytes
255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes
  
  Device Boot      Start         End      Blocks   Id  System
1gb.img1              63      112454       56196    b  W95 FAT32
1gb.img2   *      112455     1783214      835380   83  Linux
1gb.img3         1783215     2088449      152617+   5  Extended
1gb.img5         1799280     2088449      144585   82  Linux swap / Solaris

Command (m for help): q

$ bc
512*112455
57576960
^D

$ sudo losetup -o 57576960 /dev/loop0 1gb.img
$ sudo mount -o ro /dev/loop0 /mnt

$ ls /mnt
bin   dev  home  lost+found  mnt  proc  sbin     srv  tmp  var
boot  etc  lib   media       opt  root  selinux  sys  usr

ログイン画面が出ない

uImage を FAT32 に、ファイルシステムの内容を ext3 に展開し、U-Boot も設定して BeagleBoard を起動してみました。おおお、無事に起動するー。途中で、ext3 のタイムスタンプが未来になっているとか言ってリブートがかかりましたが、2回目は OK でした。これはまた、別途検討。

もっと大きな問題は、なんとブートが成功してもシリアルポートに login: が出ません! というか、tty のエコーバックが全然出ない。でも、heartbeat しています。結論からいうと、/etc/inittab や securetty の設定を忘れてました。ドキュメントにちゃんと書いてあるのに、無視してました。そのため、思わず /etc/init.d/rc をデバッグしそうになったり、update_rc.d というコマンドを覚えたりしました。後者はこんなふうに使うそうです。

# update_rc.d -f cron remove
これをやっても、/etc/init.d/cron は消えません。再度有効にするには、
# update_rc.d cron defaults 89 11
とかするようです。(記憶で書いているので、間違っていたらごめんなさい。) 詳細は、この辺が詳しいです。(← マニュアル見ろよ! > 俺

もう一つ、mount の remount オプションを覚えました。この辺、うろ覚えでいつも混乱します。NetBSD だと、mount -uw / とかするんだよな、確か。Linux では、mount -o remount,rw / とかするみたい。昨日、/etc/init.d/rc をいじっていたら、ルートファイルシステムが readonly になってしまい、rc を戻せなくて焦ったのでした。(← 生兵法は怪我のもと)

あ、そうそう。シングルユーザーモードにする方法も思い出しました。カーネルに single というキーワードを渡せば良いみたいです。U-Boot だと、bootargs に single って追加してあげればカーネルに伝わります。

解決できていない問題

もう一つが、昨日(夜中に)書いた musb_hdrc の件です。これは重そうですが、解決しないとネットに繋がらないので、何もできません。。。昨日夜中までゴリゴリしていて睡眠不足なので、これは明日以降、挑戦してみます。

フォロワー