かなり前、友人 @ecto0310 氏より、秋月電子の福袋に入っていた「Lininoわんわんハントセット」を頂いておりました。
今回は、それを「おもしろLinuxボード」として活用しようと考えました。
注: 今回のLinino記事では、ほぼ以下のOpenWrtの記事をなぞる形となっており、目新しい内容はありません。続編として、より「内容のある」活用記事を出したいと考えています。
https://openwrt.org/toh/arduino.cc/yun?s[]=arduino
そもそもLininoとは何なのか ¶
開発が完全に停止しているArduino Yúnベースの互換ボードの様です。(公式サイトも既に無いようです。)
2015年頃(約10年前)にやや活発になっていたようです。
元となったArduino Yúnですが、家庭用ルーターとArduino評価ボードとがUARTとSPIを介して合体した、かなり変わった評価ボードとなっています。
- Atheros AR9330 (MIPS 24Kc@400MHz)
- 64MB DDR@400MHz DRAM
- 16MB SPI Flash 25Q128FV
- microSD Slot
- USB 2.0 Host
- WiFi 802.11 b/g/n + 10/100Mbps Ethernet
- ATMEL ATmega32U4
- microUSB Guest
標準ではOpenWrtベースのファームウェアが焼かれています。(既にメンテナンスされていません。)
それを、OpenWrt(本物)(令和最新板)にしたいわけです。
そもそも最新のOpenWrtって動く? ¶
2025年現在、8MB Flash / 64MB RAMが最小要求だそうです。余裕ですね(?)。
https://openwrt.org/supported_devices
シリアルコンソールの準備 ¶
準備として、LininoのATmega 32U4側(非ルーター側)に、Bridgeライブラリを焼きます。
https://docs.arduino.cc/libraries/bridge/
これを焼き、microUSBケーブルでホストマシンと繋ぐことで、USBシリアルデバイスとして認識されるようになります。
Openすると、Atheros AR9330側のシリアルコンソールがブリッジされ、見慣れた(?)ブートログを拝めます。
- 余談: 家庭用ルーター等をハックするときと違い、UARTパターンに直接はんだ付けしなくても良いだなんて、とても楽ですね。
現状確認 ¶
早速ソフトウェア構成を確認してみると:
Bootloader | U-Boot 1.1.4-linino-gdd727126 |
---|---|
Linux | Linux version 3.3.8 (build@build-base) (gcc version 4.6.3 20120201 (prerelease) (Linaro GCC 4.6-2012.02) ) #1 Tue Oct 14 15:28:09 CEST 2014 |
カーネルがかなり古めですね。私は、古いLinuxについての知見があまり無く、色々遊ぶなら現在最新のLinux 6系を使いたいのです。
念の為、パーティション構成も確認しておきましょう。
ブートログに含まれるmtdブロックデバイスのパーティション構成
[ 0.680000] Creating 7 MTD partitions on "spi0.0":
[ 0.690000] 0x000000000000-0x000000040000 : "u-boot"
[ 0.710000] 0x000000040000-0x000000050000 : "u-boot-env"
[ 0.720000] 0x000000050000-0x000000ea0000 : "rootfs"
[ 0.760000] 0x000000870000-0x000000ea0000 : "rootfs_data"
[ 0.780000] 0x000000ea0000-0x000000fe0000 : "kernel"
[ 0.790000] 0x000000fe0000-0x000000ff0000 : "nvram"
[ 0.800000] 0x000000ff0000-0x000001000000 : "art"
[ 0.820000] 0x000000050000-0x000000fe0000 : "firmware"
Arduino Yúnと同じ景色です。これなら安心してArduino Yúnのファームウェアを焼けそうです。
(私はそれでもBrickさせないか不安だったので、Linino裏面側のSPI Flashを剥がし、Stock ROMをDumpしました。)
Bootloader Update ¶
OpenWrtの記事によると、大きなカーネルイメージをロードするためには、1.1.5以降のU-Bootが必要なようです。
Update the bootloader to 1.1.5 because 1.1.4 does not support bigger kernel upload by default https://openwrt.org/toh/arduino.cc/yun?s%5B%5D=arduino#flashing_the_latest_openwrt
現状のバージョンは U-Boot 1.1.4-linino-gdd727126 であり、アップデートする必要があります。
しかし、Linino向けの新しいU-Bootは提供されていません。
なので、Arduino Yún向けの新しいU-Bootに置き換えていきます。
Arduino Yún向けBootloaderをパチってくる ¶
以下のGitHub Releaseから yun-go-updater-linux64.tar.gz
など適当なものを拾い、中から u-boot-arduino-lede.bin
を連れてきます。
https://github.com/arduino/yun-go-updater/releases/tag/1.2
TFTPサーバーを用意する ¶
@puhitaku 先生のTFTPサーバーがシングルバイナリでサクッと上がってきて便利です。
https://github.com/puhitaku/tftp-now
Bootloaderへ入る ¶
Linino(や、Arduino Yún)のU-Bootにはやや癖(?)があり、通電直後はブートローダーに入るチャンスがありません。
以下の「いずれか」の手順でAtheros AR9330を一度リセットしてあげる必要があります。
- Atheros AR9330側リセットボタンを押す
- 本体の3連リセットスイッチの中央
- Linino的にはLinux Rebootボタンらしい
- 起動後、rebootコマンドにて再起動する
以下のような文言が現れるので:
autoboot in 4 seconds (stop with 'lin')...
lin
とタイプすることで、U-Bootに入れます。(プロンプトは linino>
です。)
Bootloaderの書き込み ¶
転送元TFTPサーバーのIPアドレス・自IPアドレスを設定します。
linino> setenv serverip 192.168.1.2;
linino> setenv ipaddr 192.168.1.1;
次に、ファームウェアをメモリ上に展開します。
linino> tftp 0x80060000 u-boot-arduino-lede.bin
注: この時、出力が *****
のようにならず、 T T T ..
となる場合、TFTPサーバーへの接続がタイムアウトしているので、ネットワーク設定を見直すなりタイムアウト値を見直すなりしてください。
フラッシュへと書き込みます。
linino> erase 0x9f000000 +0x40000;
linino> cp.b $fileaddr 0x9f000000 $filesize;
linino> erase 0x9f040000 +0x10000
ここで、リセットすると:
autoboot in 4 seconds (stop with 'ard')...
となり、プロンプトも arduino>
となることがわかります。少し寂しい気もしますね。
OpenWrt化 ¶
今回はとりあえずOpenWrt化したいだけなので、特に気にせずprebuiltバイナリを拾ってくることにします。
凝ったファームウェアが必要でない場合は、OpenWrt Firmware Selectorから頂戴するのが便利です。
https://firmware-selector.openwrt.org/?version=24.10.1&target=ath79%2Fgeneric&id=arduino_yun
ここから、sysupgradeファイルを頂戴します。
OpenWrtの書き込み ¶
先ほど同様にU-Bootに入り、IPアドレスを設定:
autoboot in 4 seconds (stop with 'ard')...
arduino> setenv serverip 192.168.1.2;
arduino> setenv ipaddr 192.168.1.1;
メモリ上に展開:
arduino> tftp 0x80060000 openwrt-24.10.1-ath79-generic-arduino_yun-squashfs-sysupgrade.bin;
注 - Copy: この時、出力が *****
のようにならず、 T T T ..
となる場合、TFTPサーバーへの接続がタイムアウトしているので、ネットワーク設定を見直すなりタイムアウト値を見直すなりしてください。
実フラッシュへの書き込み:(この時、eraseにだいぶ時間がかかりますが、そういうものです。)
arduino> erase 0x9f050000 +0xE50000;
arduino> cp.b $fileaddr 0x9f050000 $filesize;
ここでリブートすると最新のOpenWRTで上がってきます。
いざブート ¶
無事luciも拝むことができました。完成です。
次回 ¶
ところで、Usedのメモリが多く、遊ぶにはやや狭いですね。
そのへんの最適化の話は次回以降書きます。たぶん。