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:
7:e3eab86f1de9
Parent:
6:e11bf54dd344
Child:
8:a356376db984
--- a/C027.cpp	Mon Oct 21 19:45:55 2013 +0000
+++ b/C027.cpp	Fri Oct 25 08:46:43 2013 +0000
@@ -1,4 +1,3 @@
-
 /*  Platform source file, for the u-blox C27-C20/U20/G35 
 *   mbed Internet of Things Starter Kit
 *   http://mbed.org/platforms/u-blox-C027/
@@ -19,65 +18,106 @@
 }
 
 C027::C027() :
-    mdmEn(MDMEN), mdmRst(MDMRST), mdmPwrOn(MDMPWRON), mdmRts(MDMRTS),
+    mdmEn(MDMEN),
+#ifndef C027_REVA
+                  mdmRst(MDMRST),
+#endif                
+                                  mdmPwrOn(MDMPWRON), mdmRts(MDMRTS),
     gpsEn(GPSEN), gpsRst(GPSRST)
 {
-#define REVA
+    // we start with the gps disabled
     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
     mdmIsEnabled = false;
 }
 
-void C027::gpsPower(bool enable)
-{
-    if (gpsIsEnabled != enable)
-    {
-#ifdef REVA
-        gpsEn = mdmIsEnabled || enable;
-#else
-        gpsEn = enable;  // LDOEN: 1=on,0=off
-#endif
-        wait_ms(10);
-        gpsIsEnabled = enable;
-        if (enable)
-            gpsReset();
-        else
-            gpsRst = 0;         // RESET: 0=reset,1=operating
-    }
-}
-    
 void C027::mdmPower(bool enable)
 {
-    if (mdmIsEnabled != enable)
+    if (!mdmIsEnabled && enable) // enable modem
     {
-#ifdef REVA
-        gpsEn = enable || gpsIsEnabled;
+#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
+#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
-        mdmEn = enable; // LDOEN: 1=on,0=off
-        mdmRst = 1;
-        wait_ms(10);
-        mdmIsEnabled = enable;
-        if (enable)
-            mdmReset();
-        else
-            mdmRst = 0;         // RESET: 0=reset,1=operating
+        mdmIsEnabled = true;
+        // the modem schould be fully ready after 3000ms
+    }
+    else if (mdmIsEnabled && !enable) // disable modem
+    {
+        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
+        // 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
+#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
+        if (!gpsIsEnabled)
+            gpsEn = 0;  // LDOEN(gps): 1=on -> 0=off
+#endif
     }
 }
 
 void C027::mdmReset(void)
 {
+#ifndef C027_REVA
     if (mdmIsEnabled)
     {
+        // power on sequence is triggered by 50ms reset low
         mdmRst   = 0;    // RESET: 0=reset,1=operating
-        wait_ms(50);     //        power on sequence is triggered by 50ms reset low
+        wait_ms(50);
         mdmRst   = 1;    // RESET: 1=operating,0=reset
     }
+#endif
+}
+
+void C027::gpsPower(bool enable)
+{
+    if (!gpsIsEnabled && enable) // enable gps
+    {
+        gpsRst   = 0;   // RESET: 0=reset
+        gpsEn    = 1;   // LDOEN: 0=off -> 1=on
+        wait_ms(1);     //        wait until stable
+        gpsRst   = 1;   // RESET: 0=reset -> 1=operating
+        gpsIsEnabled = true;
+        // the gps schould be fully ready after 50ms
+    }
+    else if (gpsIsEnabled && !enable) // diasble gps
+    {
+        gpsIsEnabled = false;
+        gpsRst   = 0;   // RESET: 1=operating -> 0=reset
+#ifdef C027_REVA
+        // the gps ldo may have to remain enabled for the level shifters of the modem
+        if (!mdmIsEnabled) 
+            gpsEn    = 0;   // LDOEN: 1=on -> 0=off 
+#else
+        gpsEn    = 0;   // LDOEN: 1=on -> 0=off 
+#endif
+    }
 }
 
 void C027::gpsReset(void)