Cortex-R52:GIC 構成

「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

おすすめ

転載: blog.csdn.net/djkeyzx/article/details/132339467