ラズパイZEROで5GWiFi利用

 サーバーを置いてある室内のWiFi環境を電子レンジに影響されない5Gに変えればと思い、ラズパイZEROで動きそうなUSBインターフェスのものを探すと、ちょうど2バンド使えてLinuxでも動きそうなのがあったので買ってみた。

届いたものを見てみると、今までのようにOSに含まれているブロードコムではなくRealtekのチップを使ったものであった。
 このドライバーの組み込みで相当苦労した。以下はその顛末である。
 Windows用にはドライバーがCDで添付されているが、Linuxには無い。メーカーのホームページを見てみると、Linux用のドライバーがあったので、それを試してみた。

 中身はドライバーのソースでコンパイルが必要である。コンパイルにはカーネルソースが必要となるが当初カーネルソースが2つあることに気づかづ別のソースにリンクを張っていた。
 もしかしてこれが苦労した原因かもしれないが、それは試していない

 その条件を整えるため以下のツールをインストールした。
pi@raspberrypi:~ $ sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
*** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** We're running for the first time
 *** Backing up files (this will take a few minutes)
 *** Remove old firmware backup
 *** Backing up firmware
 *** Backing up modules 4.14.98+
#############################################################
WARNING: This update bumps to rpi-4.19.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=224931
##############################################################
Would you like to proceed? (y/N)n
Enterで実行せず
sudo reboot

pi@raspberrypi:~ $ sudo apt-get install build-essential bc git

pi@raspberrypi:~ $ sudo apt-get install raspberrypi-kernel-headers

pi@raspberrypi:~ $ cd /usr/src
pi@raspberrypi:/usr/src $ ls
linux-headers-4.14.98+  linux-headers-4.14.98-v7+

pi@raspberrypi:/usr/src $ sudo ln -s linux-headers-4.14.79+ linux
ここで4.14.79+ではなく4.14.79-v7+にリンクを張っていた。
pi@raspberrypi:/usr/src $ ls -l
合計 8
lrwxrwxrwx  1 root root   25  3月 27 13:07 linux -> linux-headers-4.14.79+
drwxr-xr-x 24 root root 4096  3月 27 13:03 linux-headers-4.14.98+
drwxr-xr-x 24 root root 4096  3月 27 13:03 linux-headers-4.14.98-v7+
 必要のないものもあるが、ネットで見ながら適当にインストール。
 ソースに添付のreadme.txtを見ると、解凍したディレクトリーに入ってmakeするようにとなっている。
 その前にプラットホームをラズパイに合わすためI386_PCをnとしてARM_RPIをyとする
$ sudo vi ./Makefile  
CONFIG_PLATFORM_I386_PC = n  ## y -> n
CONFIG_PLATFORM_ARM_RPI = y  ## n -> y
 次に
$ make
 色んなメッセージが出るが、時折カラー表示のwarningとかnoteなどの表示が出る。
 しかし、最終的に終了して8812AU.koなるドライバーは完成した。

 これをinsmodで組み込む。
$ insmod ./8812au.ko

 lsmodで確認すると組み込まれているようである。

 そこでiwconfigで動作を確認する。

 wlan1として組み込まれた表示はあるが、正常動作しているwlan0と比べると項目はあるが、具体的な数字が無い。

 どうも動いていないようである。やはりコンパイル中に出た警告がいけなかったようで、正常にコンパイルできなかったようである。

 それではとソースに添付の説明にあったdkmsなるツールを使う事を試してみる。
pi@raspberrypi:/usr/src $ sudo apt-get install dkms
realtekホームページのソースで再試行

pi@raspberrypi:/usr/src $ ls
8812au-4.2.2  linux  linux-headers-4.14.98+  linux-headers-4.14.98-v7+
pi@raspberrypi:/usr/src $ sudo dkms add -m 8812au -v 4.2.2

Creating symlink /var/lib/dkms/8812au/4.2.2/source ->
                 /usr/src/8812au-4.2.2

DKMS: add completed.

pi@raspberrypi:/usr/src $ sudo dkms build -m 8812au -v 4.2.2

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area...
'make' all...................................................................................................................................................................................................................................................................................................................................
cleaning build area...

DKMS: build completed.
やはり20分
しかしこれで作成されたドライバーも動作しなかった。

これも失敗
ネットで探したらラズパイ用に修正されたドライバーソースがある記述に遭遇。
https://github.com/abperiasamy/rtl8812AU_8821AU_linux
ここからソースを頂いてきて、ラズパイに転送。
gitでの取得はID認証を求められ上手くいかなかったのでブラウザでZIPファイルを取得後転送した。

 ラズパイのホームディレクトリーにunzipで解凍し、
Makefile 調整 †
つまり前にやったようにMakefileの内容を386_PCからRaspberry Pi 向けに変更する。

pi@raspberrypi: ~ $ cd rtl8812AU_8821AU_linux/
pi@raspberrypi: ~/rtl8812AU_8821AU_linux $ vi Makefile
52行目
CONFIG_PLATFORM_I386_PC = y

CONFIG_PLATFORM_I386_PC = n
に、
58行目
CONFIG_PLATFORM_ARM_RPI = n

CONFIG_PLATFORM_ARM_RPI = y
に変更

Make を実行
pi@raspberrypi ~/rtl8812AU_8821AU_linux $ make

今回は警告は出ない。
make[1]: Entering directory '/usr/src/linux'
  CC [M]  /home/pi/src/rtl8812AU_8821AU_linux/core/rtw_cmd.o
  CC [M]  /home/pi/src/rtl8812AU_8821AU_linux/core/rtw_security.o
  CC [M]  /home/pi/src/rtl8812AU_8821AU_linux/core/rtw_debug.o
  CC [M]  /home/pi/src/rtl8812AU_8821AU_linux/core/rtw_io.o
  CC [M]  /home/pi/src/rtl8812AU_8821AU_linux/core/rtw_ioctl_query.o
  CC [M]  /home/pi/src/rtl8812AU_8821AU_linux/core/rtw_ioctl_set.o
  CC [M]  /home/pi/src/rtl8812AU_8821AU_linux/core/rtw_ieee80211.o
          以下省略
やはり20分ほどかかった。
rtl8812au.ko は 1.7M で不調だったものに比べ500Kほど増えている。
-rwxr--r-- 1 pi pi 1769328 3月 28 12:22 rtl8812au.ko
インストール †
pi@raspberrypi ~/rtl8812AU_8821AU_linux $ sudo make install
install -p -m 644 rtl8812au.ko /lib/modules/4.14.98+/kernel/drivers/net/wireless/
/sbin/depmod

これでは組み込まれなかったのでinsmodで組み込むと
pi@wp-test:~ $ lsmod
Module                  Size  Used by
sg                     21445  0
uas                    15036  0
rtl8812au            1287573  0
cfg80211              542402  1 rtl8812au
rfkill                 21476  3 cfg80211
snd_bcm2835            23253  0
snd_pcm                89814  1 snd_bcm2835
snd_timer              22428  1 snd_pcm
snd                    60280  3 snd_timer,snd_bcm2835,snd_pcm
uio_pdrv_genirq         3718  0
uio                    10038  1 uio_pdrv_genirq
fixed                   3033  0
ip_tables              12427  0
x_tables               22130  1 ip_tables
ipv6                  398081  34
root@raspberrypi:~# iwconfig
で動作確認。前とは違って見事動作していた。

このテストは実働システムを壊さないように新規のSDカードで実施したため、実働システムにドライバーを入れる必要がある。

ラズパイ用にアレンジされたソースのおかげで無事、realtekのwifiを動かすことが出来た。
しかし、これはテスト用に作ったSDカードでのことであり、wordpress等をインストールしている実働用のSDで動かすには、同じようなドライバーのコンパイルをすればよいが、折角wordpressなどが動いているSDカードでコンパイルの様な危険な操作はしたくない。

となるとどうするかと考え、もしかしてカーネルが同じなのだからドライバー本体であるrtl8812AU.koをコピーして認識されれば良いのではと思いつく。

 しかし、これも稼働用のSDカードではなく試しにwordpressをインストールしたのがあったのでこれで試してから上手くいけば正式に稼働用SDカードにコピーすることとした。
 ファイル共有してあるのでウィンドウズPCを経由してrtl8812AU.koをコピー
 それをドライバーの所定の位置にコピー
pi@raspberrypi:~ $ cd /lib/modules/4.14.98+/kernel/drivers/net/wireless/
pi@raspberrypi:/lib/modules/4.14.98+/kernel/drivers/net/wireless $ sudo cp ~/rtl8812au.ko

パーミッションを644に変更
pi@raspberrypi:/lib/modules/4.14.98+/kernel/drivers/net/wireless $ sudo chmod 64
4 rtl8812au.ko
pi@raspberrypi:/lib/modules/4.14.98+/kernel/drivers/net/wireless $ ls -l
合計 1880
drwxr-xr-x 6 root root    4096  3月 17 21:02 ath
drwxr-xr-x 2 root root    4096  3月 17 21:02 atmel
drwxr-xr-x 5 root root    4096  3月 17 21:01 broadcom
drwxr-xr-x 4 root root    4096  3月 17 21:01 intersil
-rw-r--r-- 1 root root   67816  2月 18 19:11 mac80211_hwsim.ko
drwxr-xr-x 5 root root    4096  3月 17 21:01 marvell
drwxr-xr-x 3 root root    4096  3月 17 21:01 mediatek
drwxr-xr-x 3 root root    4096  3月 17 21:01 ralink
drwxr-xr-x 6 root root    4096  3月 17 21:01 realtek
-rw-r--r-- 1 root root   47416  2月 18 19:11 rndis_wlan.ko
-rw-r--r-- 1 root root 1769328  3月 28 16:06 rtl8812au.ko
drwxr-xr-x 3 root root    4096  3月 17 21:02 zydas
認識させる
pi@raspberrypi:~ $ sudo depmod
lsmodで確認するが組み込まれていない。再起動が必要かも。
そこで強制的に
pi@raspberrypi:~ $ sudo insmod ./rtl8812au.ko
pi@raspberrypi:~ $ lsmod
Module                  Size  Used by
rtl8812au            1287573  0
ctr                     4422  2
ccm                    10611  3
arc4                    2332  2
rt2800usb              18197  0
rt2800lib              95872  1 rt2800usb
rt2x00usb              12185  1 rt2800usb
rt2x00lib              47572  3 rt2800lib,rt2800usb,rt2x00usb
mac80211              651286  3 rt2800lib,rt2x00lib,rt2x00usb
cfg80211              542402  3 rt2x00lib,mac80211,rtl8812au
rfkill                 21476  4 cfg80211
crc_ccitt               1654  1 rt2800lib
snd_bcm2835            23253  0
snd_pcm                89814  1 snd_bcm2835
snd_timer              22428  1 snd_pcm
snd                    60280  3 snd_timer,snd_bcm2835,snd_pcm
uio_pdrv_genirq         3718  0
uio                    10038  1 uio_pdrv_genirq
fixed                   3033  0
ip_tables              12427  0
x_tables               22130  1 ip_tables
ipv6                  398081  29
で組み込まれた。
確認する。
pi@raspberrypi:~ $ iwconfig
wlan1     IEEE 802.11bgn  ESSID:"0024A511B049"  Nickname:""
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:24:A5:11:B0:49
          Bit Rate:150 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=100/100  Signal level=100/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

lo        no wireless extensions.

wlan0     IEEE 802.11  ESSID:"0024A511B049"
          Mode:Managed  Frequency:2.462 GHz  Access Point: 00:24:A5:11:B0:49
          Bit Rate=135 Mb/s   Tx-Power=20 dBm
          Retry short  long limit:2   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=70/70  Signal level=-25 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:147   Missed beacon:0

pi@raspberrypi:~ $ ifconfig
lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 12  bytes 720 (720.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12  bytes 720 (720.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163  mtu 1500
        inet 192.168.0.80  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::fcb4:233a:cb8d:c72  prefixlen 64  scopeid 0x20
        ether 10:6f:3f:80:1e:0f  txqueuelen 1000  (イーサネット)
        RX packets 3680  bytes 2074049 (1.9 MiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 1578  bytes 214468 (209.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan1: flags=4163  mtu 1500
        inet 192.168.0.63  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::533c:a46d:765b:471f  prefixlen 64  scopeid 0x20
        ether 00:0f:00:73:eb:96  txqueuelen 1000  (イーサネット)
        RX packets 58  bytes 8723 (8.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 34  bytes 5967 (5.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
動いているようである。
当初のwifiドングルを抜いて、realtek単独で起動する。
正常に動いている。
raspi-config でアクセスポイントを5ギガにして完成である。

ゴミ
pi@raspberrypi:/usr/src $ sudo git clone https://github.com/diederikdehaas/rtl88
12AU
Cloning into 'rtl8812AU'...

pi@raspberrypi:/usr/src $ $ sudo mv rtl8812AU rtl8812AU-4.3.20
pi@raspberrypi:/usr/src $ ls -al
合計 20
drwxr-xr-x  5 root root 4096  3月 27 13:20 .
drwxr-xr-x 10 root root 4096 11月 13 12:56 ..
lrwxrwxrwx  1 root root   25  3月 27 13:07 linux -> linux-headers-4.14.79+
drwxr-xr-x 24 root root 4096  3月 27 13:03 linux-headers-4.14.98+
drwxr-xr-x 24 root root 4096  3月 27 13:03 linux-headers-4.14.98-v7+
drwxr-xr-x  8 root root 4096  3月 27 13:18 rtl8812AU-4.3.20

pi@raspberrypi:/usr/src $ DRV_NAME=rtl8812AU
pi@raspberrypi:/usr/src $ DRV_VERSION=4.3.20

pi@raspberrypi:/usr/src $ sudo dkms add -m ${DRV_NAME} -v ${DRV_VERSION}

Creating symlink /var/lib/dkms/rtl8812AU/4.3.20/source ->
                 /usr/src/rtl8812AU-4.3.20

DKMS: add completed.

pi@raspberrypi:/usr/src $ sudo dkms build -m ${DRV_NAME} -v ${DRV_VERSION}

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area...
'make' KVER=4.14.98+.................................................................................................................................................................................................................................................................................................................................................................................................................................
cleaning build area...

DKMS: build completed.
ラズパイZEROで約20分

pi@raspberrypi:/usr/src $ sudo dkms install -m ${DRV_NAME} -v ${DRV_VERSION}

8812au:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.14.98+/updates/dkms/

depmod....

DKMS: install completed.

再起動
i@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 0bda:a811 Realtek Semiconductor Corp.
Bus 001 Device 003: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub