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 #include <arch/arm.h>
00039 #include <dev/irqreg.h>
00040
00041 #if defined(PIOA_ID)
00042
00043 #ifndef NUT_IRQPRI_PIOA
00044 #define NUT_IRQPRI_PIOA 4
00045 #endif
00046
00047 static int PortIoIrqCtl(int cmd, void *param);
00048
00049 IRQ_HANDLER sig_PIOA = {
00050 #ifdef NUT_PERFMON
00051 0,
00052 #endif
00053 NULL,
00054 NULL,
00055 PortIoIrqCtl
00056 };
00057
00061 static void PortIoIrqEntry(void) __attribute__ ((naked));
00062 void PortIoIrqEntry(void)
00063 {
00064 IRQ_ENTRY();
00065 #ifdef NUT_PERFMON
00066 sig_PIOA.ir_count++;
00067 #endif
00068 if (sig_PIOA.ir_handler) {
00069 (sig_PIOA.ir_handler) (sig_PIOA.ir_arg);
00070 }
00071 IRQ_EXIT();
00072 }
00073
00089 static int PortIoIrqCtl(int cmd, void *param)
00090 {
00091 int rc = 0;
00092 u_int *ival = (u_int *)param;
00093 int enabled = inr(AIC_IMR) & _BV(PIOA_ID);
00094
00095
00096 if (enabled) {
00097 outr(AIC_IDCR, _BV(PIOA_ID));
00098 }
00099
00100 switch(cmd) {
00101 case NUT_IRQCTL_INIT:
00102
00103 outr(AIC_SVR(PIOA_ID), (unsigned int)PortIoIrqEntry);
00104
00105 outr(AIC_SMR(PIOA_ID), AIC_SRCTYPE_INT_EDGE_TRIGGERED | NUT_IRQPRI_PIOA);
00106
00107 outr(AIC_ICCR, _BV(PIOA_ID));
00108 break;
00109 case NUT_IRQCTL_STATUS:
00110 if (enabled) {
00111 *ival |= 1;
00112 }
00113 else {
00114 *ival &= ~1;
00115 }
00116 break;
00117 case NUT_IRQCTL_ENABLE:
00118 enabled = 1;
00119 break;
00120 case NUT_IRQCTL_DISABLE:
00121 enabled = 0;
00122 break;
00123 case NUT_IRQCTL_GETPRIO:
00124 *ival = inr(AIC_SMR(PIOA_ID)) & AIC_PRIOR;
00125 break;
00126 case NUT_IRQCTL_SETPRIO:
00127 outr(AIC_SMR(PIOA_ID), (inr(AIC_SMR(PIOA_ID)) & ~AIC_PRIOR) | *ival);
00128 break;
00129 #ifdef NUT_PERFMON
00130 case NUT_IRQCTL_GETCOUNT:
00131 *ival = (u_int)sig_PIOA.ir_count;
00132 sig_PIOA.ir_count = 0;
00133 break;
00134 #endif
00135 default:
00136 rc = -1;
00137 break;
00138 }
00139
00140
00141 if (enabled) {
00142 outr(AIC_IECR, _BV(PIOA_ID));
00143 }
00144 return rc;
00145 }
00146
00147 #endif