honeylab's blog

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

メガドライブミニに一般的なUSBアーケードスティックを直接接続して使えるようにする

メガドライブミニが発売されて2週間。

いろいろなハックをしてきましたが、やっておきたかったこの改造が成功したので記録しておきます。

(※この記事の内容は技術的検証であり、完全に再現可能な手順を記したものではありません。この手順で行ったことをもとに、平均的なユーザが利用可能なツールがリリースされる可能性はゼロではありません。平均的なユーザが、現在できることではそのリリースを待つことです。)

 

※検索でたどり着いた方へ※

このページには技術的情報がまとめてあります。

 市販のゲームコントローラメガドライブミニで使用するには
こちらのコンバータを使用するのが最もかんたんで確実です。 

【MDミニ用】スーパーコンバーター(PS4/PS3用コントローラ対応) - メガドライブミニ

【MDミニ用】スーパーコンバーター(PS4/PS3用コントローラ対応) - メガドライブミニ

  • 作者: 
  • 出版社/メーカー: コロンバスサークル
  • 発売日: 2019/12/09
  • メディア: Video Game
 

 

過去の記事にも書きましたが、メガドライブミニではいわゆるファームウェアLinux)の設定で、特定の公式サポートゲームパッドしか接続・認識できないことがわかっています。

honeylab.hatenablog.jp

また、偶然USBのVIDやPIDが一致したパッドでも、上下左右のキーが正しく入力できなかったり、ボタンのマップがめちゃくちゃで、ろくにゲームができない、という状態のようです。

そんな中、

www.4gamer.net

このような製品もサードパーティから発売されるようで、一般的なユーザはこの変換アダプタを購入して使用するのがいいのではないか、と思われます。

しかし、これ一本 5,480 円するようで…
処理内容を考えると、全く妥当ではあるんです。しかし、じゃぁこれを使ってアケコンで対戦する、となったらx2本で一万円かかってしまうわけで。

もちろん、それも一つのやり方ですが、ここはメガドラミニのほうを書き換えて
一般的なアケコンを使えるようにしてしまえ、というハックが成功しました。

 

使用したアーケードスティック

 今回使用したアーケードスティックは、iBUFFALOの「ARCADE STICK 13Ⅱ」

(BSGPAC02BKBC)というものです。
近所のハードオフのジャンクコーナーにありました。

ジャンクコーナーにあったので、動作が不安だったのですが、どうやらボタンやスティックが前オーナーによってマルっと交換されているだけで、動作には問題はありませんでした。
ボタンの交換がジャンクコーナー行きの理由だったようです。

 

どうやってつくったか

メガドラミニの内蔵謹製エミュレータがどのようにしてコントローラ入力を読み取っているのかをまず観測してみます。

Linuxシステムコールの呼び出しを観測できる「strace」ツールをメガドライブミニに入れて動かしてみます。

# /rootfs_data/strace -e trace=open -ff /usr/game/m2engage

すると、

[pid 29051] open("/dev/input/event4", O_RDONLY|O_LARGEFILE) = 8

という部分が見つかりました。
どうやら、/dev/input/event4を読んでいるようです。

 このデバイスは、Linuxソースコード evdev.c をHUBのポート番号によって番号が固定されるようにオリジナルのソースから改変することで実現されていました。

 

純正のメガドライブパッドを接続したとき、event4がどのようなイベントを受け取っているのか、「evtest」ツールで確認します。

 Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0xca3 product 0x24 version 0x111
Input device name: "6B controller"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 288 (BTN_TRIGGER)
Event code 289 (BTN_THUMB)
Event code 290 (BTN_THUMB2)
Event code 291 (BTN_TOP)
Event code 292 (BTN_TOP2)
Event code 293 (BTN_PINKIE)
Event code 294 (BTN_BASE)
Event code 295 (BTN_BASE2)
Event code 296 (BTN_BASE3)
Event code 297 (BTN_BASE4)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 127
Min 0
Max 255
Flat 15
Event code 1 (ABS_Y)
Value 127
Min 0
Max 255
Flat 15
Event type 4 (EV_MSC)
Event code 4 (MSC_SCAN)

出力は上のようになりました。
ボタンは、288-297がレポートでき、方向キーは、X軸、Y軸それぞれ0-127-255の絶対座標で受け取れるようです。 

では、この買ってきたアーケードスティックを接続した場合はどうなるでしょうか。

…… なんと、当然認識しません。カーネルにIDが記録されていないからです。
この辺の制限を外したカーネルを使って試す必要があります。

制限を外して再コンパイルしたカーネルを使うと以下のように認識させることができます。

Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x1dd8 product 0xe version 0x110
Input device name: "BSGPAC02 Series"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 304 (BTN_A)
Event code 305 (BTN_B)
Event code 306 (BTN_C)
Event code 307 (BTN_X)
Event code 308 (BTN_Y)
Event code 309 (BTN_Z)
Event code 310 (BTN_TL)
Event code 311 (BTN_TR)
Event code 312 (BTN_TL2)
Event code 313 (BTN_TR2)
Event code 314 (BTN_SELECT)
Event code 315 (BTN_START)
Event code 316 (BTN_MODE)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 128
Min 0
Max 255
Flat 15
Event code 1 (ABS_Y)
Value 128
Min 0
Max 255
Flat 15
Event code 2 (ABS_Z)
Value 128
Min 0
Max 255
Flat 15
Event code 5 (ABS_RZ)
Value 128
Min 0
Max 255
Flat 15
Event code 16 (ABS_HAT0X)
Value 0
Min -1
Max 1
Event code 17 (ABS_HAT0Y)
Value 0
Min -1
Max 1
Event type 4 (EV_MSC)
Event code 4 (MSC_SCAN) 

試してみると、ボタンは304~316、で、X-Y-ZとHATが使えるようです。
詳しく調べてみると、このコントローラ、「mode」ボタンで x-yモード、zモード、HATモードが切り替えられるようです。今回は、x-yモードを使います。

アーケードスティックの「1」~「10」を順に押していき、割り当てを確認します。

すると、「BTN_B,BTN_C,BTN_TR,BTN_TL,BTN_A,BTN_X,BTN_Z,BTN_Y,BTN_SELECT,BTN_START」のように割り当てられていることがわかりました。

これをメガドライブ純正パッドと同じようになるように変換してやればいい、ということです。

では、それをどうやって実現するか。

まず、標準のカーネルでは/dev/input/event4~event13に割り振られる部分のソースコードを変更し、+10して event14~event23に割り当てられるようにします(退避させる)

 

そこで、LinuxのUsermode Input Deviceという機能を使い、イベントコードを変換するプログラムを書きます。

具体的には、以下のようなソースコードです。

 

bitbucket.org

 

 このへん

qiita.com

を参考にしています。

 

 

このソースコードを、ホスト上でメガドライブミニ用にコンパイルし、メガドライブ上にコピーします。

iBuffaloのアーケードスティックをメガドライブに接続すると

[50270.421860] generic-usb 0003:1DD8:000E.0007: usb_submit_urb(ctrl) failed: -1
[50270.429714] generic-usb 0003:1DD8:000E.0007: timeout initializing reports
[50270.437645] input: BSGPAC02 Series as /devices/platform/sunxi-ehci.1/usb1/1-1/1-1.2/1-1.2:1.0/input/input14
[50270.449359] generic-usb 0003:1DD8:000E.0007: input,hidraw0: USB HID v1.10 Gamepad [BSGPAC02 Series] on usb-sunxi-ehci-1.2/input0

という表示が現れ、

# ./evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: axp22-supplyer
/dev/input/event1: sunxi-keyboard
/dev/input/event2: gpio-keys
/dev/input/event3: sunxi-ths
/dev/input/event14: BSGPAC02 Series

 

event14(本体のコントローラポート1に挿したため)が割り当てられました。

先ほどのプログラム(uinput)にこれを引数として渡します。

# ./uinput /dev/input/event14 &
# argv[0]=./uinput
[43017.030912] input: evfrom23 as /devices/virtual/input/input36
argv[1]=/dev/input/event14 

 すると、/devices/virtual/input/input36という仮想inputデバイスが作成され、プログラムで変換した値が送信されるようになります。

この時作成された仮想inputデバイスは、たまたまうまいことevent4に再マップされました。(udevルールを書くことで確実になるはずです)

# ./evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: axp22-supplyer
/dev/input/event1: sunxi-keyboard
/dev/input/event2: gpio-keys
/dev/input/event3: sunxi-ths
/dev/input/event4: evfrom23

 この状態で、内蔵謹製エミュレータを起動すると、見事iBuffaloのアケコンを認識し、操作ができるようになりました!!!!

 

ここまで、手作業で実行して確認しているので、この一連の流れをスタートアップスクリプトとしてrootfsに書いてやれば、自動的にアーケードスティックを認識できるようになるはずです。

また、今回変換テーブルを作らず直接変換してしまっています。
そうではなく、接続されたコントローラのVIDなどを見て、適切なマップを追加することで別のコントローラも使用できるようになります。
専用の設定ファイルでも作ってやると後々追加出来て便利なんですかね。

加えて、現在のところ、本体にはんだ付けしたシリアルコンソールを利用しないで、
カーネルを書き換える仕組みがまだ整備されていません。
おそらく海外のproject LUNARやhakchiチームがそのあたりを実装したら、
そのコードを利用することで、本体を(物理的に)無改造でこのような動作をさせられるようになるはずです。しかし、保証は外れそうなので、その辺気になる方は、最初に出てきた変換アダプタを使うのがいいんでしょうね…

さて、この方法でメガドライブミニをプレイしている証拠映像がこちらです。

 


メガドラミニにアーケードスティックをつなぐデモ

 

デモ撮影中とはいえゲームへたくそすぎんだろ…
まぁ、波動拳出てるんで、ちゃんと動いてるんだと思いますよ。

 

見た目ではわかりませんが、基板乗っ取りやArduinoなどの変換アダプタは使用していません。
メガドライブミニに直接コントローラのケーブルを挿しているだけです。

遅延など、測定はしていないのですが、本当に必要になったらどうにか測定してみたいと思います。
外付けUSBデバイスで変換するよりは理論上早いはずなんですがね…

 

メガドライブミニ(Genesis Mini)の前面イヤホン端子とボリュームつまみを使えるようにしました!

メガドライブミニ、精巧なモデリングが評判でしたが、
どうしても再現できなかったと思われる前面イヤホン端子。

それを恒例の魔改造で使えるようにしました!

メガドライブオリジナルには3.5mmのイヤホンジャックがついていましたが、
同じものをつけると明らかにでかすぎたので、ちゃんとミニ化して2.5mmのをつけてます。

なので、普通のヘッドホンを繋ぐには変換ケーブルが必要です。

また、技術的な都合もあり、なんと元のメガドライブに使用されていたのと
同じアナログオーディオICを使うというひとネタもあり。

f:id:honeylab:20191006102502p:plain

 

もっと詳細な作成技術情報はこちら

https://www.slideshare.net/ssuserb6da59/ss-179366684

 

簡単に言うと、CPUからHDMIに送られる途中のデジタル音声信号を分岐し、
アナログ変換して、

 


ボリュームつまみの信号で音量も調節して、

f:id:honeylab:20191006102841p:plain

ヘッドホン端子のところに穴を開けて
めちゃ配線して

 

f:id:honeylab:20191006102914p:plain

こうじゃ!!

 

youtu.be

どや。

 

「3日でできたメガドライブミニ 徹底解析・ハック 最速本」をBOOTHに出品しました。

技術書典当日の深夜まで原稿を書いてコンビニで印刷してみたものの、
一人じゃせいぜい50部つくるのが限界でした。
大変ありがたいことに技術書典に持ち込んだ分は完売いたしました…

現地でお届けできなかった方・遠方の方に向けてデジタル版をBOOTHに出品しました。

honeylab.booth.pm

 

もし現地で物理本をお買い上げいただいた方には別途URLをご案内出来ますので、

hiromitu2120@gmail.com もしくは Twitter @bakueikozo へDMいただければと思います。(現地でほかの頒布物をお買い上げいただいている方は、そちらに記載されているURLと同一です。)

 

尚、この本を増補する形で「完全版」を今後執筆する予定です。
今のところこちらをお買い上げいただいた方でも、差額での提供などは難しいです。

本誌のお買い上げは、今後の「完全版」への応援として受け止めさせていただきます。
そのほかの頒布物も順次BOOTH,通販委託などを行っていきますので随時お知らせいたします。

 

メガドライブミニ (Genesis Mini) をハックする(2)特定のUSBデバイスしか使えない縛り

※検索でたどり着いた方へ※

このページには技術的情報がまとめてあります。

 市販のゲームコントローラメガドライブミニで使用するには
こちらのコンバータを使用するのが最もかんたんで確実です。 

【MDミニ用】スーパーコンバーター(PS4/PS3用コントローラ対応) - メガドライブミニ

【MDミニ用】スーパーコンバーター(PS4/PS3用コントローラ対応) - メガドライブミニ

  • 作者: 
  • 出版社/メーカー: コロンバスサークル
  • 発売日: 2019/12/09
  • メディア: Video Game
 

 

あと数時間でメガドラミニが到着するはずですが、その前に昨日セガから公開されたOSSソースコードをもとにハックの準備をしていきます。

https://sega.jp/mdmini/doc/mdmini-oss/

前情報で、どうやら付属の純正パッド以外のコントローラが認識しないという話が聞こえていました。また、マルチタップ代わりのUSBハブも専用品番でないと使えない、とのことです。

f:id:honeylab:20190919054355p:plain

https://game.watch.impress.co.jp/docs/news/1185012.html

おそらく動作保証とかいろいろ理由はあるのでしょうが、既存のハードウェアリソースが使えないのはちょっともったいないですよね。

では、公開されたLinuxソースコードをあさっていきます。

USBドライバ周りのはずですので drivers/usbあたりを探してみます。

すると、hub/core.cに不思議な文字列を発見しました。

 

 
#ifdef CONFIG_USB_SPECIAL_DEVICE
#define SPECIAL_USB_DEVICE(ven, prod) \
    .idVendor = (ven), \
    .idProduct = (prod)

struct device_id {
    __le16 idVendor;
    __le16 idProduct;
};

static const struct device_id special_id_list[] = {
    { SPECIAL_USB_DEVICE(0x14cd, 0x8601) },
    { SPECIAL_USB_DEVICE(0x0ca3, 0x24) },
    { SPECIAL_USB_DEVICE(0x0ca3, 0x25) },
    { SPECIAL_USB_DEVICE(0x0bda, 0x5411) },
    { SPECIAL_USB_DEVICE(0x05e3, 0x0608) },
    { SPECIAL_USB_DEVICE(0x2109, 0x2817) },
    { SPECIAL_USB_DEVICE(0x1a40, 0x0101) },
    { SPECIAL_USB_DEVICE(0x1dd8, 0x000f) },
    { SPECIAL_USB_DEVICE(0x1dd8, 0x000b) },
    { SPECIAL_USB_DEVICE(0x0079, 0x0011) },
    {}
};
#endif

 

また、関連するKConfigには

config USB_SPECIAL_DEVICE bool

"Only Support special devices" depends on USB

default n help if you say Y here,then only support special device!!!

という項目と、hub.cに以下のような定義がありました。

#ifdef CONFIG_USB_SPECIAL_DEVICE
    if(special_match_id(udev, special_id_list)) {
        if (retval >= 0)
            retval = -EINVAL;
        goto fail;
    }
#endif

どうやらここに指定していないUSBデバイス

認識時に振り落とされるようです。

では、ここで指定されているVID/PIDが何の製品なのか確認してみましょう。

VID Vendor Name PID Product Name
14CD Super Top 8601 4-Port hub
0CA3 Sega Corp. 0024 同梱Pad ?
0C3A Sega Corp. 0025 同梱Pad ?
0BDA Realtek Semiconductor Corp. 5411 おそらくUSBHUB
05E3 Genesys Logic, Inc 0608 USB HUB
2109 VIA Labs, Inc. 2817 おそらくUSBHUB
1A40 Terminus Technology Inc. 0101 USB HUB
1DD8 BUFFALO  000f BSGP1204 
1DD8 BUFFALO  000b BSGP1601
0079 DragonRise Inc 0011 GamePad
 
というリストができました。
公開されている情報と同じ…ように見えますが、見慣れない「DragonRise」というゲームパッドが見えています。
drivers/hid/inputあたりを確認すると、なぜか0C3A:0024や0025の製品が、このDragonRiseというゲームパッドのドライバ内でハンドルされています。
また、configでDragonRiseを有効にした時に同梱Padも認識されるようになっています。もしかすると、これが実質標準のゲームパッドハンドラで、そこに挿入する形で同梱のドライバをハンドルさせるようにしたのかもしれません。
 
さて、このあたりが事前に情報の出ていた「特定のHUBやゲームパッドしか認識できない」という挙動の原理のようです。
この辺を修正するか、デバイス側で調整してやれば認識するようになるかもしれませんね。
カーネルコンパイル&書き込みが必要なのでまだまだ先の話になると思います)
 

メガドライブミニ (Genesis Mini) をハックする(1)

動画とか、discordとかに流れてきたゲーム機レビュアー?の人の画像を見てハックの準備を進めています。っていうかずいぶんわかったぞ。

もう準備、っていうよりハックの実作業といっても過言じゃないだろ。

 

メガドライブミニの基板を見ると、ファミコンミニとかのR16が乗ってる基板のレイアウトと部品の並びは同じで、引き出されてるペリフェラルの並びが同じようにしか見えない。発振子の出てる位置も、USBの引き出し位置も一緒。
メーカが同じで、シリーズが近ければ大体似たようなピン配置になることから考えて、R16/A33系統、もしかしたらちょっと上位ぐらいのSoCが乗っていて、ピンアサインはほぼ互換っていうか一緒なんじゃないか。

リセット+USB挿入でFELモードに入るところまでは確認されてるらしいけど、本体を手元に持っている人はそれ以上詳しくなくてわからないらしい。

sunxi-toolsで soc idがなんて出るかが気になる。

もしも違うidが出たとしたら、

https://github.com/linux-sunxi/sunxi-tools/blob/master/soc_info.c

ここに適当に互換しそうなやつを追加して試してみればいいんだよね?
コンパイルの準備をしておこう。

 そして、ファミコンミニのu-boot/kernelでは、UART0がPortFに割り当てられてたんだけど、これはコンパイルオプションでPortBにも割り当てられる。っていうか、そうじゃないとSDカードポートと競合する。今回SDカードポートは出てないようで、
基板をひっくり返してみたところ、仮にR16と同じピンアサインだったらまさにジャストの位置からPB0/PB1(UART0 TX/RX)がテストパッドに引き出されてる。

 


もう間違いなくこれがUARTピンだと思う。

SoC周りにあと2本パッドがあるけど、まだそこはわかってない。もしかしたらデバッグトリガがあったりなかったりして。

 

というわけで、届いて速攻でNANDを引っぺがす前に、UARTを探すっていう作業はたぶん済んだ状態まで来た。

あと2週間も待つの…????

 

 

I saw this movie and get some pictures from friends.

www.youtube.com

 

 

 

A snapshot from the Movie tell me many many information to prepare hacking.

 

SoC(System On chip) like as a CPU is Z7213 from "ZUIKI" but is is seems to be having Allwinner's core.

http://www.zuiki.co.jp/products/z7213/

 

f:id:honeylab:20190905215816p:plain f:id:honeylab:20190905220403p:plain

 

This PCB's artwork is close to NESC/SNESC 's PCB layout.
I think Z7213 has upper compatible to R16/A33 Soc from AllWinner.

 

Because .....

This table is pinout of R16.

 

f:id:honeylab:20190905220742p:plain

 Right Bottom has X'tal in/out,Right Top has USB0/USB1 Pattern.
Bottom Center has RAM's wire,and Left Side has NAND wires.
There is no contradiction.

 

f:id:honeylab:20190905221914p:plain

I believe each SoC has compatiblilty core but not only pin-out.

And this picture is of other side of Genesis Mini's pcb around SoC.

f:id:honeylab:20190905223131p:plain

 

https://linux-sunxi.org/Nintendo_NES_Classic_Edition

PB0/PB1 is UART for the "mainline u-boot" default UART0 pins.
Or "legacy u-boot" can use this pins for UART0 with configuration.

I see PB0 and PB1 wires are taken out to TEST PAD.
I can use UART console without doubt with soldering when the console will arrived.
If the stock kernel will not accept console login or hack,but SEGA must be show the source-code of u-boot and Linux Kernel.
I can compile them with enabling UART access and run new u-boot from USB FEL mode.

 

 

未来からやってきたメガドライブミニ最速解析本

技術書典7でうちの島が別室になっていて全然お客さんが来なくて3時ぐらいにもう帰ろっか…っていう雰囲気になっている嫌な夢を見ました!勘弁して!!!

 

令和最初のゲームハード最速解析本

技術書典7で頒布予定です。

]techbookfest.org

 

最速解析本の進捗がやってきたので貼っておきます(どういうことなんだってばよ)

(未来の自分が鋭意執筆中なので内容は刻々と変わっていく予定です。)

f:id:honeylab:20190904083349p:plain

f:id:honeylab:20190904083430p:plain




9/22 池袋サンシャイン 技術書典7に出展します。

 

techbookfest.org

techbookfest.org

 

今回のお品書きは以下の予定です。

  • NO HACK,NO LIFE! Vol.1 (予価1000円)

このブログで紹介したりしなかったりした機械の分解・解析・改造を再編集したものです。ドンキGPLカメラやレトロアーケード、フォトフレームの改造詳細、
そして、児童館にあった30年前の大型電気遊具を修理したレポなどなんと100p予定!

f:id:honeylab:20190828144235p:plain f:id:honeylab:20190828144324p:plain

9/19に発売されるメガドライブミニを速攻で分解して解析し、本にまとめて9/22に頒布してしまおうという無謀なチャレンジ。果たして実るか。成果が出てれば500円。

前回の技術書典やBOOTHで販売した本、フォントや版の大きさが悪くてかなり読みにくいものになってしまった反省を踏まえて、再編集・再印刷して少数発行します。
前回お求め頂いた方には、ご購入が分かる写真の添付またはアンケートにお答えいただくことで、新版のデジタルデータをDLできるようにさせていただく予定です。

 

以上3点、果たして間に合うか! 結果は現場で!

 今回の技術書典は2フロア使用しての開催とこのことです。
「はにらぼ」のブースは「け36D」(3階の中央付近)です。
会場にお越しいただいた読者の方、ぜひお声がけください。