2025年にLininoにOpenWrtを焼く

2025-06-11 device embedded linux

かなり前、友人 @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のメモリが多く、遊ぶにはやや狭いですね。

そのへんの最適化の話は次回以降書きます。たぶん。