honeylab's blog

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

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

あと数時間でメガドラミニが到着するはずですが、その前に昨日セガから公開された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やゲームパッドしか認識できない」という挙動の原理のようです。
この辺を修正するか、デバイス側で調整してやれば認識するようになるかもしれませんね。
カーネルコンパイル&書き込みが必要なのでまだまだ先の話になると思います)