beala.substack.comのページ
出典: beala.substack.com

LR2021のPRAMに独自プログラムを読み込む

LoRa無線チップSemtech LR2021には、無線処理を担う回路に加えて、ファームウェアを書き換えられるマイコンが内蔵されています。開発者のAlex Beal氏は、チップ内の4KBのパッチ用メモリー「PRAM」に独自プログラムを読み込む方法を調べ、FFT処理やメッシュネットワークの中継をチップ上で動かしました。

一般的なメッシュ機器では、外部マイコンがLoRaチップに送信などを指示し、受信時にはチップからデータを受け取ります。外部マイコン側のプログラムが、パケットの符号化や転送の規則を処理する構成です。

LR2021の内蔵プロセッサは、32MHzで動作するSynopsys ARCv2 EMです。通常はチップへのコマンド処理などを担い、ユーザーが直接プログラムするための機能ではありませんが、PRAMにプログラムを置くことで処理を追加できます。

I/Qサンプルからウォーターフォール表示を生成

Beal氏は、LR2021から生のI/Qサンプルを読み出すソフトウェア無線の手法を踏まえ、サンプルを外部へ転送せずにチップ内で高速フーリエ変換(FFT)を実行するプログラムを作りました。FFTは信号を周波数成分に分解する計算で、その結果から無線信号の変化を示すウォーターフォール表示を生成します。

最初の実装では表示が毎秒6.6フレームでしたが、DMAでサンプル取得と計算を並行させるなどの工夫により、毎秒462フレームに達しました。DMAは、CPUが別の処理をしている間に周辺回路がメモリーへデータを転送する仕組みです。

この処理では、実行コードを置けるPRAMだけでは計算用メモリーが足りません。Beal氏はメモリー領域にデータを書き込み、内容が変化しないか調べて、作業領域や参照テーブルに使える場所を特定しました。

メッシュ中継もチップ上で動作

Beal氏はMeshCoreのリピーター用ファームウェアもPRAM向けに移植し、LR2021単体で中継処理を実行しました。プログラムをPRAMに読み込む段階では外部マイコンが必要ですが、読み込み後はスリープさせ、LR2021が中継を続けます。

移植版は直接ルーティング、フラッドルーティング、トレースパケット、アドバタイズに対応します。送信待ちキューには最大4件のメッセージを保持でき、64件の重複排除テーブルで同じパケットの再送を抑えます。

一方、暗号化処理は移植されていません。アドバタイズには署名済みデータをあらかじめメモリーに置く方式を使い、時刻情報は更新しません。また、チップ内蔵ファームウェアのイベントループに処理を協調させる必要があるため、既存のイベントを受け渡しながら中継機能を割り込ませています。

固定機能の無線機や一般的なSDRとの違い

LoRaは、チャープ信号を使うスペクトラム拡散方式の変調です。通常の構成では外部マイコンがパケット処理などを行い、無線チップがLoRa変調・復調を含む無線通信を担います。

一般的なSDRでは、送受信の信号処理をソフトウェアで組み立てます。GNU RadioのLoRa実装では拡散率や符号化率、帯域幅などを選べ、受信側には同期、復調、誤り訂正、CRC検証などの処理ブロックが用意されています。

LR2021の試みでは、無線チップ内のプロセッサとPRAMを使い、FFTや中継の一部をチップ上で実行します。ウォーターフォール表示の生成では、別の機器へI/Qサンプルを運んでから処理する手順を省けました。メッシュ中継では外部マイコンを完全になくすのではなく、プログラムの読み込み後にスリープさせています。