honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

Add 3rd USB port on Playstation classic

 honeylab.hatenablog.jp

前の記事で書きましたが、PlaystationClassicには追加のUSBポートを簡単に取り付けられるような端子はありません。
しかし、ゲームを追加して2Pで遊ぶにはどうしてももう一つのUSBポートが必要です。
無くてもいいのですが、HUB、しかもセルフパワーのものが必要になってきます。

基板と本体の動作をよく確認していると、もともとのUSBコネクタの至近に
VBUSを制御しているようなFETらしきものがあります。

f:id:honeylab:20181213084343p:plain


どうやら、PSCは結構厳しめの電流制限管理をしているようです。
ここで電流を引っ張りすぎて本体の電源供給に問題が出ないようにしているのだと思います。

海外のサイトでも、USB3.0に対応しているような電流消費の大きめのUSBメモリはハブを介さないと動作しないという報告が多数出ています。

さて、実際の工作工程です。

ここまでを検証して、USBポートを増やすには、もともとのUSBコネクタの近くで
配線パターンをカットして、セルフパワーのHUBチップを経由してUSBポートを増設し、増設した一本をもともとのUSBコネクタに戻してやればいいということになります。

もともとのコネクタ付近はこの様になっていますが

f:id:honeylab:20181213084912p:plain  f:id:honeylab:20181213085027p:plain

このCPUからの線を取るために、22Ωのダンピング抵抗と15kのプルダウン抵抗は取っ払ってしまいます。米粒より小さいノミぐらいの部品です。

そして、細いUEWを使ってUSBの配線を一旦ユニバーサル基板で受けておきます。

そして、PSCの中に内蔵するためのHUBを準備します。

適当なUSBハブ(制御基板が取り外せるタイプのやつが便利です)を

パカっと割って、

åç 2018-12-11 22 37 00.jpg 

制御基板を取り外します。

セルフパワーで構築する必要がありますが、電源部分は自分で配線する必要があるので、バスパワーの安いやつでOKです。

 何個かHUBをぶち割って見ましたが、この形のHUBはだいたいこのような構造をしているようです。参考までに。

あ、いまさらいいますが、素人さんは真似してはいけませんよまじで。

取り外した制御基板を割り込ませて配線します。こんなかんじ。
また、もともとのコネクタのVBUSには先述のきつい電流制限がかかっていますので、
電源はmicroUSBコネクタのところからジャンパーで持ってきます。
電流制限がかからない状態になりますが、供給元のアダプタが音を上げるか燃えるかのどちらかです。

 

 

f:id:honeylab:20181213090116p:plain

f:id:honeylab:20181213090258p:plain

ここまで配線した時点で、一応動作確認をしておきます。
問題なく動作したようなので、ケースに穴をあけます。
本当はもともとのプレステのように拡張端子のふたを開けるギミックも欲しいのですが、そんなに心が強くないのでとりあえず直接USBコネクタを取り付けます。

 

f:id:honeylab:20181213090803p:plain

 

蓋をして完了!

 

 

これで2PコントローラとUSBメモリを同時に使っても本体周りをすっきりさせることができました!

 

尚、内蔵したHUBのポートはまだ2つ余っているので、本体内にUSBメモリを内蔵させてしまったり、無線LANドングルでも刺せばいいんじゃないですかね。

(Linuxカーネルソースが公開され、各種ドライバのコンパイルとinsmodが確認されましたので、たいていのUSB機器はこれからどんどん認識できるようになると思います)

 

 

 

No Additional USB Host Port in Playstation Classic

だれかがプレイステーションクラシックの基板には未接続のUSBポートがあると言っていたようですが、これは正しくありません。

 

f:id:honeylab:20181213012044p:plain


PSCの基板に搭載されているUSB Hubチップ"RTS5482"のデータシートが公開されていないうえにUSB Hubチップの近くに怪しげなパッドがあることからそのように推定した人がいるようですが、私は、以下の理由から、空きパッドはUSBではないと断定しています。

1.そもそもLinuxのブートログで、2 port HUBと言い切っている

[ 3.036296] <0>.(0)[31:kworker/0:1]hub 2-1:1.0: USB hub found
[ 3.037703] <0>.(0)[31:kworker/0:1]hub 2-1:1.0: 2 ports detected

SoCのUSBポートに接続され、USBのネゴシエーションをしたうえで2portと言っているので、それ以外の答えはありません。
何らかの設定によって2ポートに制限しているのではないか、という可能性は、
次の理由で否定します。

 

2.空きパッドに接続されている配線は、到底USBのものとは推測できない

f:id:honeylab:20181213013231p:plain


左からチップに入っているのはSoCからのUSB Upstreamで、

↓ 、 → の配線はそれぞれコントローラ1、2用のUSBの配線です。

このように、USBの配線は必ず2本並行で、直角を避けてカーブで曲げ、
長さも同じになるようにインピーダンスコントロールすることが必須です。

それに対し、↑ で引き出されている配線が空きパッドに接続されていますが、
この配線はペアでコントロールされていません。また、4本あるうちの
一本だけが〇で示した位置でビア経由でクロスしています。
ここにUSB信号を流したとして、実際問題が発生しないかもしれませんが、
基板設計としては絶対にありえません。

さらに、パッド周辺の端子をよく観察してみると、下図ような回路になっています。

f:id:honeylab:20181213014238p:plain

USB Hostの正しい回路は下図が基本です。

f:id:honeylab:20181213014525p:plain

上の図では、抵抗(推測)は電源線にプルアップが存在するのみですが、
USBでデータラインに介在するのはプルダウンとダンピング抵抗のみです。
上の回路ではUSBホストを構成できません。

上記の理由から、プレイステーションクラシックの基板に、

追加でUSBを取り付ける場所は無い、ということになります。

 

では、この8ピンパッドは何なのか、ということですが、
RTS5482のファームウェアの更新などに使うピン、と考えています。

これは同じメーカの別のUSB Host (3.0対応)チップのピン配置です。

f:id:honeylab:20181213015406p:plain

型番も違えば、もちろんピン数も違いますが、メーカが同じなら何となく
似たような位置に似たようなピンが来ることが多いです。
先述のように、USBの差動ペアが例外なく隣同士に配置されています。
左下にクロックI/Oがあるのも似ています。

では、それ以外のピンは何かというと、上側にある MISO/MOSI/SCS/SCKの4ピンです。
同じような位置にあり、テストやファームウェアなど開発時に使いそう、という目的でも相当かと思います。

f:id:honeylab:20181213015713p:plain

この図は、何か別の機器のSPI接続例ですが、これと比較してみると、
プルアップ抵抗が存在していたり、直接接続もあり似ている気がします。

やはり、USBではなく、専用のデバッグ用の端子と断定します。
夢がなくて残念ですが、技術的に考えると、このような結果です。

 

さて、とはいえプレイステーションクラシックのハック運用(ゲーム追加)には
今のところUSBメモリが必須で、2ポートしかないPSCでは
外付けUSBハブが必要になり、配線がごちゃごちゃしてしまいます。

そこで、本体からどうにかもう一本のUSBコネクタを生やすために
ごりっと基板を改造してしまい、どうにか動く形にすることができました。

写真はこんな感じ。

 

詳しくは次の記事で書きたいと思います。



 

Telnetd on Playstation classic

Succeeded.

Install my psc_slave script with lolhack technology.

 

This is test version.

DO NOT USE without UART console for fix brick.
DO NOT USE without UART console for fix brick.

 

< repository URL is not public now . testing >

 

DO NOT USE without UART console for fix brick.

DO NOT USE without UART console for fix brick.

 

after install psc_slave , Playstation classic can perform USB device.
if you connected to linux , see dmsg like this.

[32763.224401] usb 1-1: new high-speed USB device number 9 using ehci_hcd
[32763.845803] usb 1-1: New USB device found, idVendor=18d1, idProduct=0001
[32763.845807] usb 1-1: New USB device strings: Mfr=3, Product=4, SerialNumber=5
[32763.845810] usb 1-1: Product: Android
[32763.845812] usb 1-1: Manufacturer: Android
[32763.845813] usb 1-1: SerialNumber: 0123456789ABCDEF
[32763.876700] rndis_host 1-1:1.0: usb0: register 'rndis_host' at usb-0000:02:03.0-1, RNDIS device, 06:16:26:36:46:56
[32763.879860] cdc_acm 1-1:1.2: This device cannot do calls on its own. It is not a modem.
[32763.879970] cdc_acm 1-1:1.2: ttyACM0: USB ACM device
[32774.788595] usb0: no IPv6 routers present

You can see "rndis_host 1-1:1.0: usb0: register 'rndis_host' at usb-0000:02:03.0-1, RNDIS device, 06:16:26:36:46:56"

It explain you have RNDIS device (like LAN card).

Default script will setup PSC with 192.168.77.1 

You set your usb0 to 192.168.77.2

ex : > ifconfig usb0 192.168.77.1

You can ping to PSC

tmark@atde5:~$ ping 192.168.77.1
PING 192.168.77.1 (192.168.77.1) 56(84) bytes of data.
64 bytes from 192.168.77.1: icmp_req=1 ttl=64 time=2.91 ms
64 bytes from 192.168.77.1: icmp_req=2 ttl=64 time=2.49 ms
64 bytes from 192.168.77.1: icmp_req=3 ttl=64 time=3.65 ms
64 bytes from 192.168.77.1: icmp_req=4 ttl=64 time=1.30 ms
64 bytes from 192.168.77.1: icmp_req=5 ttl=64 time=2.54 ms
64 bytes from 192.168.77.1: icmp_req=6 ttl=64 time=1.53 ms
64 bytes from 192.168.77.1: icmp_req=7 ttl=64 time=2.51 ms

And telnet server worked.

You can connect with telnet.

f:id:honeylab:20181211091514p:plain

 

Wow!

 

You can see ttyACM0  but now not working for login..adjusting now.

 

Playstation classic in USB gadget mode

Playstation Classic UART login console startup log — Bitbucket

プレイステーションクラシックのLinuxの起動時のログに

[    2.172504] <2>.(2)[1:swapper/0][g_android][USB]android_init_functions: f->dev_name = f_ffs, f->name = ffs
  [    2.173818] <2>.(2)[1:swapper/0]file system registered
  [    2.174510] <2>.(2)[1:swapper/0][g_android][USB]android_init_functions: init ffs success!!
  [    2.175578] <2>.(2)[1:swapper/0][g_android][USB]android_init_functions: f->dev_name = f_mbim, f->name = mbim
  [    2.177002] <2>.(2)[1:swapper/0][g_android][USB]android_init_functions: init mbim success!!
  [    2.178077] <2>.(2)[1:swapper/0][g_android][USB]android_init_functions: f->dev_name = f_acm, f->name = acm
  [    2.179796] <2>.(2)[1:swapper/0][g_android][USB]android_init_functions: init acm success!!
  [    2.180869] <2>.(2)[1:swapper/0][g_android][USB]android_init_functions: f->dev_name = f_mtp, f->name = mtp

のような出力が出ていることには気づいていましたが、

プレイステーションクラシック、D+/D-のつながったUSBケーブルで、
PCなどにつなぐと電源がONにならないというのは知られていた挙動でした。

 

これを止めるために以下の手順を行います。

/usr/bin/start_pman の中には

CHG_INFO=$(cat /sys/module/musb_hdrc/parameters/charger_info)

touch $POWER_LOG
# disable SDP
if [ "$CHG_INFO" -eq "1" ]; then
echo $0: SDP power detected. 1>>/tmp/power.log 2>&1
if [ x"$VARIANT" = x"user" ]; then
echo 1 > /sys/class/leds/red/brightness
/sbin/shutdown -H now
fi
fi

下線のように、USBの状態(データ線が有効?)によって自動でシャットダウンするように記載されていました。

これを先頭に#を入れて無効化します。

これで、データUSBケーブルでPCと接続してもシャットダウンしなくなりました。

 

echo 0 > /sys/class/android_usb/android0/enable
echo rndis > /sys/class/android_usb/android0/functions
echo 224 > /sys/class/android_usb/android0/bDeviceClass 224
echo 1 > /sys/class/android_usb/android0/f_rndis/wceis 1
echo 1 > /sys/class/android_usb/android0/enable

プレイステーションクラシックのコンソールから叩き込むと

[ 2457.634708] <3>.(3)[583:sh][g_android][USB]enable_store: device_attr->attr.name: enable
[ 2457.635757] <3>.(3)[583:sh][g_android][USB]bind_config function 'rndis'/c0a9d880
[ 2457.636712] <3>.(3)[583:sh][g_android]rndis_function_bind_config MAC: 06:16:26:36:46:56
[ 2457.637771] <3>.(3)[583:sh]android_usb gadget: using random self ethernet address
[ 2457.639331] <3>.(3)[583:sh]rndis0: MAC b2:c9:41:17:4f:6f
[ 2457.640035] <3>.(3)[583:sh]rndis0: HOST MAC 06:16:26:36:46:56
[ 2457.640810] <3>.(3)[583:sh]android_usb gadget: cfg 1/c0a9d1ec speeds: high full
[ 2457.641896] <3>.(3)[583:sh][g_android][USB]enable_store: enable 0->1 case, device_desc.idVendor = 0x18d1, device_desc.idProduct = 0x1
root@aiv8167-rockman-emmc:/sys/devices/virtual/android_usb/android0# [ 2457.873261] <0>-(0)[0:swapper/0][g_android][USB]android_disconnect: dev->connected = 0
[ 2457.874298] <0>-(0)[0:swapper/0]android_usb gadget: [COM]composite_disconnect: reassign the complete function!!
[ 2457.875736] <0>.(0)[4143:kworker/0:3][g_android]android_work: sent uevent USB_STATE=DISCONNECTED, is_hwconnected=1
[ 2457.943789] <0>.(0)[4143:kworker/0:3][g_android]android_work: sent uevent USB_STATE=CONNECTED, is_hwconnected=1
[ 2457.948388] <0>-(0)[0:swapper/0][g_android][USB]android_disconnect: dev->connected = 0
[ 2457.949433] <0>-(0)[0:swapper/0]android_usb gadget: [COM]composite_disconnect: reassign the complete function!!
[ 2457.950848] <0>.(0)[4143:kworker/0:3][g_android]android_work: sent uevent USB_STATE=DISCONNECTED, is_hwconnected=1
[ 2458.035659] <0>.(0)[4143:kworker/0:3][g_android]android_work: sent uevent USB_STATE=CONNECTED, is_hwconnected=1
[ 2458.038963] <0>-(0)[0:swapper/0]android_usb gadget: high-speed config #1: android
[ 2458.039977] <0>-(0)[0:swapper/0]android_usb gadget: [COM]USB_REQ_SET_CONFIGURATION: value=0
[ 2458.041116] <0>.(0)[4143:kworker/0:3][g_android]android_work: sent uevent USB_STATE=CONFIGURED, is_hwconnected=1
[ 2458.042679] <0>-(0)[589:ui_menu]composite_setup: 5 callbacks suppressed
[ 2458.043561] <0>-(0)[589:ui_menu]android_usb gadget: [ratelimit]non-core control req21.43 v000c i0000 l0
[ 2458.044772] <0>-(0)[589:ui_menu]android_usb gadget: [COM]composite_setup: value=-95,bRequestType=0x21, bRequest=0x43
[ 2458.046118] <0>-(0)[589:ui_menu]android_usb gadget: [COM]composite_setup: w_value=0xc, w_length=0x0
[ 2458.047670] <0>-(0)[589:ui_menu]android_usb gadget: [ratelimit]non-core control req21.00 v0000 i0000 l24
[ 2458.048952] <0>-(0)[589:ui_menu]rndis_command_complete: MaxTransferSize: 2048 : Multi_pkt_txr: disabled
[ 2458.050420] <0>-(0)[589:ui_menu]android_usb gadget: [ratelimit]non-core control reqa1.01 v0000 i0000 l1025
[ 2458.051915] <0>-(0)[589:ui_menu]android_usb gadget: [ratelimit]non-core control req21.00 v0000 i0000 l28
[ 2459.524424] <1>.(1)[82:hwrng]hwrng: no data available

なんということでしょう、rndisが有効になりました。

ホストPCのほうでは

[ 6934.185491] rndis_host 2-1.2:1.0 enp0s29u1u2: unregister 'rndis_host' usb-0000:00:1d.0-1.2, RNDIS device
[ 6934.637480] usb 2-1.2: new high-speed USB device number 27 using ehci-pci
[ 6934.732399] usb 2-1.2: New USB device found, idVendor=18d1, idProduct=0001
[ 6934.732409] usb 2-1.2: New USB device strings: Mfr=3, Product=4, SerialNumber=5
[ 6934.732415] usb 2-1.2: Product: Android
[ 6934.732419] usb 2-1.2: Manufacturer: Android
[ 6934.732423] usb 2-1.2: SerialNumber: 0123456789ABCDEF
[ 6934.749300] rndis_host 2-1.2:1.0 usb0: register 'rndis_host' at usb-0000:00:1d.0-1.2, RNDIS device, 06:16:26:36:46:56
[ 6934.774778] rndis_host 2-1.2:1.0 enp0s29u1u2: renamed from usb0
[ 6934.802860] IPv6: ADDRCONF(NETDEV_UP): enp0s29u1u2: link is not ready

と表示され、見事にデバイスとして認識されたことを示しています。

続いて、PSCのほうでIPを割り当てます。

ifconfig rndis0 192.168.100.100

ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

rndis0 Link encap:Ethernet HWaddr B2:C9:41:17:4F:6F
inet addr:192.168.100.100 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:18 errors:18 dropped:0 overruns:0 frame:18
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1356 (1.3 KiB) TX bytes:879 (879.0 B)

続いて、ホストには 192.168.100.101 を割り当てましょう

で、PSCからpingを打つと…

f:id:honeylab:20181209235610p:plain

 すごいすごい!!!

RNDISのほかにも、各種ドライバが準備されていました。

f:id:honeylab:20181209235728p:plain

 

全部が有効にできるかはわかりませんが、少なくともf_mass_storageは使うことができました。

たぶん次にやると便利なのはシリアルガジェットですが、まだ試してません。

これがうまく使いこなせると諸々ハックがしやすくなりますね。

ファイル転送にUSBを使わなければいけなかった分が減るだけでも、面白いことは増えそうです。

 

Playstation Classic is full controlled from UART console.

わーい、I have got root. ぶっちゃけもうHack completeだよ.

 

 以下の方々の解析結果との合わせ技です。

たくさんの解析経過があるのでぜひ辿ってみてください。

 

twitter.com

 

twitter.com

twitter.com

twitter.com

I have not read Playstation classic firmware yet but...

honeylab.hatenablog.jp

事前画像から推測していた謎パッドは確かにfastbootへの入り口でした。
このパッドをショートしてPCにUSB接続することでfastmodeに入れました。

 

さて、いままでAndroid系はあまりいじってないのでfastmodeとやらも全然わかってなかったのですが、調べてみると、どうやらMediaTek系の携帯(スマフォ)のファームウェアの読み書きと同等に扱えるような気がしてきました。

 

パッドショートによる動作が多少特殊で、一瞬VCOMポートに見えて、その直後にはMT Preloaderというデバイスになるようです。

しかし、SP Flash Toolなどのファームウェア読み書きツールでコマンドを設定したあと、
パッドショートでUSB接続させると、デバイスの挿入をハンドルしてコマンドを発行できることが確認できました。

しかし、scatterファイルというSoCの定義ファイルがまず必要で、
さらに、読み書きしているBROM.DLLとやらがMT8176に対応していないといけないようです。

 

では、MT8176を搭載している中華携帯用の書き換えツールを探してみようとしたのですが…

Mediatek mt8173 / mt8176 development : Android

ここに記載されてるFirmwareを片っ端から落としても、なぜかMT8173の定義ファイルしか入っていません。

他にもいろいろ調べてみたのですが、もしかするとMT8176とスペック表記されている携帯機種は実はフェイクで、MT8173が搭載されているのではないか、という疑惑もあるようです。

 

闇!

 

というわけで、チップの対応している部分(BROM.DLL)を探す&ツールのアップデートが必要そうです。