honeylab's blog

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

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