🔎

Arduino UNO R4 Minima 用のブートローダーのソースコードを読む ( SystemInit 編 )

2025/01/12に公開

変更履歴

  • rev.1 2025/01/14 変更履歴を追加。「[対象外] BSP 未初期化変数の早期初期化」の SystemCoreClock に関する記述を修正。
  • rev.0 2025/01/12 新規作成

1. はじめに

この記事では、前回の記事で省略した SystemInit関数について確認した内容をまとめます。
ビルドしたブートローダーが実行する SystemInit関数は、Renesas の Flexible Software Package (FSP) に含まれています。この関数は、Renesas マイコンの機能やビルド設定に応じて必要な処理が組み込まれます。Cortex-M85 のエラッタ対応や TrustZone に関する設定など、Cortex-M4 には適用されない処理が多く含まれていますが、今回は勉強のため、対象外となる機能についても可能な限り確認しました。
ただ、SystemInit関数内で実行されるクロック設定処理 (bsp_clock_init関数) については、情報量が多いため次回の記事で記述することにいたしました。Minima 用のブートローダーがアプリケーションを起動するまでの確認については、次の記事で終了する予定です。

  • 過去の関連記事
  1. Arduino UNO R4 Minima用のブートローダーをビルドする
  2. Arduino UNO R4 Minima用のブートローダのソースコードを読む (アプリケーション起動編)

2. SystemInit 関数

SystemInit関数の各コードブロックを、上から順番にセクションに分けて記述します。対象外となるコードについてはセクション名に [対象外] と記載しました。

[対象外] Cortex-M85 のキャッシュと分岐機能の初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L196-L205

Cortex-M85を搭載したマイコン 向けの設定です。命令キャッシュ、分岐予測、および低オーバーヘッド分岐拡張を有効化する設定が行われています。
さらに、最新のリリース版(v5.7.0)では、初期化処理に加えてエラッタ対策が実装されています。

https://github.com/renesas/fsp/blob/v5.7.0/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L233-L243

  1. エラッタ 3175626
    AXIバス上でキャッシュの追い出し (eviction) とストア処理間の WAW ハザードによってロード処理がハングアップする場合があるそうです。この問題を回避するために、キャッシュポリシーを強制ライトスルーに設定しています[1],[2]

  2. エラッタ 3190818
    特定条件下で非キャッシュ可能な場所に対する LDM 命令が進まなくなるそうです[3]。この問題はACTLR (Auxiliary Control Register) の予約領域である16ビット目[4]を 1 にすることで回避できます。ただし、非キャッシュ可能領域に対する LDM 命令のパフォーマンスに影響を与えるとのことでした。

なお、Minima に搭載されている ra4m1 は Cortex-M4 なので、このブロックは対象外となります。Minima の場合はコンパイルオプションに-mcpu=cortex-m4が指定されており、下記のように__ARM_ARCH_7EM__がプリプロセッサマクロとして定義されています。

$ arm-none-eabi-gcc -mcpu=cortex-m4 -dM -E - < /dev/null | grep __ARM_ARCH_7EM__
#define __ARM_ARCH_7EM__ 1

これにより、以下のパスにある renesas.h でRENESAS_CORTEX_M4が定義されます。
tinyusb/hw/mcu/renesas/fsp/ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/renesas.h

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/renesas.h#L109-L111

FPU の有効化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L207-L214

FPU を有効化する処理です。RA4M1 シリーズのマイコンには単精度浮動小数点ユニット (FPv4-SP FPU [5]) が搭載されています[6]
FPU へのアクセスは、CPACR レジスタ (Coprocessor Access Control Register) の CP10、CP11 の両方に 0b11 を書くことで有効化 (フルアクセス) できます[7],[8]

定数__FPU_USEDはtinyusb/lib/CMSIS_5/CMSIS/Core/Include/core_cm4.hに定義されています。このファイルは、ブートローダーのビルド時に get_deps.py で取得した CMSIS_5 ライブラリの一部です。
https://github.com/ARM-software/CMSIS_5/blob/20285262657d1b482d132d20d755c8c330d55c1f/CMSIS/Core/Include/core_cm4.h#L100-L111
__VFP_FP____SOFTFP__は、GCC によって定義されるプリプロセッサマクロです。コンパイルオプション-mfloat-abiを hard に設定すると__SOFTFP__は定義されませんが、__VFP_FP__は soft および hard の両方で定義されます。

$ arm-none-eabi-gcc -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -dM -E - < /dev/null  | grep -E '__VFP_FP__|__SOFTFP__'
#define __VFP_FP__ 1
$ arm-none-eabi-gcc -mcpu=cortex-m4 -mfloat-abi=soft -dM -E - < /dev/null  | grep -E '__VF
P_FP__|__SOFTFP__'
#define __SOFTFP__ 1
#define __VFP_FP__ 1

また、__FPU_PRESENTは R7FA4M1AB.h で 1 として定義されています。

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/R7FA4M1AB.h#L56-L61

[対象外] Sealing Stack

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L216-L223

このブロックは、TrustZoneを搭載したArmv8-MおよびArmv8.1-M向けのセキュリティ対策です。Cortex-Mシリーズ用のTrustZoneには、ノンセキュア側の状態遷移を悪用し、セキュア側のスタックポインタ(MSP_SやPSP_S)が指す値を、関数の戻りアドレスや割り込み復帰時のインテグリティシグネチャとして誤解釈させる攻撃があります[9]
この攻撃を防ぐため、MSP_Sの初期値が指すアドレスに0xFEF5EDA5 (BSP_TZ_STACK_SEAL_VALUE) を設定しています。この値は、通常の戻りアドレスやインテグリティシグネチャとして解釈されない特殊なパターンです。
この設定により、例えばSystemInit関数から抜けてReset_Handlerに戻り、セキュア側のメインスタックが空になった状態で、スタックポインタをプロセススタックポインタ(PSP_S)に切り替えた場合に、攻撃を防ぐことができます。一方、MSP_Sが初期値ではない (セキュア側のメインスタックポインタが空ではない) 状態でPSP_Sに切り替える場合には、この処理だけでは不十分です。この場合は、MSP_Sが指すアドレスに 0xFEF5EDA5 を手動で設定する必要があります[10]

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L51

VTOR の初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L225-L232

Cortex-M33 の場合、リセット時の VTOR の値は不定 (UNKNOWN) とされています[11]。そのため、__Vectorsシンボルが指すアドレスを VTOR として設定します。この処理はセキュアプロジェクトで実行されます。一方、ノンセキュアプロジェクトは、セキュアプロジェクトによってSCB_NS->VTORが設定された後に起動されるため、この処理はスキップされます。

Cortex-M4 の場合、リセット時の VTOR の値は 0x00000000 に初期化されています[12]。Cortex-M4 には TrustZone がないため、ノンセキュアプロジェクトとセキュアプロジェクトの区別はありませんが、セキュアビルドと同様に VTOR の初期化処理を行います。またアプリケーション側でこのコードを実行した場合でも、この処理によって自身のベクタテーブルで VTOR を再設定することができます。

バッテリ電源スイッチ停止

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L234-L250

コメントに記載されてるとおりユーザーズマニュアルに記述された VBTCR1.BPWSWSTP ビットの設定フローを実行しています。VBATT 機能の使用する場合でも、パワーオンリセット後はフローに従って、このビットを 1 にする必要があります[13]
なお、Minima がブートローダーモードに入るために使用するバッテリバックアップレジスタは、この操作の後に読み書きができるようになります[14],[15]

[対象外] TFU (三角関数演算器) のモジュールスタート

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L252-L254

三角関数演算のアクセラレータである TFU に対して、モジュールストップ状態を解除しています。このアクセラレータはRA4シリーズだとモーター制御用の RA4T1 に搭載されています。

https://www.renesas.com/ja/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ra4t1-ra4-series-100mhz-arm-cortex-m33-motor-control-microcontroller#overview

[対象外] BSP 未初期化変数の早期初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L256-L260

.noinitセクション (C ランタイムで初期化されない領域) に配置された変数の初期化を行っています。このセクションに配置される変数は、C ランタイム初期化前に呼び出される R_BSP_WarmStart 関数で利用可能です。初期化する変数は、ピンアクセスの有効・無効管理用のカウンタ、HMI_Handlerの要因ごとのコールバック関数配列、レジスタプロテクションの有効・無効管理用のカウンタ配列、SystemCoreClock変数となります。

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L525-L546

SystemCoreClockはBSP_MOCO_HZで初期化されています。リセット時のシステムクロックのクロックソースは、8 MHzの中速オンチップオシレータ (MOCO) です[16],[17]。そのため、この定数は tinyusb/hw/bsp/ra/boards/uno_r4/fsp_cfg/bsp/bsp_mcu_family_cfg.h で8000000で定義されていると思われます。
ただ、システムクロック (ICLK) は クロックソースとの間に分周回路があります[18]。分周比は SCKDIVCR レジスタの ICK[2:0] によって決まり、RA4M1 の場合、リセット後の値は 16 分周となります[19]。そのため、SystemCoreClockにはBSP_MOCO_HZ/16を入れる必要がありそうですが、このレジスタのリセット後の値は、マイコンによって異なるようです[20]
なお、このバージョンの FSP では、BSP_MOCO_HZはこの箇所以外では参照されていないようです。ドキュメント等も調べましたが、すみませんがこの設定値の詳細については確認できませんでした。
BSP_MOCO_HZは分周後の値が格納されることを想定している、または、分周比のデフォルト値が 1 であるマイコン向けの設定値なのかもしれません。このブロックを有効化する場合はこの点を確認したほうがよさそうです。

R_BSP_WarmStart関数はSystemInit内の処理でのうち、リセット直後、クロック設定後、C ランタイム初期化後の三つのタイミングで実行されます。どの要因で呼ばれたかは、引数で判断できるようになっています。この関数の中身はテンプレートで弱定義されています。ビルドしたブートローダーではBSP_WarmStartの上書きはしていないため、このブロックは適用外としているのかと思います。

R_BSP_WarmStart 関数 (BSP_WARM_START_RESET)

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L262-L264

リセット直後のフック処理です。今回の場合はR_BSP_WarmStart関数がスケルトンであるため、特に処理は行われません。

[対象外] クロック変数の初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L265-L269

クロック設定をスキップして、クロック変数の初期化を行っています。この処理についてはbsp_clock_init関数と合わせて別の記事に記述します。

bsp_clock_init 関数 (クロック設定)

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L270-L273

システムクロックの設定を行います。この処理については次の記事に記述します。

TRNG (真性乱数発生器)のリセット

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L274-L281

RA4M1シリーズには、セキュア暗号エンジン (SCE5) が搭載されており、その中に乱数発生器があります[21]。ここでは、クロック初期化後に予期せぬ電流引き込みが発生しないように、未使用回路に対する初期化を行っています[22]

[対象外] グラフィック電源ドメインの有効化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L283-L291

RA8D1のようなグラフィック電源ドメインのコントローラが搭載されているRAシリーズ向けの処理です[23]。最新のfsp (v5.7.0) では、これに対応する処理が C ランタイムの初期化以降に移動されていました。

https://www.renesas.com/ja/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ra8d1-480mhz-arm-cortex-m85-based-graphics-microcontroller-helium-and-trustzone#overview

R_BSP_WarmStart 関数 (BSP_WARM_START_POST_CLOCK)

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L293-L295

クロック設定後のフック処理です。今回の場合は特に処理は行われません。

MSPモニタリング (SPMON) の有効化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L296-L316

MSP モニタリング (SPMON) の有効化を行っています。MSP がアンダーフローまたはオーバーフローした際に、ノンマスカブル割り込み (NMI) が発生するように OAD ビットを設定しています[24]

R_ICU->NMIERはノンマスカブル割り込みイネーブルレジスタで、各要因による割り込み許可を設定できます。ここではCPUスタックポインタモニタ割り込み許可をしています。このレジスタの各ビットは、予約ビットをのぞき、リセット後に一回だけ 1 を書き込むことができます。また、0の書き込みは無効となります。そのため、リード・モディファイ・ライトをせずにCPUスタックポインタモニタ割り込み許可ビットを 1 とし、他のビットは 0 としています[25]

なお、BSP_PRV_STACK_LIMITBSP_PRV_STACK_TOPの定義は system.c に定義されています。
https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L49-L50

また、BSP_CFG_STACK_MAIN_BYTESは tinyusb/hw/bsp/ra/boards/uno_r4/fsp_cfg/bsp/bsp_cfg.h に定義があり、値は0x800 (2KiB)となっています。

https://github.com/hathach/tinyusb/blob/0.17.0/hw/bsp/ra/boards/uno_r4/fsp_cfg/bsp/bsp_cfg.h#L15

[対象外] MSPLIM レジスタ設定

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L318-L327

先ほどは Renesas の MSP モニタリングでしたが、こちらは Arm の機能となります。__set_MSPLIMの定義は CMSIS_5 の cmsis_gcc.h にあります。

https://github.com/ARM-software/CMSIS_5/blob/20285262657d1b482d132d20d755c8c330d55c1f/CMSIS/Core/Include/cmsis_gcc.h#L783-L801

MSPLIMは特殊レジスタで、メインスタックポインタの下限値を設定することができます[26]。設定した下限値を下回ると、UsageFault が発生します[27]
なお、MSPLIM以外にもPSPLIMが存在します。また、これらのレジスタはセキュア領域用 (MSPLIM_SPSPLIM_S) とノンセキュア領域用 (MSPLIM_NSPSPLIM_NS) に個別で実装される場合があります。MSPLIMおよびPSPLIMの実装有無は、Armv8-M が mainline か baseline かに加え、セキュリティ機能 (TrustZone) の有無によって決まります[28]

この特殊レジスタが存在する場合、先ほどの SPMON は非搭載になる傾向のようです。また、最新の FSP (v5.7.0) では、Cortex-M33に限定するコードがなくなっています。

https://github.com/renesas/fsp/blob/v5.7.0/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L362-L364

C ランタイム初期化

.bssセクションの初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L329-L339

.bssセクションをゼロクリアします。bssセクションに配置された初期値のない静的変数やグローバル変数の値はここで 0 に初期化されます。

.dataセクションの初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L341-L349

.data セクションには、初期値を持つ静的変数やグローバル変数、また .code_in_ram セクションに配置された RAM 実行関数が含まれます。このセクションの初期データは、リンカスクリプト内のAT > FLASHによってフラッシュメモリに格納されています。初期データの先頭は、__etextシンボルによって示されています。リンカスクリプトは以下の場所に格納されています。

tinyusb/hw/bsp/ra/linker/gcc/fsp.ld

[対象外] ITCM, DTCM の初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L364-L370

ITCM, DTCMに配置したデータの初期化を行います。Cortex-M4には非搭載のためこのコードは対象外となります。

初期化関数の実行

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L372-L389

.init_arrayに登録されたアドレスにある関数を実行します。C++ の静的またはグローバル変数を、定義時にコンストラクタで初期化する場合は、その初期化処理へのアドレスが登録されます。また、__attribute__((constructor))を指定した関数へのアドレスもここに登録されます。gcc でビルドした場合、これらの実行コードはコンパイル時に.text.startupセクションに分類され、リンク時に.text.startupに置かれた処理へのアドレスを.init_arrayに登録するようです。

SystemCoreClockUpdate 関数

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L396-L398

SystemCoreClock変数のアップデートを行います。この処理はbsp_clock_init関数内でも呼ばれています。そのため、この処理についてもbsp_clock_init関数と合わせて別の記事に記述します。

RTC のリセット

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L399-L407

RTC のリセット処理を実行しています。この内容についてもbsp_clock_init関数と合わせて別の記事で記述します。

[対象外] PmnPFS レジスタの書き込み保護解除

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L409-L417

入出力端子機能の設定で使用する PmnPFS レジスタ[29]への書き込み保護を解除しています。PWPR.B0WI ビットをクリアして PWPR.PFSWE の書き込みができるようにし、PWPR.PFSWE を 1 にして PmnPFS レジスタの書き込みを有効にしています[30]。ビルドしたブートローダーではこのブロックは対象外です。

[対象外] ポートセキュリティ属性レジスタのリセット

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L419-L429

各ポートのセキュリティ属性をリセットしています。PMSAR[m] の n ビットによって、Pmn のセキュリティ属性 (0:セキュア, 1:ノンセキュア) を設定できます[31]。セキュリティ属性のデフォルト値は RA シリーズによって異なるようです。具体的にはRA8 シリーズでは、セキュリティ属性のデフォルト値はセキュアであり[32]、それ以前のシリーズではノンセキュアとなってます。今回確認しているバージョンのFSPでは、RA8シリーズに非対応であったため常にノンセキュアで初期化していますが、v5.7.0では以下のように場合分けされています。

https://github.com/renesas/fsp/blob/v5.7.0/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L473-L487

[対象外] セキュリティ機能の初期化

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L431-L435

セキュリティ機能の初期化を行っています。ユーザーの設定 (マクロ) に合わせてノンセキュア側の FPU アクセス設定や、メモリや周辺モジュールのセキュリティ属性の設定などが行われています。また、ピンや ELC (イベントリンクコントローラ) のセキュリティ設定を行うための関数が弱定義されており、この関数内で実行されます。

R_BSP_WarmStart関数 (BSP_WARM_START_POST_C)

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L437-L439

C ランタイム初期化後のフック処理です。今回の場合は特に処理は行われません。

割り込み設定

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L440-L442

割り込みに関する設定を行っています。bsp_irq_cfg関数は、tinyusb/hw/mcu/renesas/fsp/ra/fsp/src/bsp/mcu/all/bsp_irq.c で定義されています。
RA4M1 の場合、対象外となるセキュリティ関連の処理は対象外となるため、処理内容は下記のようになります。

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/mcu/all/bsp_irq.c#L113-L116

IELSR は ICU イベントリンク設定レジスタです[33]。NVIC で使用する IRQ 要因の選択を、弱定義されたg_interrupt_event_link_selectの値によって設定しています。
配列のインデックスはIRQ番号に対応しております。この番号はベクタテーブルの例外番号16を0として以降は連番で割り振られています[34]
例えば、ベクタテーブルの例外番号 16 に登録した割り込みハンドラの要因は、IELSR0 の IELS[7:0] で設定したイベント信号となります。イベント信号はハードウェアマニュアルの表13.4 イベントテーブルに記述されています[35]。ベクタテーブルの例外番号 16 にUSBFS_USBI割り込みのハンドラを登録したい場合は、このフィールドに 033h を設定します。なお、FSP では発生元が IELSRn となるベクタテーブルの領域を .application_vector セクションにアプリケーションベクタとして配置することが想定されています。
tinyusb では tinyusb/hw/bsp/ra/family.c にアプリケーションベクタと合わせてg_interrupt_event_link_selectが定義されていますが、今回ビルドしたブートローダーでは、パッチをあてて、arduino-renesas-bootloader/src/irq_table.c内で定義したものをリンクするようにしています。

https://github.com/arduino/arduino-renesas-bootloader/blob/8898c7b7db3ac0ec86f4b69688df45de71bf007f/src/irq_table.c#L211-L240

なお、BSP_PRV_IELS_ENUMマクロは、引数の先頭にELC_を結合するマクロで、tinyusb/hw/bsp/ra/boards/uno_r4/fsp_cfg/bsp/bsp_mcu_family_cfg.h で定義されています。結合後のマクロは fsp/ra/fsp/src/bsp/mcu/ra4m1/bsp_elc.h で定義されています。

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/mcu/ra4m1/bsp_elc.h#L101-L102

bsp_init関数

https://github.com/renesas/fsp/blob/d52e5a6a59b7c638da860c2bb309b6e78e752ff8/ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c#L443-L445

bsp_init関数は、tinyusb/hw/mcu/renesas/fsp/ra/fsp/src/bsp/mcu/all/bsp_common.cにスケルトンが弱定義されており、今回の場合はこれがリンクされます。そのため、特に処理は行われません。

脚注
  1. Arm "Cortex-M85 AT640 and Cortex-M85 with FPU AT641 Software Developer Errata Notice Document version: 15.0 Document ID: SDEN-2236668", p.32, " 3175626 AXI hang due to dependency between read data channel and write response channel " ↩︎

  2. Arm "Arm® Cortex®-M85 Processor Technical Reference Manual Revision: r1p1", p.88, "5.14 MSCR, Memory System Control Register" ↩︎

  3. Arm "Cortex-M85 AT640 and Cortex-M85 with FPU AT641 Software Developer Errata Notice Document version: 15.0 Document ID: SDEN-2236668", p.56, "3190818 Under limited circumstances, LDM to normal non-cacheable AXI location can not complete" ↩︎

  4. Arm "Arm® Cortex®-M85 Processor Technical Reference Manual Revision: r1p1", p.69, "5.9 ACTLR, Auxiliary Control Register" ↩︎

  5. Arm "ARMv7-M Architecture Reference Manual Version: E.e", p.A2-34, "A2.5 The optional Floating-point Extension" ↩︎

  6. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.74, "2.1.1 CPU" ↩︎

  7. Arm "ARMv7-M Architecture Reference Manual Version: E.e", p.A2-61, "A2.6 Coprocessor support" ↩︎

  8. Arm "ARMv7-M Architecture Reference Manual Version: E.e", p.B3-614, "B3.2.20 Coprocessor Access Control Register, CPACR" ↩︎

  9. Arm "Stack sealing and why it is needed in TrustZone for Armv8-M Document ID: 102446"。具体的な攻撃方法は文献の5. Exampleに記載されています。 ↩︎

  10. Arm "Stack sealing and why it is needed in TrustZone for Armv8-M Document ID: 102446", p.11, "4.4 Stack sealing value" ↩︎

  11. Arm "Arm® Cortex® -M33 Devices Revision: r0p4 Generic User Guide", p4-267, "4.2.1 System control block registers summary" ↩︎

  12. Arm "Cortex-M4 Revision r0p0 Technical Reference Manual ARM DDI 0439B (ID030210)", p4-3, "4.2 Register summary" ↩︎

  13. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.239, "11.2.1 VBATT コントロールレジスタ 1(VBTCR1)" ↩︎

  14. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.239, "11.2.1 VBATT コントロールレジスタ 1(VBTCR1)" ↩︎

  15. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.256, "11.3.4 VBATT バックアップレジスタの使用法" ↩︎

  16. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.141, "8.1 概要" ↩︎

  17. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.148, "8.2.2 システムクロックソースコントロールレジスタ(SCKSCR)" ↩︎

  18. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.179, "8.7.1 システムクロック(ICLK)" ↩︎

  19. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.146, "8.2.1 システムクロック分周コントロールレジスタ(SCKDIVCR)" ↩︎

  20. Renesas Electronics Corporation, "Renesas RA4T1グループ ユーザーズマニュアル ハードウェア編 Rev.1.20", Dec 2024, p.141, "8.2.2 SCKDIVCR : システムクロック分周コントロールレジスタ", この場合、ICK[2:0]のリセット後の値は 4 分周となっています。 ↩︎

  21. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.1548, "46.1 概要" ↩︎

  22. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.235, "10.9.14 未使用回路に対するモジュールストップ機能" ↩︎

  23. Renesas Electronics Corporation, "Renesas RA8D1グループ ユーザーズマニュアル ハードウェア編 Rev.1.20", Nov 2024, p.310, "10.2.12 PDCTRGD : グラフィック電源ドメインコントロールレジスタ" ↩︎

  24. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.310, "15.2.2 オーバーフローエラーとアンダーフローエラー" ↩︎

  25. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.270, "13.2.3 ノンマスカブル割り込みイネーブルレジスタ(NMIER)" ↩︎

  26. Arm " Arm® v8-M Architecture Reference Manual DDI0553B.y ID09082024", p.1757, "D1.2.177 MSPLIM, Main Stack Pointer Limit Register" ↩︎

  27. Arm " Arm® v8-M Architecture Reference Manual DDI0553B.y ID09082024", p.1897, "D1.2.270 UFSR, UsageFault Status Register" ↩︎

  28. Arm " Arm® v8-M Architecture Reference Manual DDI0553B.y ID09082024", p.115, "B3.21 Stack limit checks" ↩︎

  29. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.429, "19.2.5 ポート mn 端子機能選択レジスタ(PmnPFS/PmnPFS_HA/PmnPFS_BY)(m = 0 ~ 9; n = 00 ~ 15)" ↩︎

  30. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.436, "19.5.1 端子機能の設定手順" ↩︎

  31. Renesas Electronics Corporation, "Renesas RA4T1グループ ユーザーズマニュアル ハードウェア編 Rev.1.20", Dec 2024, p.431, "18.2.8 PmSAR : ポートセキュリティ属性レジスタ (m = 0~5、8)" ↩︎

  32. Renesas Electronics Corporation, "Renesas RA8M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.20", Nov 2024, p.638, "19.2.9 PmSAR : ポートセキュリティ属性レジスタ (m = 0~9, A, B)" ↩︎

  33. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.275,"13.2.6 ICU イベントリンク設定レジスタ n(IELSRn)" ↩︎

  34. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.280, "13.3.1 割り込みベクタテーブル 表13.3 割り込みベクタテーブル" ↩︎

  35. Renesas Electronics Corporation, "Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編 Rev.1.10", 2023.09, p.282, "13.3.2 イベント番号" ↩︎

Discussion