マイコン工作実験日記

Microcontroller を用いての工作、実験記録

Doom Player -- QSPI Flashについて

2022-02-25 21:36:49 | DoomPlayer

Doom Playerでは、次の目的でQSPIフラッシュを使用しています。

  1. ゲームデータであるWADファイルの格納
  2. ゲームの設定データの格納
  3. Music Player機能で表示に使用する円形の画像データの格納

このQSPIフラッシュとしては、WinbondのW25Q128JVとW25Q256JVを使っています。シェアウェア販であるDOOM1.WADであれば、およそ4MBのサイズなので64Mbitのフラッシュでも足りるのですが、正規ゲーム版のDOOM.WADになると10MB越えになるので128Mbitが必要となります。PLUTONIA.WADTNT.WAD になると16MB越えなのでW25Q256JVを使っています。

W25Q128JVは安価でSOIC-8パッケージもあるのでアマチュアにとっても使いやすいデバイスです。W25Q256JVはパッケージがWSON-8になってしまい幅広なので、秋月のSOP8 DIP変換基板に載らないのが残念なところ。

どちらもWinbondの製品ですので、QSPIフラッシュのコマンド体系は同じなのですが、128Mbitまでは3バイトのアドレスで足りたのが、256Mbitになると4バイトアドレス指定が必要になります。したがって、容量の違いを判別して、適切な長さのアドレスを送る必要があります。容量の判定するには、Read Manufacturer/ Device IDコマンドでデバイスのIDを読んで判定することもできますが、今回はRead SFDP registerコマンドを使ってSFDP情報に含まれる容量情報を参照することにしました。

SFDPには、読み出しに使用するコマンドや、セクターのサイズ等の情報も含まれているので、これらを参照して動くようなコードを用意することも可能なように思われますが、使うデバイスによってはベンダー固有情報も参照しないとならなくなる場合もあるようなので、どんなベンダーのどんなデバイスでもサポートするドライバを作るためには、ノウハウの蓄積が必要そうです。Winbondの場合には、基本パラメータテーブルだけしか持っていないようなので、複数デバイス対応も難しくなさそうです。

写真のように複数のフラッシュを用意したので、それぞれに別のWADファイルを書き込んでおき、フラッシュの差し替えでゲームを切り替えることが可能です。以下、オープニングの画面だけですが、紹介しておきます。

上に示したWADファイルは、いずれもゲームを起動できデモを一巡することができるのですが、一部のファイルではゲーム開始時やステージの切り替わり時にメモリが不足してリブートしてしまう場合があります。画面切り替わり時に画面が崩れ落ちるように切り替わるワイプ表示効果でメモリが消費されるのが原因なので、ゲーム開始時にこのワイプ表示を行わないようにするボタンを用意してあります。

ソースファイルのf_wipe.cで処理されているのでwipeボタンにしたのですが、Doom用語では "Screen Melt" と呼ばれているようなので、そのうちに修正するつもりです。

手持ちのWADファイルのデモは、この対処でいずれも内蔵メモリだけでも一巡できるようになったのですが、どうもギリギリで動いている箇所もある気配です。実際にゲームをすると、メモリが不足するステージもあるに違いないでしょう。やはり、実際にゲームをプレイして楽しむためには、PSRAMを積んで動かした方が良さそうです。

 


Doom Player -- VS1053b

2022-02-19 12:41:10 | DoomPlayer

Doom Playerでは、ゲーム音楽や効果音は全てVS1053bを経由して出力されています。前記事でも触れたように、効果音はSTM32H7A3のDACによりアナログ信号に変換され、これをVS1053bでゲームBGMとミキシングしています。

ゲーム音楽は、DOOMのWADファイル上では、MUS形式と呼ばれるDOOM独自の形式で保存されていますが、この形式はMIDIのフォーマット0(SMF0)のデータとその並びをちょっと変更した程度のものなので、MIDI SMF0に簡単に逐次的に変換することができます。つまり、MIDIのSMF0データを入力として受け付けてくれる音源チップがあれば、ゲーム音楽を再生できることになります。そのようなアマチュア向けチップとしては、どうやら次の2種類があるようです。

  1. VS1053b
    2000年代終わりにMP3プレーヤ製作用として大ヒット(?)した製品。MP3の特許が切れて激安中華製プレーヤが出現するとともにMP3プレーヤを製作する人も姿を消しましたが、今でもチップやボードは販売されているようです。MIDIシンセとしての音や機能には限りがあるので、MIDI機能を使っている人は多くはないように思われます。わたしも、MIDI機能が備わっていることには、今回の製作を始めるまで全く気づいていませんでした。
  2. SAM2695
    フランスのDream社のチップ。MIDI野郎で使われているチップ。今回、初めて知りました。Aliexpressとかではチップ買えそうですが、ちょっと入手難しそう。おまけに、0.4mmピッチのQFNなのでハンダ付けも苦労しそう。

SAM2695の方がいい音で鳴りそうなのですが、入手/工作も難しそうなので適当なモジュールが無いか探したところ、ようやく見つけたのが、こちらのボード。シールドサイズなのでちょっとデカい。SAM2695はI2Sでの出力もできないので、やはり今回はVS1053b を使うことにしました。レトロゲームにレトロチップの組み合わせも悪く無いだろうと思ったのですが、ちゃんと音が鳴るまで苦労しました。以下、その経過。

VS1053bでMIDIデータの生成をするためには、Real time MIDI機能というものを使います。VS1053bのGPIO0をL, GPIO1をHレベルに固定してブートすれば、何もしなくてもシリアルポートで受信したMIDIデータを再生してくれるという嬉しいバカチョン機能です。早速、SMF0に変換したDOOMの音楽データを流し込んでみたのですが、頻繁に再生が止まってしまい使い物になりません。長くても45秒くらいでおかしくなって、短い場合には、再生を始めて数秒で止まってしまいます。配線ミスかと思って確認したものの、問題はなく、同じような経験をしている人がいないか検索したところ、シンセアンプラグドさんが同じような経験をされており、どうやらチップの問題らしいことが判明。

VS1053bをMIDI音源として使っている人は少ないのか検索しても解決策が見つからないので、 本家のフォーラムを読み漁ったところ次のことがわかりました。

  • 元々のreal time midi機能は、入力のバッファが短く、ノート数が多いとバッファが溢れて音の再生が止まったり、鳴りっぱなしになったりすることがある。使い物にならん。
  • 解決策として、"Real-Time MIDI input" というアプリケーションが提供されているので、これをVS1053bのRAMにダウンロードして、ROMで提供されているオリジナルファームの代わりに走らせる。

と、まぁ、これだけのことだったのですが、データシートだけでなくアプルケーションノートはひと通り読まないといけないということを改めて、認識しました。VS1053bって、何種類もパッチ/アプリ/プラグインが用意されているなんて全く知らなかったので、ちょっとした驚きです。一番、驚いたことは、マイコン無しでVS1053bにSDカードをつなげてMP3プレーヤを作れるというアプリが用意されていること。VS1053bが内蔵するDSPをプログラムすることで、マイコン無しでもプレーヤが作れるようです。

最新のパッチは2020年になっており、長くサポートされているようです。今回使用したFeatherWingのチップのデートコードは2033になっていました。


Doom Player -- ハードウェア概要

2022-02-16 12:47:18 | DoomPlayer

Doom Playerのハードウェアがほぼ固まったので、その概要を記すことにします。まずは全体像。

Nucleo-H7A3ZIの上に拡張基板を載せて、さらにその上にLCDモジュールが載っているという3階建てです。

ユニバーサル基板で組んである拡張基板には、VS1053bとQSPIフラッシュが載っています。8ピンのDIPソケットがふたつ並んでおり、SOPパッケージを変換基板を使って実装。右側には QSPI フラッシュ、左側には予備のフラッシュもしくはPSRAMを載せて使うことができます。この写真ではPSRAMが載っていますが、何も刺さなくでも動作可能。予備のQSPIフラッシュを乗せた場合には、ブート時にBLUEスイッチを使って、どちらのフラッシュを参照するかを選択することができます。そのため、2種類のDOOM WADファイルを切り替えて使うことができるという仕掛けになっています。PSRAMは、内蔵メモリだけではメモリ不足でゲームが遊べない場合に使用します。現在のファームでは、内蔵メモリだけでもシェアウエア版のゲーム(DOOM1.WAD)は問題なくデモが動くのですが、WADファイルによってはデモを走らせていると、途中でメモリ不足でリブートしてしまいます。実際にゲームをプレイしている際にもステージの途中や切り替わり時にメモリ不足が生じることがあります。シェアウエア版であれば、内蔵RAMだけでも最後までプレイできるかもしれませんが、未確認です。

VS1053bの部分は、Music Maker FeatherWing を使っています。自分で変換基板を使って組むより簡便で小さくできるのがメリットですね。

LCDモジュールは、BuyDisplayの3.5インチもの。このモジュールはインタフェースのバリエーションが選べるし、ジャンパ設定で自分で変更することも可能なのが気に入っています。以前は、もっと安かったんですが、近頃は値上がりしてしまったのが残念ではあります。LCD基板の裏にはSPI フラッシュ用のパターンが用意されていますが、普通のSPIでありQSPIアクセス用の信号は出ていないので、未使用。

LCDインターフェースとしては、8ビットパネル、静電容量タッチパネル付きで購入。STM32H7A3にはLTDCが備わっているのでRGB565を使うことも可能ですが、内蔵メモリをフレームバッファで消費してしまうのが気がかりだったので、8ビットパラレルを選択。16ビットパラレルが使えれば、書き込み速度を倍にできたところですが、Nucleo-H7A3ZIだとFMCから16ビットを引き出すことができなかったので断念。

ハードウェア全体は、各モジュールやICをほぼ直結するだけの単純なものです。ブロック図で示すとこうなります。

QSPI Flash/PSRAMは、STM32H7A3のOCTOSPIを使ってつなげます。Nucleoではピン割り当ての都合上、個別のIOラインを割り当てることができないので、線を共有するMultiplex モードを使用。CS信号でアクセスするデバイスを切り替えます。

VS1053bとは、4種類のペリフェラルを使って接続。SPIは、VS1053bの設定用。UARTは、MIDIデータの送信用。そして、I2Sは再生したMIDIの合成音をデジタル信号として受信するために使用しています。この信号データからMusic Player機能で表示されるスペクトラム画像が生成されます。

DACは、Doomのゲーム効果音の再生に用いられています。DOOMの効果音は、PCMの8ビットデータとして用意されていますので、これをDACでアナログ信号に変換。VS1053b側では、LINE入力でこれを受けることで、MIDIの再生音とミキシングして再生することができます。基板上にはイヤフォンジャックが載っていますが、これはDACの出力音を確認するために使用したものです。

このように各部を直結するだけなので、パスコンやDAC出力のDC成分除去用のコンデンサが追加で必要なくらいの単純なハードウェアです。配線作業も大したことはないのですが、ただひとつだけ配線作業に注意が必要なのが、VS1053bからの端子引き出しです。

Music Maker FeatherWingでは、VS1053b のLINE入力端子やI2Sの信号端子は未使用となっており、基板の端子ランドとは接続されていません。幸いなことに、これらの端子はフローティングのままとなっており、FeatherWing基板も多くのGPIO端子が未使用のために、それらのランドが空いていました。そこで、QFPパッケージの端子にポリウレタン線を半田付けして引き出しています。

 

FeatherWingとLCDボードにはSDカードスロットも備わっていますが、これらは未使用。将来的には、ゲームデータのSave/Load機能をサポートしてもいいかもしれません。