honeylab's blog

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

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

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

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の書き換えには

 こういうのとか

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

 

オリックス給油カード&リパークの駐車後払い法人カードを拾ったので届けてみたら

三井のリパーク~♪

 

先日、保育園の送り迎えに使用している駐車場の精算機で
カード挿入口にカードが置き忘れられていることに気づきました

 

f:id:honeylab:20201105163953j:plain

 

説明書を隅から隅まで読むタイプの人は気づいているかもしれませんが、

クレジットカード等には習得時の連絡先と、会社によっては

「薄謝進呈」

f:id:honeylab:20201112101732p:plain


と書かれていることがよくあります。皆さん自分のカードを確認してみましょう。

 

さて、クレジットカード、交番に届けたところで実はお礼なんてもらえません。

しかし、センターに連絡するとお礼がもらえるそうです。

これはこれは。

 

いや、マジでお礼が欲しいわけではなく、その内容そのものに興味があったのでセンターに電話してみました。

拾得したことを伝えると、時間、場所、こちらの連絡先を聞かれ、
後日返送用封筒を送るので、カードにはさみを入れて返送してくれ、とのことでした。
特にここでお礼についての話はありません。

ははーん、返信用封筒とともに送られてくるか、送付後に別途そっと送られてくるんだな??

大体、なんかしらのお礼、って言ったらQUOカードやろ。500円か?ええんやで??

 

などと思いつつ数日、返送用封筒とお礼の手紙が到着しました。

f:id:honeylab:20201112095210j:plain

「ささやかではございますが、お礼の品を同封いたします」

 

おっなんやなんや

 

f:id:honeylab:20201112095241j:plain

 

ど どーん!!!!

ボールペン!!!

 

オリックス バッファローズの ボールペン!!!!

 

…ありがとうございます!!!!!

 

googleで検索してみると、クレジットカード会社によってはQUOカードだったりすることはあるみたいです。
これが、只の法人支払いカードだからなのか、ご時世なのか、会社の力やそのほか諸々のことなのかはわかりませんが、とりあえずこのカードを届けると、バッファローズのボールペンがもらえることがわかりました。

 

ゲームギアミクロのLCDに何か出す & 1.15インチの謎に迫る

この手のハードの解析について、みんなの興味があるところなのは
ほかのゲームのエミュとかROMを入れられるとかそういうところなんだと思いますが、
それははっきり言って最終的には「できる」んですよ。

でも、それをすること自体には、いろいろな問題、
情報発信の責任がついてきてしまいます。

「ネタ」としてその手のことに近いことをやることはあると思いますが、
例えば簡単な入れ替えツールや明確なROMの引っこ抜き方はこのブログには出てきませんのであしからず。

 

さて、このハード、Linuxとしてデバイスが抽象化されていますので、その辺のハンドルを試してみます。

内蔵LCDはST7789VWというわりとハイスペックな240x240の液晶が搭載されています。

shikarunochi.matrix.jp

Linuxから画面に表示させるには、フレームバッファというデバイスに何かしらのデータを書き込むと、割り当てられたディスプレイに何かが表示されます。
普通のマシンでは、 cat /dev/urandom > /dev/fb0 として、画面にごみが表示されることを確認することが多いです。

seenaburns.com

ゲームギアミクロでも同様に、/dev/fb0が存在していますのでこれを試してみます…

ゲームのUIをストップさせてこのコマンドを実行させてみますが…何も表示されません。

あれれ?どういうことだろう。

ゲームのUIを動かしたまま、上記コマンドを実行すると一瞬画面にごみが表示されました。

おやおや。どうやらこのマシンでは、fbに書き込んだデータは別の仕組みでlcdに転送されているようです。

いろいろ調べてみると、"/sys/kernel/screen_update/update” というファイルが見つかりました。このファイルに"1"を書き込むと、ドライバがfb0からlcdに転送してくれる仕組みになっているようです。

では改めて、urandomからfbに書き込み。

さらに、クロスコンパイルしたfb-testを実行してみます。

コマンドだけ打ち込んでもLCDが変わりません。

ここは手動で/sys/kernel/screen_update/updateを更新します

 

 

実行している動画です。

 

このように、一応fb0に連動してlcdを更新させることができました。
fbを使用するアプリケーションはlcdへの転送を組み込むか、別途バックグラウンドで転送するアプリを動作させれば(syncの問題は出ますが)
普通のLinuxのアプリのように動作させることが可能です。

もしくは、このdispドライバが非同期更新の仕組みを持っていると助かるのですが…

 

 

ところで、公式スペックによると画面サイズは1.15インチということになっています。 

f:id:honeylab:20201008023329p:plain

 

発売前、液晶の解像度とこの1.15インチという値から、内蔵されるLCDを探していたのですが見つかりませんでした。
こんな中途半端(160x144)の値の液晶をカスタムで作るわけはないため、オーバーサイズの液晶をマスクして使うことは想定していました。

 

上記の動画を見るとわかるように、左上の点が下にオフセットされています。

つまり、こんな感じでゲームギアミクロでは正方形の液晶の上下をマスクして長方形に見せています。

f:id:honeylab:20201008023201p:plain

ドライバのパラメータを見てみると、以下のように設定されていました。

f:id:honeylab:20201008021515p:plain

内部fbは256x238として使用されていて、エミュレータでは160x144に描画、
これをLCDの[0-240,38-180]の範囲に拡大表示する、という動作です。
つまり横方向1.5倍、縦方向…ちょっと合わない…?

まぁ、最終的に整数倍にならないのはたぶんそれをやるとゴリゴリの表示になっちゃう、とかいう理由で調整したんじゃないですかね。たぶん。
(計算でぴったり合わせてドヤ顔するつもりだったんだけどなぁ…)

ところで、このLCD、スペック的には1.3インチということになっています。

では、公式スペックの1.15インチはどこから来たのでしょう。

f:id:honeylab:20201008024442p:plain

 

 

…出た!!!1.15インチ!!! この中途半端な値はここから来たのね!

ふぅ、すっきりした…三平方の定理ってこうやって使うのよ。