この解説は、Skyworks (Silicon Labs) Si47XX PROGRAMMING GUIDE AN332 を基に、Google AI (Gemini) の協力を得て作成しています。
1 コマンド 概要
PATCH_ARGS (Patch Arguments Setting)
Silicon Labs社製ラジオレシーバIC(Si4735/32等)において、「0x15: PATCH_ARGS」はファームウェアパッチをデバイスの内部RAMに適用するためのコマンド(Command)です。
パッチデータの構造はPATCH の構造を参照下さい。
[目的と概要]:
Silicon Labs社製ラジオレシーバIC(Si4735/32等)において、「0x15: PATCH_ARGS」はファームウェアパッチをデバイスの内部RAMに適用するためのコマンド(Command)です。
パッチデータの構造はPATCH の構造を参照下さい。
[目的と概要]:
外部ホストマイコンからSi47xxの内部RAMへ、ファームウェアパッチの制御情報、インデックス、またはメタデータ(引数)を流し込むための専用コマンド。
[AN332で記載されていない目的と解説]:
0x16 (PATCH_DATA) が純粋なバイナリデータの連続転送を行うのに対し、0x15 はパッチ転送のシーケンスにおけるアドレスの切り替え、セクションの区切り、または特定の制御トリガーとして機能します。
パッチファイル全体の約5%〜10%未満という少数派ですが、データ構造を正しくパースさせるための「インデックス指示役」として不可欠なコマンドです。
パッチファイル全体の約5%〜10%未満という少数派ですが、データ構造を正しくパースさせるための「インデックス指示役」として不可欠なコマンドです。
2 コマンドパラメータ
2.1 パラメータリスト
ホストから送信するパケットは、先頭のコマンドバイトを含めて常に計8バイト固定です。
AN332で記載されていない目的と解説:
マイコンのROM容量を削減する「圧縮パッチ(Compressed Patch)」手法を実装する際、この 0x15 が出現する行番号(インデックス)を特定・記録しておくことが極めて重要になります。
これにより、大部分を占める 0x16 を配列から全て削り、0x15 の位置だけを動的に差し替えて送信するアルゴリズムが可能になります。
AN332で記載されていない目的と解説:
マイコンのROM容量を削減する「圧縮パッチ(Compressed Patch)」手法を実装する際、この 0x15 が出現する行番号(インデックス)を特定・記録しておくことが極めて重要になります。
これにより、大部分を占める 0x16 を配列から全て削り、0x15 の位置だけを動的に差し替えて送信するアルゴリズムが可能になります。
| Bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| CMD | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
| ARG1 | X | X | X | X | X | X | X | X |
| ARG2 | X | X | X | X | X | X | X | X |
| ARG3 | X | X | X | X | X | X | X | X |
| ARG4 | X | X | X | X | X | X | X | X |
| ARG5 | X | X | X | X | X | X | X | X |
| ARG6 | X | X | X | X | X | X | X | X |
| ARG7 | X | X | X | X | X | X | X | X |
| ARG | Bit | Name | Function |
|---|---|---|---|
| 1 | 8 | Patch Argument Byte 1 | |
| 2 | 8 | Patch Argument Byte 2 | |
| 3 | 8 | Patch Argument Byte 3 | |
| 4 | 8 | Patch Argument Byte 4 | |
| 5 | 8 | Patch Argument Byte 5 | |
| 6 | 8 | Patch Argument Byte 6 | |
| 7 | 8 | Patch Argument Byte 7 |
[AN332で記載されていない目的と解説]: 0x16 と同様に、この7バイトが内部のどのメモリ空間や制御レジスタに対応しているかは完全に非公開(ブラックボックス)です。
ユーザーはデータ改変を行わず、パッチファイル(.csgなど)に記載された通りの値をそのまま送信する必要があります。
ユーザーはデータ改変を行わず、パッチファイル(.csgなど)に記載された通りの値をそのまま送信する必要があります。
3 応答パラメータ
STATUS (Status Byte)[目的と概要]:
コマンド(8バイト)を1行送信するごとに、デバイスから1バイトのステータスが返されます。
[目的と概要]:
デバイスの現在の状態を示す1バイトの応答。最上位ビット(Bit 7)の CTS (Clear to Send) と、Bit 6の ERR (Error) を含みます。
[詳細解説]:
CTS (Bit 7): デバイスが1行(8バイト)のデータ処理を終え、次のパッチコマンド(0x15 または 0x16)を受け入れ可能になったら 1 になります。
ホストはこのビットを必ずポーリング(監視)する必要があります。
ERR (Bit 6): パッチの転送中に内部チェックサムエラーや、データの順序不正(シーケンスエラー)を検出した場合、デバイスはこのビットを 1 にしてパッチ処理を強制停止(ハルト)します。
特に 0x15 と 0x16 の送信順序が1行でも狂うと、即座にこのERRビットが 1 になります。
コマンド(8バイト)を1行送信するごとに、デバイスから1バイトのステータスが返されます。
[目的と概要]:
デバイスの現在の状態を示す1バイトの応答。最上位ビット(Bit 7)の CTS (Clear to Send) と、Bit 6の ERR (Error) を含みます。
[詳細解説]:
CTS (Bit 7): デバイスが1行(8バイト)のデータ処理を終え、次のパッチコマンド(0x15 または 0x16)を受け入れ可能になったら 1 になります。
ホストはこのビットを必ずポーリング(監視)する必要があります。
ERR (Bit 6): パッチの転送中に内部チェックサムエラーや、データの順序不正(シーケンスエラー)を検出した場合、デバイスはこのビットを 1 にしてパッチ処理を強制停止(ハルト)します。
特に 0x15 と 0x16 の送信順序が1行でも狂うと、即座にこのERRビットが 1 になります。
4 その他(Google AI (Gemini) の見解)
4.1 コマンドの重要ステップと注意事項
POWER_UPでの前提条件:
厳密な8バイト境界の維持:
CTSの確実なポーリング:
0x01: POWER_UP コマンドを発行する際、引数の FUNC でパッチ起動フラグ(Patching enabled)を有効にしておく必要があります。
これが無効な場合、0x15 コマンドは不正コマンドとして即座に無視またはエラーになります。
これが無効な場合、0x15 コマンドは不正コマンドとして即座に無視またはエラーになります。
厳密な8バイト境界の維持:
0x15 を含む8バイトのパケットを途切れなく送信する必要があります。
1バイトでも欠落すると、デバイスは次のデータを正しいコマンドとして認識できなくなります。
1バイトでも欠落すると、デバイスは次のデータを正しいコマンドとして認識できなくなります。
CTSの確実なポーリング:
0x15 コマンドは内部のアドレス切り替え等を伴う場合があるため、処理にわずかな時間を要することがあります。
固定のディレイではなく、必ずSTATUSのCTSビットが 1 になったことを確認してから次の行(0x16 など)に進んでください。
固定のディレイではなく、必ずSTATUSのCTSビットが 1 になったことを確認してから次の行(0x16 など)に進んでください。
4.2 もう少し踏み込んだ応用展開
効率的なメモリ圧縮アルゴリズムの鍵:
パッチデータ内において、0x15 は「たまに現れる特別な行」です。
これを応用し、マイコンのフラッシュメモリを節約するために、パッチデータ全体から先頭の 0x15 や 0x16 を全て削除し、 「0x15 が何行目に存在するか」のインデックス情報だけを別配列(数バイト〜数十バイト程度)で管理する手法が極めて有効です。
送信時にインデックスと一致した行だけ 0x15 を先頭に付与し、それ以外は 0x16 を付与して送信することで、配列全体のサイズを12.5%削減(1000行なら1KB以上の削減)できます。
これを応用し、マイコンのフラッシュメモリを節約するために、パッチデータ全体から先頭の 0x15 や 0x16 を全て削除し、 「0x15 が何行目に存在するか」のインデックス情報だけを別配列(数バイト〜数十バイト程度)で管理する手法が極めて有効です。
送信時にインデックスと一致した行だけ 0x15 を先頭に付与し、それ以外は 0x16 を付与して送信することで、配列全体のサイズを12.5%削減(1000行なら1KB以上の削減)できます。
4.3 デバッグ時のチェックリスト
送出パケットの先頭バイト確認:
ERRビットのリアルタイム監視:
最I2C/SPI通信バッファの整合性:
パッチファイルからデータを読み出す際、0x15 と 0x16 が元のファイルの記述通りに正確に識別・送信されているか?(入れ替わりや一律変換のバグがないか)
ERRビットのリアルタイム監視:
0x15 コマンドを送信した直後にSTATUSのBit 6(ERR)が 1 になっていないか?(ここでエラーが出る場合、POWER_UP の設定ミスか、そこまでの 0x16 データに過不足があった可能性が高いです)
最I2C/SPI通信バッファの整合性:
マイコン側の通信ライブラリが、0x15+7バイトの計8バイトを1つのフレームとして正しくデバイスに届けられているか?
4.4 まとめ
0x15: PATCH_ARGS コマンドは、大量の 0x16: PATCH_DATA の中に埋もれがちですが、パッチ全体の構造を正しく組み立てるための「ナビゲーター」として決定的な役割を持っています。
このコマンドの出現タイミングを正確に処理し、CTS同期を徹底することが、SSB拡張パッチをノーエラーで一発完遂させるための重要な境界線となります。
このコマンドの出現タイミングを正確に処理し、CTS同期を徹底することが、SSB拡張パッチをノーエラーで一発完遂させるための重要な境界線となります。
