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

Committer:
mazgch
Date:
Mon May 05 15:44:46 2014 +0000
Revision:
19:61d31c12230d
Parent:
17:8ca897c3cf41
Child:
20:89c45165ee87
change error message if on third party platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 2:b7bd3660ff64 1 /* Platform source file, for the u-blox C27-C20/U20/G35
mazgch 2:b7bd3660ff64 2 * mbed Internet of Things Starter Kit
mazgch 2:b7bd3660ff64 3 * http://mbed.org/platforms/u-blox-C027/
mazgch 2:b7bd3660ff64 4 *
mazgch 2:b7bd3660ff64 5 */
mazgch 19:61d31c12230d 6 #if defined(TARGET_UBLOX_C027) || defined(TARGET_LPC1768)
mazgch 19:61d31c12230d 7
mazgch 19:61d31c12230d 8 #include "C027.h"
mazgch 19:61d31c12230d 9
mazgch 19:61d31c12230d 10 #if !defined(TARGET_UBLOX_C027)
mazgch 16:3ce62caf4518 11 // override the mbed_die function
mazgch 2:b7bd3660ff64 12 void mbed_die(void)
mazgch 2:b7bd3660ff64 13 {
mazgch 8:a356376db984 14 DigitalOut led(LED);
mazgch 17:8ca897c3cf41 15 __disable_irq();
mazgch 16:3ce62caf4518 16 for (;;)
mazgch 2:b7bd3660ff64 17 {
mazgch 16:3ce62caf4518 18 // nothing to do here
mazgch 16:3ce62caf4518 19 led = 0;
mazgch 16:3ce62caf4518 20 wait_ms(200);
mazgch 16:3ce62caf4518 21 led = 1;
mazgch 16:3ce62caf4518 22 wait_ms(200);
mazgch 2:b7bd3660ff64 23 }
mazgch 2:b7bd3660ff64 24 }
mazgch 16:3ce62caf4518 25 #endif
mazgch 2:b7bd3660ff64 26
mazgch 6:e11bf54dd344 27 C027::C027() :
mazgch 16:3ce62caf4518 28 // Modem
mazgch 16:3ce62caf4518 29 mdmEn(MDMEN, 0), // LDO off
mazgch 16:3ce62caf4518 30 mdmRst(MDMRST, 1), // not reset
mazgch 16:3ce62caf4518 31 mdmPwrOn(MDMPWRON, 1), // Power On idle
mazgch 16:3ce62caf4518 32 mdmLvlOe(MDMLVLOE, 1), // GPIO/Serial velel shifters off
mazgch 16:3ce62caf4518 33 mdmILvlOe(MDMILVLOE, 0), // I2C Level shifter off
mazgch 16:3ce62caf4518 34 mdmUsbDet(MDMUSBDET, 0), // USB not used
mazgch 16:3ce62caf4518 35 // GPS
mazgch 16:3ce62caf4518 36 gpsEn(GPSEN, 0), // LDO off
mazgch 16:3ce62caf4518 37 gpsRst(GPSRST, 1) // not reset
mazgch 6:e11bf54dd344 38 {
mazgch 16:3ce62caf4518 39 DigitalOut led(LED, 0); // start with leds off
mazgch 16:3ce62caf4518 40 DigitalOut mdmRts(MDMRTS, 0); // make sure that rts is low
mazgch 16:3ce62caf4518 41
mazgch 6:e11bf54dd344 42 gpsIsEnabled = false;
mazgch 6:e11bf54dd344 43 mdmIsEnabled = false;
mazgch 14:e30f90b5447e 44 mdmUseUsb = false;
mazgch 6:e11bf54dd344 45 }
mazgch 6:e11bf54dd344 46
mazgch 6:e11bf54dd344 47 void C027::mdmPower(bool enable)
mazgch 6:e11bf54dd344 48 {
mazgch 7:e3eab86f1de9 49 if (!mdmIsEnabled && enable) // enable modem
mazgch 6:e11bf54dd344 50 {
mazgch 7:e3eab86f1de9 51 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 52 // we need the gps ldo for the level shifters of the modem
mazgch 16:3ce62caf4518 53 if (!gpsIsEnabled)
mazgch 16:3ce62caf4518 54 gpsEn = 1; // LDOEN(gps): 0=off -> 1=on
mazgch 7:e3eab86f1de9 55 #endif
mazgch 8:a356376db984 56 mdmLvlOe = 1; // LVLEN: 1=disabled
mazgch 13:fb30e9923a7b 57 mdmILvlOe = 0; // ILVLEN: 0=disabled
mazgch 16:3ce62caf4518 58 // turn on the mode by enabling power with power on pin low and correct USB detect level
mazgch 14:e30f90b5447e 59 mdmUsbDet = mdmUseUsb ? 1 : 0; // USBDET: 0=disabled, 1=enabled
mazgch 16:3ce62caf4518 60 mdmPwrOn = 0; // PWRON: 0=turn on
mazgch 16:3ce62caf4518 61 mdmEn = 1; // LDOEN: 1=on
mazgch 16:3ce62caf4518 62 wait_ms( 1); // wait until supply switched off
mazgch 16:3ce62caf4518 63 // mnake sure reset is also off
mazgch 16:3ce62caf4518 64 mdmRst = 1; // RESET: 0=not reset
mazgch 8:a356376db984 65 wait_ms(300); // power on sequence is triggered by keeping reset 50ms-300ms low
mazgch 14:e30f90b5447e 66 mdmPwrOn = 1; // PWRON: 0=turn on -> 1=idle
mazgch 7:e3eab86f1de9 67 mdmIsEnabled = true;
mazgch 10:bc9e2eb5daa8 68 // the interfaces of the modem should be fully ready after a certain period
mazgch 10:bc9e2eb5daa8 69 // LISA-U200 5000ms
mazgch 10:bc9e2eb5daa8 70 // SARA-G350 3000ms
mazgch 10:bc9e2eb5daa8 71 // LISA-C200
mazgch 10:bc9e2eb5daa8 72 wait_ms(1000);
mazgch 16:3ce62caf4518 73 // now we can safely enable the level shifters
mazgch 13:fb30e9923a7b 74 mdmLvlOe = 0; // LVLEN: 0=enabled (uart/gpio)
mazgch 13:fb30e9923a7b 75 if (gpsIsEnabled)
mazgch 13:fb30e9923a7b 76 mdmILvlOe = 1; // ILVLEN: 1=enabled (i2c)
mazgch 7:e3eab86f1de9 77 }
mazgch 7:e3eab86f1de9 78 else if (mdmIsEnabled && !enable) // disable modem
mazgch 7:e3eab86f1de9 79 {
mazgch 7:e3eab86f1de9 80 mdmIsEnabled = false;
mazgch 16:3ce62caf4518 81 // diable all level shifters
mazgch 13:fb30e9923a7b 82 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c)
mazgch 13:fb30e9923a7b 83 mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio)
mazgch 8:a356376db984 84 mdmUsbDet = 0; // USBDET: 0=disabled
mazgch 16:3ce62caf4518 85 // initiate power off sequence by setting PwnOn low for >1s
mazgch 8:a356376db984 86 mdmPwrOn = 0; // PWRON: 0=active
mazgch 8:a356376db984 87 wait_ms(1000); // send to sleep
mazgch 8:a356376db984 88 mdmPwrOn = 1; // PWRON: 0=active -> 1=idle
mazgch 7:e3eab86f1de9 89 // now we can savely switch off the ldo
mazgch 8:a356376db984 90 mdmEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 91 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 92 // the gps ldo may no longer be needed level shifters of the modem
mazgch 7:e3eab86f1de9 93 // so we switch it off if the gps is not enabled
mazgch 16:3ce62caf4518 94 if (!gpsIsEnabled)
mazgch 7:e3eab86f1de9 95 gpsEn = 0; // LDOEN(gps): 1=on -> 0=off
mazgch 7:e3eab86f1de9 96 #endif
mazgch 6:e11bf54dd344 97 }
mazgch 13:fb30e9923a7b 98
mazgch 6:e11bf54dd344 99 }
mazgch 6:e11bf54dd344 100
mazgch 14:e30f90b5447e 101 void C027::mdmUsbEnable(bool enable)
mazgch 14:e30f90b5447e 102 {
mazgch 14:e30f90b5447e 103 mdmUseUsb = enable;
mazgch 14:e30f90b5447e 104 if (mdmIsEnabled)
mazgch 14:e30f90b5447e 105 mdmUsbDet = mdmUseUsb ? 1 : 0;
mazgch 14:e30f90b5447e 106 }
mazgch 14:e30f90b5447e 107
mazgch 6:e11bf54dd344 108 void C027::mdmReset(void)
mazgch 6:e11bf54dd344 109 {
mazgch 8:a356376db984 110 if (mdmIsEnabled)
mazgch 8:a356376db984 111 {
mazgch 8:a356376db984 112 mdmRst = 0; // RESET: 0=reset
mazgch 8:a356376db984 113 // power on sequence is triggered by reset low
mazgch 8:a356376db984 114 // LISA-U200 50ms
mazgch 8:a356376db984 115 // SARA-G350 50ms
mazgch 8:a356376db984 116 // LISA-C200 300ms
mazgch 8:a356376db984 117 wait_ms(300);
mazgch 8:a356376db984 118 mdmRst = 1; // RESET: 0=reset -> 1=operating
mazgch 8:a356376db984 119 }
mazgch 8:a356376db984 120 }
mazgch 8:a356376db984 121
mazgch 8:a356376db984 122 void C027::mdmWakeup(void)
mazgch 8:a356376db984 123 {
mazgch 6:e11bf54dd344 124 if (mdmIsEnabled)
mazgch 6:e11bf54dd344 125 {
mazgch 8:a356376db984 126 mdmPwrOn = 0;
mazgch 8:a356376db984 127 // wakeup the device by low pulse:
mazgch 8:a356376db984 128 // LISA-U200 50-80us
mazgch 8:a356376db984 129 // SARA-G350 5ms
mazgch 16:3ce62caf4518 130 // LISA-C200 300ms
mazgch 16:3ce62caf4518 131 wait_ms(300);
mazgch 8:a356376db984 132 mdmPwrOn = 1;
mazgch 6:e11bf54dd344 133 }
mazgch 8:a356376db984 134 }
mazgch 8:a356376db984 135
mazgch 8:a356376db984 136 void C027::mdmSleep(void)
mazgch 8:a356376db984 137 {
mazgch 8:a356376db984 138 if (mdmIsEnabled)
mazgch 8:a356376db984 139 {
mazgch 8:a356376db984 140 mdmPwrOn = 0;
mazgch 8:a356376db984 141 // going to sleep is triggerd by low pulse:
mazgch 8:a356376db984 142 // LISA-U200 1000ms
mazgch 8:a356376db984 143 // SARA-G350 n/a
mazgch 8:a356376db984 144 // LISA-C200 n/a
mazgch 8:a356376db984 145 wait_ms(1000);
mazgch 8:a356376db984 146 mdmPwrOn = 1;
mazgch 8:a356376db984 147 }
mazgch 7:e3eab86f1de9 148 }
mazgch 7:e3eab86f1de9 149
mazgch 7:e3eab86f1de9 150 void C027::gpsPower(bool enable)
mazgch 7:e3eab86f1de9 151 {
mazgch 7:e3eab86f1de9 152 if (!gpsIsEnabled && enable) // enable gps
mazgch 7:e3eab86f1de9 153 {
mazgch 16:3ce62caf4518 154 // switch on power supply
mazgch 7:e3eab86f1de9 155 gpsEn = 1; // LDOEN: 0=off -> 1=on
mazgch 7:e3eab86f1de9 156 wait_ms(1); // wait until stable
mazgch 16:3ce62caf4518 157 // make sure we are not in reset
mazgch 7:e3eab86f1de9 158 gpsRst = 1; // RESET: 0=reset -> 1=operating
mazgch 7:e3eab86f1de9 159 gpsIsEnabled = true;
mazgch 7:e3eab86f1de9 160 // the gps schould be fully ready after 50ms
mazgch 13:fb30e9923a7b 161 if (mdmIsEnabled)
mazgch 13:fb30e9923a7b 162 mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c)
mazgch 7:e3eab86f1de9 163 }
mazgch 7:e3eab86f1de9 164 else if (gpsIsEnabled && !enable) // diasble gps
mazgch 7:e3eab86f1de9 165 {
mazgch 7:e3eab86f1de9 166 gpsIsEnabled = false;
mazgch 13:fb30e9923a7b 167 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c)
mazgch 7:e3eab86f1de9 168 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 169 // the gps ldo may have to remain enabled for the level shifters of the modem
mazgch 16:3ce62caf4518 170 if (!mdmIsEnabled)
mazgch 16:3ce62caf4518 171 gpsEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 172 #else
mazgch 13:fb30e9923a7b 173 gpsEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 174 #endif
mazgch 7:e3eab86f1de9 175 }
mazgch 6:e11bf54dd344 176 }
mazgch 6:e11bf54dd344 177
mazgch 6:e11bf54dd344 178 void C027::gpsReset(void)
mazgch 6:e11bf54dd344 179 {
mazgch 6:e11bf54dd344 180 if (gpsIsEnabled)
mazgch 6:e11bf54dd344 181 {
mazgch 6:e11bf54dd344 182 gpsRst = 0; // RESET: 0=reset,1=operating
mazgch 6:e11bf54dd344 183 wait_ms(1);
mazgch 6:e11bf54dd344 184 gpsRst = 1; // RESET: 1=operating,0=reset
mazgch 6:e11bf54dd344 185 }
mazgch 6:e11bf54dd344 186 }
mazgch 19:61d31c12230d 187 #endif