Пример #1
0
/*
 *  割込み要求ラインの属性の設定
 *
 *  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);
	}
}
Пример #2
0
/*
 *  割込み要求ラインの属性の設定
 *
 *  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);
    }    
}