Board support library for C027 - updated with thread-safe wait()

Fork of C027 by u-blox

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?

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 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 }