Raspberry Pi 2B で Wi-Fi アダプタを動かす (WI-U2-433DM, RTL8811AU)

# 前提条件
* Raspberry Pi 2 Model B
* BUFFALO WI-U2-433DM （使いたい Wi-Fi アダプタ）
* Realtek RTL8811AU （アダプタに搭載されたチップ）

`uname -r` の結果
```:uname -r 実行結果
6.6.20+rpt-rpi-v7 (インストール初期)
6.6.31+rpt-rpi-v7 (DKMS 動作確認)
```

まず、Wi-Fi アダプタを RasPi へ接続し、`lsusb` コマンドでデバイスを確認しておく。
`802.11ac WLAN Adapter` として認識されていることがわかる。
```bash:lsusb 実行結果
Bus 001 Device 004: ID 0411:0242 BUFFALO INC. (formerly MelCo., Inc.) 802.11ac WLAN Adapter
Bus 001 Device 003: ID 0424:ec00 Microchip Technology, Inc. (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Microchip Technology, Inc. (formerly SMSC) SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

# 忙しい人向け手順
Raspberry Pi 2 で試したところ、30分はかかった。
```bash:コマンド実行
sudo apt update
sudo apt install build-essential git raspberrypi-kernel-headers dkms -y
mkdir gnab
cd gnab
git clone https://github.com/gnab/rtl8812au.git
cd rtl8812au
sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile
sed -i 's/CONFIG_PLATFORM_ARM_RPI = n/CONFIG_PLATFORM_ARM_RPI = y/g' Makefile
make -j4
sudo make install　# たくさん時間がかかる
sudo make dkms_install  ## もっと時間がかかる
```

# 手順

## 概要

次の GitHub リポジトリの RTL8812 向けドライバをインストールした。
* https://github.com/gnab/rtl8812au.git

使っているアダプタのチップは RTL8811AU だが、RTL8812 向けドライバでも動くらしい。
ただ、他にも試したリポジトリはあるが、コンパイルに失敗したり、動かなかったりした。

* https://github.com/abperiasamy/rtl8812AU_8821AU_linux
* https://github.com/aircrack-ng/rtl8812au.git

以降は、https://github.com/gnab/rtl8812au.git に記載されたインストール手順を見ながら実行した。

## インストール
ドライバのビルドに最低限必要なパッケージを導入する。
```bash:コマンド実行
sudo apt update
sudo apt install vim build-essential git raspberrypi-kernel-headers -y
```

GitHub リポジトリをダウンロードする。（ホームディレクトリ内で作業している）
```bash:コマンド実行
mkdir gnab
cd gnab
git clone https://github.com/gnab/rtl8812au.git
cd rtl8812au
```

Raspberry Pi 向けに Makefile の中身を書き換える。（ビルド対象のアーキテクチャを x86 から変更している）
```bash:コマンド実行
sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile
sed -i 's/CONFIG_PLATFORM_ARM_RPI = n/CONFIG_PLATFORM_ARM_RPI = y/g' Makefile
```

先程のコマンドを実行すると、rtl8812au ディレクトリの中の Makefile が次のように変更されているはずなので、`vi Makefile` で確認する。
```bash:Makefile の内容（一部）
CONFIG_PLATFORM_I386_PC = n  # 57行目 y => n
CONFIG_PLATFORM_ARM_RPI = n  # 63行目 n => y
```

`make` でドライバをビルドする。（-j4 オプションで CPU を4コア並列でコンパイル実行）
```bash:コマンド実行
make -j4
```

`make` コマンドが失敗してしまったときは、`make clean` で中間ファイルなどを削除する。
```bash:コマンド実行
make claen
```

ビルド作業で生成された `8812au.ko` を `make install` で所定の場所にインストールする。
```bash:コマンド実行
sudo make install
```

`wpa_supplicant.conf` を編集し、接続先 Wi-FI の情報を登録する。
```bash:コマンド実行
sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
```

```bash:wpa_supplicant.conf の内容
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
        ssid="SSID"
        psk="Password"
}
```

Raspberry Pi を再起動後、`ip a` で Wi-Fi アダプタの認識を確認する。
`wlan0` の項目があれば、ドライバが認識されているはず。
```:ip a 実行結果
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether b8:27:eb:19:cc:51 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether cc:e1:d5:29:80:c0 brd ff:ff:ff:ff:ff:ff
```

## DKMS インストール
`sudo apt upgrade` などで OS Kernel のバージョンが上がると、ドライバが使用できなくなる。
Kernel のバージョンが上がっても、更新時に自動的に再構築してインストールするため DKMS を使う。

```bash:コマンド実行
sudo apt install dkms -y
```

次のコマンドでドライバーを DKMS にインストールする。 
```bash:コマンド実行
sudo make dkms_install
```

ドライバを削除するときは、次のコマンドで削除できる。
```bash:コマンド実行
sudo make dkms_remove
```

# 最後に
Raspberry Pi 2B には Wi-Fi モジュールが搭載されていないため、Wi-Fi へ接続するには USB 接続の Wi-Fi アダプタ（ドングル）を使う必要があります。
IEEE802.11ac が使えるアダプタをフリマアプリで探して、見つかったものを確認せずに購入したところ、見事に Linux ドライバをインストールしてからでないと利用できない製品を入手したため、インストール手順を備忘録として残しました。
使えるドライバを探すのに苦労しました。ただ、アップデートによって使えなくなるかもしれません。