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 20:10:00 2013 +0000
Revision:
19:82c9967207f1
Parent:
16:6475e8463afc
Child:
20:2ae219d82c0e
Delay at boot, after initial setup is complete.  Need to wait for the reset signals on the board to settle, so we don't reset the LISA chip multiple times.

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
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 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
mazgch 8:a356376db984 45 mdmPwrOn = 1; // PWRON: 1=idle, 0=action
mazgch 8:a356376db984 46 mdmEn = 0; // LDOEN: 1=on, 0=off
dixter1 15:971186932592 47 mdmRst = 1; // RESET: 0=reset, 1=operating
mazgch 6:e11bf54dd344 48 mdmIsEnabled = false;
mazgch 14:e30f90b5447e 49 mdmUseUsb = false;
dixter1 19:82c9967207f1 50
dixter1 19:82c9967207f1 51
dixter1 19:82c9967207f1 52 // The USB insertion and removal, and the Reset Button
dixter1 19:82c9967207f1 53 // can cause multiple resets to the device. Wait for
dixter1 19:82c9967207f1 54 // a period of time for this to settle before proceeding
dixter1 19:82c9967207f1 55 // with turning on various components on the board.
dixter1 19:82c9967207f1 56 wait_ms(3000);
mazgch 6:e11bf54dd344 57 }
mazgch 6:e11bf54dd344 58
dixter1 16:6475e8463afc 59 void C027::LeakageTest( void )
dixter1 16:6475e8463afc 60 {
dixter1 16:6475e8463afc 61 mdmEn = 0; //disable
dixter1 16:6475e8463afc 62 gpsEn = 1; //enable
dixter1 16:6475e8463afc 63 mdmLvlOe = 0; //enable
dixter1 16:6475e8463afc 64 mdmILvlOe = 1; //enable
dixter1 16:6475e8463afc 65 mdmPwrOn = 1; //hi (no meaning this context)
dixter1 16:6475e8463afc 66 }
dixter1 16:6475e8463afc 67
mazgch 6:e11bf54dd344 68 void C027::mdmPower(bool enable)
mazgch 6:e11bf54dd344 69 {
mazgch 7:e3eab86f1de9 70 if (!mdmIsEnabled && enable) // enable modem
mazgch 6:e11bf54dd344 71 {
mazgch 8:a356376db984 72 mdmEn = 1; // LDOEN: 0=off -> 1=on
dixter1 15:971186932592 73 wait_ms(50); // RST line will come up as soon as
dixter1 15:971186932592 74 mdmPwrOn = 0; // PWRON: 0=turn on -> 1=idle
mazgch 8:a356376db984 75 wait_ms(300); // power on sequence is triggered by keeping reset 50ms-300ms low
mazgch 14:e30f90b5447e 76 mdmPwrOn = 1; // PWRON: 0=turn on -> 1=idle
mazgch 7:e3eab86f1de9 77 mdmIsEnabled = true;
dixter1 16:6475e8463afc 78 wait_ms(1000);
dixter1 16:6475e8463afc 79 mdmLvlOe = 0; // LVLEN: 0=enabled;
mazgch 7:e3eab86f1de9 80 }
mazgch 7:e3eab86f1de9 81 else if (mdmIsEnabled && !enable) // disable modem
mazgch 7:e3eab86f1de9 82 {
mazgch 7:e3eab86f1de9 83 mdmIsEnabled = false;
mazgch 7:e3eab86f1de9 84 // initiate power off sequence by setting PwnOn low for >1s
mazgch 13:fb30e9923a7b 85 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c)
mazgch 13:fb30e9923a7b 86 mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio)
mazgch 8:a356376db984 87 mdmUsbDet = 0; // USBDET: 0=disabled
mazgch 8:a356376db984 88 mdmPwrOn = 0; // PWRON: 0=active
mazgch 8:a356376db984 89 wait_ms(1000); // send to sleep
mazgch 8:a356376db984 90 mdmPwrOn = 1; // PWRON: 0=active -> 1=idle
mazgch 7:e3eab86f1de9 91 // now we can savely switch off the ldo
mazgch 8:a356376db984 92 mdmRst = 0; // RESET: 1=operating -> 0=reset
mazgch 8:a356376db984 93 mdmEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 94 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 95 // the gps ldo may no longer be needed level shifters of the modem
mazgch 7:e3eab86f1de9 96 // so we switch it off if the gps is not enabled
mazgch 7:e3eab86f1de9 97 if (!gpsIsEnabled)
mazgch 7:e3eab86f1de9 98 gpsEn = 0; // LDOEN(gps): 1=on -> 0=off
mazgch 7:e3eab86f1de9 99 #endif
mazgch 6:e11bf54dd344 100 }
mazgch 13:fb30e9923a7b 101
mazgch 6:e11bf54dd344 102 }
mazgch 6:e11bf54dd344 103
mazgch 14:e30f90b5447e 104 void C027::mdmUsbEnable(bool enable)
mazgch 14:e30f90b5447e 105 {
mazgch 14:e30f90b5447e 106 mdmUseUsb = enable;
mazgch 14:e30f90b5447e 107 if (mdmIsEnabled)
mazgch 14:e30f90b5447e 108 mdmUsbDet = mdmUseUsb ? 1 : 0;
mazgch 14:e30f90b5447e 109 }
mazgch 14:e30f90b5447e 110
mazgch 6:e11bf54dd344 111 void C027::mdmReset(void)
mazgch 6:e11bf54dd344 112 {
mazgch 8:a356376db984 113 if (mdmIsEnabled)
mazgch 8:a356376db984 114 {
mazgch 8:a356376db984 115 mdmRst = 0; // RESET: 0=reset
mazgch 8:a356376db984 116 // power on sequence is triggered by reset low
mazgch 8:a356376db984 117 // LISA-U200 50ms
mazgch 8:a356376db984 118 // SARA-G350 50ms
mazgch 8:a356376db984 119 // LISA-C200 300ms
mazgch 8:a356376db984 120 wait_ms(300);
mazgch 8:a356376db984 121 mdmRst = 1; // RESET: 0=reset -> 1=operating
mazgch 8:a356376db984 122 }
mazgch 8:a356376db984 123 }
mazgch 8:a356376db984 124
mazgch 8:a356376db984 125 void C027::mdmWakeup(void)
mazgch 8:a356376db984 126 {
mazgch 6:e11bf54dd344 127 if (mdmIsEnabled)
mazgch 6:e11bf54dd344 128 {
mazgch 8:a356376db984 129 mdmPwrOn = 0;
mazgch 8:a356376db984 130 // wakeup the device by low pulse:
mazgch 8:a356376db984 131 // LISA-U200 50-80us
mazgch 8:a356376db984 132 // SARA-G350 5ms
mazgch 8:a356376db984 133 // LISA-C200 150ms
mazgch 8:a356376db984 134 wait_ms(150);
mazgch 8:a356376db984 135 mdmPwrOn = 1;
mazgch 6:e11bf54dd344 136 }
mazgch 8:a356376db984 137 }
mazgch 8:a356376db984 138
dixter1 15:971186932592 139 // delete this function?
dixter1 15:971186932592 140 // pwr_on signal has no function once modem is powered on.
mazgch 8:a356376db984 141 void C027::mdmSleep(void)
mazgch 8:a356376db984 142 {
mazgch 8:a356376db984 143 if (mdmIsEnabled)
mazgch 8:a356376db984 144 {
mazgch 8:a356376db984 145 mdmPwrOn = 0;
mazgch 8:a356376db984 146 // going to sleep is triggerd by low pulse:
mazgch 8:a356376db984 147 // LISA-U200 1000ms
mazgch 8:a356376db984 148 // SARA-G350 n/a
mazgch 8:a356376db984 149 // LISA-C200 n/a
mazgch 8:a356376db984 150 wait_ms(1000);
mazgch 8:a356376db984 151 mdmPwrOn = 1;
mazgch 8:a356376db984 152 }
mazgch 7:e3eab86f1de9 153 }
mazgch 7:e3eab86f1de9 154
mazgch 7:e3eab86f1de9 155 void C027::gpsPower(bool enable)
mazgch 7:e3eab86f1de9 156 {
mazgch 7:e3eab86f1de9 157 if (!gpsIsEnabled && enable) // enable gps
mazgch 7:e3eab86f1de9 158 {
mazgch 7:e3eab86f1de9 159 gpsRst = 0; // RESET: 0=reset
mazgch 7:e3eab86f1de9 160 gpsEn = 1; // LDOEN: 0=off -> 1=on
mazgch 7:e3eab86f1de9 161 wait_ms(1); // wait until stable
mazgch 7:e3eab86f1de9 162 gpsRst = 1; // RESET: 0=reset -> 1=operating
mazgch 7:e3eab86f1de9 163 gpsIsEnabled = true;
mazgch 7:e3eab86f1de9 164 // the gps schould be fully ready after 50ms
mazgch 13:fb30e9923a7b 165 if (mdmIsEnabled)
mazgch 13:fb30e9923a7b 166 mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c)
mazgch 7:e3eab86f1de9 167 }
mazgch 7:e3eab86f1de9 168 else if (gpsIsEnabled && !enable) // diasble gps
mazgch 7:e3eab86f1de9 169 {
mazgch 7:e3eab86f1de9 170 gpsIsEnabled = false;
mazgch 13:fb30e9923a7b 171 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c)
mazgch 13:fb30e9923a7b 172 gpsRst = 0; // RESET: 1=operating -> 0=reset
mazgch 7:e3eab86f1de9 173 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 174 // the gps ldo may have to remain enabled for the level shifters of the modem
mazgch 7:e3eab86f1de9 175 if (!mdmIsEnabled)
mazgch 13:fb30e9923a7b 176 gpsEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 177 #else
mazgch 13:fb30e9923a7b 178 gpsEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 179 #endif
mazgch 7:e3eab86f1de9 180 }
mazgch 6:e11bf54dd344 181 }
mazgch 6:e11bf54dd344 182
mazgch 6:e11bf54dd344 183 void C027::gpsReset(void)
mazgch 6:e11bf54dd344 184 {
mazgch 6:e11bf54dd344 185 if (gpsIsEnabled)
mazgch 6:e11bf54dd344 186 {
mazgch 6:e11bf54dd344 187 gpsRst = 0; // RESET: 0=reset,1=operating
mazgch 6:e11bf54dd344 188 wait_ms(1);
mazgch 6:e11bf54dd344 189 gpsRst = 1; // RESET: 1=operating,0=reset
mazgch 6:e11bf54dd344 190 }
mazgch 6:e11bf54dd344 191 }