Board support library for C027
Dependents: IoTWorkshopLCD IoTWorkshopBuzzer IoTWorkshopSensors C027_USSDTest ... more
Fork of C027 by
C027.cpp@19:61d31c12230d, 2014-05-05 (annotated)
- 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?
User | Revision | Line number | New 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 |