/* * 割込み要求ラインの属性の設定 * * ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ * クしている. */ Inline void config_int(INTNO intno, ATR intatr, PRI intpri) { assert(VALID_INTNO(intno)); assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI); /* * 割込みを禁止 * * 割込みを受け付けたまま,レベルトリガ/エッジトリガの設定や,割 * 込み優先度の設定を行うのは危険なため,割込み属性にかかわらず, * 一旦マスクする. */ disable_int(intno); /* * 割込みをコンフィギュレーション */ #ifdef TOPPERS_SAFEG_SECURE gicd_config_group(intno, 1U); #endif /* TOPPERS_SAFEG_SECURE */ if ((intatr & TA_EDGE) != 0U) { #ifdef GIC_ARM11MPCORE gicd_config(intno, GICD_ICFGRn_EDGE|GICD_ICFGRn_1_N); #else /* GIC_ARM11MPCORE */ gicd_config(intno, GICD_ICFGRn_EDGE); #endif /* GIC_ARM11MPCORE */ clear_int(intno); } else { #ifdef GIC_ARM11MPCORE gicd_config(intno, GICD_ICFGRn_LEVEL|GICD_ICFGRn_1_N); #else /* GIC_ARM11MPCORE */ gicd_config(intno, GICD_ICFGRn_LEVEL); #endif /* GIC_ARM11MPCORE */ } /* * 割込み優先度とターゲットプロセッサを設定 */ gicd_set_priority(intno, INT_IPM(intpri)); gicd_set_target(intno, 1U << arm_prc_index()); /* * 割込みを許可 */ if ((intatr & TA_ENAINT) != 0U) { enable_int(intno); } }
/* * 割込み要求ラインの属性の設定 * * ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ * クしている.FI4カーネルに利用する場合には,エラーを返すようにすべき * であろう. * */ void x_config_int(INTNO intno, ATR intatr, PRI intpri) { assert(VALID_INTNO(intno)); assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI); /* * 割込み属性が設定されているかを判別するための変数の設定 */ bitpat_cfgint |= INTNO_BITPAT(intno); /* * いったん割込みを禁止する */ x_disable_int(intno); /* * レベルトリガ/エッジトリガの設定 * IRQのみサポートする */ uint32_t smr_val; if((intatr & TA_POSEDGE) != 0U) { /* * ポジティブエッジ */ smr_val = AIC_SRCTYPE_EXT_POSITIVE_EDGE; }else if((intatr & TA_HIGHLEVEL) != 0U) { /* * ハイレベルトリガ */ smr_val = AIC_SRCTYPE_EXT_HIGH_LEVEL ; }else if((intatr & TA_EDGE) != 0U) { /* * エッジトリガ */ smr_val = AIC_SRCTYPE_INT_EDGE_TRIGGERED; }else{ /* * レベルトリガ */ smr_val = AIC_SRCTYPE_INT_LEVEL_SENSITIVE; } sil_wrw_mem((void*)(TADR_AIC_BASE+TOFF_AIC_SMR+intno*4U), smr_val|INT_IPM(intpri)); if ((intatr & TA_ENAINT) != 0U){ (void)x_enable_int(intno); } }