00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include <arch/arm.h>
00044 #include <dev/irqreg.h>
00045
00046 #if defined(TWI_ID)
00047
00048 #ifndef NUT_IRQPRI_TWI
00049 #define NUT_IRQPRI_TWI 4
00050 #endif
00051
00052 static int TwoWireIrqCtl(int cmd, void *param);
00053
00054 IRQ_HANDLER sig_TWI = {
00055 #ifdef NUT_PERFMON
00056 0,
00057 #endif
00058 NULL,
00059 NULL,
00060 TwoWireIrqCtl
00061 };
00062
00066 static void TwoWireIrqEntry(void) __attribute__ ((naked));
00067 void TwoWireIrqEntry(void)
00068 {
00069 IRQ_ENTRY();
00070 #ifdef NUT_PERFMON
00071 sig_TWI.ir_count++;
00072 #endif
00073 if (sig_TWI.ir_handler) {
00074 (sig_TWI.ir_handler) (sig_TWI.ir_arg);
00075 }
00076 IRQ_EXIT();
00077 }
00078
00094 static int TwoWireIrqCtl(int cmd, void *param)
00095 {
00096 int rc = 0;
00097 u_int *ival = (u_int *)param;
00098 int enabled = inr(AIC_IMR) & _BV(TWI_ID);
00099
00100
00101 if (enabled) {
00102 outr(AIC_IDCR, _BV(TWI_ID));
00103 }
00104
00105 switch(cmd) {
00106 case NUT_IRQCTL_INIT:
00107
00108 outr(AIC_SVR(TWI_ID), (unsigned int)TwoWireIrqEntry);
00109
00110 outr(AIC_SMR(TWI_ID), AIC_SRCTYPE_INT_EDGE_TRIGGERED | NUT_IRQPRI_TWI);
00111
00112 outr(AIC_ICCR, _BV(TWI_ID));
00113 break;
00114 case NUT_IRQCTL_STATUS:
00115 if (enabled) {
00116 *ival |= 1;
00117 }
00118 else {
00119 *ival &= ~1;
00120 }
00121 break;
00122 case NUT_IRQCTL_ENABLE:
00123 enabled = 1;
00124 break;
00125 case NUT_IRQCTL_DISABLE:
00126 enabled = 0;
00127 break;
00128 case NUT_IRQCTL_GETPRIO:
00129 *ival = inr(AIC_SMR(TWI_ID)) & AIC_PRIOR;
00130 break;
00131 case NUT_IRQCTL_SETPRIO:
00132 outr(AIC_SMR(TWI_ID), (inr(AIC_SMR(TWI_ID)) & ~AIC_PRIOR) | *ival);
00133 break;
00134 #ifdef NUT_PERFMON
00135 case NUT_IRQCTL_GETCOUNT:
00136 *ival = (u_int)sig_TWI.ir_count;
00137 sig_TWI.ir_count = 0;
00138 break;
00139 #endif
00140 default:
00141 rc = -1;
00142 break;
00143 }
00144
00145
00146 if (enabled) {
00147 outr(AIC_IECR, _BV(TWI_ID));
00148 }
00149 return rc;
00150 }
00151
00152 #endif