honeylab's blog

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

allwinner A33ボードを買いました

ロスコンパイラが嫌いなため、どうにかセルフコンパイル環境を作ってやろうと
ファミコンミニのR16と実質同じはずのA33のボードを買いました。

A33-OLinuXino - Open Source Hardware Board

 

最初、国外から通販で買えることに気付かず、すごい悩んでいたのですが、
発送先を指定して、paypalで送金したら数日で届きました。すごいな。

 

 ファミコンミニ用にコンパイルしたu-bootから起動してみます。
MMCもちゃんと認識します。
ファミコンミニがMMCから起動しないのはソフトのせいじゃないのか…?

 

とりあえず、オフィシャルのカーネルdebianを書いて簡単に動作確認をしてみました。カーネルのバージョンは、3.4.39+とのことです。

 

さて、試しにNESから借りてきたkachikachiを動かしてみます。

 当然、コマンドラインオプションとかは普通に表示されますが、
NESを指定して画像描画しようとするとCould not initialize EGLで終了してしまいます。
これは、pcDuino A10で動かしたときも同じでした。
どうも、Maliのドライバが正しく読み込まれていないんじゃないかと思います。

オフィシャルのfsを調べているのですが、やはり、maliのドライバの痕跡が全然ありません。
maliを配ること自体に何か問題があるんでしょうか?

 もともとのNESのイメージには含まれてるんだけど、これ3.4.11用のやつだからたぶん動かないよね?

3.4.11をa33 olimex用に構築する、でもいいと思うんだけど、otgちゃんと動くの?とかいろいろ不安。

 

とりあえずmaliを探しに行こう…

ファミコンミニ テストパッドを改めて確認する

どうにかUSB-HOST使えないかな、っていうのと、
まだ何か使えるピンがあるんじゃないか、と気になっている人がいるようなので
少しまとめてみました。

 

SIDE-A で出てるのはほとんどAXP223の電源確認周りです。

f:id:honeylab:20170204123331p:plain

電源アダプタが付くんじゃないか、と考えられていたところは確かに、L二つを通して
AXP223のACINにつながってますが、Cとかもないので、その辺を調整しないといけなそうですね。

 

SIDE-Bで、他に使えそうなピンはほとんどないですね。
一応、コントローラ用にGPIOが2本と、TWIが2系統あるので、
その辺を工夫するしかないですね。

CPUの右肩にあるのは明らかにRTC用の32KHz振動子用です。
これ以外の詳しいテストパッドは、

http://linux-sunxi.org/Nintendo_NES_Classic_Edition

ここにもありますので参照してください。


AXPやUSB周りの回路図を近々起こしてみようかな、と思ってはいる。

 

f:id:honeylab:20170204123455p:plain

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

ニンテンドークラシックミニのリセットボタンは、ファミコンのように直接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がファーム更新のトリガになっています。(そういった取っ掛かりから、今回の解析もスムーズに始まったようです)

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

NES Classic MiniでFlashAirの認識に成功

I have succeeded to "access" FlashAir on NES Classic Mini , but I could NOT "boot" from SDCard have not yet.

 

ごめん、FlashAirの中の人…先にやっちゃった…

とりあえず、USBからのu-bootでFlashAirが認識されました。
8Gもあるので、なんでも入ります。セルフコンパイルだって可能でしょう。

今のところまだ、SDカードからダイレクトにu-bootが起動してないので、
もしかしたらu-bootをFlashに書いたり、どうせ開発と割り切ってUSBから起動するようにしててもいいのかもしれません。

 

f:id:honeylab:20170122123819p:plain f:id:honeylab:20170122123843p:plain

ディスクシステムいただきました!

f:id:honeylab:20170116183511j:plain

フォロワーさんになんとディスクシステムを送っていただきました!

ハードオフで全く動作未確認なのに3000円とかの値付けになってて買えなくて困ってたので助かりました。

なんかのネタに使わせていただきます。


早速分解。

f:id:honeylab:20170116182809j:plain

f:id:honeylab:20170116183834j:plain


こんなんなってるんやね。


title.fntを入れ替える

何かに付属するtitle.fntを日本語に対応させる方法です。
ほんとは何かのソースにコミットして、実際に使用しているタイトルから抽出しようかと思ったんですが、いまいち連携がうまくいかなかったので、とりあえずやり方と、最低限の日本語が入ったファイルを置いておいてみます。

http://honey.lovepop.jp/font/

 上から落としたファイルを解凍して、例のヤツのフォルダの中を探すとtitle.fntってのがあるので、それと入れ替えればいいです。

 

f:id:honeylab:20170116130743p:plain

上記の文字が入っています。
選定理由は、英数字、カタカナ、ひらがな、もともと日本版に入っているタイトルの文字、日本語タイトルリストから集計した上位100位ぐらいの感じです。
ちなみに最上位はこんな感じ。
文字の右側の数字が、タイトル1700本ぐらいで使われている漢字の個数です。

f:id:honeylab:20170116130904p:plain

すでにほとんど内蔵されてる気もしますね。

そこそこ入ってるので、どうしても出ないのはひらがなで対応するか、↓の方法で置き換えましょう。
自分用のツールは作りましたが、めんどいので置きません。頑張って作りましょう。

作成元のフォントはIPAフォントです。
IPAフォントを使ったデジタルコンテンツの作成と配布、で利用条件に合致してるはずです。
それ以外のフォントを使いたければ、下のほうにあるやり方で作ってみましょう。

 

FNTファイルの作り方

BMFont - AngelCode.com

こちらからBMFontをダウンロード→いろいろやり方を調べて文字セットを作る

FontSettingsはこんな感じ。これ以外でも入れば通ると思います。

f:id:honeylab:20170116130732p:plain

Export Settingはこの通りにしないとたぶんちゃんと出ません。

f:id:honeylab:20170116131137p:plain

 

これでSave Bitmap Fontで "title" とつけると、title.fnttitle_0.pngができます。
ここで、title_0に収まらない場合、title_1ができてしまいます。
この場合、データ化できませんので使う文字を減らし、[Visualization]を使って
preview:1/1 と表示されるように調整しましょう。

さて、title.fntとtitle_0.pngができましたが、このtitle.fntはそのままではだめです。
例のヤツのフォントファイルは。

 

0x00 : 必ず 0x01

0x01 - 0x04 : 元のtitle.fntのサイズ (LSB 32bit)

0x05 - 0x08 : title.png のサイズ (LSB 32bit)

0x09 - xxxx 元のtitle.fntの実データ

xxxx- yyyy 元のpngの実データ

zzzz : 最終バイト必ず0

の構造になります。

このようにファイルをバイナリエディタかなんかで作るか、適当にツールを作ってpackしましょう。

出来上がったファイルを、最初のtitle.fntをは別のフォルダに title.fnt として保存しておきます。
このファイルを例のヤツのフォルダの中にある title.fnt に上書きします。
(前のは適当に取っておきましょう)

これでUse custom font してる状態でSyncすれば生成したfntが使えます。
fntファイルの作成に失敗した場合起動しなくなるので、とりあえず元のtitle.fntに戻しつつ、どこが間違ってるかを確認しましょう。
上に置いてあるファイルを参考にしてもいいかもしれません。

あと、このページは適当に書きなぐっているので、もっと詳しくやりたい人は
わかる人に聞いてみるか、誰かがわかるサイトを作ってくれるまで待ちましょう。

まぁ、全然調べてないのでもしかしたらとっくに本家が対応してたりして(わかんない

NES Classic Miniにいろいろなコントローラを繋いでみる

f:id:honeylab:20170114142157p:plain

適当に変換して突っ込んでやればキーボードとかつながるよね、と
コネクタの代わりにするつもりでたくさん買ってきたんだけど、とりあえず直接繋いでみると

 

[ 174.140538] input: Nintendo Clovercon - controller2 as /devices/platform/twi.2/i2c-2/2-0052/input/input6
[ 174.158326] Clovercon error: failed to set data format, value is 0
[ 174.169819] Clovercon error: controller setup failed with error 5
[ 174.181076] Clovercon info: opened controller 2, controller in error state after failed setup
[ 174.195189] Clovercon info: probed controller 2
[ 174.204667] Clovercon info: added device for controller 2
[ 175.055227] Clovercon error: failed to set data format, value is 0
[ 175.066473] Clovercon error: controller setup failed with error 5
[ 176.785226] Clovercon error: failed to set data format, value is 0
[ 176.796386] Clovercon error: controller setup failed with error 5
[ 178.473550] Clovercon info: removed controller 2
[ 178.483106] Clovercon info: removed device for controller 2

[ 187.293857] input: Nintendo Clovercon - controller2 as /devices/platform/twi.2/i2c-2/2-0052/input/input7
[ 187.311675] Clovercon error: failed to set data format, value is 1
[ 187.323083] Clovercon error: controller setup failed with error 5
[ 187.334316] Clovercon info: opened controller 2, controller in error state after failed setup
[ 187.348397] Clovercon info: probed controller 2
[ 187.357949] Clovercon info: added device for controller 2
[ 188.208787] Clovercon error: failed to set data format, value is 1
[ 188.220202] Clovercon error: controller setup failed with error 5
[ 189.938798] Clovercon error: failed to set data format, value is 1
[ 189.950118] Clovercon error: controller setup failed with error 5
[ 192.430218] Clovercon info: removed controller 2
[ 192.439832] Clovercon info: removed device for controller 2

 

見たいになって、どうやらこいつが認識するプロトコルでは通信しない、と跳ねられている用だ。
適当にソースを変更すれば何かしらつながるだろう。
cloverconのソースはGPLで公開されてるので誰でもいじれます。

ちなみに、純正ではこうなる

[ 3936.126814] input: Nintendo Clovercon - controller1 as /devices/platform/twi.1/i2c-1/1-0052/input/input8
[ 3936.144365] Clovercon info: opened controller 1, controller in OK state
[ 3936.159912] Clovercon info: probed controller 1
[ 3936.169405] Clovercon info: added device for controller 1

 

 

直接コンソール触れるキーボードがつながれば便利なんだけどなぁ
というか、多分I2Cキーボード、マウスを繋げば(≒作れば)普通に色々動くだろ。

 

追記:

純正のコントローラから帰ってくるcontroller infoは

[ 16.167399] Controller info data: 01 00 a4 20 03 01

動かない二つは下

[ 40.508637] Controller info data: 00 00 a4 20 00 00
[ 62.145529] Controller info data: 00 00 a4 20 01 01

この4バイト目を3にしてくれ、って上位から投げてるんだけど、下位がいやじゃ、って言ってるっぽいのかな。