"PS5のDualSense用Linuxドライバー"をコンパイルしてみる


# TL;DR 　PS5コントローラ用のデバイスドライバのモジュール作れました。

- ドライバはデフォルトで[ ] （オフ）なので、make menuconfigなりで有効にしてね！
- パッチにはバグがあるから、手動でなおしてね！

# はじめに

GIGAZINEさんで、面白そうな記事が出ていた。

PS5のDualSense用Linuxドライバーをソニーが公式に提供

https://gigazine.net/news/20201226-sony-ps5-dualsense-linux-driver/

>手元のUbuntu 20.10で記事作成時点の最新版であるLinux 5.10.2に上記のパッチをすべて適用し、「bindeb-pkg」コマンドを実行してカーネルをビルドしてみたところ、ビルドには成功するものの「hid-playstation」のカーネルモジュールが作成されず、ドライバーを利用することができませんでした。

ほほお！！よし検証してみよう。ただし、PS5は持っていないので、コンパイルできるかな、の確認。

Kernelは、同じ 5.10.2 、作業環境もubuntu 20.10で！


# Kernelをダウンロード。

```
$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.2.tar.xz
$ tar xxvf linux*.tar.xz
$ cd linux*
$ mkdir build
$ cp /boot/config-`uname -r` build/.config

```

などなど。このあたりは `https://gihyo.jp/admin/serial/01/ubuntu-recipe/0526?page=2` を参考にしましょうね。

# パッチを当てる

https://patchwork.kernel.org/project/linux-input/list/?series=404369

ここから、１つずつパッチ(diff)をダウンロードして、丹精込めて当てましょう……


# kernelの設定を有効にする

デフォルトだとOFFなので、これを有効にしましょうね。

`  > Device Drivers > HID support > Special HID drivers
 `

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/32ded68e-2279-cbaa-2c6a-82abe8351f6c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/ec623b2d-d37e-1bb3-37a4-877c7e3baf6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/1fc0a6e7-60b3-a183-ab86-5dd08c55a90b.png)

ここで、下記のように有効にしないとダメでしょうね。

```
<M> PlayStation HID Driver
[*]   PlayStation force feedback support
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89434/277ac122-55fc-bb87-25d6-8ccffd482593.png)


# コンパイルしてみたけど、エラーがでる

おやまあ、せっかくコンパイルしたけど、エラーが出る。

```
make[1]: ディレクトリ '/home/kmtr/linux/build' に入ります
  SYNC    include/config/auto.conf.cmd
  GEN     Makefile
  GEN     Makefile
  DESCEND  objtool
  CALL    /home/kmtr/linux/linux-5.10.2/scripts/atomic/check-atomics.sh
  CALL    /home/kmtr/linux/linux-5.10.2/scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  CHK     kernel/kheaders_data.tar.xz
  GEN     kernel/kheaders_data.tar.xz
  CC [M]  kernel/kheaders.o
  CC [M]  drivers/leds/led-class-multicolor.o
  CC [M]  drivers/hid/hid-core.o
  CC [M]  drivers/hid/hid-input.o
  CC [M]  drivers/hid/hid-quirks.o
/home/kmtr/linux/linux-5.10.2/drivers/hid/hid-quirks.c:567:3: error: expected expression before ‘{’ token
  567 | + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) },
      |   ^
make[3]: *** [/home/kmtr/linux/linux-5.10.2/scripts/Makefile.build:279: drivers/hid/hid-quirks.o] エラー 1
make[3]: *** 未完了のジョブを待っています....
make[2]: *** [/home/kmtr/linux/linux-5.10.2/scripts/Makefile.build:496: drivers/hid] エラー 2
make[2]: *** 未完了のジョブを待っています....
make[1]: *** [/home/kmtr/linux/linux-5.10.2/Makefile:1805: drivers] エラー 2
make[1]: *** 未完了のジョブを待っています....
make[1]: ディレクトリ '/home/kmtr/linux/build' から出ます
```

# パッチがバグっているっぽい気がする。

うーん、ここ間違ってるんじゃないかな？”＋”が邪魔。

https://patchwork.kernel.org/project/linux-input/patch/20201219062336.72568-8-roderick@gaikai.com/

 07-13-HID-playstation-add-DualSense-Bluetooth-support..diff

```
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index 1ca46cb445be..541c8837debd 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -567,6 +567,7 @@  static const struct hid_device_id hid_have_special_driver[] = {
 #endif
 #if IS_ENABLED(CONFIG_HID_PLAYSTATION)
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) },
++	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) },
 #endif
 #if IS_ENABLED(CONFIG_HID_PRIMAX)
 	{ HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
```

これだと、

```
 #if IS_ENABLED(CONFIG_HID_PLAYSTATION)
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) },
+	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) },
 #endif
```
になって、コンパイルエラーになる。なので、パッチを当てた後に"+"を削る必要がある。

```
 #if IS_ENABLED(CONFIG_HID_PLAYSTATION)
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) },
 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS5_CONTROLLER) },
 #endif
```

これでもう一度makeしたら、無事にhid-playstation.o ができましたね！

```
  CC [M]  drivers/hid/hid-samsung.o
  CC [M]  drivers/hid/hid-sjoy.o
  CC [M]  drivers/hid/hid-sony.o
  CC [M]  drivers/hid/hid-speedlink.o
  CC [M]  drivers/hid/hid-steam.o
＜略＞
  CC [M]  drivers/hid/usbhid/usbmouse.o
  CC [M]  drivers/hid/hid-playstation.o
  LD [M]  drivers/hid/hid.o
  LD [M]  drivers/hid/hid-logitech.o
  LD [M]  drivers/hid/hid-picolcd.o
```

# 結果発表

必要な、koはできておりますなー！ただし、動作確認は物がないのでできませーん！！

```
kmtr@ubuntu2010:~/linux/build$ find . -name "*.ko" | grep play
./drivers/usb/misc/appledisplay.ko
./drivers/usb/typec/altmodes/typec_displayport.ko
./drivers/media/rc/keymaps/rc-wetek-play2.ko
./drivers/hid/hid-playstation.ko
```


# まとめ： PS5コントローラ用のデバイスドライバのモジュール作れました。

- ドライバはデフォルトで[ ] （オフ）なので、make menuconfigなりで有効にしてね！
- パッチにはバグがあるから、手動でなおしてね！