Fork to support REVB hardware.
Dependents: C027_BootTest_revb C027_EthernetSniffTest C027_M3_SerialEcho C027_HelloWorld_revb ... more
Fork of C027 by
C027.cpp@18:724e52d07c10, 2013-12-13 (annotated)
- Committer:
- dixter1
- Date:
- Fri Dec 13 19:25:26 2013 +0000
- Revision:
- 18:724e52d07c10
- Parent:
- 16:6475e8463afc
Add parameter to power functionality, so we determine at that point whether the LISA will use USB or UART (really, whether we allow uart to be enabled)
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 | |
dixter1 | 18:724e52d07c10 | 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 | 14:e30f90b5447e | 33 | DigitalOut led(LED); |
mazgch | 13:fb30e9923a7b | 34 | DigitalOut mdmRts(MDMRTS); |
mazgch | 14:e30f90b5447e | 35 | led = 0; // LED1: 0=off |
mazgch | 14:e30f90b5447e | 36 | mdmRts = 0; // RTS: 0=ready to send |
mazgch | 7:e3eab86f1de9 | 37 | // we start with the gps disabled |
mazgch | 8:a356376db984 | 38 | gpsEn = 0; // LDOEN: 1=on,0=off |
mazgch | 8:a356376db984 | 39 | gpsRst = 0; // RESET: 0=reset,1=operating |
mazgch | 6:e11bf54dd344 | 40 | gpsIsEnabled = false; |
mazgch | 7:e3eab86f1de9 | 41 | // we start with the modem disabled |
dixter1 | 16:6475e8463afc | 42 | mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) |
dixter1 | 16:6475e8463afc | 43 | mdmILvlOe = 1; // ILVLEN: 0=disabled (i2c) |
dixter1 | 15:971186932592 | 44 | mdmUsbDet = 1; // USBDET: 0=disabled |
dixter1 | 18:724e52d07c10 | 45 | |
dixter1 | 18:724e52d07c10 | 46 | |
mazgch | 8:a356376db984 | 47 | mdmPwrOn = 1; // PWRON: 1=idle, 0=action |
mazgch | 8:a356376db984 | 48 | mdmEn = 0; // LDOEN: 1=on, 0=off |
dixter1 | 15:971186932592 | 49 | mdmRst = 1; // RESET: 0=reset, 1=operating |
mazgch | 6:e11bf54dd344 | 50 | mdmIsEnabled = false; |
dixter1 | 18:724e52d07c10 | 51 | mdmUseUsb = false; |
mazgch | 6:e11bf54dd344 | 52 | } |
mazgch | 6:e11bf54dd344 | 53 | |
dixter1 | 16:6475e8463afc | 54 | void C027::LeakageTest( void ) |
dixter1 | 16:6475e8463afc | 55 | { |
dixter1 | 16:6475e8463afc | 56 | mdmEn = 0; //disable |
dixter1 | 16:6475e8463afc | 57 | gpsEn = 1; //enable |
dixter1 | 16:6475e8463afc | 58 | mdmLvlOe = 0; //enable |
dixter1 | 16:6475e8463afc | 59 | mdmILvlOe = 1; //enable |
dixter1 | 16:6475e8463afc | 60 | mdmPwrOn = 1; //hi (no meaning this context) |
dixter1 | 16:6475e8463afc | 61 | } |
dixter1 | 16:6475e8463afc | 62 | |
dixter1 | 18:724e52d07c10 | 63 | void C027::mdmPower(bool enable, bool use_mdmuart) |
mazgch | 6:e11bf54dd344 | 64 | { |
mazgch | 7:e3eab86f1de9 | 65 | if (!mdmIsEnabled && enable) // enable modem |
mazgch | 6:e11bf54dd344 | 66 | { |
dixter1 | 18:724e52d07c10 | 67 | mdmUsbDet = ( use_mdmuart? 0:1 ); // USBDET: 0=enable uart, 1=USB Only |
dixter1 | 18:724e52d07c10 | 68 | wait_ms(10); |
mazgch | 8:a356376db984 | 69 | mdmEn = 1; // LDOEN: 0=off -> 1=on |
dixter1 | 15:971186932592 | 70 | wait_ms(50); // RST line will come up as soon as |
dixter1 | 15:971186932592 | 71 | mdmPwrOn = 0; // PWRON: 0=turn on -> 1=idle |
mazgch | 8:a356376db984 | 72 | wait_ms(300); // power on sequence is triggered by keeping reset 50ms-300ms low |
mazgch | 14:e30f90b5447e | 73 | mdmPwrOn = 1; // PWRON: 0=turn on -> 1=idle |
mazgch | 7:e3eab86f1de9 | 74 | mdmIsEnabled = true; |
dixter1 | 16:6475e8463afc | 75 | wait_ms(1000); |
dixter1 | 16:6475e8463afc | 76 | mdmLvlOe = 0; // LVLEN: 0=enabled; |
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 | 7:e3eab86f1de9 | 81 | // initiate power off sequence by setting PwnOn low for >1s |
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 | 8:a356376db984 | 85 | mdmPwrOn = 0; // PWRON: 0=active |
mazgch | 8:a356376db984 | 86 | wait_ms(1000); // send to sleep |
mazgch | 8:a356376db984 | 87 | mdmPwrOn = 1; // PWRON: 0=active -> 1=idle |
mazgch | 7:e3eab86f1de9 | 88 | // now we can savely switch off the ldo |
mazgch | 8:a356376db984 | 89 | mdmRst = 0; // RESET: 1=operating -> 0=reset |
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 | 7:e3eab86f1de9 | 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 | 8:a356376db984 | 130 | // LISA-C200 150ms |
mazgch | 8:a356376db984 | 131 | wait_ms(150); |
mazgch | 8:a356376db984 | 132 | mdmPwrOn = 1; |
mazgch | 6:e11bf54dd344 | 133 | } |
mazgch | 8:a356376db984 | 134 | } |
mazgch | 8:a356376db984 | 135 | |
dixter1 | 15:971186932592 | 136 | // delete this function? |
dixter1 | 15:971186932592 | 137 | // pwr_on signal has no function once modem is powered on. |
mazgch | 8:a356376db984 | 138 | void C027::mdmSleep(void) |
mazgch | 8:a356376db984 | 139 | { |
mazgch | 8:a356376db984 | 140 | if (mdmIsEnabled) |
mazgch | 8:a356376db984 | 141 | { |
mazgch | 8:a356376db984 | 142 | mdmPwrOn = 0; |
mazgch | 8:a356376db984 | 143 | // going to sleep is triggerd by low pulse: |
mazgch | 8:a356376db984 | 144 | // LISA-U200 1000ms |
mazgch | 8:a356376db984 | 145 | // SARA-G350 n/a |
mazgch | 8:a356376db984 | 146 | // LISA-C200 n/a |
mazgch | 8:a356376db984 | 147 | wait_ms(1000); |
mazgch | 8:a356376db984 | 148 | mdmPwrOn = 1; |
mazgch | 8:a356376db984 | 149 | } |
mazgch | 7:e3eab86f1de9 | 150 | } |
mazgch | 7:e3eab86f1de9 | 151 | |
mazgch | 7:e3eab86f1de9 | 152 | void C027::gpsPower(bool enable) |
mazgch | 7:e3eab86f1de9 | 153 | { |
mazgch | 7:e3eab86f1de9 | 154 | if (!gpsIsEnabled && enable) // enable gps |
mazgch | 7:e3eab86f1de9 | 155 | { |
mazgch | 7:e3eab86f1de9 | 156 | gpsRst = 0; // RESET: 0=reset |
mazgch | 7:e3eab86f1de9 | 157 | gpsEn = 1; // LDOEN: 0=off -> 1=on |
mazgch | 7:e3eab86f1de9 | 158 | wait_ms(1); // wait until stable |
mazgch | 7:e3eab86f1de9 | 159 | gpsRst = 1; // RESET: 0=reset -> 1=operating |
mazgch | 7:e3eab86f1de9 | 160 | gpsIsEnabled = true; |
mazgch | 7:e3eab86f1de9 | 161 | // the gps schould be fully ready after 50ms |
mazgch | 13:fb30e9923a7b | 162 | if (mdmIsEnabled) |
mazgch | 13:fb30e9923a7b | 163 | mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c) |
mazgch | 7:e3eab86f1de9 | 164 | } |
mazgch | 7:e3eab86f1de9 | 165 | else if (gpsIsEnabled && !enable) // diasble gps |
mazgch | 7:e3eab86f1de9 | 166 | { |
mazgch | 7:e3eab86f1de9 | 167 | gpsIsEnabled = false; |
mazgch | 13:fb30e9923a7b | 168 | mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) |
mazgch | 13:fb30e9923a7b | 169 | gpsRst = 0; // RESET: 1=operating -> 0=reset |
mazgch | 7:e3eab86f1de9 | 170 | #ifdef C027_REVA |
mazgch | 7:e3eab86f1de9 | 171 | // the gps ldo may have to remain enabled for the level shifters of the modem |
mazgch | 7:e3eab86f1de9 | 172 | if (!mdmIsEnabled) |
mazgch | 13:fb30e9923a7b | 173 | gpsEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 174 | #else |
mazgch | 13:fb30e9923a7b | 175 | gpsEn = 0; // LDOEN: 1=on -> 0=off |
mazgch | 7:e3eab86f1de9 | 176 | #endif |
mazgch | 7:e3eab86f1de9 | 177 | } |
mazgch | 6:e11bf54dd344 | 178 | } |
mazgch | 6:e11bf54dd344 | 179 | |
mazgch | 6:e11bf54dd344 | 180 | void C027::gpsReset(void) |
mazgch | 6:e11bf54dd344 | 181 | { |
mazgch | 6:e11bf54dd344 | 182 | if (gpsIsEnabled) |
mazgch | 6:e11bf54dd344 | 183 | { |
mazgch | 6:e11bf54dd344 | 184 | gpsRst = 0; // RESET: 0=reset,1=operating |
mazgch | 6:e11bf54dd344 | 185 | wait_ms(1); |
mazgch | 6:e11bf54dd344 | 186 | gpsRst = 1; // RESET: 1=operating,0=reset |
mazgch | 6:e11bf54dd344 | 187 | } |
mazgch | 6:e11bf54dd344 | 188 | } |