honeylab's blog

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

PSCにUSB無線ドングルのドライバを入れようとしてハマった話

PSCに無線LANUSBを繋ぐ方法を標準化しようと思ってアレコレしている中で、
上手く行かない事象があったので記録しておきます。
多分ここに書いてあるようにすれば解決するし、PSC以外の似た環境でも発生しうることだと思います。

PSCのKernelはSONYからリリースされていて、configも整っているので、
make menuconfigからモジュールを設定してやれば自由にinsmod可能なモジュールを追加することができます。

f:id:honeylab:20190202205126p:plain

なので、適当に手持ちや安価に買える無線LANUSBドライバをコンパイルしてテストしていたのですが、せっかく使おうと思ったTP-LinkのTN-WN725を使うために

RTL8188EUの(stagingですが)ドライバをコンパイルし、insmodしたところカーネルがクラッシュしてしまいました。

[ 134.697838] <1>.(1)[1276:insmod]r8188eu: module is from the staging directory, the quality is unknown, you have been warned.
[ 134.703522] <1>.(1)[1276:insmod]Chip Version Info: CHIP_8188E_Normal_Chip_TSMC_D_CUT_1T1R_RomVer(0)
[ 134.729163] <2>.(2)[1276:insmod]Unable to handle kernel NULL pointer dereference at virtual address 00000004
[ 134.730441] <2>.(2)[1276:insmod]pgd = d96b8000
[ 134.731013] [00000004] *pgd=7f6db835
[ 134.731487] <2>-(2)[1276:insmod]Internal error: Oops: 817 [#1] PREEMPT SMP ARM
[ 134.732416] Modules linked in: r8188eu(C+) mac80211

 検索で引っかかるように↑に貼っておきます。

ぱっと見る感じ、NULLポインタアクセスっぽいのですが、
動作中に不安定なるとかならまだしも、stagingとはいえ、insmodした瞬間に落ちるようなバグが残っているとは思えません。
もしあったとしても、凡バグでちょっといじれば直せそうな気がしたので、
その近くにprintfを入れたり、insmodのパラメータでdebugを指定したりしてみました。

そうすると、どうやら usb_intf.c の

  memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);

 この行で落ちているようです。
メジャーなバグならもっと報告があるはず。ですが、数件レポートがあるだけで
解決したという報告もありません。


その周辺を見てみても、このアドレスを触っている文はありません。
で、pnetdevの型は…

struct net_device *pnetdev  

らしい。
もしかすると、特定のカーネルから急に構造が変わって対応していないのかもしれない、と思ってバージョン違いを見れそうなサイトを見てみました。

https://elixir.bootlin.com/linux/latest/source/include/linux/netdevice.h

 該当のメンバは

f:id:honeylab:20190202210500p:plain

1926行で宣言されていました。ズルズルっと上にたどってみていると

f:id:honeylab:20190202210622p:plain

ifdefの山…

そして偶然目に止まった

f:id:honeylab:20190202210735p:plain

この CONFIG_WIRESS_EXT

見覚えがある…

そう、昨日家に転がっていたGW-450D をコンパイルしようとして失敗し、検索して見つけた

メモがわりのブログ: Debian Sid + Linux 4.6-rc1でPlanex GW-450D KATANAを使う

を参考にしてこのフラグをセットしていたのだ。

どうやら、一部の無線LANのドライバで使用されるこのメンバを利用するモジュールconfigで選択した際に、このフラグがセットされるようだ。

 

PSCに内蔵されているカーネルではCONFIG_WIRESS_EXTがセットされていないため、構造体メンバの違うカーネルとドライバを組み合わせようとしてクラッシュするのは当然だ。

PSCには普通に考えたら無線LANドライバは入れないからな…
とはいえ、ソースツリーは、なんでそんな事になってるのよ…

今まで似たようなテストをしていてさらっと通っていたのは、多分カーネルも一緒にビルドして書き換えていたのできちんと組み合わせができていたからだと思う。
オリジナルのカーネルに戻していたので初めて気がついた。

というわけで、今後リリースされるカーネルではなにか適当な無線LANドライバをselectしておくことで、insmodできるドライバを増やせるように上記フラグをセットしておくといいんじゃないかな…

BleemSync1.0を使ってプレステクラシックにソフトを追加する(と、バグ回避方法)

modmyclassic.com

1.0はいつ出るんだ、2月30日じゃないのか、と言われ続けてましたが先日ようやくリリースされました。

0.xではUIもなく、手動で配置したゲームイメージを再構築するコンソールアプリと
ペイロードと呼ばれるプレステクラシック上で起動するスクリプト一式で構成されていましたが、
1.0ではWebサーバを内蔵し、USBケーブルでPCに接続するとAndroid Gadget(RNDIS)として認識され、ブラウザからゲームをアップロードできるようになりました。
詳しい使用方法は公式サイトからリンクされているYoutube動画を参考にするといいと思います。

 

ちょっとハマった点として、イメージを作成するときに自動的に .BIN .CUEファイルが作られていたのですが、プレステクラシック側ではどうも小文字拡張子でしか正常に動作しないようです。
そのため、最初はファイル名だけリネームしていたのですが、CUEファイル内にBINファイルの記述があり、こちらもbinに治す必要がありました。
この辺、アップローダで自動でハンドルできるようになるといいんですけどね。

ソースコードは全部公開されているので、誰か直してプルリクするんだ)

 

加えて、現時点では一部の機能(EMMCとUSBに入れたゲームを同時に内蔵メニューに表示させる)に日本タイトル版のコンソールでのみ発生するバグが有り、この機能を有効にしたままでは内蔵メニューの起動すらできない状態になっています。
そのため、公式サイトの使い方を参照した上で、以下のオプションを無効にすることで
USBに入れたメニューのみを表示する方法で使用することができます。

f:id:honeylab:20190126212655p:plain

日本版のプレステミニに含まれるゲームタイトルが格納されたDBのカラムに改行が含まれているせいで、EMMCとUSBのゲームをまとめるスクリプトが想定外の動作をしているようです(一時ファイルにCSVを使用していた)。
日本版以外ではそんなことはないので、昨日実行して詳細にデバッグするまで気づきませんでした。

近々パッチが出るはずですので、それまでは上のオプションを無効にしてください。

はい、というわけでやっとこさBleemSyncで動きましたよ、と。

 

CD-ROM driver On Playstation Classic

It is technical test.It is NOT useful to you.

I Use USB-IDE converter and 5-inch CD-ROM drive.

 

1. Stock kernel is not include scsi/cdrom driver.
 There are drivers for CD-ROM on Playstation Classic default kernel.

Dropbox - cdrom.tar.gz

2.Extract them and copy to working USB or any.

3. on console...

> insmod cdrom.ko
> insmod sg.ko
> insmod sr_mod.ko

4.Plug USB-IDE-CDROM drive to PSC

If insmod succeeded , /dev/sr0 will appear.

5.Mount filesystem

> mount -r -t iso9660 /dev/sr0 /tmp/cdrom/

You can read CD-ROM files on PSC.

f:id:honeylab:20190116001539p:plain

Can I create ISO on PSC... ? what tools...

 

Succeeded to working PlayStation Classic Rear-USB-Port as HOST

ぶっちゃけ私自身はこれそんなに重要な機能だと思ってなかったんだけど、
どうしても背面USBをOTGにして前面をすっきりさせたいっていう要望は結構あったみたいなのでアレコレしてみた。

 

まず、デフォルトのカーネルのオプションではOTGが無効になってる。

 ここで、コンパイルプションでOTGを無効にすると、microUSBのIDピンか、VBUSを見てUSBのモードを切り替えるコードも一緒に有効化される。
(というか、普通のAndroid携帯とかではそれでいい)

この状態でコンパイルするとコンパイルは通る。

が、PSCではIDピンやVBUSはSoCにつながっていないように見える。
IDピンやVBUSとの接続はDeviceTreeファイルで設定するらしいんだけど、
実際につながっているかどうかわからないので設定できない。
この状態でカーネルを起動させると、DTファイルに設定されてない、といってKernelが起動せず止まってしまう。


なので、DTファイルから読み込んで、IDピンの監視をするあたりを
まるっとコメントアウトしてしまう。
これでは切り替えができないように見えるのだが、
ソフトウェア切り替えを有効にするオプションがある。
これを使うと。

echo host > /sys/devices/platform/mt_usb/swmode

 のように起動中に強制的にHOSTモードに切り替えるようにできた。

とりあえず、使う人がいるので置き換えるファイルだけおいておく。

Dropbox - usb20_host.c.patch


SONYの公開しているファイルからこれを一個だけ置き換えて、

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-


make aiv8167_rockman_emmc_defconfig

してできたimageをPSCのBOOTIMG1から抽出したDTBとまとめてFITイメージにして
fastbootか起動してる状態からBOOTIMG1に書き込んでやればいいけど、
文鎮化したときに自分で治せる人以外やってはいけない

ここまで読んでわからない人には難しいけど
近いうちにBleemSyncの機能としてマージされると思うので待っててね

Big progress on Installing PSC custom kernel

BleemSyncの目標であるカスタムカーネルの書き換えについてDiscordのModMyClassicのメンバーで解析を進めていましたが、どうやらカーネルの書き込みについての目途が立ったようです。

もともとPSCのカーネル領域はBOOTIMG1/BOOTIMG2の二枚構成だったため、
何らかのアップグレード手段が残されていると考えられていました。
MISCパーティションに特定の値を書くとその辺が作動するようです。

とりあえず、一般的なUSBキーボードを認識してくれない(ignoreと表示される)オプションを外し、ようやく動きそうなBOOTIMGが出来上がって来たので、
fastboot経由で書き込んで見たところ、書き換えに成功しました。
flashコマンドが存在することは前から分かっていましたが、
動くかどうかを試すために何かを書き込むのはさすがに危なくて誰も試してなかったんじゃないでしょうかね。

まぁ、イメージの作成は一回目失敗してて文鎮化してるんですが(復活できた)

 

 > sudo fastboot flash BOOTIMG1 ../linux/myuboot.bin

fastboot: processing commands
fastboot: getvar:partition-type:BOOTIMG1[len:30]
fastboot:[download_base:0xfffffff044000000][download_size:0x0]
fastboot:[cmd:getvar:]-[arg:partition-type:BOOTIMG1]
fastboot: getvar:max-download-size[len:24]
fastboot:[download_base:0xfffffff044000000][download_size:0x0]
fastboot:[cmd:getvar:]-[arg:max-download-size]
fastboot: download:0053d3a0[len:17]
fastboot:[download_base:0xfffffff044000000][download_size:0x0]
fastboot:[cmd:download:]-[arg:0053d3a0]
fastboot: flash:BOOTIMG1[len:14]
fastboot:[download_base:0xfffffff044000000][download_size:0x53d3a0]
fastboot:[cmd:flash:]-[arg:BOOTIMG1]
cmd_flash: BOOTIMG1, 5493664 

 カスタムカーネルで起動したログを貼っておきます。

Custom kernel for PlayStation Classic startup log — Bitbucket
ちょっとオプション変えただけなので特に変わってるように見えないですが、

デフォルトはこっち

Playstation Classic UART login console startup log — Bitbucket

起動時に真っ先に見るここ

[ 0.000000] <0>-(0)[0:swapper]Linux version 4.4.22 (hiromitu@hiromitu-HP-ProBook-6560b) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) ) #10 SMP PREEMPT Tue Jan 1 16:47:59 JST 2019

[ 0.000000] <0>-(0)[0:swapper]Linux version 4.4.22 (mtk@b02b676401a1) (gcc version 6.2.0 (GCC) ) #1 SMP PREEMPT Sun Sep 9 15:21:14 UTC 2018
 

 が変わってると、あぁ書き換えてやったんだ、っていう達成感がありますね。

とりあえずHIDの周りをまともにしたので、あとはOTGですね。
わかる人がやればそんなにかからないと思いますが、わからんw

Embedding a USB hub into console detail explain

honeylab.hatenablog.jp\

I have worked to add 3rd USB port to PSC .

I must  expolain more detail for Add more USB port by embedding USB Hub method.

 

Prepared Parts and Tools.

1. Soldering Iron. Around 30W (boostable to about 100W)

2. Thin and soft wire such as UEW or colored wile from USB cable.

3. USB Hub PCB or DIY USB HUB kit.

 ex. nano hub 

www.tindie.com

www.aitendo.com

( I have teardown my cheap USB HUB)

f:id:honeylab:20181213085952p:plain

 

How to soldering

This picture is around of USB port.

f:id:honeylab:20181230215833p:plain

Around USB Port

There are 4 SMD resistors.
Two of them(15k ohm) are Pull-down resistor.It is available to remove safety because I connect USB Hub direct , this line level are fixed.
Other two resistors(22 ohm) are dumping resistor.It is used for wave stable , but short wire will take few effect.

f:id:honeylab:20181230215916p:plain

 

f:id:honeylab:20181230220246p:plain   f:id:honeylab:20181230220319p:plain 

Remove 4 registor.
Soldering Point comes out, but it is too small to pull out the wire.
So, I devise to cut two lines.

 

f:id:honeylab:20181230220748p:plain     f:id:honeylab:20181230220837p:plain

More wide area are available for pulling out wire.

 

Pass through a USB hub
f:id:honeylab:20181230220948p:plain

If your USB Hub has upstrem connector, You cut cable and direct connect with solder.

And USB hub's power will pull from microUSB's VCC pin.

 

Check Points.

1. Do not contact each lines or ground area.

2. Make short length wiring.

3. Confirm D-(DM,White Line Color), D+(DP,Green Line Color)

4. Dont forget VCC and GND line.

5. For good result , you shoud use short shieled cable if you can.

 

The explanation so far is theoretical.
Other man works make other result.
I will take a my console's picture and show it someday.

 

Any questions to hiromitu2120@gmail.com or twitter 

twitter.com

or 

honeylab (u/honeylab) - Reddit

some executable for psc shell (gdbserver , nano , etc )

Dropbox - rootfs.ext2.gz

PSCのハックに使っているバイナリ集です。

デフォルトで入っているbusyboxだといろいろ足りないのでアプレットたぶん全部入りと、gdbserverやらなにやらが入っています。

gunzip するとファイルシステムのイメージが出てくるので

 mount -o loop rootfs.ext2 (mountpoint)

とかでマウントして、適当にどうにかすると使えます。

入ってるexecutableのリストはこれ

そのほかにもいろいろ入ってるけど。

www.dropbox.com


わからないことがあればtwitterかdiscordで聞いてください。

 

There is my development binary tools build with buildroot.

if library missing 

set LD_LIBRARY_PATH environment value

Ask me on twitter or discord.