マイコン工作実験日記

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

RP2040 Doom

2022-03-16 19:21:14 | Weblog

すごいです。まさか、ピコで動かすとは。

ここで説明されているように、かなり苦労しているようですが、音楽や効果音、テキストモード画面までサポートしており、機能的な出来上がりは完璧です。

なるほど、音楽部分はOPL2のエミュレーションソフトを使っているのですね。こういうのがあるとは知りませんでした。わたしも試してみようかな。

 


TI 84 Python電卓の中身

2022-03-12 11:06:58 | Weblog

TIが出しているPython機能を持った電卓では、Python機能の実態としてATSAMD21E18が使われているという分解レポート。SAMD21は 3:50秒あたりで大写しになっています。

このチップAdafruitのQT Pyで使われているのと同一のM0 MCUなんですね。TIの電卓のクセしてMicrochip(ATMEL)のチップ使って、しかもUART接続で使っているという実態が明らかにされています。電卓も生き残りのための新鮮味を出すために必死というところでしょうか。


Doom Player --シリアル PSRAMを使うには

2022-03-07 12:42:03 | DoomPlayer

前記事でも述べたように、現在のDoom Playerでは内蔵メモリの大きなSTM32H7A3ですらメモリ不足になる場合があります。nrf-doom がやっているようにline_t 構造体を大幅に小さくするような工夫を凝らせば、動作に必要なメモリを減らすことはできますが、かなりのコード変更が必要となります。Doom Player ではゲーム本体のコードへの大幅な変更はできるだけやりたくなかったので、どうしてもメモリが必要であれば、シリアルPSRAMを増設して対処すれば良いということにしました。しかし、実際にシリアルPSRAMを使おうとすると一筋縄ではいかないことがわかったので、本記事ではシリアルPSRAMを使う上での問題点と、その対処法について書くことにします。実際に使っているのは、AP MemoryのAPS1604M-3SQRです。下の写真の左側がAPS1604M-3SQRで、右側はフラッシュのW25Q128JVになります。

シリアルPSRAMをSTM32H7A3に接続するためには、OCTOSPIを使います。その名前が示すように、8ビット幅のSPI接続をサポートします。しかしOCTOSPI対応のPSRAMを探すと、どのデバイスもBGAパッケージとなってしまい、ユニバーサル基板に手はんだで組み上げるスタイルがメインの自分には手におえません。そこで、4ビット幅のQSPI対応のPSRAMを使うことにします。フラッシュと同じように8ピンSOP変換基板で配線できるので、アマチュアにとってはとても手軽に使えます。

4ビット幅であれば、従来のSTM32F4/L4/F7/H7 MCUでもQSPIというペリフェラルが用意されていたのですが、OCTOSPIとQSPIにはビット幅以外にも大きな違いがひとつあります。それは、QSPIはSPIフラッシュを接続することを意図して用意されており、PSRAMには使えないということです。具体的には、メモリマップ動作での書き込みを全くサポートしていないのです。対して、OCTOSPIではメモリマップ動作での書き込みをサポートしているので、外部メモリとしてPSRAMを使うことができます。しかしながら、実際に使おうとすると、幾つもの障害が待ち受けていました。

DQS信号の設定

残念なことにOCTOSPIには幾つものエラッタが存在するのですが、その中でも "Memory-mapped write error response when DQS output is disabled". というエラッタに注目せねばなりません。DQS信号が禁止されていると、メモリマップモードでの書き込みができないという致命的な問題です。DQS信号を禁止するも何も、そもそも8ピンSOPパッケージのQSPI PSRAMの場合には、DQS信号そのものがありません。このタイトルだけ読むと、QSPI PSRAMを使うことはできず、DQS信号をサポートするOCTO SPIのPSRAMを使う必要があるように思えました。しかしながら、エラッタ本文をよく読むと、この問題には回避策があり、DQS信号の無いQSPI PSRAMを使う場合には、DQS信号を使う設定で使用し、実際の配線は不要であることがわかりました。

MPUの設定

DQS信号については、誤魔化して設定することで回避できることはわかりましたが、この回避策には制約があることも書かれています。AXIバス経由でのバイトアクセスでの書き込みが行われると、正しくバイトマスクが行われずに、余計なメモリまで書き変わってしまうという問題です。OCTOSPIは、AXIバスにつながっているインターフェースなので、バイトアクセスすれば必ずこの問題が発生してしまうことになります。具体的には、PSRAMの最初の1バイトだけ書き換えようとすると、後続する7バイトが0に書き変わってしまうという問題が発生します。この制約への対処策については、エラッタでは言及されていませんが、MPUを設定してPSRAMで使用するメモリ空間を "Strongly Ordered"に設定すれば良いことがわかりました。Normal Memoryではないので、キャッシュの効果が得られず、メモリアクセス性能は低下することになります。

ドライブ能力の設定

MPUの設定をすることで、任意のアドレスへの書き込み/読み出しが行えるようになったのですが、メモリパターンを変えながら書き込んでみると、時折ランダムにデータ化けが生じました。クロックを下げても現象に変化がないので悩みましたが、メモリ側のモードレジスタの設定を変更して、出力インピーダンスをディフォルトの50オームから100オームに変更したところ、問題を解消できました。何しろNucleoの上にユニバーサル基板を積んでいますので、どうしても配線長が長くなってしまうので、その影響があるのかもしれません。

OCTOSPI を使ったQSPI PSRAMの接続に関しては、AN5050においてもサンプルプログラムを含む言及があります。しかしながら、その内容は元々 STM34L4+向けに書かれたものであり、STM32H7で必要となるMPUの設定までは説明されていないので注意が必要です。もちろんSTのCommunityは貴重な情報源です。例えば、このスレッドが大変参考になりました。

QSPIのフラッシュやPSRAMは少ないピン数でメモリ容量を増やすことができ、ESP32ではその真価が十分に発揮されています。残念なことにSTM32では、比較的新しいデバイスでないと使うことができませんので、これらのデバイスを使う際には以下の点に注意が必要です。

  • QSPIとOCTOSPIの違いに注意。PSRAMを使うにはOCTOSPIが必要。
  • STM32H7ではOCTOSPIをサポートするデバイスと、QSPIをサポートするデバイスがある。
  • QSPIフラッシュとQSPI PSRAMの両方を使うには、OCTOSPIを2ポート持っているデバイスが必要。実際に二つのポートにつなげて使おうと思うと、144ピンパッケージが必要。


64pinとか100pinで両方が使えると便利なんですが。。。

 

 


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になっていました。