Nut/OS  4.10.3
API Reference
ih_spi0.c
Go to the documentation of this file.
00001 
00036 /*
00037  * $Log: ih_spi0.c,v $
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,                          /* Interrupt counter, ir_count. */
00064 #endif
00065     NULL,                       /* Passed argument, ir_arg. */
00066     NULL,                       /* Handler subroutine, ir_handler. */
00067     SerialPeripheral0IrqCtl     /* Interrupt control, ir_ctl. */
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     /* Disable interrupt. */
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         /* Set the vector. */
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     /* Enable interrupt. */
00147     if (enabled) {
00148         AVR32_SPI0.ier = enabledIMR;
00149     }
00150     return rc;
00151 }