honeylab's blog

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

Hack to avoid for PSC ignore almost of Keyboard or Mouse with Bluetooth

You know, press some keyboard on PSC show emulator menu, 

but almost of keybord is ignored by PSC kernel.

Because kernel is built with this config.

"ignore USB Mouse and Keyboard"

 Some of keyboard which it can work on PSC , it is reading raw USB code.

f:id:honeylab:20181219105341p:plain

this code shows kernel blocks any USB-Keyboard or USB-Mouse to use HID device.

I can remove because this is built-in driver .

 

Then , I will use Bluetooth keyboard or Mouse

BT-keyboard or Mouse will not be handled USB-HID but Bluetooth HIDP layer.

 

Compile bluetooth kernel modules from Sony OSS linux kernel.

GitHub - bakueikozo/psc_bluetooth

There are pre-built bluetooth kernel module drivers and bluz binalies executable.

insmod with my script

insmod drivers/bluetooth.ko
insmod drivers/bcm203x.ko
insmod drivers/btbcm.ko
insmod drivers/btintel.ko
insmod drivers/btmrvl.ko
insmod drivers/btqca.ko
insmod drivers/btrtl.ko
insmod drivers/btsdio.ko
insmod drivers/ath3k.ko
insmod drivers/btusb.ko
insmod drivers/bpa10x.ko
insmod drivers/hci_uart.ko
insmod drivers/hci_vhci.ko
insmod drivers/hidp.ko

 

 BT keyboard and mouse are used as /dev/input[n] 

And some Bluetooth Gamepad are woked on PSC!!

 

 

 

Playstation Classic Online ? (USB-Ethernet and USB-WiFi )

USB-有線LANデバイスの動作確認はすでに @NV 氏によって行われていたのですが、

twitter.com

ロスコンパイルよくわかんないおじさんはなかなか追いつけずに先日ようやくネットにつなげることができました。

カーネルモジュールのコンパイルとPSCへのコピー、insmodが必要ですが、
以下のデバイスが同じモジュールで認識できました。

f:id:honeylab:20181217151748p:plain

Logitec LAN-TXU2C

BUFFALO LUA3-U2-AGT

BUFFALO LUA3-U2-ATX

BUFFALO LUA-U2-KTX

そのうち帯域とか調べてみたいと思います。

 

 

続いて、ネタで時々上がっている無線LANドングルですが
あれこれ頑張った結果、ついに認識しました。

f:id:honeylab:20181217151912p:plain

 

BuffaloのWLI-UC-GNM2Sでrt2800ドライバを導入しました。

PlayStationClassicに挿したドングルをad-hocに設定し、

iPhoneからも検出できますので、iPhonetelnetクライアントでPSCをいじることもできます(何の役にも立たない)

f:id:honeylab:20181217152255p:plain

 

さて、だんだん自動化もできてきたのでスクリプト化してパッケージ化したいところなんだけど…

 

Playstation Classic MOD chip for avoid USB current limitation

電流制限回路の制限電流設定用の抵抗値を変更することで、
本体ポートの電流制限値を引き上げることができました。
上流の回路を確認していないので本当に問題ないかどうかまでは確認していませんが、
とりあえずセルフパワーのハブとUSBメモリ3本とコントローラを同時に認識できています。

f:id:honeylab:20181215233658p:plain

----------------------------------------------------------------------------

in Reddit, u/saaguirre has tested USB power load.

More experiments on USB mystery. Trying to find USB ports supply limit : PlaystationClassic

And he have found datasheet.

f:id:honeylab:20181215214049p:plain

 

This Chip is not FET, but USB current limit IC TPS2533.

label "15JL" is match.

http://www.ti.com/lit/ds/symlink/tps2553d.pdf

 

f:id:honeylab:20181215213945p:plain

f:id:honeylab:20181215213548p:plain

 

This parts works as current limitter for USB port avoid over-current.

f:id:honeylab:20181215214333p:plain

But , in PSC , I wonder it is designed for avoid connection 3rd-party controllers,HUBs,USB Flashes.

 

BTW, We can avoid this USB current limitation with canging RLIM resistor.

This graph is shows between RLIM and Current Limit.

f:id:honeylab:20181215215112p:plain

 

f:id:honeylab:20181215220502p:plain

There are series resitors are 6.2kΩ + 220kΩ.
It is 100mA setting on above table and Sony used just this value.

 

So, I want to more current , such as 500mA , use < 45kΩ.

 (226.2 * x) / (226.2 + x )< 45  , x < 56 

Use <56kΩ resistor.

f:id:honeylab:20181215222610p:plain

So ,Lets solder 56KΩ resistor to (1) or (2) point.

f:id:honeylab:20181215232839p:plain

Oh...I have not 56k just now.. but I can use 47k temporary!

If I will use 47k  , total resistance is 39k.
This value works limitter for 600mA - 700mA.

 

Don't Worry!!!!

 

This is my MOD Chip !!!

f:id:honeylab:20181215233942p:plain

Solder It! 

 

f:id:honeylab:20181215233112p:plain

This modification release current limit, but some problem will occur what I didn't know.

 

f:id:honeylab:20181215233658p:plain

 

I can use three USB flash driver and controller with non-powerd HUB on Port1.

Before this work , It was impossible.

f:id:honeylab:20181215233748p:plain



You can use OTG Cable or Powered-HUB for such using.

This is a experiment.

 

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を使わなければいけなかった分が減るだけでも、面白いことは増えそうです。