PIMORONI Pirate AudioをRaspberry Pi 3で使う

## 目的 ##
PIMORONIから出ているPirate Audioという1.3インチ240x240のカラーディスプレイとPCM5100が乗ったHATをRaspberry Piで使えるようにする。Raspberry Pi用に作ったX上で動くシンセサイザーアプリを動かすことが目標。

Bookwormだとこの方法ではX11の表示ができなかった。

## 用意するもの ##
* Raspberry Pi 3 (4でもZero 2でも良いと思う）
* [PIMORONI Pirate Audio](https://shop.pimoroni.com/collections/pirate-audio?sort=new) (何種類かあるがどれでも)
* SD Card (8GB以上)
* USB-MIDIキーボードなどなんらかのMIDI入力装置
* 電源とUSBケーブル

## 準備 ##
* Pirate AudioをRaspberry Pi 3に乗せる。
* SD CardにRaspbianを焼いておく。
* Raspberry Pi ImagerでOperating SystemにRASPBERRY PI OS (32BIT)を選択、SD Cardを選択してWRITE。
* 焼き上がったらSDカードを差し直してsshという名の空ファイルを/bootに置いておく。
* SDカードをRaspberry Pi 3に挿して電源を繋いで起動、SSHでログインする。

```ローカルからSSHで接続.
$ ssh pi@XXX.XXX.XXX.XXX
```

## 設定作業 ##
[ここ](https://akkiesoft.hatenablog.jp/entry/20201222/1608562800?fbclid=IwAR21UpZ5gxlHXWizCjOK8D4aXRnPlsn6swv30kxhmiUFSaaIl6DrGDpmSU0)の説明が神でした。さらにそのオリジナルは[ここ](https://forums.pimoroni.com/t/headphone-amp-for-raspberry-pi-with-fbtft/12750/8)とのこと。ここでの説明はほぼほぼ復唱のような内容です。

### pidi.dtboの作成 ###
[device tree overlay to use pidi with fbtft driver for rpi 2 B · GitHub](https://gist.github.com/hgroll/2731ae6d05350df663b123615f765bf5#file-pidi-overlay-dts)の右上にあるDownload Zipをクリックしてファイルをダウンロードして解凍する。pidi-overlay.dtsというファイルができるので、それをテキストエディタで開き、

```
reg = <0>;
となっている行を
reg = <1>;
```
に変更、

```
led-gpios = <&gpio 13 1>;
となっている行を
led-gpios = <&gpio 13 0>;
```

に変更、保存する。理由は[ここ](https://akkiesoft.hatenablog.jp/entry/20201222/1608562800?fbclid=IwAR21UpZ5gxlHXWizCjOK8D4aXRnPlsn6swv30kxhmiUFSaaIl6DrGDpmSU0)で説明されています（ボクはよくわかりません）。変更したファイルをRaspberry Pi 3に転送する。

バックライトのLEDに関しては、OSのバージョンによって0で動く場合と1で動く場合がある模様。最近のOSだと1っぽい。

```ローカルのターミナルで行う.
$ scp [ローカルのファイルの保存場所]/pidi-overlay.dts pi@XXX.XXX.XXX.XXX:~/
```

その後、Raspberry Pi 3にSSHで接続し、下記を行う。

```リモートで行う.
$ sudo dtc -@ -I dts -O dtb -o /boot/overlays/pidi.dtbo pidi-overlay.dts
```

Warningが3つほど出るが無視してOK。/boot/overlays に pidi.dtboができていれば成功。

### LocaleとTimezoneの設定 ###

```リモートで行う.
$ sudo raspi-config
```

* Localization Options→Localeでen-GBを解除、en-US.UTF-8 UTF-8をチェック、ja-JP.UTF-8 UTF-8をチェックしてOK。en_US.UTF-8を選択してOK。
* 再びLocalization Options→Timezone→Asia→TokyoでOK。
* 三度Localization Options→WiFi Country→JP JapanでOK。
* Finish
* Would you like to reboot now?でYes

### /boot/config.txtを編集 ###

```リモートで行う.
$ sudo nano /boot/config.txt
```

下記の3行の頭の#を取って有効にする。

```/boot/config.txt
dtparam=i2c_arm=on
dtparam=i2s=on
dtparam=spi=on
```

内蔵オーディオを無効にする（on→off）。

```/boot/config.txt
# Enable audio (loads snd_bcm2835)
dtparam=audio=off
```

ディスプレイの解像度を変更するために下記を[all]の下に追記する。

```/boot/config.txt
hdmi_force_hotplug=1
hdmi_cvt=240 240 60 1 0 0 0
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
```

ディスプレイとオーディオのドライバを有効にするために下記を追記する。

```/boot/config.txt
dtoverlay=pidi
dtoverlay=hifiberry-dac
gpio=25=op,dh
```

Ctrl+X、Y、リターンで保存する。

### /boot/cmdline.txtを編集 ###

```リモートで行う.
$ sudo nano /boot/cmdline.txt
```

下記をrootwaitの後に下記を挿入。コンソールの出力をHDMIでなくLCDにする。

```/boot/cmdline.txt
fbcon=map:10 fbcon=font:VGA8x16
```

保存する。

### コンソールの文字サイズの設定 ###

```リモートで行う.
$ sudo dpkg-reconfigure console-setup
```

起動したら色々聞かれるが、“UTF8”を選択、“Guess optimal…”を選択、“Let the system select…”を選択、 “8x16”を選択、“Ok”で終了。

ここで一旦リブート。

```リモートで行う.
$ sudo reboot
```

再起動して画面左上にカーソルらしきものが表示されていれば成功。

### Xがディスプレイ上で動く様にする (fbcpを使わない版) ###

```リモートで行う.
$ sudo mkdir /etc/X11/xorg.conf.d
$ sudo nano /etc/X11/xorg.conf.d/99-fbdev.conf
```

下記を記述。

```/etc/X11/xorg.conf.d/99-fbdev.conf
Section "Device"  
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb1"
EndSection
```

Raspberry Pi 4の場合はfb0だと動いた。

```/etc/X11/xorg.conf.d/99-fbdev.conf
Section "Device"  
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb0"
EndSection
```


### fbcpのインストールとXの設定 (上記ができなかった場合) ###
これは64bit版では動かなかった。あと、Raspberry Pi Zero 2でも動かなかった。理由はPrimaryのDisplayが見つからないというエラーっぽい。

諸々インストールが必要なのでapt-getの準備。

```リモートで行う.
$ sudo apt-get update
```

gitが必要なのでインストール。使用したOSのイメージによってはすでに入っているかも。

```リモートで行う.
$ sudo apt-get install git -y
```

cmakeも必要なのでインストール。

```リモートで行う.
$ sudo apt-get install cmake -y
```

もしエラーが出たら下記をしてから。

```
$ sudo apt update --allow-releaseinfo-change
```

fbcpをgithubから入手、ビルド。

```リモートで行う.
$ git clone https://github.com/tasanakorn/rpi-fbcp.git
$ cd rpi-fbcp
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo cp fbcp /usr/bin
$ sudo chmod +x /usr/bin/fbcp
$ sudo nano /etc/rc.local
```

/etc/rc.localの"exit 0"の前に下記を追記。

```/etc/rc.local
/usr/bin/fbcp &
```

ここでreboot。

```リモートで行う.
$ sudo reboot
```

再起動後に一瞬のフラッシュスクリーンの後デスクトップが画面に表示されればここまで成功。画面が小さくて初期設定は終了できない.

### Tight VNC Serverをインストール ###

```リモートで行う.
$ sudo apt-get install tightvncserver
$ tightvncserver
```

VNC接続のパスワードを聞かれるので入力。"Would you like to enter a view-only password (y/n)?"はNで。

VNCでRaspberry Piに接続。Macの場合、FinderのGoメニューからConnect to server...でvnc://raspberrypi.local:5901と入力しConnect。さっきのパスワードを入れて接続。初期設定は
* Country=Japan、Language=Japanese、Timezone=Tokyoで、Use English languageにチェックを入れる。
* Change PasswordはそのままNextでもOK。
* Setup ScreenはそのままNext。
* WiFiは繋ぎたかったら設定。
* Update SoftwareはSkip。
* Done。

tightvncserverを自動起動するには下記の方法でできた。が、.xsessionを使ってアプリの全画面起動を行う場合はやってはだめ。
https://www.handsonplus.com/electronic-works/how-to-use-tightvnc-with-raspi/


### スリープを無効にする ###

```リモートで行う.
$ sudo nano /etc/xdg/lxsession/LXDE/autostart
```

末尾に下記を追記。

```/etc/xdg/lxsession/LXDE/autostart.
@xset s off
@xset s noblank
@xset -dpms
```

```リモートで行う.
$ sudo nano /etc/lightdm/lightdm.conf
```

末尾に下記を追記。

```/etc/lightdm/lightdm.conf
[SeatDefaults]
xserver-command=X -s 0 -dpms
```

### オーディオスレッドのプライオリティ設定 ###

```リモートで行う.
$ sudo nano /etc/security/limits.conf
```

下記を # End of fileの前に追加。

```/etc/security/limits.conf
@audio           -       rtprio          99
@audio           -       memlock         unlimited
@audio           -       nice            -10

@realtime        -       rtprio          99
@realtime        -       memlock         unlimited
@realtime        -       nice            -10
```

リブート。

```リモートで行う.
$ sudo reboot
```

以上。