Board support library for C027

Dependents:   IoTWorkshopLCD IoTWorkshopBuzzer IoTWorkshopSensors C027_USSDTest ... more

Fork of C027 by u-blox

/media/uploads/ublox/c027_pinout_new.png

Committer:
mazgch
Date:
Sun Nov 10 18:44:53 2013 +0000
Revision:
11:722101675ce4
Parent:
10:bc9e2eb5daa8
Child:
12:31fb5ff9fef5
better blinky in case of errors

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 11:722101675ce4 11 #ifdef C027_REVA
mazgch 11:722101675ce4 12 DigitalOut led(A0);
mazgch 11:722101675ce4 13 #else
mazgch 8:a356376db984 14 DigitalOut led(LED);
mazgch 11:722101675ce4 15 #endif
mazgch 11:722101675ce4 16 led = 0;
mazgch 11:722101675ce4 17 // Send SOS in Morse Code: // "... --- ... "
mazgch 11:722101675ce4 18 const char sos[] = "=.=.=...===.===.===...=.=.=......";
mazgch 11:722101675ce4 19 const int dot = 100; // length of the dot in milliseconds (typical: 50-100 ms)
mazgch 11:722101675ce4 20 // lengths of symbols:
mazgch 11:722101675ce4 21 // di = dot
mazgch 11:722101675ce4 22 // dah = 3 dot
mazgch 11:722101675ce4 23 // char space = 3 dot
mazgch 11:722101675ce4 24 // word space = 6 dot
mazgch 11:722101675ce4 25 for (int i = 0; /* nothing */; i = sos[i+1] ? i+1 : 0)
mazgch 2:b7bd3660ff64 26 {
mazgch 11:722101675ce4 27 led = (sos[i] == '=');
mazgch 11:722101675ce4 28 wait_ms(dot);
mazgch 2:b7bd3660ff64 29 }
mazgch 2:b7bd3660ff64 30 }
mazgch 2:b7bd3660ff64 31
mazgch 6:e11bf54dd344 32 C027::C027() :
mazgch 10:bc9e2eb5daa8 33 mdmEn(MDMEN), mdmRst(MDMRST), mdmPwrOn(MDMPWRON), // MDM CTRL
mazgch 8:a356376db984 34 mdmRts(MDMRTS), mdmLvlOe(MDMLVLOE), mdmUsbDet(MDMUSBDET), // MDM IF
mazgch 8:a356376db984 35 gpsEn(GPSEN), gpsRst(GPSRST) // GPS CTRL
mazgch 6:e11bf54dd344 36 {
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
mazgch 8:a356376db984 42 mdmLvlOe = 1; // LVLEN: 1=disabled
mazgch 8:a356376db984 43 mdmUsbDet = 0; // USBDET: 0=disabled
mazgch 8:a356376db984 44 mdmPwrOn = 1; // PWRON: 1=idle, 0=action
mazgch 8:a356376db984 45 mdmRts = 0; // RTS. 0=ready to send
mazgch 8:a356376db984 46 mdmEn = 0; // LDOEN: 1=on, 0=off
mazgch 8:a356376db984 47 mdmRst = 0; // RESET: 0=reset, 1=operating
mazgch 6:e11bf54dd344 48 mdmIsEnabled = false;
mazgch 6:e11bf54dd344 49 }
mazgch 6:e11bf54dd344 50
mazgch 6:e11bf54dd344 51 void C027::mdmPower(bool enable)
mazgch 6:e11bf54dd344 52 {
mazgch 7:e3eab86f1de9 53 if (!mdmIsEnabled && enable) // enable modem
mazgch 6:e11bf54dd344 54 {
mazgch 7:e3eab86f1de9 55 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 56 // we need the gps ldo for the level shifters of the modem
mazgch 8:a356376db984 57 gpsEn = 1; // LDOEN(gps): 0=off -> 1=on
mazgch 7:e3eab86f1de9 58 #endif
mazgch 8:a356376db984 59 mdmPwrOn = 1; // PWRON: 1=idle
mazgch 8:a356376db984 60 mdmEn = 0; // LDOEN: 0=off
mazgch 8:a356376db984 61 mdmRst = 0; // RESET: 0=reset
mazgch 8:a356376db984 62 mdmLvlOe = 1; // LVLEN: 1=disabled
mazgch 8:a356376db984 63 mdmUsbDet = 0; // USBDET: 0=disabled
mazgch 8:a356376db984 64 wait_ms( 10); // wait until supply switched off
mazgch 8:a356376db984 65 mdmEn = 1; // LDOEN: 0=off -> 1=on
mazgch 8:a356376db984 66 wait_ms( 10); // wait until supply stable and on
mazgch 8:a356376db984 67 wait_ms(300); // power on sequence is triggered by keeping reset 50ms-300ms low
mazgch 8:a356376db984 68 mdmRst = 1; // RESET: 0=reset -> 1=operating
mazgch 8:a356376db984 69 mdmLvlOe = 0; // LVLEN: 0=enabled
mazgch 8:a356376db984 70 mdmUsbDet = 1; // USBDET: 1=enabled
mazgch 7:e3eab86f1de9 71 mdmIsEnabled = true;
mazgch 10:bc9e2eb5daa8 72 // the interfaces of the modem should be fully ready after a certain period
mazgch 10:bc9e2eb5daa8 73 // LISA-U200 5000ms
mazgch 10:bc9e2eb5daa8 74 // SARA-G350 3000ms
mazgch 10:bc9e2eb5daa8 75 // LISA-C200
mazgch 10:bc9e2eb5daa8 76 wait_ms(1000);
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 8:a356376db984 82 mdmLvlOe = 1; // LVLEN: 1=disabled
mazgch 8:a356376db984 83 mdmUsbDet = 0; // USBDET: 0=disabled
mazgch 8:a356376db984 84 mdmPwrOn = 0; // PWRON: 0=active
mazgch 8:a356376db984 85 wait_ms(1000); // send to sleep
mazgch 8:a356376db984 86 mdmPwrOn = 1; // PWRON: 0=active -> 1=idle
mazgch 7:e3eab86f1de9 87 // now we can savely switch off the ldo
mazgch 8:a356376db984 88 mdmRst = 0; // RESET: 1=operating -> 0=reset
mazgch 8:a356376db984 89 mdmEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 90 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 91 // the gps ldo may no longer be needed level shifters of the modem
mazgch 7:e3eab86f1de9 92 // so we switch it off if the gps is not enabled
mazgch 7:e3eab86f1de9 93 if (!gpsIsEnabled)
mazgch 7:e3eab86f1de9 94 gpsEn = 0; // LDOEN(gps): 1=on -> 0=off
mazgch 7:e3eab86f1de9 95 #endif
mazgch 6:e11bf54dd344 96 }
mazgch 6:e11bf54dd344 97 }
mazgch 6:e11bf54dd344 98
mazgch 6:e11bf54dd344 99 void C027::mdmReset(void)
mazgch 6:e11bf54dd344 100 {
mazgch 8:a356376db984 101 if (mdmIsEnabled)
mazgch 8:a356376db984 102 {
mazgch 8:a356376db984 103 mdmRst = 0; // RESET: 0=reset
mazgch 8:a356376db984 104 // power on sequence is triggered by reset low
mazgch 8:a356376db984 105 // LISA-U200 50ms
mazgch 8:a356376db984 106 // SARA-G350 50ms
mazgch 8:a356376db984 107 // LISA-C200 300ms
mazgch 8:a356376db984 108 wait_ms(300);
mazgch 8:a356376db984 109 mdmRst = 1; // RESET: 0=reset -> 1=operating
mazgch 8:a356376db984 110 }
mazgch 8:a356376db984 111 }
mazgch 8:a356376db984 112
mazgch 8:a356376db984 113 void C027::mdmWakeup(void)
mazgch 8:a356376db984 114 {
mazgch 6:e11bf54dd344 115 if (mdmIsEnabled)
mazgch 6:e11bf54dd344 116 {
mazgch 8:a356376db984 117 mdmPwrOn = 0;
mazgch 8:a356376db984 118 // wakeup the device by low pulse:
mazgch 8:a356376db984 119 // LISA-U200 50-80us
mazgch 8:a356376db984 120 // SARA-G350 5ms
mazgch 8:a356376db984 121 // LISA-C200 150ms
mazgch 8:a356376db984 122 wait_ms(150);
mazgch 8:a356376db984 123 mdmPwrOn = 1;
mazgch 6:e11bf54dd344 124 }
mazgch 8:a356376db984 125 }
mazgch 8:a356376db984 126
mazgch 8:a356376db984 127 void C027::mdmSleep(void)
mazgch 8:a356376db984 128 {
mazgch 8:a356376db984 129 if (mdmIsEnabled)
mazgch 8:a356376db984 130 {
mazgch 8:a356376db984 131 mdmPwrOn = 0;
mazgch 8:a356376db984 132 // going to sleep is triggerd by low pulse:
mazgch 8:a356376db984 133 // LISA-U200 1000ms
mazgch 8:a356376db984 134 // SARA-G350 n/a
mazgch 8:a356376db984 135 // LISA-C200 n/a
mazgch 8:a356376db984 136 wait_ms(1000);
mazgch 8:a356376db984 137 mdmPwrOn = 1;
mazgch 8:a356376db984 138 }
mazgch 7:e3eab86f1de9 139 }
mazgch 7:e3eab86f1de9 140
mazgch 7:e3eab86f1de9 141 void C027::gpsPower(bool enable)
mazgch 7:e3eab86f1de9 142 {
mazgch 7:e3eab86f1de9 143 if (!gpsIsEnabled && enable) // enable gps
mazgch 7:e3eab86f1de9 144 {
mazgch 7:e3eab86f1de9 145 gpsRst = 0; // RESET: 0=reset
mazgch 7:e3eab86f1de9 146 gpsEn = 1; // LDOEN: 0=off -> 1=on
mazgch 7:e3eab86f1de9 147 wait_ms(1); // wait until stable
mazgch 7:e3eab86f1de9 148 gpsRst = 1; // RESET: 0=reset -> 1=operating
mazgch 7:e3eab86f1de9 149 gpsIsEnabled = true;
mazgch 7:e3eab86f1de9 150 // the gps schould be fully ready after 50ms
mazgch 7:e3eab86f1de9 151 }
mazgch 7:e3eab86f1de9 152 else if (gpsIsEnabled && !enable) // diasble gps
mazgch 7:e3eab86f1de9 153 {
mazgch 7:e3eab86f1de9 154 gpsIsEnabled = false;
mazgch 7:e3eab86f1de9 155 gpsRst = 0; // RESET: 1=operating -> 0=reset
mazgch 7:e3eab86f1de9 156 #ifdef C027_REVA
mazgch 7:e3eab86f1de9 157 // the gps ldo may have to remain enabled for the level shifters of the modem
mazgch 7:e3eab86f1de9 158 if (!mdmIsEnabled)
mazgch 7:e3eab86f1de9 159 gpsEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 160 #else
mazgch 7:e3eab86f1de9 161 gpsEn = 0; // LDOEN: 1=on -> 0=off
mazgch 7:e3eab86f1de9 162 #endif
mazgch 7:e3eab86f1de9 163 }
mazgch 6:e11bf54dd344 164 }
mazgch 6:e11bf54dd344 165
mazgch 6:e11bf54dd344 166 void C027::gpsReset(void)
mazgch 6:e11bf54dd344 167 {
mazgch 6:e11bf54dd344 168 if (gpsIsEnabled)
mazgch 6:e11bf54dd344 169 {
mazgch 6:e11bf54dd344 170 gpsRst = 0; // RESET: 0=reset,1=operating
mazgch 6:e11bf54dd344 171 wait_ms(1);
mazgch 6:e11bf54dd344 172 gpsRst = 1; // RESET: 1=operating,0=reset
mazgch 6:e11bf54dd344 173 }
mazgch 6:e11bf54dd344 174 }