«前の日記(2021-07-30) 最新 次の日記(2023-06-18)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2023-04-13 AlmaLinux 9 (20221116)で Raspberry Pi 400のWi-Fiを使えるようにする

AlmaLinux 9 (20221116)で Raspberry Pi 400のWi-Fiを使えるようにする

突然ですが Raspberry Pi 400を買いました。Raspberry Pi 4ではなく400にした理由は、 たまたま買おうとしたときにスイッチサイエンスに在庫があるのが400だったのと、キーボード付きなのと、端子が後ろに集中していて使いやすそうだと思ったからです。

FreeBSDとAlmaLinuxを入れて遊ぶつもりですが、まずはAlmaLinuxの方から。

まずは、国内のミラーからRasPi用のイメージをダウンロードしてきます。今回使用したのは AlmaLinux-9-RaspberryPi-9.1-20221116.aarch64.raw.xz です。

イメージの書き込みかたは省略します。イメージを書きんだSDカードを挿して電源を入れると普通に起動しました。Raspberry Pi 400はUSBからのブートにも対応しているため、SDカード以外にもUSBメモリやSSDを挿しても使えるようです。

以下の初期パスワードでログインします。

ユーザー名: root
パスワード: almalinux

Wi-Fiが使えない

AlmaLinux 9の配布されたイメージそのままの状態では、Wi-Fiが使えませんでした。

nmcliコマンドで確認してみると、Wi-Fiは有効になっているものの WIFI-HWmissingとなっており、Wi-Fiのハードウェアが見つからない状態になっているようです。

$ nmcli radio
WIFI-HW  WIFI     WWAN-HW  WWAN    
missing  enabled  missing  enabled

これはPi 400 のハードウェアが Pi 4 と微妙に異なるためで、Pi 4がBCM43455というチップを採用しているのに対し、Pi 400はBCM43456を採用しているようです。

dmesgをgrepしてみると、ファームウェアの読み込みに失敗していることがわかります。ドライバとしてはbrcmfmacで対応しているのですが、ファームウェアがないためハードウェアを使用できていないようです。

$ dmesg | grep brcmfmac
[   19.848452] brcmfmac: F1 signature read @0x18000000=0x15294345
[   19.859149] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43456-sdio for chip BCM4345/9
[   19.886424] brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43456-sdio.raspberrypi,400.bin failed with error -2
[   19.902527] brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43456-sdio.bin failed with error -2
[   19.968835] usbcore: registered new interface driver brcmfmac
[   20.926139] brcmfmac: brcmf_sdio_htclk: HT Avail timeout (1000000): clkctl 0x50

ファームウェアは linux-firmware というパッケージに含まれていて、/lib/firmware 以下にインストールされているのですがこの中に 43456 用のものがないことがわかります。ファイル名にRaspberry Piのモデル名らしきものがありますが、ここにもPi 400はないですね。

$ find /lib/firmware/brcm | grep -i raspberry
/lib/firmware/brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi 4 Model B.txt.xz
/lib/firmware/brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt.xz
/lib/firmware/brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt.xz
/lib/firmware/brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt.xz
/lib/firmware/brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi Compute Module 4.txt.xz
/lib/firmware/brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.txt.xz
/lib/firmware/brcm/brcmfmac43455-sdio.raspberrypi,3-model-a-plus.txt.xz

本来であれば、linux-firmware パッケージが更新されて dnf update するだけで Pi 400 対応になってくれると良いのですが、今回は別のところからファームウェアを持ってくることにします。

こちらのbrcm-supprementalリポジトリにあるファイルの中から、以下の3つのファイルを持ってきて /lib/firmware/brcm の下にコピーしてやります。他のファイルはxzで圧縮されていますが、圧縮しなくてもOKです。

  • brcmfmac43456-sdio.raspberrypi,400.bin
  • brcmfmac43456-sdio.raspberrypi,400.clm_blob
  • brcmfmac43456-sdio.raspberrypi,400.txt

コピーしたら再起動します。

Wi-Fiが使えるようになった

再起動すると、Wi-Fiが使えるようになっています。nmcliのWIFI-HWがmissingではなくなっていますし、dmesgをgrepした結果にもファームウェアの読み込みエラーが出なくなっています。

$ nmcli radio
WIFI-HW  WIFI     WWAN-HW  WWAN    
enabled  enabled  missing  enabled 
$ dmesg | grep brcmfmac
[    8.911175] brcmfmac: F1 signature read @0x18000000=0x15294345
[    8.963376] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43456-sdio for chip BCM4345/9
[    9.065806] usbcore: registered new interface driver brcmfmac
[    9.226089] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43456-sdio for chip BCM4345/9
[    9.256216] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM4345/9 wl0: May 14 2020 17:26:08 version 7.84.17.1 (r871554) FWID 01-3d9e1d87
[   13.425989] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[   13.986762] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[   17.410402] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled

この状態で、nmcli device wifi list とコマンドを実行すると、周囲のWi-Fi SSIDが表示されます。

接続するには nmcli device wifi connect [SSID] password [パスワード] というコマンドを実行します。

まとめ

AlmaLinux 9でRaspberry Pi 400のWi-Fiが使用できないのは、Pi 4と使用しているハードウェアが微妙に異なり、標準パッケージにファームウェアが含まれていないためです。ファームウェアを特定のディレクトリに置くと、Wi-Fiが使えるようになります。

いずれはlinux-firmwareパッケージが更新されて標準で使えるようになるといいのですが、これを書いている時点では上記の方法でファームウェアを追加してやる必要があります。