ラズパイで設定するemmcのpSLCモード有効化

たまたまpSLCの存在を知って、そこからいろいろ情報を集めて知ったものです。
もしかしたらまた知見が必要になるかもしれないので、備忘録として置いておきます。

:::note warn
一度pSLC化すると、元のMLCやTLCの状態に戻すことはできません。
この記事を参考に操作を行う場合は、自己責任で進めていただければと思います。
:::

## pSLC?
> pSLC(Pseudo SLC: 疑似SLC) modeは、本来はひとつのセルに複数bitのデータをprogramできるMLC NANDやTLC NANDにおいて、1bit分のみのデータをprogramするmodeを指します。つまり、本来は複数bitのデータが使用できるNANDを疑似的にSLC NANDとして使用することからpSLCと呼ばれています。
> 
> このような制御方法をおこなうと、記憶容量としては減少してしまいますが、セル内部の電荷密度及び注入頻度も減ることから、高寿命が期待できる信頼性の高い使用方法になります。

https://emb.macnica.co.jp/articles/10490/

容量を犠牲に信頼性があげられるみたいです。


## 設定に使用した環境
- Raspberry Pi 4
    - Raspberry Pi OS Lite (64bit)
- emmc (FEMDNN064G-A3A56)
    - `E2M2 064G` というSteamDeckで使われているらしいストレージから取り外しています。


## emmcの準備
SteamDeckで使用されているemmcが手に入ったので、基板から剥がして変換基板に載せました。
基板のガーバーデータは[ここ](https://github.com/voltlog/emmc-wfbga153-microsd)のものを使用しています。
![IMG_7130.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478491/c1d13c0f-e2dc-ed60-52eb-7ca2d8c969cf.jpeg)



## ラズパイをUSB経由で起動
emmcの操作をする場合ラズパイ本体のSDカードスロット経由で接続する必要があるため、OSはSDカード以外から起動する必要があります。
私はこのページを参考に設定しました。

https://raspida.com/rpi4-ssd-usb-boot


## emmcの設定変更

### 必要なパッケージの取得

```bash
$ sudo apt update && sudo apt install -y mmc-utils
```

### emmcの情報の確認　
```bash
$ sudo mmc extcsd read /dev/mmcblk0 | grep -A1 MAX_ENH_SIZE_MULT
Max Enhanced Area Size [MAX_ENH_SIZE_MULT]: 0x00099a
 i.e. 20135936 KiB
```
このemmcの場合、最大約20GB前後のサイズの領域を用意できるようです。

### 設定
今回は全領域をpSLCとして設定したいので、上で確認した最大容量を入力して設定をします。
**ここで入力する数字を間違えるとやり直しができないみたいなので、注意してください。**
（mmcコマンドを使ったパーティション設定をこの後も行う場合、`-y`オプションを使うと追加設定ができなくなるようです。追加設定をする予定がある場合は`mmc help`等で詳細を確認してください。）
```bash
$ sudo mmc enh_area set -y 0 20135936 /dev/mmcblk0
Enhanced User Data Area Size [ENH_SIZE_MULT]: 0x00099a
 i.e. 20135936 KiB
Max Enhanced Area Size [MAX_ENH_SIZE_MULT]: 0x00099a
 i.e. 20135936 KiB
Done setting ENH_USR area on /dev/mmcblk0
setting OTP PARTITION_SETTING_COMPLETED!
Setting OTP PARTITION_SETTING_COMPLETED on /dev/mmcblk0 SUCCESS
Device power cycle needed for settings to take effect.
Confirm that PARTITION_SETTING_COMPLETED bit is set using 'extcsd read' after power cycle
```

```bash
$ sudo mmc extcsd read /dev/mmcblk0 | grep PARTITION_SETTING_COMPLETED
Partitioning Setting [PARTITION_SETTING_COMPLETED]: 0x01
```

### 設定の確認
データが入ったまま設定変更しても、パーティション等の情報はそのままみたいですね。
```
 $ lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda            8:0    1 14.8G  0 disk
|-sda1         8:1    1  256M  0 part /boot
`-sda2         8:2    1 14.6G  0 part /
mmcblk0      179:0    0 19.2G  0 disk
|-mmcblk0p1  179:1    0  256M  0 part
`-mmcblk0p2  179:2    0 18.9G  0 part
mmcblk0boot0 179:32   0    4M  1 disk
mmcblk0boot1 179:64   0    4M  1 disk
```

パーティションを雑に弄ってfdiskを叩いて情報表示するとこうなりました。
```bash
 $ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 19.2 GiB, 20619198464 bytes, 40271872 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x64561452

Device         Boot Start      End  Sectors  Size Id Type
/dev/mmcblk0p1       2048 40271871 40269824 19.2G 83 Linux
```

## 速度比較
ここを参考にベンチマークをしてみました。

https://blog.turai.work/entry/20180804/1533378243

### 設定前
```
Seq-Read 41.916
Seq-Write 40.236
Rand-Read-512K 40.459
Rand-Write-512K 37.611
Rand-Read-4K 15.575
Rand-Write-4K 12.635
Rand-Read-4K-QD32 22.944
Rand-Write-4K-QD32 25.661
```

### 設定後
```
Seq-Read 42.564
Seq-Write 41.253
Rand-Read-512K 41.514
Rand-Write-512K 39.643
Rand-Read-4K 15.548
Rand-Write-4K 13.34
Rand-Read-4K-QD32 23.003
Rand-Write-4K-QD32 25.481
```

気持ち書き込み速度が増えています。


## さいごに
今回はmicroSD化したemmcをラズパイに繋いで設定を調整しました。
実際の耐久性は正直分からないですが、今回準備したemmcにはとりあえず家のhomebridgeサーバの一部として働いてもらいます。


## 参考にしたページ

EnhancedAreaSizeの設定はここを参考にしました。
https://www.embeddedartists.com/wp-content/uploads/2020/04/Working_with_eMMC.pdf