「Cortex-R52: GIC」 では、 GIC 関連の設定レジスタと割り込みの種類について簡単に説明し、次に SGI、SPI、PPI の設定方法について説明します。
R52 TRM の説明によれば、割り込みは INTID で表され、割り込みに関連する設定は次のとおりです。
- Enable: 有効な割り込みのみがコアに送信されますが、無効な割り込みは発生しても保留されます。
- 優先度: 5 ビットの優先度設定、値が小さいほど優先度が高くなります。
- 割り込みトリガ動作: レベルトリガまたはエッジトリガ
- グループの設定: IRQ または FIQ
- ルーティング ターゲットの設定: ターゲット コア (複数可)
1. SPI、PPI、SGI割り込みの構成
1.1 設定項目
設定 | スピス | SGI と PPI |
有効にする | GICD_ISENABLERn GICD_ICENABLERn |
GICR_ISENABLERn GICR_ICENABLERn |
優先度 | GICD_IPRIORITYn | GICR_IPRIORITYn |
構成 (レベルまたはエッジ) | GICD_ICFGRn | GICR_ICFGRn |
グループ | GICD_IGROUPn | GICR_IGROUPn |
ルーティング (ターゲット コア/コア) | GICD_IROUTERn | 該当なし |
PPI はコアに対してプライベートであるため、Route を設定する必要はありません。
1.2 コード例
if(INT_IS_SPI(intID))
{
REG32_WRITE(gicd_base_addr, gicd_isenabler_offset_x, enable_mask)
REG32_WRITE(gicd_base_addr, gicd_irouter_offset_x, affinity_mask)
REG8_WRITE (gicd_base_addr, gicd_ipriorityr_offset_x, prio_mask)
REG32_WRITE(gicd_base_addr, gicd_icfgr_offset_x, cfg_mask)
}
else
{
REG32_WRITE(gicr_base_addr, gicr_isenabler0/1, enable_mask)
REG8_WRITE (gicr_base_addr, gicr_ipriorityr0/1, prio_mask)
if(INT_IS_PPI(intID))
{
REG32_WRITE(gicr_base_addr, gicr_icfgr1, cfg_mask)
}
}
ここで説明する必要があるのは、ルーター レジスタ IROUTER32-991 です。このレジスタのビットフィールド構造は次のとおりです。
R52 の場合、Aff3 は 0 としてのみ読み取られ、Aff2/1 もチップ設計の構成に応じて固定されます。実際、シングルコア クラスタの R52 では、Aff2 と 1 は基本的に 0 であり、唯一可能なのは変更可能 Aff0 のみ このビットフィールドの詳細説明は次のとおりです。
では、この値はどこから来たのでしょうか? MPIDR (詳細については、「Cortex-R52: アフィニティ」を参照)
つまり、SPI をコア 2 にルーティングしたいので、まずコアの affnity0 を (MPIDR 経由で) 取得し、それをこのレジスタに書き込む必要があります。また、このレジスタは 64 ビットであることに注意してください。
2. 注意事項
2.1 GICモジュールの初期化
GIC は 3 つのモジュールで構成されているため、これら 3 つのモジュールも初期化する必要があります。
モジュール | レジスタ操作 | 説明する |
卸売業者 | 1. GICD_CTRL.EnableGrp0/1 設定 1 2. GICD_CTRL.ARE を設定する必要はありません (デフォルトで有効、RAO/WI (1 として読み取り、書き込みは無視)) |
デフォルト値は 0 で、IRQ および FIQ グループが有効になります。 アフィニティルーティングはデフォルトで有効になっています |
再配布者 | GICR_WAKER.ProcessorSleep を 0 に設定 接続されたコアに私が目を覚ますと伝えてください |
デフォルト値は 1 です。 ソフトウェアは、ジャンプする前に ChildrenAsleep ステータスをポーリングして 0 になる必要があります。 この操作は、CPU インターフェイスを設定する前に完了する必要があります。 |
CPUインターフェース | 1. ICC_SRE.SRE が 1 (RAO/WI) であるかどうかを確認します。 2、ICC_IGRPEN0/1 3. ICC_PMR.Priority は優先マスクを設定します 4. ICC_BRPn はプリエンプション ポリシーを設定します |
1. ハードウェアのデフォルトは 1 です。 2. Group0 と 1 を有効に設定します。 3. CPU に送信される優先マスクを設定します。通常、デフォルトは FF です。 |
2.2 割り込み構成の概要
割り込みの種類 | 設定項目 |
SPI(32-991) | 1. 優先度: GICD_IPRIORITYRn 2. 割り込みグループ GICD_IGROUPRn 3. トリガータイプ GICD_ICFGRn 4. ルーティングの目的 GICD_IROUTERn 5. 割り込みイネーブル GICD_ISENABLERn |
PPI(16-31) & SGI(0-15) |
1. 優先度 GICR_IRPIORITYRn(n= 0-7) 2. 割り込みグループ GICR_IGROUPR0 3. トリガータイプ GICR_ICFGR0/1 4. 割り込みイネーブル GICR_ISENABLER0 |