2018/12/06
PlayStation ClassicでDOOMを動かすまで
2018/12/03に発売されたSIEの「PlayStation Classic」についてです。
以降は製品名を「PSミニ」と略します。
お約束ですが
ここに書いてある情報の利用は自己責任でお願いします。
基本スペック
ニンテンドークラシックミニシリーズとは違い、MediaTek製SoCを採用しています。
- SoC: MediaTek MT8167A (4-core ARMv8)
- RAM: Samsung K4B4G1646D-BYMA x2 (合計1GB)
- eMMC: Samsung KLMAG1JETD-B041 (16GB)
- PMIC: MediaTek MT6392A
- USB Hub?: Realtek RTS5482
分解
SONY系ハードおなじみの「剥がすと保証は無効」のシールはなく、プラスドライバーのみで簡単に分解できます。
まぁ、保証とか投げ捨てる前提なので軽く動作確認した後に分解しました。
関係ありそうな箇所の説明
UART
いかにもそれっぽいパッドがUARTです。
HDMI端子がある側から、3.3V、TxD、RxD、GNDとなっています。
ロジックレベルは1.8Vです。3.3Vが出ているので勘違いしがちですが要注意です。
eMMC
以下に、eMMCの主要なピンの場所を示します。
ここで注意することは、D0ピンがビアを一切使わずに接続されています。 そのため、配線を保護しているレジストを削って接続するしかありません。
eMMCをPCに接続して読み書きしたい方は、以下のページをおすすめします。
【番外編】PlayStation Classic の eMMC をダンプする
fastboot
基板の右下の方にある、大きなパッド同士をショートさせながらPCへ接続することでfastbootに入れます。
しかし、fastbootでできることは現時点で分かっている限りではほぼ無いに等しいです。
fastbootでgetvar all→bootで同じSoCのタブレットのboot.imgを流したときの挙動、bootコマンド対応してない? pic.twitter.com/PyUqqtz1tU
— NV (@nvsofts) December 3, 2018
fastboot入る直前に一瞬USB-シリアル変換(CDC-ACM)で認識しますが、これはMediaTek製SoCで用意されているファーム焼きモードに関係するようです。
この件については、以下のページが詳しいです。
I have not read Playstation classic firmware yet but…
饒舌 (verbose) モード
裏面(SIDE B)にある特定のパッド同士をショートさせると、饒舌モード(と勝手に呼んでいます)に入ります。
このモードでは、通常表示されることのないsystemdの起動ログやログインプロンプトを見ることができます。
詳しい情報については、以下のページを参照してください。
Playstation Classic alternate startup log and realtime message
システムの構成
カーネルはAndroidカーネル(カスタム版Linux)、ユーザーランドはYoctoです。 SoC自体は64bitですが、システムとしては32bitで動いています。
eMMCのパーティション構成は以下の通りです。TEE(Trusted Execution Environment)があることに注目です。
Disk /dev/loop0: 30535680 sectors, 14.6 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): C907B807-D79F-48E2-9743-A7288A4540BA
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 30535646
Partitions will be aligned on 1024-sector boundaries
Total free space is 1085 sectors (542.5 KiB)
Number Start (sector) End (sector) Size Code Name
1 1024 17407 8.0 MiB 8300 BOOTIMG1
2 17408 33791 8.0 MiB 8300 BOOTIMG2
3 33792 34815 512.0 KiB 8300 SEC_RO
4 34816 35839 512.0 KiB 8300 MISC
5 35840 39935 2.0 MiB 8300 TEE1
6 39936 44031 2.0 MiB 8300 TEE2
7 44032 453631 200.0 MiB 8300 ROOTFS1
8 453632 535551 40.0 MiB 8300 ROOTFS2
9 535552 29895679 14.0 GiB 8300 GAADATA
10 29895680 30535551 312.4 MiB 8300 USRDATA
ルートファイルシステムはdm-verityのような正当性検証が行われていないため、書き換えし放題です。
ログイン可能にしたPSミニで、ps
コマンドやmount
コマンド等を実行した結果Gistにアップしています(容量が大きいので閲覧注意)
PlayStation Classic various logs
ちなみにゲームデータはきちんと暗号化されており、鍵の一部はTrustZoneで保護されているようです。
USBメモリを使ったアップデート機能
軽くeMMC内を調べていたときに存在自体は確認していたのですが、その後madmonkey氏が掘り下げて詳しい情報を出しています。
要約すると
- 接続されたUSBメモリの特定のボリュームラベル(SONY)とディレクトリをトリガーに、アップデートを試みる
- 対称鍵暗号で暗号化されているが、パスワードはeMMC内にある
- 任意のシェルスクリプトを動作させることができる
ということです。
詳しい情報はここには記載しませんが、調べれば出てきます。
DOOMを動かす
PSミニではディスプレイサーバとしてWaylandが使われています。
PrBoom+のSVN版がWaylandをサポートしているSDL 2.0に対応しているため、これを使うことにしました。
SDL 2.0のライブラリはPSミニに入っているため、PrBoom+をARM向けにビルドすることで動くはずです。
実際にやってみたところ、きちんと動きました。
PlayStation ClassicでDOOM(PC版)が動いた! PrBoom+のSDL2版をWayland上で動作させてる pic.twitter.com/lz6p6Gusph
— NV (@nvsofts) December 6, 2018
USBメモリから任意のシェルスクリプトを動かす技を使って自動実行させるようにしてみた、理論上は無改造本体でもOKなはず pic.twitter.com/xxCYAro9d0
— NV (@nvsofts) December 6, 2018
最後に
今回は
- BGA153のICのリボールとリワーク
- 顕微鏡下でのはんだ付け
など、勉強になったことも多かったです。
また、ハックに関する情報を公開している以下の方々へ感謝します。
- emuonpsp (@emuonpsp) 氏
- Takumi Sueda (@puhitaku) 氏
- きんのじ (@v9938) 氏
- ひろみつ (@bakueikozo) 氏
- Hakchi ResourcesのDiscordの関連チャンネルの方々
あと、カーネルのソース公開してくれませんかね・・・(なぜかここには無い)