MAX3100, an external serial device to add additional serial ports via SPI

Revision:
1:46c8c60e744a
Parent:
0:055897ab699b
Child:
2:2a49171453d5
--- a/MAX3100.cpp	Sun Jan 16 18:27:44 2011 +0000
+++ b/MAX3100.cpp	Mon Jan 17 01:14:16 2011 +0000
@@ -52,7 +52,8 @@
         _spi->frequency(MAX3100_SPI_FREQ);
     }
     
-    if (irq != NC) {    
+    if (irq != NC) {
+        irqMask(irq);
         _irq = new InterruptIn(irq);
         _irq->mode(PullUp);
         topic_1498(irq);       
@@ -100,49 +101,49 @@
 void 
 MAX3100::baud(int baudrate) 
 {        
-    __disable_irq();
+    irqDisable();
     config &= ~(0xf);
     config |= (baudrate & 0xf);
     config_write(config);
-    __enable_irq();
+    irqEnable();
 }
     
 void 
 MAX3100::enableRxIrq(void) 
 { 
-    __disable_irq();
+    irqDisable();
     config &= ~MAX3100_RM(1);
     config |=  MAX3100_RM(1);
     config_write(config); 
-    __enable_irq();
+    irqEnable();
 }
     
 void 
 MAX3100::disableRxIrq(void) 
 { 
-    __disable_irq();
+    irqDisable();
     config &= ~MAX3100_RM(1);
     config_write(config);     
-    __enable_irq();
+    irqEnable();
 }
     
 void 
 MAX3100::enableTxIrq(void) 
 { 
-    __disable_irq();
+    irqDisable();
     config &= ~MAX3100_TM(1);
     config |=  MAX3100_TM(1);
     config_write(config); 
-    __enable_irq();
+    irqEnable();
 }
     
 void 
 MAX3100::disableTxIrq(void) 
 { 
-    __disable_irq();
+    irqDisable();
     config &= ~MAX3100_TM(1);
     config_write(config);     
-    __enable_irq();
+    irqEnable();
 }
         
 int 
@@ -163,7 +164,7 @@
     // Function is non-interruptable by the MAX3100 class
     // to avoid SPI bus contention between writing a byte
     // in user context (here) and IRQ context.    
-    __disable_irq();
+    irqDisable();
 
     conf = config_read();
         
@@ -184,7 +185,7 @@
         if (tx_buffer_in == tx_buffer_out) tx_buffer_full = true;
     }
     
-    __enable_irq();
+    irqEnable();
         
     return 1;
 }
@@ -261,16 +262,16 @@
 {
     switch(i) {
         case 1: 
-            __disable_irq();
+            irqDisable();
             config &= ~(1 << 6);
             config_write(config);     
-            __enable_irq();
+            irqEnable();
             break;
         case 2: 
-            __disable_irq();
+            irqDisable();
             config |= (1 << 6);
             config_write(config);     
-            __enable_irq();
+            irqEnable();
             break;    
     }
 }
@@ -284,6 +285,53 @@
     }
     return count & 1;
 }
+
+void
+MAX3100::irqDisable(void)
+{
+    if (_irqMask0) LPC_GPIOINT->IO0IntEnF &= ~_irqMask0;
+    if (_irqMask2) LPC_GPIOINT->IO2IntEnF &= ~_irqMask2;    
+}
+
+void
+MAX3100::irqEnable(void)
+{
+    if (_irqMask0) LPC_GPIOINT->IO0IntEnF |= _irqMask0;
+    if (_irqMask2) LPC_GPIOINT->IO2IntEnF |= _irqMask2;    
+}
+
+void 
+MAX3100::irqMask(PinName p)
+{
+    _irqMask0 = _irqMask2 = 0;
+    
+    switch( p ) {
+        case p5:  _irqMask0 = (1UL << 9); break;
+        case p6:  _irqMask0 = (1UL << 8); break;
+        case p7:  _irqMask0 = (1UL << 7); break;
+        case p8:  _irqMask0 = (1UL << 6); break;
+        case p9:  _irqMask0 = (1UL << 0); break;
+        case p10: _irqMask0 = (1UL << 1); break;
+        case p11: _irqMask0 = (1UL << 18); break;
+        case p12: _irqMask0 = (1UL << 17); break;
+        case p13: _irqMask0 = (1UL << 15); break;
+        case p14: _irqMask0 = (1UL << 16); break;
+        case p15: _irqMask0 = (1UL << 23); break;
+        case p16: _irqMask0 = (1UL << 24); break;
+        case p17: _irqMask0 = (1UL << 25); break;
+        case p18: _irqMask0 = (1UL << 26); break;
+        case p21: _irqMask2 = (1UL << 5); break;
+        case p22: _irqMask2 = (1UL << 4); break;
+        case p23: _irqMask2 = (1UL << 3); break;
+        case p24: _irqMask2 = (1UL << 2); break;
+        case p25: _irqMask2 = (1UL << 1); break;
+        case p26: _irqMask2 = (1UL << 0); break;
+        case p27: _irqMask0 = (1UL << 11); break;
+        case p28: _irqMask0 = (1UL << 10); break;
+        case p29: _irqMask0 = (1UL << 5); break;
+        case p30: _irqMask0 = (1UL << 4); break;        
+    }
+}
         
 void 
 MAX3100::topic_1498(PinName p) {