Ultra96 ボードを Vivado 2018.2 および PetaLinux 2018.2 から dhcp クライアントとして wlan1 を使用する場合のメモ書きです。
Ultra96 には WiFi チップが乗っていますが、デフォルトでは phy の存在までしか認識されず、wlanX インタフェースを明示的に作成する必要があるようです。
そこで、Ultra96 の wlan1 をWiFiルータに接続するための手順をまとめてみました。
ちなみに、2018.3 にはどうも必要なファイルが足りていないらしく、initramfs からのブートすら出来ませんでした。
- Xilinx の PetaLinux 2018.2 ダウンロードコーナーにある Ultra96 の BSP をダウンロードする。
- petalinux-create -t project -s <BSP ファイル名> でプロジェクトを展開する。
- petalinux-config -c kernel で WiFi チップのデバドラがあることを確認する。
(デフォルトで入っているので通常はいじらなくてOK) - petalinux-config -c rootfs で User packages を選択し、
packagegroup-petalinux-ultra96-webapp
ultra96-ap-setup
のチェックを外す。 - Filesystem backages => base => busybox にある busybox-udhcpc のチェックをつける。
- petalinux-config でブート先が SD カードになっていることを確認する。
(本BSPはデフォルトで SD カードブートになっているので、通常はいじらなくてOK) - petalinux-build でコンパイルする。気長に待つ。
- コンパイルが終了したら、images/linux ディレクトリに降り、
petalinux-build --boot --force --fsbl zynqmp_fsbl.elf --fpga system.bit --pmufw pmufw.elf --u-boot
で BOOT.BIN を構築する。
- sudo su で root ユーザになっておく。また /mnt に何もマウントしていないことを確認する。
- この投稿の後ろの方に示すスクリプトを走らせ、起動時に wlan1 を作成して udhcpc を起動するようにする。
- SD カードをセットして、マウントする。/dev/sdX1 (X はお使いのPCによって変わります。私のPCでは “d” でした。) の場合は
mount -t vfat /dev/sdX1 /mnt
として、/mnt に FAT32 パーティションをマウントする。
- BOOT.BIN, image.ub を FAT32 パーティションにコピーする。
cp -fp BOOT.BIN image.ub /mnt
- アンマウントして先ほど編集した rootfs.ext4 を dd コマンドで /dev/sdX2 にコピーする。
umount /mnt dd if=rootfs.ext4 of=/dev/sdX2 bs=1M
これも時間がかかるので気長に待つ。
- お好みで e2fsck, resize2fs をかけて割り当てたパーティション全体が使用できるようにする。
e2fsck -f /dev/sdX2 resize2fs /dev/sdX2
以上のように作成した SD カードを Ultra96 に挿して起動すると、wpa_supplicant.conf で指定した WiFi ルータにつながるようになります。
最後に、rootfs.ext4 を編集するスクリプトを掲載します。SSID, PSK にはお手持ちの環境に合った値を入れて下さい。
#!/bin/bash mount -t ext4 -o loop rootfs.ext4 /mnt cat <<EOF >/mnt/etc/wpa_supplicant.conf ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 update_config=1 network={ key_mgmt=WPA-PSK ssid="" #psk="" psk= } EOF sed 's/wlan0/wlan1/g' /mnt/etc/network/interfaces > '/mnt/etc/network/interfaces .XXX' mv '/mnt/etc/network/interfaces.XXX' /mnt/etc/network/interfaces cat <<EOF >/mnt/etc/init.d/ultra96-wlan1.sh #! /bin/sh ### BEGIN INIT INFO # Provides: Ultra96 wlan1 interface # Required-Start: # Required-Stop: # Default-Start:S # Default-Stop: # Short-Description: attaches Ultra96 wlan1 # Description: attaches Ultra96 wlan1 ### END INIT INFO DESC="ultra96-power-button.sh powers off the board when the power button is pushed" case "\$1" in start) echo -n "Start Ultra96 wlan1" iw phy phy0 interface add wlan1 type managed echo "." ;; stop) echo -n "Stop Ultra96 wlan1" ifconfig wlan1 down ;; *) echo "Usage: /etc/init.d/ultra96-wlan1.sh {start|stop}" exit 1 esac exit 0 EOF chmod +x /mnt/etc/init.d/ultra96-wlan1.sh rm -f /mnt/etc/rcS.d/S99ultra96-wlan1.sh pushd /mnt/etc/rcS.d ln -s ../init.d/ultra96-wlan1.sh S99ultra96-wlan1.sh popd umount /mnt