Board support library for C027
Dependents: IoTWorkshopLCD IoTWorkshopBuzzer IoTWorkshopSensors C027_USSDTest ... more
Fork of C027 by
Diff: C027.cpp
- 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)