Nut/OS  4.10.3
API Reference
ih_spi1.c
Go to the documentation of this file.
00001 
00036 /*
00037 * $Log: ih_spi1.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_SPI1
00048 #define NUT_IRQPRI_SPI1  AVR32_INTC_INT3
00049 #endif
00050 
00051 static int SerialPeripheral1IrqCtl(int cmd, void *param);
00052 
00053 IRQ_HANDLER sig_SPI1 = {
00054 #ifdef NUT_PERFMON
00055     0,                          /* Interrupt counter, ir_count. */
00056 #endif
00057     NULL,                       /* Passed argument, ir_arg. */
00058     NULL,                       /* Handler subroutine, ir_handler. */
00059     SerialPeripheral1IrqCtl     /* Interrupt control, ir_ctl. */
00060 };
00061 
00065 static SIGNAL(SerialPeripheral1IrqEntry)
00066 {
00067     IRQ_ENTRY();
00068 #ifdef NUT_PERFMON
00069     sig_SPI1.ir_count++;
00070 #endif
00071     if (sig_SPI1.ir_handler) {
00072         (sig_SPI1.ir_handler) (sig_SPI1.ir_arg);
00073     }
00074     IRQ_EXIT();
00075 }
00076 
00091 static int SerialPeripheral1IrqCtl(int cmd, void *param)
00092 {
00093     int rc = 0;
00094     unsigned int *ival = (unsigned int *) param;
00095     ureg_t imr = AVR32_SPI1.imr;
00096     static ureg_t enabledIMR = 0;
00097     int_fast8_t enabled = imr;
00098 
00099     /* Disable interrupt. */
00100     if (enabled) {
00101         AVR32_SPI1.idr = 0xFFFFFFFF;
00102         AVR32_SPI1.idr;
00103         enabledIMR = imr;
00104     }
00105 
00106     switch (cmd) {
00107     case NUT_IRQCTL_INIT:
00108         /* Set the vector. */
00109         register_interrupt(SerialPeripheral1IrqEntry, AVR32_SPI1_IRQ, NUT_IRQPRI_SPI1);
00110         break;
00111     case NUT_IRQCTL_STATUS:
00112         if (enabled) {
00113             *ival |= 1;
00114         } else {
00115             *ival &= ~1;
00116         }
00117         break;
00118     case NUT_IRQCTL_ENABLE:
00119         enabled = 1;
00120         break;
00121     case NUT_IRQCTL_DISABLE:
00122         enabled = 0;
00123         break;
00124     case NUT_IRQCTL_GETPRIO:
00125         *ival = AVR32_INTC_INT3;
00126         break;
00127 #ifdef NUT_PERFMON
00128     case NUT_IRQCTL_GETCOUNT:
00129         *ival = (unsigned int) sig_SPI1.ir_count;
00130         sig_SPI1.ir_count = 0;
00131         break;
00132 #endif
00133     default:
00134         rc = -1;
00135         break;
00136     }
00137 
00138     /* Enable interrupt. */
00139     if (enabled) {
00140         AVR32_SPI1.ier = enabledIMR;
00141     }
00142     return rc;
00143 }