読者です 読者をやめる 読者になる 読者になる

ファミコンミニでSDカードからLinuxが完全に起動した

honeylab.hatenablog.jp

上の方法で接続したSDカードから、u-bootとLinuxカーネルを読み込んで、
mmcblk0p1として作ったext2のrootfsをマウントして、
mmcblk0p2に作ったlinux-swapを認識して、仮想メモリ4Gの普通のLinuxが起動しました。
結局のことろ、適当に配線してたのが悪かったっぽいんですよねぇ…
このフレキにしたら、今まで起動していなかった手持ちのSD,マイクロSDカード
すべてからu-boot経由でlinuxが起動しました。

f:id:honeylab:20170213202251p:plain

free -m の結果、Swap: で3282 (MB) が出てますね。

 

で、これ、だれが必要なの…?

 

まぁ、とりあえず単体でいろいろ差し替えて遊べる、というところには来たので、
これからちょいちょい周辺機器をつないで遊んでみようかなと。
i2cってmonoから簡単に触れると便利だなぁとか、
FlashAirのスクリプトを使ってどうにかオンラインのデータをやり取りできないかな、とか
SDIOってうまく触れるのかな?とかいろいろある。

Xがなんか動かないな(フリーズする)
とりあえずstraceして調べてみよう、とか。

 

次の課題としては、せっかくLinux動くようにしたので、コンパイル環境(config)をちゃんと公開しようとか、
なぜかmali.koがうまく読み込めないので、
SDカードからカスタムカーネルを起動しつつ、もともとのfs(newroot)をちゃんとマウントして、swapが有効の状態でkachikachiが動くようにできるかな?ってとこかな。
最新のhakchiからinit周りを持ってきて、このカスタムカーネルと一緒にSDカードに書くだけで動くんじゃないかなって気もするんだけど。

SDカードフレキケーブル試作

試作品一号が動作しました。
取り回しやはんだ付けのしやすさなどをもう一度考えて、
フレキをもう少し短く、その先にプルアップ抵抗等の普通の基板をつける、ってしようかな。

 

とりあえず、今回の試作工程

f:id:honeylab:20170213133128p:plain

 

パターンを作ってみる

f:id:honeylab:20170213133206p:plain

 

試しに当てて試行錯誤する

 

f:id:honeylab:20170213133150p:plain

 

感光用フィルムに印刷

 

フレキ用生基板を使います

 

感光させます

 スプレー式現像液で現像。これすこぶる便利よ。

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

 

現像後、エッチング

f:id:honeylab:20170213133415p:plain

 

 

ドリルで穴をあける

f:id:honeylab:20170213133432p:plain

f:id:honeylab:20170213133440p:plain

きれいに磨いてはんだ付け

f:id:honeylab:20170213133502p:plain

 

つなぐ

f:id:honeylab:20170213133542p:plain

 

Linux起動した!

 

 

 

FlashAir(Wifi-SD Card) on NES Classic Mini

for comming users.

I have already succeeded to boot linux from SD Card on NES Classic Mini.

 Sometimes fail boot and cause error in Linux,I am adjusting now.
I wanto to make connection kit for SDCard on NESC.
More infomation are below.

 

honeylab.hatenablog.jp

 

honeylab.hatenablog.jp

honeylab.hatenablog.jp

 

 

NES Classic MiniのLinuxをcloverconで操作してslを走らせる

NES Classic Miniではコントローラがi2cで接続され、
Linux上からは/dev/event や /dev/input/event で取得することができます。
しかし、それを触るにはプログラムを書かなければいけないため少々面倒です。
将来的に、直接キーボードを接続する前準備として、
コントローラ端子にキーボードをつなげるようにドライバを改変してみました。
もちろん、将来接続するのはアレ↓ですがw

f:id:honeylab:20170210134741p:plain

 

さて、とりあえずコントローラのボタンとキーの割り当ては下のようにします。

↑ "o"

← " r"

↓ ”e”

→ "t"

SELECT "b"
START "ENTER"

B "l"
A "s"

 

こうすると、起動後の"login:"に 対して "root [ENTER]"を押してログインでき、
"ls [ENTER]"でファイル一覧が取得できます。


clovercon.cを少し改変

f:id:honeylab:20170210134343p:plain

f:id:honeylab:20170210134539p:plain

 

 

ところで、おっさん達はその昔端末に"sl"というプログラムが入っていることがあったのを覚えているかと思います。

https://ja.wikipedia.org/wiki/Sl_(UNIX)

Unix系OSにおいて、ls は最もよく使われるコマンドであるが、lsコマンドを実行しようとしてslとミスタイプすることがしばしばある。そのような場合、コンピュータは「sl」という存在しないコマンドを求めてシステムを全検索してしまい、70年代から80年代当時の処理能力の遅いコンピュータではそれにしばらく時間がかかり、作業が中断してしまうことがあった。そこでそれを防ぐため、「sl」と言う名のダミーのプログラムを用意することがあった。

このslも、そういったダミープログラムの一つであるといえるが、ミスタイプによってロスする時間(現代においては殆ど一瞬である)よりも、SLが走り抜けるのを待っている時間のほうが長いなど、ジョークプログラムとしての性格が強い。

Ctrl+Cでも停止できず、数分間も延々とSLが走っている姿を見させられるため、嫌がらせに近いと評価する者もいるが、学生時代の豊田准教授は本ソフトのマニュアルにおいて「高度に発展した、キータイプ矯正を目的とするアニメーションプログラムである」と主張している。

そんなslが、buildrootのパッケージに入っていたのでついでに入れてみました。

本当は[B][A][START] でlsしなければいけない時に、slしてしまうとどうなるか。
以下の動画でどうぞ。

 

ファミコンミニでスーファミエミュレータsnes9xを動かす

さて、2ボタンしかない日本のファミコンミニSNES入れてどうすんだといわれそうですが、
まぁ海外モデルでは複数ボタンもあるしどうにかなるんじゃね、ということで試していたSNESエミュレータがぼちぼち動きそうなので少しまとめておきます。

 

とりあえず、retroPiとかにも持っていかれる元のsnes9xを選定してみました。

GitHub - domaemon/snes9x-sdl: Snes9x - Portable Super Nintendo Entertainment System (TM) emulator

 

ここからcloneしてコンパイルします。
まず、ファミコンミニに非常に近いA33上で動かしてみることにします。

このA33にはLCDをつけていて、X11とかはちゃんと動いていますが、
適当にコンパイルした状態だと色がきちんと出ないうえに、
横に二つ並んで表示される、という困った状態になりました。

 

何となく推測すると、フレームバッファの色解像度と
出力されているLCDの解像度が合わない、ということのようです。
ここで早めに「きれいに2つ並んでるんだから、元が16bitで32bitディスプレイなんだな」と気づけばよかったんですが、そこに気付くまでには結構時間がかかりましたw

これは、結構早い段階でファミコンミニでも再現できていたため、
A33上で同じ現象が出る、ということはファミコンミニでも直すのに役立ちました。

↓のはpcDuinoでコンパイルした奴をファミコンミニに持って行ったものです。
結構前から動かせそうで動かせてなかったんですよね。

 

で、いろいろ調べてみたところ、ファミコンミニフレームバッファHDMI出力は
「1280x720 32bit」にすればきれいに出る、ということがわかりました。

ここで、snes9xのSDLポートはどうなっているかというと、

f:id:honeylab:20170206192342p:plain

見事に16bit固定のようです。さらに、

f:id:honeylab:20170206192426p:plain

のように、内部レンダリングも16bit固定になっていました。
もしかして、ここを変えればいいんじゃね?と思いましたが

f:id:honeylab:20170206192856p:plain

ここに指定できるのは、結局16bitカラーのみのようです。
エミュレーションの都合上仕方がないようなので、作成されたバッファを32bitに転送することで色変換を実現しました。

 

内部バッファと一緒にスクリーンは別途作って

f:id:honeylab:20170206193400p:plain

f:id:honeylab:20170206193510p:plain

フリップ時にいったん経由して描画する

そんな感じなのと、SDL1.2に依存しているので拡大縮小が出来ず、最大パフォーマンスが出ていませんが、SDL2に移行できればSDL_BlitScaledが使えて、
そうすると内部バッファとの関係でもう少しパフォーマンスが上がるかもしれません。

 

で、今のところはとりあえずこんなもんです。

上から下に移動してる青線はフレーム描画のテスト用に書いてるものです。 


ちょっとまだ遅いし、画面解像度の1280x800を使い切れていない(小さめで書いてる)ので、ぼちぼち調整して、あとはパッド対応をしたらどうにかなるかな。

 

fcuexをファミコンミニ向けにコンパイルする(not yet)

同様に、fcuexもA33向けにまずコンパイルしてみた。

 なんかすごいもっさりなんだけど…大丈夫かこれ?

同じように、SDLの依存がひどいので、再コンパイル待ち
コンパイルできたらファミコンミニに持っていこう。

snex9x-sdlをファミコンミニ向けにコンパイルする(not yet)

とりあえず、snes9x-sdlコンパイルしてA33で動かしてみた。

SDLはA33上でapt-get した。

ひろみつ(85.1kg) on Twitter: "snes9x-sdl on A33 board https://t.co/KE8KKGgTFL"

 

なんかもっさりしてる?
こないだ一回ファミコンミニで動かしたときはそんなんでも無かった気がするんだけどなぁ

 

で、ファミコンミニに持っていこうとするが、依存ライブラリが多すぎてダメだこりゃw

と言うわけで、改めてSDLを最小限構成で自前ビルドしてる所なう。

root@A33-OLinuXino:/home/olimex/SDL-1.2.15# ./configure --without-x --disable-directfb --disable-pulseaudio --disable-pulseaudio-shared --disable-arts --disable-nas --disable-diskaudio --disable-dummyaudio --disable-video-x11 --disable-input-tslib

で、できたSDLの依存先は

root@A33-OLinuXino:/home/olimex/SDL-1.2.15# ldd /usr/local/lib/libSDL-1.2.so.0
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6eb0000)
libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6e9c000)
libdirectfb-1.2.so.9 => /usr/lib/arm-linux-gnueabihf/libdirectfb-1.2.so.9 (0xb6e3b000)
libfusion-1.2.so.9 => /usr/lib/arm-linux-gnueabihf/libfusion-1.2.so.9 (0xb6e25000)
libdirect-1.2.so.9 => /usr/lib/arm-linux-gnueabihf/libdirect-1.2.so.9 (0xb6e05000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6de2000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6cf1000)
/lib/ld-linux-armhf.so.3 (0xb6f99000)

うーん、なんか思って無いのが入ってるぞ?--disable-directfbしたはずなのになんで入っちゃってるんだろう…
でもまぁこのぐらいなら持っていける?とか思ったりもする

 

さて、改めてコンパイル中…