Example #1
0
/*
 *  割込み要求ラインの属性の設定
 *
 *  ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ
 *  クしている.FI4カーネルに利用する場合には,エラーを返すようにすべき
 *  であろう.
 */
void
x_config_int(INTNO intno, ATR intatr, PRI intpri)
{
	assert(VALID_INTNO(intno));
	assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI);

	/*
	 *  割込み要求のマスク
	 *
	 *  割込みを受け付けたまま,レベルトリガ/エッジトリガの設定や,割
	 *  込み優先度の設定を行うのは危険なため,割込み属性にかかわらず,
	 *  一旦マスクする.
	 */    
	x_disable_int(intno);

	/*
	 *  割込み優先度をセット
	 */
    AINTC.CMR[intno] = PRI_TO_CHN(intpri);
    
	/*
	 *  割込みを許可
	 */
	if ((intatr & TA_ENAINT) != 0U){
		(void)x_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);
    }    
}