Fork to support REVB hardware.

Dependents:   C027_BootTest_revb C027_EthernetSniffTest C027_M3_SerialEcho C027_HelloWorld_revb ... more

Fork of C027 by u-blox

Files at this revision

API Documentation at this revision

Comitter:
mazgch
Date:
Fri Oct 25 08:46:43 2013 +0000
Parent:
6:e11bf54dd344
Child:
8:a356376db984
Commit message:
added function to power and reset the modules on the board; make sure the correct board revision is selected

Changed in this revision

C027.cpp Show annotated file Show diff for this revision Revisions of this file
C027.h Show annotated file Show diff for this revision Revisions of this file
--- 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)
--- a/C027.h	Mon Oct 21 19:45:55 2013 +0000
+++ b/C027.h	Fri Oct 25 08:46:43 2013 +0000
@@ -13,22 +13,28 @@
 // We do not have fancy leds that can be flashed on the C027.
 void mbed_die(void);
 
+#define C027_REVA // remove this define for the revision B boards
+
 class C027
 {
 public:
     C027();
 
-    void gpsPower(bool enable);
     void mdmPower(bool enable);
     void mdmReset(void);
+    void gpsPower(bool enable);
     void gpsReset(void);
 
 private:
+    // modem pins 
     DigitalOut mdmEn;
+#ifndef C027_REVA
     DigitalOut mdmRst;
+#endif
     DigitalOut mdmPwrOn;
     DigitalOut mdmRts;
     bool mdmIsEnabled;
+    // gps pins
     DigitalOut gpsEn;
     DigitalOut gpsRst;
     bool gpsIsEnabled;