基本
CMSIS-Packsは、ARMコア向けのドキュメント、フラッシュアルゴリズム、コードサンプル、HALなどを配布するための、ARMの仕組みであり、大まかな仕様でもあります。
CMSIS-PackはARMコアの製造元が作成することが想定されており、ソースの一覧を通じて分散的に配布できます。それでも、ARMは実質的に必要になるほぼあらゆるチップ向けのCMSIS-Packsをホストしています。
CMSIS-PacksはZIPファイルであり、任意のファイルを含みます。正確な構造はメーカーによって定義されており、ZIPファイルのルートレベルに配置される .pdsc ファイルに記述されています。 .pdsc ファイルは、Packに関するすべてのメタ情報を含むシンプルなXMLファイルです。
また、Packの中にはたいていの場合(メーカーがそう選べば含まれないこともあります)、そのPackで記述されているチップに書き込むためのフラッシュアルゴリズムも含まれています。 これらは .FLM ファイルであり、一定の定義済み構造に従う単なるELFバイナリです。
フラッシュアルゴリズム
フラッシュアルゴリズムは、実行されるシンプルなプログラムです。これは、RAMにロードされてフラッシュダウンローダーによって実行される、固定の(場合によっては省略可能な)関数群で構成されます。 これらの関数についてはこちらで説明されています。 同じ仕様では、デバッグシンボルとしてELFバイナリ自体の中、および .pdsc ファイル内に格納されるメタデータについても説明されています。
完全に機能するフラッシュアルゴリズムを組み立てるには、ロード可能なELFシンボルとメタデータの両方が必要です。これはフラッシュダウンローダーの役割です。 関数は標準のARM EABI呼び出し規約に従います。
YAML形式
Packsには不要な肥大化した内容が多く含まれているため、ターゲット記述のための簡略化した形式を導入しました。 ターゲットの表現には、よく知られた形式でありコメントも記述できるため、YAMLを採用しました。 各YAMLファイルは、CMSIS-Packsに相当するチップファミリ全体を対象とします。
YAML形式は次の構造に従います:
---# チップファミリの名前。name: string# ファミリ内のすべてのチップの一覧。variants: # チップの名前。 - name: string # CPUコアの説明。 cores: # コアの名前。 - name: string # アーキテクチャ type: armv6m | armv7a | armv7m | armv7em | armv8a | armv8m | riscv | xtensa # コア固有のオプション。`!Arm {}`, `!Riscv {}`, `!Xtensa {}` のいずれかを指定できます core_access_options: object # 利用可能なすべてのメモリとそのプロパティの一覧。 memory_map: # メモリの種類。[!Ram, !Nvm, !Generic] を指定できます。 # !Ram と !Nvm の少なくとも一方が存在している必要があります。 - !Ram: range: # メモリの開始アドレス(この値を含む)。 start: number # メモリの終了アドレス(この値を含まない)。 end: number # このメモリを、チップがブート元とするメモリとして示します。 access: boot: boolean # この領域にアクセスできるコアの一覧 cores: - core name - !Nvm: range: # メモリの開始アドレス(この値を含む)。 start: number # メモリの終了アドレス(この値を含まない)。 end: number # このメモリを、チップがブート元とするメモリとして示します。 access: boot: boolean # この領域にアクセスできるコアの一覧 cores: - core name - !Generic: range: # メモリの開始アドレス(この値を含む)。 start: number # メモリの終了アドレス(この値を含まない)。 end: number # この領域にアクセスできるコアの一覧 cores: - core name # 使用されるすべてのフラッシュアルゴリズムの一覧。 flash_algorithms: # フラッシュアルゴリズムの名前。 - string# 利用可能なすべてのフラッシュアルゴリズムの一覧。flash_algorithms: # フラッシュアルゴリズムの名前。 - name: string # フラッシュアルゴリズムの説明。 description: string # このアルゴリズムをデフォルトアルゴリズムとして使用することを示します。 default: boolean # フラッシュアルゴリズムのすべてのロード可能シンボルを含む # Base64エンコードされたELFバイナリBlob。 instructions: base64string # initルーチンの位置独立アドレス。 pc_init: number # uninitルーチンの位置独立アドレス。 pc_uninit: number # program pageルーチンの位置独立アドレス。 pc_program_page: number # erase sectorルーチンの位置独立アドレス。 pc_erase_sector: number # erase allルーチンの位置独立アドレス。 pc_erase_all: number # ELFバイナリのdataセクションが開始するオフセット。 data_section_offset: number # フラッシュアルゴリズムが対応するエンコーディング(および圧縮アルゴリズム)。 transfer_encoding: raw | miniz flash_properties: # このフラッシュアルゴリズムを使用するアドレス範囲。 address_range: # 開始アドレス(この値を含む)。 start: number # 終了アドレス(この値を含まない)。 end: number # 書き込み可能なブロックサイズ。これはフラッシュに書き込める最小単位です。 page_size: number # フラッシュ内の1バイトが消去された状態の値。 erased_byte_value: number # ページプログラム処理にかかり得る時間。 program_page_timeout: number # セクタ消去処理にかかり得る時間。 erase_sector_timeout: number # このフラッシュ領域を構成するセクタ。セクタは消去可能な単位です。 sectors: # 以下のアドレスから適用されるセクタサイズ。 - size: number # 新しいセクタサイズが適用される開始アドレス。 address: number # このアルゴリズムを使用できるコアの一覧 cores: - core nameターゲット抽出
これらすべてを手作業で行うのは正気の沙汰ではないため、target-gen というユーティリティを提供しています。これは、すべてのメタデータとELF Blobを含むファミリ定義を抽出するために使用できます。
このユーティリティは、展開済みのPackフォルダーと、まだZIPのままの .pack ファイルの両方を受け付け、必要であればPackファイルを自動的にダウンロードすることもできます。
利用可能なオプションを確認するには target-gen --help を使用してください。
生成されたファイルは、probe-rs にターゲットとして読み込むことも、probe-rs が提供する組み込みターゲットに含めるべきだと思う場合にはPRとして提出することもできます。