honeylab's blog

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

「マジョカアイリス」を魔改造して「アイリスオーヤマ」の照明のリモコンにする

さて、ぼちぼち各方面からのハックも佳境となり、
液晶単体での使用や、内蔵リソース書き換えの技術も整ってきました。

そんな中で、どうしてもやらないと気が済まなかったネタが

「内蔵赤外線LEDを使ってリモコン操作をする」ということです。

 

マジョカアイリス、マジョカランタンとの連携のために赤外線LEDが内蔵されています。

 

f:id:honeylab:20210118031026p:plain

せっかくなので、マジョカアイリスを振って何かを操作出来るようにしてみましょう。

 必殺技の発動などの時に赤外線信号が出ますが、あくまでもランタンと連動させるための単純な信号しか出ていません。

 

この信号だけでは外部機器を制御できませんので、マジョカアイリス基板に外付けした小型のマイコンにリモコンの赤外線信号を学習させておいて、この信号をトリガにリモコン信号を出力させるようにします。

これなら、必殺技などのモーションはそのまま残し、リモコンとして使用できます。

 

先駆者として、中身を引っこ抜いて別マイコンに置き換えてエアコンのリモコンにした方はいたようですが、ちょっと中身を引っこ抜くのは私の美学じゃないのですよ…

 

まず、内蔵赤外線LEDの配線を確認してみます。

すると、内蔵LEDは+側ではなく、-側を制御して点灯させているということがわかりました。この信号はあくまでもLEDを点灯させるための制御のため、外付けマイコンのトリガとするのには少し面倒です。

 そのため、そのLED信号を制御信号をいったんフォトMOSリレーに入力し、外付けマイコンに入力することにします。
フォトMOSリレーは内部的にLEDが入っているために、元の基板の回路に与える影響が少ない、という利点もあります。

 内蔵赤外LED自体は一般的なリモコンのLEDと互換性のあるものですので、この部分はそのまま利用することにします。

  

最終的な回路構成はこんな感じです。

 

f:id:honeylab:20210118032014p:plain

Arduinoのリモコン送出ライブラリでは+制御のLEDしか使用できませんので、

-制御の基板のまま赤外LEDを制御するために、赤外LEDの手前に2SC1815を使用した反転ドライブ回路を追加しています。

 

このようにすることで、最小の改造でマジョカアイリスをリモコンにすることができます。
さて、なんのリモコンにするか…派手なアクションをしてくれたほうがいいよな…照明…

 

ん!!! うちの照明 「アイリスオーヤマ」

リモコン付き照明じゃん!!!!

(しかもAlexa連携とかもついてて便利)

https://www.amazon.co.jp/dp/B07J5VTMS2

  

 

まさかのアイリス被り!!!これやこれ!!!

 

というわけで、

リモコン受信モジュールとArduinoを接続してリモコンコードを取得します。
受信モジュールは、マジョカランタンに入っていたものを毟り取りました。

 

 スケッチは、サンプルにあるIRRecvDumpV2を使っています。
ネットで探せばたくさん例が出てきます。

www.shibuya24.info

 

この信号を、マジョカアイリスの赤外線信号をトリガにし、アクション映像が流れた分の時間を待ってリモコン信号として送出するようにArduinoのスケッチを作成します。

gist.github.com

 

Image

Image

こんな感じで適当に配線して突っ込みます。

 

幸い内部には十分なスペースがありました。

Image

ついでに、起動画面をちょっと書き換えてみました。

 

f:id:honeylab:20210118032155p:plain

 

アイリスオーヤマのロゴ、ハートが入ってて意外と親和性が高いのでは…?!

リソース書き換えの方法はこちら

honeylab.hatenablog.jp

 

さて、実際にやってみましょう!!!

 

www.youtube.com

 

 

魔法少女 部屋の電気をつけられるおっさん誕生!!!

 

…あぁぁぁあ! 
ちょっと楽しいぞこれ!!

そういう風に作ったんだから動くのは当たり前なんだけど、
なんだろうこのワクワク感wwww

 

さて、本体魔改造系はこんなもんかなぁ…

 

マジョカアイリスハック

アストロシティミニをほったらかしてこんなことやってました。

 

こちらのblog

kako.com

 

や、Twitterなどで広まって
もはや電子工作おっさんみんなが買っちゃったんじゃないかと思われる
「マジョカアイリス」

 

www.takaratomy.co.jp

詳しい成り行きは各種まとめなんかを見てもらうことにして

 

twitter.com

 

みんな、この横長 64x480 液晶の特殊性と在庫過多による圧倒的値引きにひかれて買いあさってしまったようです。
ところで、この液晶を真面目に使おうとすると、フラットケーブルの処理やマイコンのプログラムなど、すでに電子工作の猛者と化しているレベルでないと
結構処理の難しい工作になってしまいます。

 

 ここまでの工作、結構むずいです。

github.com

しかし、この「マジョカアイリス」、ロットによって本体基板上にmicroSDスロットが搭載されているモデルがあることがわかっています。
このSDカードの中に、おそらく画像や動画が入っているので、これを差し替えてしまえばとりあえず画像が表示できるではないか、というソフトウェア的な取り組みを行ってみました。

 

内蔵microSDカード、2Gのものと4Gのものが現在確認されています。

 中身を一通り確認しましたが、普通のFATフォーマットのパーティション内に、いくつかのフォルダ、データがあるのみです。

この中で、ルートフォルダにあるAB565.binというファイルが、このオモチャの操作中に表示される画像であることがわかりました。

 このファイルは16bitRAW画像データが連結された特殊な形式ですので、これを編集しやすくなるように分離し、再度結合できるようにするツールを作成し、ファイルを置き換えてみました。

 ファイルをいくつか編集してSDカードを更新してみると…

 見事、待機時に表示されるアニメーションが変化しました。

液晶を単体で接続したときのように滑らかに動かすことはできませんが、
この工作、はんだ付け等難しい作業が必要ないため、オモチャハックの入り口としてはそこそこ難易度が低く、結果もわかりやすいのでいい教材かと思います。

 

この作業に必要なC#のプログラムのソースコードは公開しておきます。

 

microSDからコピーしたファイルを使って、このプログラムに読み込ませることでファイルが分離できます。
このソースコード、VisualStudioで作成したものですが、あえてプロジェクトファイルなどは置かず、単一のクラスだけ置いておきます。
そのため、まずはこれをコンパイルして、自分の環境で実行できるというのが最低限必要な力です。それ以下の方はサポートできません。

ここまで登ってきてください。

このソースコードを使って、すでに同様に差し替えに成功されている方もいるようです。

 

 

microSD内には、このほかにもアクション時に再生される動画や音声などが収められていますが、まだフォーマットに未確定の部分があるためその部分の差し替えはまだできません。私の興味が続けばその辺もできるようになるかもしれません。

 

 

 

 

 

アストロシティ解析用メモ(入力回り)

内蔵レバー・ボタン イベント情報

root@z7213-astro-pp:/mnt/UDISK# ./evtest.bin
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: axp22-supplyer
/dev/input/event1: gpio-keys-polled
/dev/input/event2: sunxi-keyboard
/dev/input/event3: headset
/dev/input/event4: 6B controller
/dev/input/event5: 6B controller
/dev/input/event16: sunxi-ths
Select the device event number [0-16]: 1
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "gpio-keys-polled"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 21 (KEY_Y)
Event code 30 (KEY_A)
Event code 44 (KEY_Z)
Event code 45 (KEY_X)
Event code 46 (KEY_C)
Event code 48 (KEY_B)
Event code 59 (KEY_F1)
Event code 60 (KEY_F2)
Event code 103 (KEY_UP)
Event code 105 (KEY_LEFT)
Event code 106 (KEY_RIGHT)
Event code 108 (KEY_DOWN)
Event code 116 (KEY_POWER)
Properties:
Testing ... (interrupt to exit)

------

^C
root@z7213-astro-pp:/mnt/UDISK# hexdump -C /dev/input/event1
00000000 03 2b 05 00 a8 a2 0c 00 01 00 69 00 01 00 00 00 |.+........i.....|
00000010 03 2b 05 00 bd a2 0c 00 00 00 00 00 00 00 00 00 |.+..............|
00000020 04 2b 05 00 d4 de 05 00 01 00 69 00 00 00 00 00 |.+........i.....|
00000030 04 2b 05 00 e1 de 05 00 00 00 00 00 00 00 00 00 |.+..............|
00000040 05 2b 05 00 40 01 02 00 01 00 6a 00 01 00 00 00 |.+..@.....j.....|
00000050 05 2b 05 00 4d 01 02 00 00 00 00 00 00 00 00 00 |.+..M...........|
00000060 06 2b 05 00 2b 91 0b 00 01 00 6a 00 00 00 00 00 |.+..+.....j.....|
00000070 06 2b 05 00 38 91 0b 00 00 00 00 00 00 00 00 00 |.+..8...........|
00000080 07 2b 05 00 bf 8c 0a 00 01 00 6c 00 01 00 00 00 |.+........l.....|
00000090 07 2b 05 00 ce 8c 0a 00 00 00 00 00 00 00 00 00 |.+..............|
000000a0 09 2b 05 00 73 83 02 00 01 00 6c 00 00 00 00 00 |.+..s.....l.....|
000000b0 09 2b 05 00 80 83 02 00 00 00 00 00 00 00 00 00 |.+..............|
000000c0 0a 2b 05 00 4d 28 02 00 01 00 67 00 01 00 00 00 |.+..M(....g.....|
000000d0 0a 2b 05 00 5a 28 02 00 00 00 00 00 00 00 00 00 |.+..Z(..........|
000000e0 0b 2b 05 00 54 35 02 00 01 00 67 00 00 00 00 00 |.+..T5....g.....|
000000f0 0b 2b 05 00 61 35 02 00 00 00 00 00 00 00 00 00 |.+..a5..........|
00000100 0d 2b 05 00 39 3a 09 00 01 00 1e 00 01 00 00 00 |.+..9:..........|
00000110 0d 2b 05 00 47 3a 09 00 00 00 00 00 00 00 00 00 |.+..G:..........|
00000120 0d 2b 05 00 f7 8c 0d 00 01 00 1e 00 00 00 00 00 |.+..............|
00000130 0d 2b 05 00 04 8d 0d 00 00 00 00 00 00 00 00 00 |.+..............|
00000140 0e 2b 05 00 d8 09 01 00 01 00 30 00 01 00 00 00 |.+........0.....|
00000150 0e 2b 05 00 e5 09 01 00 00 00 00 00 00 00 00 00 |.+..............|
00000160 0e 2b 05 00 16 0a 04 00 01 00 30 00 00 00 00 00 |.+........0.....|
00000170 0e 2b 05 00 23 0a 04 00 00 00 00 00 00 00 00 00 |.+..#...........|
00000180 0e 2b 05 00 0e 6e 06 00 01 00 2e 00 01 00 00 00 |.+...n..........|
00000190 0e 2b 05 00 1a 6e 06 00 00 00 00 00 00 00 00 00 |.+...n..........|
000001a0 0e 2b 05 00 6b bc 09 00 01 00 2e 00 00 00 00 00 |.+..k...........|
000001b0 0e 2b 05 00 77 bc 09 00 00 00 00 00 00 00 00 00 |.+..w...........|
000001c0 0e 2b 05 00 de 4b 0d 00 01 00 2d 00 01 00 00 00 |.+...K....-.....|
000001d0 0e 2b 05 00 eb 4b 0d 00 00 00 00 00 00 00 00 00 |.+...K..........|
000001e0 0f 2b 05 00 e8 30 01 00 01 00 2d 00 00 00 00 00 |.+...0....-.....|
000001f0 0f 2b 05 00 f5 30 01 00 00 00 00 00 00 00 00 00 |.+...0..........|
00000200 0f 2b 05 00 d3 6d 03 00 01 00 15 00 01 00 00 00 |.+...m..........|
00000210 0f 2b 05 00 e0 6d 03 00 00 00 00 00 00 00 00 00 |.+...m..........|
00000220 0f 2b 05 00 db eb 05 00 01 00 15 00 00 00 00 00 |.+..............|
00000230 0f 2b 05 00 e8 eb 05 00 00 00 00 00 00 00 00 00 |.+..............|
00000240 0f 2b 05 00 80 f0 09 00 01 00 2c 00 01 00 00 00 |.+........,.....|
00000250 0f 2b 05 00 8e f0 09 00 00 00 00 00 00 00 00 00 |.+..............|
00000260 0f 2b 05 00 53 6a 0e 00 01 00 2c 00 00 00 00 00 |.+..Sj....,.....|
00000270 0f 2b 05 00 60 6a 0e 00 00 00 00 00 00 00 00 00 |.+..`j..........|
00000280 10 2b 05 00 a8 bc 0c 00 01 00 3c 00 01 00 00 00 |.+........<.....|
00000290 10 2b 05 00 b5 bc 0c 00 00 00 00 00 00 00 00 00 |.+..............|
000002a0 11 2b 05 00 d4 fc 00 00 01 00 3c 00 00 00 00 00 |.+........<.....|
000002b0 11 2b 05 00 e0 fc 00 00 00 00 00 00 00 00 00 00 |.+..............|
000002c0 11 2b 05 00 7d c5 0e 00 01 00 3b 00 01 00 00 00 |.+..}.....;.....|
000002d0 11 2b 05 00 8b c5 0e 00 00 00 00 00 00 00 00 00 |.+..............|
000002e0 12 2b 05 00 53 a6 04 00 01 00 3b 00 00 00 00 00 |.+..S.....;.....|
000002f0 12 2b 05 00 60 a6 04 00 00 00 00 00 00 00 00 00 |.+..`...........|

 

Select the device event number [0-16]: 4
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)
Properties:
Testing ... (interrupt to exit)

astro コマンドラインオプション

getopt_long(in_stack_00000038,in_stack_0000003c,"hb:w:e:o:a:s:d:z:v",in_stack_00000030)

バーチャ1

293 root 274m R astro -b SGM01X-01 -o lcd -d 20 -e none

コラムス

398 root 248m S astro -b SGSC2X-05 -o lcd -d 20 -e none

dに20以外を設定したら単体起動できた なぜ

 

astroの入力ルーチン

アストロシティミニでRetroArch-MAMEを動作させてみた

さて、ここまでいろいろやってきた中で

honeylab.hatenablog.jp

 

どうも、メガドラミニで動くProject Lunarからファイルを引っ張ってくれば、さらっとRetroArchが動くのではないかという結論に達しました。

modmyclassic.com

 

現時点では、はんだ付けやシリアルコンソールへのアクセスが必要ですが、
ほんの少しの修正を行うだけで、とりあえずRetroArchを起動させることができました。

ただし、例えば動的なLCDHDMIへの出力変更周りなどはサポートされていないため
諸々調整をすれば問題なく使用できそうです。

 

RetroArch自体はProject Lunarへのパッチで動くレベルだと思うのですが、
メガドライブミニではFELボタンがあったのに対し、PCエンジンミニはUSB FELモードへの突入部分の調整や、Linuxカーネルの書き換えを行わないとMDminiゲームパッド以外使用できないためその辺は時間がかかりそうです。

 

また、出荷時に内部に格納されたゲームのデータの一部は、変換さえすれば
MAMEで読み込み可能な形式に変更できる可能性があることがわかりました。

 

これをもとに、内蔵エミュレータではなく、RetroArchでぷよぷよ通を動かしてみたのがこちらです。

 

以下に、今後自分必要そうなメモを書き残していきます

・音声出力先の変更 

root@z7213-astro-pp:/mnt/UDISK/retroarch# amixer -c 1 cset name='Speaker Function' 1
numid=27,iface=MIXER,name='Speaker Function'
; type=ENUMERATED,access=rw------,values=1,items=6
; Item #0 'headset'
; Item #1 'spk'
; Item #2 'spk_headset'
; Item #3 'earpiece'
; Item #4 'btout'
; Item #5 'bt_button_voice'
: values=1

LCDHDMIの変更

 change_output.sh 1  #HDMI出力、720p

 change_output.sh 1  480 #HDMI出力、480p

 change_output.sh 0 # LCD出力

  ※ LCDHDMIでは縦横が違うので、Video Rotate Settingを変更する必要あり

※音声切り替えはRetroArch切り替え後でもOK、映像はRetroArchの再起動が必要

・USBネットワークデバイスの有効可(WindowsのRNDISドライバ経由、インターネット共有使用可能)

echo rndis,acm > /sys/class/android_usb/android0/functions
echo 0 > /sys/class/android_usb/android0/bDeviceClass
echo 1 > /sys/class/android_usb/android0/f_rndis/wceis
echo 1 > /sys/class/android_usb/android0/f_acm/instances
echo 1 > /sys/class/android_usb/android0/enable

ifconfig rndis0 up
udhcpc -i rndis0

 

も~っと アストロシティミニ 内部にアクセスする 詳細

honeylab.hatenablog.jp

 

↑前回に引き続き、より詳しいことが分かったのと、
意外とこのブログが(ゲームギアミクロの時より圧倒的に)読まれていることが分かったのでもう少し詳しく書いてみます。

 

まず、基板詳細図のアップデートです。
UART端子が見つかりました。
これにより、シリアルポート経由でシステムのより深い部分まで解析できました。

f:id:honeylab:20201220002333p:plain

基板上にあった4ピンの並び、一般的な組み込み機器だと 電源-GND-TXD-RXDみたいな配置出てていることがあるんですが、今回ここに出ていたのは RXD-GND,そしてI2Cの信号モニタ用の端子でした。
どうも、IC7がセキュリティ用のチップであり、そのチップに対するアクセスのデバッグ・観測などのためにこのピンを設けていたのではないかと思います。

 

さて、シリアル端子を使ったシステム解析の方法をせっかくなので書いてみます。

実際に手を動かして試すこともできない方も多いと思いますので、これを見ながらなんとなくイメージしてみてください。

本体裏から基板にアクセスし、USB-シリアルケーブルなどでPCと接続します。

今回、シリアル通信ソフトはRloginというものを使っています。

 

f:id:honeylab:20201220002956p:plain

接続がうまくいくと、電源投入時にこのような出力が見えてきます。

f:id:honeylab:20201220003031p:plain

ログインプロンプトが表れます。

ここで、ユーザ名はroot、ですが、パスワードはわかりません。

これではここから進めません。
いったん電源を切り、ターミナルから's'(小文字のs)を押しながら電源を入れなおします。

すると、さっきより詳しい起動メッセージが表れます。

f:id:honeylab:20201220003331p:plain

さらに、Linuxが起動する前のブートローダである、u-bootのモニタモードで起動できます。

この時のログをこちらに置いておきます。

 

gist.github.com

u-bootのモニタモードでは、ブートローダ環境変数Linuxの起動オプションなどを確認、変更することができます。

「help」コマンドで使用可能なコマンド一覧が表示されます。

f:id:honeylab:20201220003557p:plain

さて、ではここからどうするか。

Linuxを起動した際、パスワードを求められたのはログインシェルが起動したからです。
これを起動せず、コマンドラインを使用できるようにする方法があります。
一般的なLinuxディストリビューションでは、起動後に/sbin/initを呼び出し、自動実行スクリプトやログインシェルの起動を行います。これをストップし、最小限であるbusyboxのシェルだけが起動するようにLinuxコマンドラインを書き換えてしまいます。

(※詳しく書くとアレなのでここは割愛します)

 

このモードで起動すると、パスワード入力など関係なく、rootファイルシステムがマウントされ、busyboxのシェルが起動した状態にすることができます。

f:id:honeylab:20201220003909p:plain

いきなり / # というコマンドライン入力待ちになりました。
しかし、この状態ではいつものアストロシティのゲームは動いていませんし、ファイルシステムのマウントも不十分な状態です。緊急レスキューモードみたいな感じです。

この状態で触れる範囲でこねくり回してやり、改めて通常のLinux起動状態にした際に、パスワードを入れなくてもログインできるようにしてしまいます。

幸い、この状態でrootfsはinitramfsではなくNAND完全にマウントされていて、しかもrwの状態でした。
ここで、/etc/passwd ファイルを見てみます。

f:id:honeylab:20201220004257p:plain

すると、rootの行、赤丸で囲った部分に"x"と書かれています。
これは、rootのパスワードは別途 /etc/shadow に記載されている、という意味です。

では、/etc/shadowは、と見てみると

f:id:honeylab:20201220004400p:plain

rootの行に$6から始まる長々とした文字列が書かれています。
これは、rootのパスワードはSHA512で暗号化されて保存されている、ということです。
実は、メガドラミニ→PCEミニ→アストロシティミニは同じ開発会社によるLinuxディストリビューションが採用されています。
メガドラミニではSoCの名前を含む短めの文字列だったのですが、その後、暗号化強度が増している気がします…気のせいかもしれませんが…
本当に必要ならば、このハッシュを結果にもつ文字列を総当たりで探すこともできるのですが、それは今回時間の無駄です。もともとの/etc/passwordの中の'x'を削除してしまうだけで、/etc/shadowは参照されなくなります。また、パスワードは空になります。

f:id:honeylab:20201220004749p:plain

今回はこのファイルを含むファイルシステムがマウントされていたためこの手法がうまくいきました。

では、パスワードを削除した状態で改めてLinuxを通常起動に戻します。

 

f:id:honeylab:20201220004916p:plain

ユーザ名にrootを入力するだけで通常のLinuxとしてログインできるようになりました。

ここから、システム内部を詳しく調べていきます。

まず、SoCはAllwinner A33互換のZ7213とわかってはいますが、Linuxからどのように見えているかをコマンドで確認します。

f:id:honeylab:20201220005108p:plain

スペック通り、Quad CoreのARM7プロセッサだということがわかります。

f:id:honeylab:20201220005227p:plain

/usrに移動すると、astroディレクトリが見えます。
中を見てみると、75MBの容量を持つ一つの実行ファイル'astro'が見えます。
サイズからして、この中にROMイメージも埋め込まれているのでは、と考えられます。

 

さて、このようなシリアルコンソールからだけでもある程度の観察は可能ですが、ファイル自体が手元にないと逆アセンブルやリソース吸出しなどは困難です。
内蔵されているLinuxはゲーム専用にシュリンクされていますから、USBメモリなどを使用することができません。
しかし、カーネルオプションとして、Android Gagetと呼ばれる仕組みが偶然なのか残されていて、所定のオプションを設定してPCと接続するとデータ通信が可能になります。

まず、システム上のNANDがどのような構成になっているかを確認します。

先ほどのu-bootの起動メッセージ中にはこのような表示がありました。 

 

f:id:honeylab:20201220005835p:plain

Linuxからはこのように見えているようです。

f:id:honeylab:20201220005910p:plain


root@z7213-astro-pp:/usr/astro# cat /proc/cmdline
boot_type=0 disp_para=100 fb_base=0x0 config_size=48128 boot.serialno=28078a547088ffffd979 boot.hardware=sun8i console=ttyS0,115200 noinitrd root=/dev/nandd rootfstype=ext4 rootwait init=/sbin/init ion_cma_512m=64m ion_cma_1g=176m ion_carveout_512m=96m ion_carveout_1g=150m coherent_pool=4m loglevel=0 partitions=boot-res@nanda:env@nandb:boot@nandc:rootfs@nandd:savedata@nande:misc@nandf:UDISK@nandg

cmdlineとも合わせて確認すると、例えばこのrootfsを含むパーティションはnanddであると考えられます。

このパーティションを、USB経由でPCに認識させます。

echo 0 > /sys/class/android_usb/android0/enable
echo mass_storage > /sys/class/android_usb/android0/functions
echo /dev/nandd > /sys/class/android_usb/android0/f_mass_storage/lun/file
echo 1 > /sys/class/android_usb/android0/enable

そう、アストロシティミニの背面電源USB端子は、電源だけでなく、データ配線もきちんと有効になっています。
それを利用するため、USBケーブルでPCと接続します。
データの取り扱いのためにはLinuxのPCが一番便利ですが、簡単にやるにはVMWareなどのUSBパススルーの使えるVMでもいいでしょう(私はそうしています)

PCと接続した状態で上のコマンドラインを打つと、USBメモリが接続されたように見えます。

注意点としては、Windowsマシンの場合、このコマンドラインでは「このディスクはフォーマットされていません」などのメッセージが表示されます。
このパーティションは、Linuxの標準であるext4パーティションであり、Windowsからは全く認識できません。
うっかりフォーマットしてしまうと、アストロシティミニが見事にお陀仏になりますので気を付けましょう。この場合、VMに接続し、VMLinuxから認識させます。

f:id:honeylab:20201220010706p:plain

このように、/dev/sdbとしてNANDのrootfsパーティションが認識されました。

あとは、ddコマンドでパーティションをまるごとファイル化します。

このようにして、解析に必要なパーティションを回収します。

f:id:honeylab:20201220010855p:plain

回収したファイル、ここではnandcをファイルシステムとしてマウントしてみます。

すると、

f:id:honeylab:20201220011401p:plain

linuxカーネルイメージ、uImageファイルが置かれたfat32ファイルシステムだった、ということがわかりました。
今後、新しく作ったuImageファイルはこのパーティションにおいてやれば読み込んでくれます。

rootfsも同様にマウントします。

f:id:honeylab:20201220011646p:plain

PC側でファイルにアクセスできることが確認できました。
ここまで来てしまえばあとはなんでも調べ放題です。
ファイルを一通り調べて、動きを確認したければシリアルから動作を確認する、それを繰り返してシステムの全体を把握していきます。

とはいえ、もうこのZ7213のシステムはハードも大体固定なので、これまでに作られた各種バイナリを持ってくれば大体動いちゃうんですよね…

 

解析はこの後もまだまだ続きます。

 

アストロシティミニのハードウェア詳細

買わないって言ってたんだけど、分解写真見たら買ってもいいかと思ったので買いました。

 

基板のチップ全体がシールドでおおわれてたせいであんまり分解写真がなかったようですが、これは簡単に取れるやつです。

本体・LCD周辺はほかの人が写真撮ってると思うので
基板の現在の解析状況を貼っておきます。

 

f:id:honeylab:20201218154127p:plain

 

そして、UARTが見つからない…

FELのスイッチもない。

まさかここにきて本当にUART廃止した…?

 

実は、PCエンジンミニからはFelキーが廃止され、起動時にUSB経由でパケットを投げることでFelモードに入るような仕組みになっています。

すこしめんどいですが、これで中にアクセスはできるはずです。

今後いろいろ試してみます。

 

参考に、メガドライブミニ、PCエンジンミニの基板の写真へのリンクも貼っておきますね。

honeylab.hatenablog.jp

 

さて、システム詳細。

メインSoC ZUIKI Z7213。メガドラミニ、PCエンジンMiniと同じやつ。

システム全体の開発は例によってZUIKIがやってます。

www.zuiki.co.jp

例によって、LinuxなどOSSの部分はセガのサイトで公開されています。

sega.jp

 

 

 

 

ROM FORESEE FS33ND04GS108TF10 (512MB)

メガドラミニと一緒。メガドラミニは一部違うロットもあったみたいだけど。

RAM Unic SCB13H2G160 (256M)

 

パネルのボタンは全部普通のGPIOにつながってるので、必要ならば適当にスイッチを付けるだけでボタン入力に変換できます。

 

背面USB、ホストサイドはやはりメガドラミニ、PCEミニと同じようにMA8601のHUBチップを介しています。

HDMI出力もEP952。今回の特徴は外部HDMIにも接続できること。

基板の特徴として、チップ番号やピン配置のシルクがきちんと記載され、丁寧なつくりの印象を受けました。

 

最新の解析状況はtwitterで上げていくと思いますので、よかったらフォローしてみてください。

twitter.com

 

あと、いまから買うならこのリンク踏んでからから買ってねw

 

 

 

アストロシティミニ

アストロシティミニ

  • 発売日: 2020/12/17
  • メディア: Video Game
 

 

任天堂 GAME & WATCHを分解してあれこれしてSTM32評価ボードとして使う

「GAME & WATCH スーパーマリオブラザーズ」、例のごとく分解・魔改造していきます。

 

基板の詳細な画像などは、例えばこちらとか

mazu-bunkai.com

もっときれいに分解しているほかの方のサイトがありますので、
そちらのほうを是非参照してください…

 

 

 はい、我々甘ちゃんなので、このハード、いつものようにLinux+エミュで構成されているものと思い込んでNintendoのOSSサイトをリロードしまくっていたのですが、その期待を全力で裏切って、STM32という極めて効率的なハードを選定してきました。

 

 基板をよく見るとわかるのですが、メインクロックの水晶振動子は実装されず、代わりに32.768の時計 RTC用の水晶が実装されています。

 


このため、スペック表にきちんと月差を記載することができたんですね。

 

任天堂さすがすぎる。

 

液晶はINNOLUX製おそらく320x240と思われました。

 

 この型番でググっても何の情報も出てきません。カスタムだと思われます。

 

基板上にはゲームのROMや動画像データが収録されていると思われるFlashが実装されていました。

 中身を読みだしてみましたが、完全にランダムであり、圧縮か暗号化が全体にかけられているものと推測されました。この時点で私は割とスキル不足で完全解析をあきらめましたw

仮に内蔵されているROMイメージを既存の別のROMイメージに書き換えたとしても、内蔵エミュレータはおそらくマリオブラザーズほぼ専用になっていて、それ以降に発売された、標準マッパー以外のROMイメージなどに対応させるのは困難だと思われます。
そのため、そういった改造を行うには汎用のNESエミュレータをポーティングすることが一番の近道になります。

この評価基板(言い切った)、CPU内蔵Flashへの書き込みやデバッグのためのSWDポートがきちんと残されています。

 

ST謹製の開発ツールでCPUを指定し、C言語でプログラムを書き込むことで自由にプログラムを動作させることができます。
また、通常の開発環境であれば、書き込まれたプログラムの読出しやデバッグが可能ですが、さすがにこの辺はプロテクトがかかっていて、単純に読み出すことは不可能でした。加えて、私の持っているツールでは高度なデバッグ操作ができないようで、その辺はもうあきらめることにしました。

 ということで、この基板をSTM32H7の評価基板として使い倒すための調査を行いました。

 
ボタン配線などは割と簡単にパターンをたどることでわかります。
LCDの配線もデータ、クロックなどはSTM32内蔵のLCDドライバのピンアサインをもとに推測、およびトレースで判別させました。

 

f:id:honeylab:20201126011227p:plain

しかし、どうやらLCDの初期化にはSPIでコマンドを投げてやる必要があるらしいということがわかり、ロジックアナライザでの解析を行いました。

 

どうにか初期化シーケンスが判明し、LCDフレームバッファの内容を表示させるところまでは到達しました。
後はボタン、音声周りですが、ここはまぁそんなに難しくないと思います

 

が、まぁここから先はぶっちゃけ誰でもできるので…w

なんか面白いネタ無いかなぁ…w

 

海外のハッカーの人がFlash内の解読、再Packに成功したようで、ROMイメージの書き換えなどには成功しているようです。

おそらくこちらの方が最速で突っ走っているかと

twitter.com

 

ところで、みんなが期待している簡単にROMを差し替えるツール的なもの、
今回のハードに関してはそもそも、USBコネクタの配線がSoCまで届いていないこと、
プログラムの書き換えには専用のハードがいることから、

特定の電子工作マニア以外にはおそらくできないものになると思います。

例えばCPU内蔵のプログラムの書き換えには 

 こういうのが必要

とか

FlashROMの書き換えには

 こういうのとか

 
ここはハードの制限なので、ソフトではどうにもならんですねぇ。