PicWriterUSB:ソフトウェア編【FAT & Intel HEX】

hex_file_log

FAT12 readerとIntel HEX parserの実装

こんにちは、リゲル・インテリジェンスです。

RP2040にUSBマスストレージクラス&FAT12ドライブを実装しました。ホストOSからファイルとして書き込まれたデータはmsc_disk変数(RAM)上に展開されていますので、簡単&高速にアクセスすることが出来ます。ただし、msc_disk変数の大きさがそのままPicWriterドライブの容量となり、「.hex」ファイルのサイズ制限にもなります。

RP2040がDual coreであることを利用し、Core0にUSBマスストレージ処理をCore1にPICマイコン書込み処理を行わせますが、msc_disk変数のデータはその両方からアクセスされることになります。本来であれば同時アクセスによる意図せぬデータ破壊などを防ぐために適切な排他処理が必要ですが、Core1からは参照のみであることに加えてPICマイコンへのプログラム書込み中に元ファイルのデータを書き換えることはユースケース上も殆ど無いでしょうから、特に何も処理はせず通常の変数としてアクセスしています。

というわけで、PICマイコンに書込むデータをmsc_disk変数から取り出すには、

  • FAT12のreader
  • Intel HEXファイルのparser

の2つがあれば良いことになります。

FAT12 reader

FAT12をサポートするファイルシステムソフトウェアは巷に数多くありますが、今回は既にメモリ上にあるデータの参照だけですので(リソース低減の意味からも)外部プログラムなどは使用せず、必要な機能のみを直接実装していくことにします。アクセスの手順としては下記の通りです。

  • Block3(Root directory entry)へのWrite10コマンドがあれば、ホストOSからの書込みがあったと判断する
  • Block3(Root directory entry)に拡張子が「.HEX」のファイルエントリがあるか確認する
  • 該当するファイルエントリがあれば、開始セクタ(Block)、ファイルサイズ、ファイル名を取得する
  • 開始セクタの情報からFATチェーンを探索する

ファイル名の取得は動作確認ログに残すために行っています。Long file nameへの対応はPICマイコンへの書込みプログラムの動作上の必要性は無いですが、ログを見たときに不自然感があるので表示に対応しています。Long file nameの仕様では最大20のディレクトリエントリが使用可能です(制御文字含め260字)が、PicWriterドライブではルートディレクトリエントリの最大数が16でありしかもその内最低でも3つはボリュームラベルやファイルのエントリに使用しますので、13エントリx13文字=169字+末尾のNULLを入れて170字を最大数に設定しています。

これらの対応を入れたソースコードは下記になります。

このプログラムをRP2040にて実行しPicWriterドライブにHEXファイルを書込むと、下記のようにログが得られます。

hex_file_log

次ページで「.HEX」ファイルを確認していきます。

コメント

タイトルとURLをコピーしました