Board support library for C027 - updated with thread-safe wait()
Fork of C027 by
C027.cpp@16:286a756a8d3f, 2014-09-12 (annotated)
- Committer:
- ansond
- Date:
- Fri Sep 12 21:00:10 2014 +0000
- Revision:
- 16:286a756a8d3f
- Parent:
- 15:37252d7bcd9e
updated with thread-safe wait()
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 | |
ansond | 16:286a756a8d3f | 9 | #include "mbed.h" |
ansond | 16:286a756a8d3f | 10 | #include "rtos.h" |
ansond | 16:286a756a8d3f | 11 | |
mazgch | 2:b7bd3660ff64 | 12 | void mbed_die(void) |
mazgch | 2:b7bd3660ff64 | 13 | { |
mazgch | 8:a356376db984 | 14 | DigitalOut led(LED); |
mazgch | 11:722101675ce4 | 15 | led = 0; |
mazgch | 11:722101675ce4 | 16 | // Send SOS in Morse Code: // "... --- ... " |
mazgch | 11:722101675ce4 | 17 | const char sos[] = "=.=.=...===.===.===...=.=.=......"; |
mazgch | 11:722101675ce4 | 18 | const int dot = 100; // length of the dot in milliseconds (typical: 50-100 ms) |
mazgch | 11:722101675ce4 | 19 | // lengths of symbols: |
mazgch | 11:722101675ce4 | 20 | // di = dot |
mazgch | 11:722101675ce4 | 21 | // dah = 3 dot |
mazgch | 11:722101675ce4 | 22 | // char space = 3 dot |
mazgch | 11:722101675ce4 | 23 | // word space = 6 dot |
mazgch | 11:722101675ce4 | 24 | for (int i = 0; /* nothing */; i = sos[i+1] ? i+1 : 0) |
mazgch | 2:b7bd3660ff64 | 25 | { |
mazgch | 11:722101675ce4 | 26 | led = (sos[i] == '='); |
ansond | 16:286a756a8d3f | 27 | Thread::wait(dot); |
mazgch | 2:b7bd3660ff64 | 28 | } |
mazgch | 2:b7bd3660ff64 | 29 | } |
mazgch | 2:b7bd3660ff64 | 30 | |
mazgch | 6:e11bf54dd344 | 31 | C027::C027() : |
mazgch | 13:fb30e9923a7b | 32 | mdmEn(MDMEN), mdmRst(MDMRST), mdmPwrOn(MDMPWRON), // MDM CTRL |
mazgch | 13:fb30e9923a7b | 33 | mdmLvlOe(MDMLVLOE), mdmILvlOe(MDMILVLOE), mdmUsbDet(MDMUSBDET), // MDM IF |
mazgch | 13:fb30e9923a7b | 34 | gpsEn(GPSEN), gpsRst(GPSRST) // GPS CTRL |
mazgch | 6:e11bf54dd344 | 35 | { |
mazgch | 14:e30f90b5447e | 36 | DigitalOut led(LED); |
mazgch | 13:fb30e9923a7b | 37 | DigitalOut mdmRts(MDMRTS); |
mazgch | 14:e30f90b5447e | 38 | led = 0; // LED1: 0=off |
mazgch | 14:e30f90b5447e | 39 | mdmRts = 0; // RTS: 0=ready to send |
mazgch | 7:e3eab86f1de9 | 40 | // we start with the gps disabled |
mazgch | 8:a356376db984 | 41 | gpsEn = 0; // LDOEN: 1=on,0=off |
mazgch | 8:a356376db984 | 42 | gpsRst = 0; // RESET: 0=reset,1=operating |
mazgch | 6:e11bf54dd344 | 43 | gpsIsEnabled = false; |
mazgch | 7:e3eab86f1de9 | 44 | // we start with the modem disabled |
mazgch | 13:fb30e9923a7b | 45 | mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) |
mazgch | 13:fb30e9923a7b | 46 | mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) |
mazgch | 8:a356376db984 | 47 | mdmUsbDet = 0; // USBDET: 0=disabled |
mazgch | 8:a356376db984 | 48 | mdmPwrOn = 1; // PWRON: 1=idle, 0=action |
mazgch | 8:a356376db984 | 49 | mdmEn = 0; // LDOEN: 1=on, 0=off |
mazgch | 8:a356376db984 | 50 | mdmRst = 0; // RESET: 0=reset, 1=operating |
mazgch | 6:e11bf54dd344 | 51 | mdmIsEnabled = false; |
mazgch | 14:e30f90b5447e | 52 | mdmUseUsb = false; |
ansond | 16:286a756a8d3f | 53 | Thread::wait(50); // when USB cable is inserted the interface chip issues |
mazgch | 15:37252d7bcd9e | 54 | // multiple resets to the target CPU We wait here for a short period to |
mazgch | 15:37252d7bcd9e | 55 | // prevent those resets from propagating to the modem and other |
mazgch | 15:37252d7bcd9e | 56 | // components. |
mazgch | 6:e11bf54dd344 | 57 | } |
mazgch | 6:e11bf54dd344 | 58 | |
mazgch | 6:e11bf54dd344 | 59 | void C027::mdmPower(bool enable) |
mazgch | 6:e11bf54dd344 | 60 | { |
mazgch | 7:e3eab86f1de9 | 61 | if (!mdmIsEnabled && enable) // enable modem |
mazgch | 6:e11bf54dd344 | 62 | { |
mazgch | 7:e3eab86f1de9 | 63 | #ifdef C027_REVA |
mazgch | 7:e3eab86f1de9 | 64 | // we need the gps ldo for the level shifters of the modem |
mazgch | 8:a356376db984 | 65 | gpsEn = 1; // LDOEN(gps): 0=off -> 1=on |
mazgch | 7:e3eab86f1de9 | 66 | #endif |
mazgch | 14:e30f90b5447e | 67 | mdmPwrOn = 0; // PWRON: 0=turn on |
mazgch | 8:a356376db984 | 68 | mdmEn = 0; // LDOEN: 0=off |
mazgch | 8:a356376db984 | 69 | mdmRst = 0; // RESET: 0=reset |
mazgch | 8:a356376db984 | 70 | mdmLvlOe = 1; // LVLEN: 1=disabled |
mazgch | 13:fb30e9923a7b | 71 | mdmILvlOe = 0; // ILVLEN: 0=disabled |
mazgch | 14:e30f90b5447e | 72 | mdmUsbDet = mdmUseUsb ? 1 : 0; // USBDET: 0=disabled, 1=enabled |
ansond | 16:286a756a8d3f | 73 | Thread::wait( 10); // wait until supply switched off |
mazgch | 8:a356376db984 | 74 | mdmEn = 1; // LDOEN: 0=off -> 1=on |
ansond | 16:286a756a8d3f | 75 | Thread::wait( 10); // wait until supply stable and on |
ansond | 16:286a756a8d3f | 76 | Thread::wait(300); // power on sequence is triggered by keeping reset 50ms-300ms low |
mazgch | 8:a356376db984 | 77 | mdmRst = 1; // RESET: 0=reset -> 1=operating |
ansond | 16:286a756a8d3f | 78 | Thread::wait(150); // LISA-C requires 150ms low to turn on |
mazgch | 14:e30f90b5447e | 79 | mdmPwrOn = 1; // PWRON: 0=turn on -> 1=idle |
mazgch | 7:e3eab86f1de9 | 80 | mdmIsEnabled = true; |
mazgch | 10:bc9e2eb5daa8 | 81 | // the interfaces of the modem should be fully ready after a certain period |
mazgch | 10:bc9e2eb5daa8 | 82 | // LISA-U200 5000ms |
mazgch | 10:bc9e2eb5daa8 | 83 | // SARA-G350 3000ms |
mazgch | 10:bc9e2eb5daa8 | 84 | // LISA-C200 |
ansond | 16:286a756a8d3f | 85 | Thread::wait(1000); |
mazgch | 13:fb30e9923a7b | 86 | mdmLvlOe = 0; // LVLEN: 0=enabled (uart/gpio) |
mazgch | 13:fb30e9923a7b | 87 | if (gpsIsEnabled) |
mazgch | 13:fb30e9923a7b | 88 | mdmILvlOe = 1; // ILVLEN: 1=enabled (i2c) |
mazgch | 7:e3eab86f1de9 | 89 | } |
mazgch | 7:e3eab86f1de9 | 90 | else if (mdmIsEnabled && !enable) // disable modem |
mazgch | 7:e3eab86f1de9 | 91 | { |
mazgch | 7:e3eab86f1de9 | 92 | mdmIsEnabled = false; |
mazgch | 7:e3eab86f1de9 | 93 | // initiate power off sequence by setting PwnOn low for >1s |
mazgch | 13:fb30e9923a7b | 94 | mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) |
mazgch | 13:fb30e9923a7b | 95 | mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) |
mazgch | 8:a356376db984 | 96 | mdmUsbDet = 0; // USBDET: 0=disabled |
mazgch | 8:a356376db984 | 97 | mdmPwrOn = 0; // PWRON: 0=active |
ansond | 16:286a756a8d3f | 98 | Thread::wait(1000); // send to sleep |
mazgch | 8:a356376db984 | 99 | mdmPwrOn = 1; // PWRON: 0=active -> 1=idle |
mazgch | 7:e3eab86f1de9 | 100 | // now we can savely switch off the ldo |
mazgch | 8:a356376db984 | 101 | mdmRst = 0; // RESET: 1=operating -> 0=reset |
mazgch | 8:a356376db984 | 102 | mdmEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 103 | #ifdef C027_REVA |
mazgch | 7:e3eab86f1de9 | 104 | // the gps ldo may no longer be needed level shifters of the modem |
mazgch | 7:e3eab86f1de9 | 105 | // so we switch it off if the gps is not enabled |
mazgch | 7:e3eab86f1de9 | 106 | if (!gpsIsEnabled) |
mazgch | 7:e3eab86f1de9 | 107 | gpsEn = 0; // LDOEN(gps): 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 108 | #endif |
mazgch | 6:e11bf54dd344 | 109 | } |
mazgch | 13:fb30e9923a7b | 110 | |
mazgch | 6:e11bf54dd344 | 111 | } |
mazgch | 6:e11bf54dd344 | 112 | |
mazgch | 14:e30f90b5447e | 113 | void C027::mdmUsbEnable(bool enable) |
mazgch | 14:e30f90b5447e | 114 | { |
mazgch | 14:e30f90b5447e | 115 | mdmUseUsb = enable; |
mazgch | 14:e30f90b5447e | 116 | if (mdmIsEnabled) |
mazgch | 14:e30f90b5447e | 117 | mdmUsbDet = mdmUseUsb ? 1 : 0; |
mazgch | 14:e30f90b5447e | 118 | } |
mazgch | 14:e30f90b5447e | 119 | |
mazgch | 6:e11bf54dd344 | 120 | void C027::mdmReset(void) |
mazgch | 6:e11bf54dd344 | 121 | { |
mazgch | 8:a356376db984 | 122 | if (mdmIsEnabled) |
mazgch | 8:a356376db984 | 123 | { |
mazgch | 8:a356376db984 | 124 | mdmRst = 0; // RESET: 0=reset |
mazgch | 8:a356376db984 | 125 | // power on sequence is triggered by reset low |
mazgch | 8:a356376db984 | 126 | // LISA-U200 50ms |
mazgch | 8:a356376db984 | 127 | // SARA-G350 50ms |
mazgch | 8:a356376db984 | 128 | // LISA-C200 300ms |
ansond | 16:286a756a8d3f | 129 | Thread::wait(300); |
mazgch | 8:a356376db984 | 130 | mdmRst = 1; // RESET: 0=reset -> 1=operating |
mazgch | 8:a356376db984 | 131 | } |
mazgch | 8:a356376db984 | 132 | } |
mazgch | 8:a356376db984 | 133 | |
mazgch | 8:a356376db984 | 134 | void C027::mdmWakeup(void) |
mazgch | 8:a356376db984 | 135 | { |
mazgch | 6:e11bf54dd344 | 136 | if (mdmIsEnabled) |
mazgch | 6:e11bf54dd344 | 137 | { |
mazgch | 8:a356376db984 | 138 | mdmPwrOn = 0; |
mazgch | 8:a356376db984 | 139 | // wakeup the device by low pulse: |
mazgch | 8:a356376db984 | 140 | // LISA-U200 50-80us |
mazgch | 8:a356376db984 | 141 | // SARA-G350 5ms |
mazgch | 8:a356376db984 | 142 | // LISA-C200 150ms |
ansond | 16:286a756a8d3f | 143 | Thread::wait(150); |
mazgch | 8:a356376db984 | 144 | mdmPwrOn = 1; |
mazgch | 6:e11bf54dd344 | 145 | } |
mazgch | 8:a356376db984 | 146 | } |
mazgch | 8:a356376db984 | 147 | |
mazgch | 8:a356376db984 | 148 | void C027::mdmSleep(void) |
mazgch | 8:a356376db984 | 149 | { |
mazgch | 8:a356376db984 | 150 | if (mdmIsEnabled) |
mazgch | 8:a356376db984 | 151 | { |
mazgch | 8:a356376db984 | 152 | mdmPwrOn = 0; |
mazgch | 8:a356376db984 | 153 | // going to sleep is triggerd by low pulse: |
mazgch | 8:a356376db984 | 154 | // LISA-U200 1000ms |
mazgch | 8:a356376db984 | 155 | // SARA-G350 n/a |
mazgch | 8:a356376db984 | 156 | // LISA-C200 n/a |
ansond | 16:286a756a8d3f | 157 | Thread::wait(1000); |
mazgch | 8:a356376db984 | 158 | mdmPwrOn = 1; |
mazgch | 8:a356376db984 | 159 | } |
mazgch | 7:e3eab86f1de9 | 160 | } |
mazgch | 7:e3eab86f1de9 | 161 | |
mazgch | 7:e3eab86f1de9 | 162 | void C027::gpsPower(bool enable) |
mazgch | 7:e3eab86f1de9 | 163 | { |
mazgch | 7:e3eab86f1de9 | 164 | if (!gpsIsEnabled && enable) // enable gps |
mazgch | 7:e3eab86f1de9 | 165 | { |
mazgch | 7:e3eab86f1de9 | 166 | gpsRst = 0; // RESET: 0=reset |
mazgch | 7:e3eab86f1de9 | 167 | gpsEn = 1; // LDOEN: 0=off -> 1=on |
ansond | 16:286a756a8d3f | 168 | Thread::wait(1); // wait until stable |
mazgch | 7:e3eab86f1de9 | 169 | gpsRst = 1; // RESET: 0=reset -> 1=operating |
mazgch | 7:e3eab86f1de9 | 170 | gpsIsEnabled = true; |
mazgch | 7:e3eab86f1de9 | 171 | // the gps schould be fully ready after 50ms |
mazgch | 13:fb30e9923a7b | 172 | if (mdmIsEnabled) |
mazgch | 13:fb30e9923a7b | 173 | mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c) |
mazgch | 7:e3eab86f1de9 | 174 | } |
mazgch | 7:e3eab86f1de9 | 175 | else if (gpsIsEnabled && !enable) // diasble gps |
mazgch | 7:e3eab86f1de9 | 176 | { |
mazgch | 7:e3eab86f1de9 | 177 | gpsIsEnabled = false; |
mazgch | 13:fb30e9923a7b | 178 | mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) |
mazgch | 13:fb30e9923a7b | 179 | gpsRst = 0; // RESET: 1=operating -> 0=reset |
mazgch | 7:e3eab86f1de9 | 180 | #ifdef C027_REVA |
mazgch | 7:e3eab86f1de9 | 181 | // the gps ldo may have to remain enabled for the level shifters of the modem |
mazgch | 7:e3eab86f1de9 | 182 | if (!mdmIsEnabled) |
mazgch | 13:fb30e9923a7b | 183 | gpsEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 184 | #else |
mazgch | 13:fb30e9923a7b | 185 | gpsEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 186 | #endif |
mazgch | 7:e3eab86f1de9 | 187 | } |
mazgch | 6:e11bf54dd344 | 188 | } |
mazgch | 6:e11bf54dd344 | 189 | |
mazgch | 6:e11bf54dd344 | 190 | void C027::gpsReset(void) |
mazgch | 6:e11bf54dd344 | 191 | { |
mazgch | 6:e11bf54dd344 | 192 | if (gpsIsEnabled) |
mazgch | 6:e11bf54dd344 | 193 | { |
mazgch | 6:e11bf54dd344 | 194 | gpsRst = 0; // RESET: 0=reset,1=operating |
ansond | 16:286a756a8d3f | 195 | Thread::wait(1); |
mazgch | 6:e11bf54dd344 | 196 | gpsRst = 1; // RESET: 1=operating,0=reset |
mazgch | 6:e11bf54dd344 | 197 | } |
mazgch | 6:e11bf54dd344 | 198 | } |