honeylab's blog

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

ニンテンドークラシックミニのリセットボタンについて

ニンテンドークラシックミニのリセットボタンは、ファミコンのように直接CPUをリセットするボタンではなく、普通のキーボードやボタンと同じように認識されています。
メニューからROMを選んで、内蔵エミュレータ(kachikachi)を起動した後、
リセットボタンの入力があれば、その瞬間のステートセーブとスナップショットをとって、エミュレータを終了するようになっています。


さて、ソフト的にどうなっているのかを調べてみました。
まず、リセットボタンはタダのデジタルIOではなく、CPUのKEYADC(LRADC)というポートに接続されています。

一つのピンである程度の数の入力を受けられるよう工夫されています。

f:id:honeylab:20170124210737p:plain

 別のマイコンでのことですが、よく使われる手法で以下のページなどが参考になります。

少ないポートでキー入力 - 無作為研究所

以下の回路は、ニンテンドークラシックミニのCPUと良く似た
A33 CPUを採用したOlimexのボードの回路図です。

f:id:honeylab:20170124204656p:plain

お馴染みの「リセットボタンを押すとFELに入る」、と言うのはこの様になっています。
実際には、あと何個かボタンがつけられるはずです。
この端子はlinuxが起動すると sunxi-keyドライバで受け取り、イベントとして取得できるため、エミュレータがハンドルできます。

ソースコードとしては以下のように書かれています。

f:id:honeylab:20170124205513p:plain

ボタンが押されると割り込みがかかり、レジスタから押されたキーを判定します。

f:id:honeylab:20170124205957p:plain

キーマップはこんな感じ。
いわゆるAndroidタブレットなんかに最初からついてるキーが割り当てられています。
さらに、Linuxからイベントを見てみると

f:id:honeylab:20170124210126p:plain

リセットボタンを押して離すと、上記のイベントがとれます。
115と言うのがキーコード、これはKEY_VOLUMEUPです。
つまり、リセットボタンではなくVOLUMEUPボタンだったんですねw

実は、AllwinnerのAndroidタブレットはまさにそのまま、VOLUMEUPがファーム更新のトリガになっています。(そういった取っ掛かりから、今回の解析もスムーズに始まったようです)

どっかに抵抗値の一覧があると思うので、リセットボタンの端子にちょっと外付ボタンを追加すると、別のことができるボタンをつけることもできるかも知れませんね。
あと、このキーをハンドルする用に既存の別のエミュレータを改良すれば、
メニューから呼ばれて、セーブステートを使うようにインストールすることもできるはずです。
(セーブステートや、スナップショットをとるインターフェイスは解析済みです)