Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of C027 by
C027.cpp@13:fb30e9923a7b, 2013-11-19 (annotated)
- Committer:
- mazgch
- Date:
- Tue Nov 19 12:26:01 2013 +0000
- Revision:
- 13:fb30e9923a7b
- Parent:
- 12:31fb5ff9fef5
- Child:
- 14:e30f90b5447e
added ilevoe (i2c buffer oe)
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 | 2:b7bd3660ff64 | 6 | |
mazgch | 2:b7bd3660ff64 | 7 | #include "C027.h" |
mazgch | 2:b7bd3660ff64 | 8 | |
mazgch | 2:b7bd3660ff64 | 9 | void mbed_die(void) |
mazgch | 2:b7bd3660ff64 | 10 | { |
mazgch | 8:a356376db984 | 11 | DigitalOut led(LED); |
mazgch | 11:722101675ce4 | 12 | led = 0; |
mazgch | 11:722101675ce4 | 13 | // Send SOS in Morse Code: // "... --- ... " |
mazgch | 11:722101675ce4 | 14 | const char sos[] = "=.=.=...===.===.===...=.=.=......"; |
mazgch | 11:722101675ce4 | 15 | const int dot = 100; // length of the dot in milliseconds (typical: 50-100 ms) |
mazgch | 11:722101675ce4 | 16 | // lengths of symbols: |
mazgch | 11:722101675ce4 | 17 | // di = dot |
mazgch | 11:722101675ce4 | 18 | // dah = 3 dot |
mazgch | 11:722101675ce4 | 19 | // char space = 3 dot |
mazgch | 11:722101675ce4 | 20 | // word space = 6 dot |
mazgch | 11:722101675ce4 | 21 | for (int i = 0; /* nothing */; i = sos[i+1] ? i+1 : 0) |
mazgch | 2:b7bd3660ff64 | 22 | { |
mazgch | 11:722101675ce4 | 23 | led = (sos[i] == '='); |
mazgch | 11:722101675ce4 | 24 | wait_ms(dot); |
mazgch | 2:b7bd3660ff64 | 25 | } |
mazgch | 2:b7bd3660ff64 | 26 | } |
mazgch | 2:b7bd3660ff64 | 27 | |
mazgch | 6:e11bf54dd344 | 28 | C027::C027() : |
mazgch | 13:fb30e9923a7b | 29 | mdmEn(MDMEN), mdmRst(MDMRST), mdmPwrOn(MDMPWRON), // MDM CTRL |
mazgch | 13:fb30e9923a7b | 30 | mdmLvlOe(MDMLVLOE), mdmILvlOe(MDMILVLOE), mdmUsbDet(MDMUSBDET), // MDM IF |
mazgch | 13:fb30e9923a7b | 31 | gpsEn(GPSEN), gpsRst(GPSRST) // GPS CTRL |
mazgch | 6:e11bf54dd344 | 32 | { |
mazgch | 13:fb30e9923a7b | 33 | DigitalOut mdmRts(MDMRTS); |
mazgch | 13:fb30e9923a7b | 34 | mdmRts = 0; // RTS. 0=ready to send |
mazgch | 7:e3eab86f1de9 | 35 | // we start with the gps disabled |
mazgch | 8:a356376db984 | 36 | gpsEn = 0; // LDOEN: 1=on,0=off |
mazgch | 8:a356376db984 | 37 | gpsRst = 0; // RESET: 0=reset,1=operating |
mazgch | 6:e11bf54dd344 | 38 | gpsIsEnabled = false; |
mazgch | 7:e3eab86f1de9 | 39 | // we start with the modem disabled |
mazgch | 13:fb30e9923a7b | 40 | mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) |
mazgch | 13:fb30e9923a7b | 41 | mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) |
mazgch | 8:a356376db984 | 42 | mdmUsbDet = 0; // USBDET: 0=disabled |
mazgch | 8:a356376db984 | 43 | mdmPwrOn = 1; // PWRON: 1=idle, 0=action |
mazgch | 8:a356376db984 | 44 | mdmEn = 0; // LDOEN: 1=on, 0=off |
mazgch | 8:a356376db984 | 45 | mdmRst = 0; // RESET: 0=reset, 1=operating |
mazgch | 6:e11bf54dd344 | 46 | mdmIsEnabled = false; |
mazgch | 6:e11bf54dd344 | 47 | } |
mazgch | 6:e11bf54dd344 | 48 | |
mazgch | 6:e11bf54dd344 | 49 | void C027::mdmPower(bool enable) |
mazgch | 6:e11bf54dd344 | 50 | { |
mazgch | 7:e3eab86f1de9 | 51 | if (!mdmIsEnabled && enable) // enable modem |
mazgch | 6:e11bf54dd344 | 52 | { |
mazgch | 7:e3eab86f1de9 | 53 | #ifdef C027_REVA |
mazgch | 7:e3eab86f1de9 | 54 | // we need the gps ldo for the level shifters of the modem |
mazgch | 8:a356376db984 | 55 | gpsEn = 1; // LDOEN(gps): 0=off -> 1=on |
mazgch | 7:e3eab86f1de9 | 56 | #endif |
mazgch | 8:a356376db984 | 57 | mdmPwrOn = 1; // PWRON: 1=idle |
mazgch | 8:a356376db984 | 58 | mdmEn = 0; // LDOEN: 0=off |
mazgch | 8:a356376db984 | 59 | mdmRst = 0; // RESET: 0=reset |
mazgch | 8:a356376db984 | 60 | mdmLvlOe = 1; // LVLEN: 1=disabled |
mazgch | 13:fb30e9923a7b | 61 | mdmILvlOe = 0; // ILVLEN: 0=disabled |
mazgch | 8:a356376db984 | 62 | mdmUsbDet = 0; // USBDET: 0=disabled |
mazgch | 8:a356376db984 | 63 | wait_ms( 10); // wait until supply switched off |
mazgch | 8:a356376db984 | 64 | mdmEn = 1; // LDOEN: 0=off -> 1=on |
mazgch | 8:a356376db984 | 65 | wait_ms( 10); // wait until supply stable and on |
mazgch | 8:a356376db984 | 66 | wait_ms(300); // power on sequence is triggered by keeping reset 50ms-300ms low |
mazgch | 8:a356376db984 | 67 | mdmRst = 1; // RESET: 0=reset -> 1=operating |
mazgch | 8:a356376db984 | 68 | mdmUsbDet = 1; // USBDET: 1=enabled |
mazgch | 7:e3eab86f1de9 | 69 | mdmIsEnabled = true; |
mazgch | 10:bc9e2eb5daa8 | 70 | // the interfaces of the modem should be fully ready after a certain period |
mazgch | 10:bc9e2eb5daa8 | 71 | // LISA-U200 5000ms |
mazgch | 10:bc9e2eb5daa8 | 72 | // SARA-G350 3000ms |
mazgch | 10:bc9e2eb5daa8 | 73 | // LISA-C200 |
mazgch | 10:bc9e2eb5daa8 | 74 | wait_ms(1000); |
mazgch | 13:fb30e9923a7b | 75 | mdmLvlOe = 0; // LVLEN: 0=enabled (uart/gpio) |
mazgch | 13:fb30e9923a7b | 76 | if (gpsIsEnabled) |
mazgch | 13:fb30e9923a7b | 77 | mdmILvlOe = 1; // ILVLEN: 1=enabled (i2c) |
mazgch | 7:e3eab86f1de9 | 78 | } |
mazgch | 7:e3eab86f1de9 | 79 | else if (mdmIsEnabled && !enable) // disable modem |
mazgch | 7:e3eab86f1de9 | 80 | { |
mazgch | 7:e3eab86f1de9 | 81 | mdmIsEnabled = false; |
mazgch | 7:e3eab86f1de9 | 82 | // initiate power off sequence by setting PwnOn low for >1s |
mazgch | 13:fb30e9923a7b | 83 | mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) |
mazgch | 13:fb30e9923a7b | 84 | mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) |
mazgch | 8:a356376db984 | 85 | mdmUsbDet = 0; // USBDET: 0=disabled |
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 | mdmRst = 0; // RESET: 1=operating -> 0=reset |
mazgch | 8:a356376db984 | 91 | mdmEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 92 | #ifdef C027_REVA |
mazgch | 7:e3eab86f1de9 | 93 | // the gps ldo may no longer be needed level shifters of the modem |
mazgch | 7:e3eab86f1de9 | 94 | // so we switch it off if the gps is not enabled |
mazgch | 7:e3eab86f1de9 | 95 | if (!gpsIsEnabled) |
mazgch | 7:e3eab86f1de9 | 96 | gpsEn = 0; // LDOEN(gps): 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 97 | #endif |
mazgch | 6:e11bf54dd344 | 98 | } |
mazgch | 13:fb30e9923a7b | 99 | |
mazgch | 6:e11bf54dd344 | 100 | } |
mazgch | 6:e11bf54dd344 | 101 | |
mazgch | 6:e11bf54dd344 | 102 | void C027::mdmReset(void) |
mazgch | 6:e11bf54dd344 | 103 | { |
mazgch | 8:a356376db984 | 104 | if (mdmIsEnabled) |
mazgch | 8:a356376db984 | 105 | { |
mazgch | 8:a356376db984 | 106 | mdmRst = 0; // RESET: 0=reset |
mazgch | 8:a356376db984 | 107 | // power on sequence is triggered by reset low |
mazgch | 8:a356376db984 | 108 | // LISA-U200 50ms |
mazgch | 8:a356376db984 | 109 | // SARA-G350 50ms |
mazgch | 8:a356376db984 | 110 | // LISA-C200 300ms |
mazgch | 8:a356376db984 | 111 | wait_ms(300); |
mazgch | 8:a356376db984 | 112 | mdmRst = 1; // RESET: 0=reset -> 1=operating |
mazgch | 8:a356376db984 | 113 | } |
mazgch | 8:a356376db984 | 114 | } |
mazgch | 8:a356376db984 | 115 | |
mazgch | 8:a356376db984 | 116 | void C027::mdmWakeup(void) |
mazgch | 8:a356376db984 | 117 | { |
mazgch | 6:e11bf54dd344 | 118 | if (mdmIsEnabled) |
mazgch | 6:e11bf54dd344 | 119 | { |
mazgch | 8:a356376db984 | 120 | mdmPwrOn = 0; |
mazgch | 8:a356376db984 | 121 | // wakeup the device by low pulse: |
mazgch | 8:a356376db984 | 122 | // LISA-U200 50-80us |
mazgch | 8:a356376db984 | 123 | // SARA-G350 5ms |
mazgch | 8:a356376db984 | 124 | // LISA-C200 150ms |
mazgch | 8:a356376db984 | 125 | wait_ms(150); |
mazgch | 8:a356376db984 | 126 | mdmPwrOn = 1; |
mazgch | 6:e11bf54dd344 | 127 | } |
mazgch | 8:a356376db984 | 128 | } |
mazgch | 8:a356376db984 | 129 | |
mazgch | 8:a356376db984 | 130 | void C027::mdmSleep(void) |
mazgch | 8:a356376db984 | 131 | { |
mazgch | 8:a356376db984 | 132 | if (mdmIsEnabled) |
mazgch | 8:a356376db984 | 133 | { |
mazgch | 8:a356376db984 | 134 | mdmPwrOn = 0; |
mazgch | 8:a356376db984 | 135 | // going to sleep is triggerd by low pulse: |
mazgch | 8:a356376db984 | 136 | // LISA-U200 1000ms |
mazgch | 8:a356376db984 | 137 | // SARA-G350 n/a |
mazgch | 8:a356376db984 | 138 | // LISA-C200 n/a |
mazgch | 8:a356376db984 | 139 | wait_ms(1000); |
mazgch | 8:a356376db984 | 140 | mdmPwrOn = 1; |
mazgch | 8:a356376db984 | 141 | } |
mazgch | 7:e3eab86f1de9 | 142 | } |
mazgch | 7:e3eab86f1de9 | 143 | |
mazgch | 7:e3eab86f1de9 | 144 | void C027::gpsPower(bool enable) |
mazgch | 7:e3eab86f1de9 | 145 | { |
mazgch | 7:e3eab86f1de9 | 146 | if (!gpsIsEnabled && enable) // enable gps |
mazgch | 7:e3eab86f1de9 | 147 | { |
mazgch | 7:e3eab86f1de9 | 148 | gpsRst = 0; // RESET: 0=reset |
mazgch | 7:e3eab86f1de9 | 149 | gpsEn = 1; // LDOEN: 0=off -> 1=on |
mazgch | 7:e3eab86f1de9 | 150 | wait_ms(1); // wait until stable |
mazgch | 7:e3eab86f1de9 | 151 | gpsRst = 1; // RESET: 0=reset -> 1=operating |
mazgch | 7:e3eab86f1de9 | 152 | gpsIsEnabled = true; |
mazgch | 7:e3eab86f1de9 | 153 | // the gps schould be fully ready after 50ms |
mazgch | 13:fb30e9923a7b | 154 | if (mdmIsEnabled) |
mazgch | 13:fb30e9923a7b | 155 | mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c) |
mazgch | 7:e3eab86f1de9 | 156 | } |
mazgch | 7:e3eab86f1de9 | 157 | else if (gpsIsEnabled && !enable) // diasble gps |
mazgch | 7:e3eab86f1de9 | 158 | { |
mazgch | 7:e3eab86f1de9 | 159 | gpsIsEnabled = false; |
mazgch | 13:fb30e9923a7b | 160 | mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) |
mazgch | 13:fb30e9923a7b | 161 | gpsRst = 0; // RESET: 1=operating -> 0=reset |
mazgch | 7:e3eab86f1de9 | 162 | #ifdef C027_REVA |
mazgch | 7:e3eab86f1de9 | 163 | // the gps ldo may have to remain enabled for the level shifters of the modem |
mazgch | 7:e3eab86f1de9 | 164 | if (!mdmIsEnabled) |
mazgch | 13:fb30e9923a7b | 165 | gpsEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 166 | #else |
mazgch | 13:fb30e9923a7b | 167 | gpsEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 168 | #endif |
mazgch | 7:e3eab86f1de9 | 169 | } |
mazgch | 6:e11bf54dd344 | 170 | } |
mazgch | 6:e11bf54dd344 | 171 | |
mazgch | 6:e11bf54dd344 | 172 | void C027::gpsReset(void) |
mazgch | 6:e11bf54dd344 | 173 | { |
mazgch | 6:e11bf54dd344 | 174 | if (gpsIsEnabled) |
mazgch | 6:e11bf54dd344 | 175 | { |
mazgch | 6:e11bf54dd344 | 176 | gpsRst = 0; // RESET: 0=reset,1=operating |
mazgch | 6:e11bf54dd344 | 177 | wait_ms(1); |
mazgch | 6:e11bf54dd344 | 178 | gpsRst = 1; // RESET: 1=operating,0=reset |
mazgch | 6:e11bf54dd344 | 179 | } |
mazgch | 6:e11bf54dd344 | 180 | } |