Board support library for C027

Dependents:   IoTWorkshopLCD IoTWorkshopBuzzer IoTWorkshopSensors C027_USSDTest ... more

Fork of C027 by u-blox

/media/uploads/ublox/c027_pinout_new.png

Revision:
8:a356376db984
Parent:
7:e3eab86f1de9
Child:
9:7e038529bfff
--- a/C027.cpp	Fri Oct 25 08:46:43 2013 +0000
+++ b/C027.cpp	Tue Nov 05 21:41:46 2013 +0000
@@ -8,34 +8,33 @@
 
 void mbed_die(void)
 {
+    DigitalOut led(LED);
     for (;;)
     {
         // nothing to do here
-        
-        // we do not have fancy leds that 
-        // can be flashed on the C027
+        led = 0;
+        wait_ms(200);
+        led = 1;
+        wait_ms(200);
     }
 }
 
 C027::C027() :
-    mdmEn(MDMEN),
-#ifndef C027_REVA
-                  mdmRst(MDMRST),
-#endif                
-                                  mdmPwrOn(MDMPWRON), mdmRts(MDMRTS),
-    gpsEn(GPSEN), gpsRst(GPSRST)
+    mdmEn(MDMEN),   mdmRst(MDMRST),     mdmPwrOn(MDMPWRON),   // MDM CTRL
+    mdmRts(MDMRTS), mdmLvlOe(MDMLVLOE), mdmUsbDet(MDMUSBDET), // MDM IF
+    gpsEn(GPSEN),   gpsRst(GPSRST)                            // GPS CTRL
 {
     // we start with the gps disabled
-    gpsEn    = 0; // LDOEN: 1=on,0=off
-    gpsRst   = 0; // RESET: 0=reset,1=operating
+    gpsEn     = 0;  // LDOEN:  1=on,0=off
+    gpsRst    = 0;  // RESET:  0=reset,1=operating
     gpsIsEnabled = false;
     // we start with the modem disabled
-    mdmPwrOn = 1; // PWRON: 1=idle,0=action
-    mdmRts   = 0; // RTS.   0=ready to send 
-    mdmEn    = 0; // LDOEN: 1=on,0=off
-#ifndef C027_REVA
-    mdmRst   = 0; // RESET: 0=reset,1=operating
-#endif
+    mdmLvlOe  = 1;  // LVLEN:  1=disabled
+    mdmUsbDet = 0;  // USBDET: 0=disabled
+    mdmPwrOn  = 1;  // PWRON:  1=idle, 0=action
+    mdmRts    = 0;  // RTS.    0=ready to send 
+    mdmEn     = 0;  // LDOEN:  1=on, 0=off
+    mdmRst    = 0;  // RESET:  0=reset, 1=operating
     mdmIsEnabled = false;
 }
 
@@ -45,19 +44,20 @@
     {
 #ifdef C027_REVA
         // we need the gps ldo for the level shifters of the modem
-        gpsEn    = 1;   // LDOEN(gps): 0=off -> 1=on 
-#endif
-        mdmPwrOn = 1;   // PWRON: 1=idle
-        mdmEn    = 0;   // LDOEN: 0=off
-#ifndef C027_REVA
-        mdmRst   = 0;   // RESET: 0=reset
+        gpsEn     = 1;  // LDOEN(gps): 0=off -> 1=on 
 #endif
-        wait_ms(1);     //        wait until stable
-        mdmEn    = 1;   // LDOEN: 0=off -> 1=on
-        wait_ms(50);    //        power on sequence is triggered by keeping reset 50ms low
-#ifndef C027_REVA
-        mdmRst   = 1;   // RESET: 0=reset -> 1=operating
-#endif
+        mdmPwrOn  = 1;  // PWRON:  1=idle
+        mdmEn     = 0;  // LDOEN:  0=off
+        mdmRst    = 0;  // RESET:  0=reset
+        mdmLvlOe  = 1;  // LVLEN:  1=disabled
+        mdmUsbDet = 0;  // USBDET: 0=disabled
+        wait_ms( 10);   //         wait until supply switched off
+        mdmEn     = 1;  // LDOEN:  0=off -> 1=on
+        wait_ms( 10);   //         wait until supply stable and on
+        wait_ms(300);   //         power on sequence is triggered by keeping reset 50ms-300ms low
+        mdmRst    = 1;  // RESET:  0=reset -> 1=operating
+        mdmLvlOe  = 0;  // LVLEN:  0=enabled
+        mdmUsbDet = 1;  // USBDET: 1=enabled
         mdmIsEnabled = true;
         // the modem schould be fully ready after 3000ms
     }
@@ -65,14 +65,14 @@
     {
         mdmIsEnabled = false;
         // initiate power off sequence by setting PwnOn low for >1s
-        mdmPwrOn = 0;   // PWRON: 0=active
-        wait_ms(1000);  
-        mdmPwrOn = 1;   // PWRON: 0=active -> 1=idle
+        mdmLvlOe  = 1;  // LVLEN:  1=disabled
+        mdmUsbDet = 0;  // USBDET: 0=disabled
+        mdmPwrOn  = 0;  // PWRON:  0=active
+        wait_ms(1000);  //         send to sleep
+        mdmPwrOn  = 1;  // PWRON:  0=active -> 1=idle
         // now we can savely switch off the ldo
-#ifndef C027_REVA
-        mdmRst   = 0;   // RESET: 1=operating -> 0=reset
-#endif
-        mdmEn    = 0;   // LDOEN: 1=on -> 0=off
+        mdmRst    = 0;  // RESET:  1=operating -> 0=reset
+        mdmEn     = 0;  // LDOEN:  1=on -> 0=off
 #ifdef C027_REVA
         // the gps ldo may no longer be needed level shifters of the modem
         // so we switch it off if the gps is not enabled
@@ -84,15 +84,44 @@
 
 void C027::mdmReset(void)
 {
-#ifndef C027_REVA
+    if (mdmIsEnabled)
+    {
+        mdmRst   = 0;   // RESET: 0=reset
+        // power on sequence is triggered by reset low
+        // LISA-U200   50ms
+        // SARA-G350   50ms
+        // LISA-C200  300ms
+        wait_ms(300);
+        mdmRst   = 1;   // RESET: 0=reset -> 1=operating
+    }
+}
+
+void C027::mdmWakeup(void)
+{
     if (mdmIsEnabled)
     {
-        // power on sequence is triggered by 50ms reset low
-        mdmRst   = 0;    // RESET: 0=reset,1=operating
-        wait_ms(50);
-        mdmRst   = 1;    // RESET: 1=operating,0=reset
+        mdmPwrOn = 0;
+        // wakeup the device by low pulse: 
+        // LISA-U200 50-80us
+        // SARA-G350     5ms
+        // LISA-C200   150ms 
+        wait_ms(150);   
+        mdmPwrOn = 1;
     }
-#endif
+}
+
+void C027::mdmSleep(void)
+{
+    if (mdmIsEnabled)
+    {
+        mdmPwrOn = 0;
+        // going to sleep is triggerd by low pulse: 
+        // LISA-U200  1000ms
+        // SARA-G350     n/a
+        // LISA-C200     n/a
+        wait_ms(1000);  
+        mdmPwrOn = 1;
+    }
 }
 
 void C027::gpsPower(bool enable)