/* * 割込み要求ラインの属性の設定 * * 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); } }