Fork to support REVB hardware.

Dependents:   C027_BootTest_revb C027_EthernetSniffTest C027_M3_SerialEcho C027_HelloWorld_revb ... more

Fork of C027 by u-blox

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?

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