Go to the documentation of this file.00001
00036
00037
00038
00039
00040
00041 #include <arch/avr32.h>
00042 #include <dev/irqreg.h>
00043 #include <avr32/io.h>
00044
00045 #include <arch/avr32/ihndlr.h>
00046
00047 #ifndef NUT_IRQPRI_SPI0
00048 #define NUT_IRQPRI_SPI0 AVR32_INTC_INT3
00049 #endif
00050
00051 #ifndef AVR32_SPI0
00052 #define AVR32_SPI0 AVR32_SPI
00053 #endif
00054
00055 #ifndef AVR32_SPI0_IRQ
00056 #define AVR32_SPI0_IRQ AVR32_SPI_IRQ
00057 #endif
00058
00059 static int SerialPeripheral0IrqCtl(int cmd, void *param);
00060
00061 IRQ_HANDLER sig_SPI0 = {
00062 #ifdef NUT_PERFMON
00063 0,
00064 #endif
00065 NULL,
00066 NULL,
00067 SerialPeripheral0IrqCtl
00068 };
00069
00073 static SIGNAL(SerialPeripheral0IrqEntry)
00074 {
00075 IRQ_ENTRY();
00076 #ifdef NUT_PERFMON
00077 sig_SPI0.ir_count++;
00078 #endif
00079 if (sig_SPI0.ir_handler) {
00080 (sig_SPI0.ir_handler) (sig_SPI0.ir_arg);
00081 }
00082 IRQ_EXIT();
00083 }
00084
00099 static int SerialPeripheral0IrqCtl(int cmd, void *param)
00100 {
00101 int rc = 0;
00102 unsigned int *ival = (unsigned int *) param;
00103 ureg_t imr = AVR32_SPI0.imr;
00104 static ureg_t enabledIMR = 0;
00105 int_fast8_t enabled = imr;
00106
00107
00108 if (enabled) {
00109 AVR32_SPI0.idr = 0xFFFFFFFF;
00110 AVR32_SPI0.idr;
00111 enabledIMR = imr;
00112 }
00113
00114 switch (cmd) {
00115 case NUT_IRQCTL_INIT:
00116
00117 register_interrupt(SerialPeripheral0IrqEntry, AVR32_SPI0_IRQ, NUT_IRQPRI_SPI0);
00118 break;
00119 case NUT_IRQCTL_STATUS:
00120 if (enabled) {
00121 *ival |= 1;
00122 } else {
00123 *ival &= ~1;
00124 }
00125 break;
00126 case NUT_IRQCTL_ENABLE:
00127 enabled = 1;
00128 break;
00129 case NUT_IRQCTL_DISABLE:
00130 enabled = 0;
00131 break;
00132 case NUT_IRQCTL_GETPRIO:
00133 *ival = AVR32_INTC_INT3;
00134 break;
00135 #ifdef NUT_PERFMON
00136 case NUT_IRQCTL_GETCOUNT:
00137 *ival = (unsigned int) sig_SPI0.ir_count;
00138 sig_SPI0.ir_count = 0;
00139 break;
00140 #endif
00141 default:
00142 rc = -1;
00143 break;
00144 }
00145
00146
00147 if (enabled) {
00148 AVR32_SPI0.ier = enabledIMR;
00149 }
00150 return rc;
00151 }