Board support library for C027 - updated with thread-safe wait()
Fork of C027 by
C027.cpp
00001 /* Platform source file, for the u-blox C27-C20/U20/G35 00002 * mbed Internet of Things Starter Kit 00003 * http://mbed.org/platforms/u-blox-C027/ 00004 * 00005 */ 00006 00007 #include "C027.h" 00008 00009 #include "mbed.h" 00010 #include "rtos.h" 00011 00012 void mbed_die(void) 00013 { 00014 DigitalOut led(LED); 00015 led = 0; 00016 // Send SOS in Morse Code: // "... --- ... " 00017 const char sos[] = "=.=.=...===.===.===...=.=.=......"; 00018 const int dot = 100; // length of the dot in milliseconds (typical: 50-100 ms) 00019 // lengths of symbols: 00020 // di = dot 00021 // dah = 3 dot 00022 // char space = 3 dot 00023 // word space = 6 dot 00024 for (int i = 0; /* nothing */; i = sos[i+1] ? i+1 : 0) 00025 { 00026 led = (sos[i] == '='); 00027 Thread::wait(dot); 00028 } 00029 } 00030 00031 C027::C027() : 00032 mdmEn(MDMEN), mdmRst(MDMRST), mdmPwrOn(MDMPWRON), // MDM CTRL 00033 mdmLvlOe(MDMLVLOE), mdmILvlOe(MDMILVLOE), mdmUsbDet(MDMUSBDET), // MDM IF 00034 gpsEn(GPSEN), gpsRst(GPSRST) // GPS CTRL 00035 { 00036 DigitalOut led(LED); 00037 DigitalOut mdmRts(MDMRTS); 00038 led = 0; // LED1: 0=off 00039 mdmRts = 0; // RTS: 0=ready to send 00040 // we start with the gps disabled 00041 gpsEn = 0; // LDOEN: 1=on,0=off 00042 gpsRst = 0; // RESET: 0=reset,1=operating 00043 gpsIsEnabled = false; 00044 // we start with the modem disabled 00045 mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) 00046 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) 00047 mdmUsbDet = 0; // USBDET: 0=disabled 00048 mdmPwrOn = 1; // PWRON: 1=idle, 0=action 00049 mdmEn = 0; // LDOEN: 1=on, 0=off 00050 mdmRst = 0; // RESET: 0=reset, 1=operating 00051 mdmIsEnabled = false; 00052 mdmUseUsb = false; 00053 Thread::wait(50); // when USB cable is inserted the interface chip issues 00054 // multiple resets to the target CPU We wait here for a short period to 00055 // prevent those resets from propagating to the modem and other 00056 // components. 00057 } 00058 00059 void C027::mdmPower(bool enable) 00060 { 00061 if (!mdmIsEnabled && enable) // enable modem 00062 { 00063 #ifdef C027_REVA 00064 // we need the gps ldo for the level shifters of the modem 00065 gpsEn = 1; // LDOEN(gps): 0=off -> 1=on 00066 #endif 00067 mdmPwrOn = 0; // PWRON: 0=turn on 00068 mdmEn = 0; // LDOEN: 0=off 00069 mdmRst = 0; // RESET: 0=reset 00070 mdmLvlOe = 1; // LVLEN: 1=disabled 00071 mdmILvlOe = 0; // ILVLEN: 0=disabled 00072 mdmUsbDet = mdmUseUsb ? 1 : 0; // USBDET: 0=disabled, 1=enabled 00073 Thread::wait( 10); // wait until supply switched off 00074 mdmEn = 1; // LDOEN: 0=off -> 1=on 00075 Thread::wait( 10); // wait until supply stable and on 00076 Thread::wait(300); // power on sequence is triggered by keeping reset 50ms-300ms low 00077 mdmRst = 1; // RESET: 0=reset -> 1=operating 00078 Thread::wait(150); // LISA-C requires 150ms low to turn on 00079 mdmPwrOn = 1; // PWRON: 0=turn on -> 1=idle 00080 mdmIsEnabled = true; 00081 // the interfaces of the modem should be fully ready after a certain period 00082 // LISA-U200 5000ms 00083 // SARA-G350 3000ms 00084 // LISA-C200 00085 Thread::wait(1000); 00086 mdmLvlOe = 0; // LVLEN: 0=enabled (uart/gpio) 00087 if (gpsIsEnabled) 00088 mdmILvlOe = 1; // ILVLEN: 1=enabled (i2c) 00089 } 00090 else if (mdmIsEnabled && !enable) // disable modem 00091 { 00092 mdmIsEnabled = false; 00093 // initiate power off sequence by setting PwnOn low for >1s 00094 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) 00095 mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) 00096 mdmUsbDet = 0; // USBDET: 0=disabled 00097 mdmPwrOn = 0; // PWRON: 0=active 00098 Thread::wait(1000); // send to sleep 00099 mdmPwrOn = 1; // PWRON: 0=active -> 1=idle 00100 // now we can savely switch off the ldo 00101 mdmRst = 0; // RESET: 1=operating -> 0=reset 00102 mdmEn = 0; // LDOEN: 1=on -> 0=off 00103 #ifdef C027_REVA 00104 // the gps ldo may no longer be needed level shifters of the modem 00105 // so we switch it off if the gps is not enabled 00106 if (!gpsIsEnabled) 00107 gpsEn = 0; // LDOEN(gps): 1=on -> 0=off 00108 #endif 00109 } 00110 00111 } 00112 00113 void C027::mdmUsbEnable(bool enable) 00114 { 00115 mdmUseUsb = enable; 00116 if (mdmIsEnabled) 00117 mdmUsbDet = mdmUseUsb ? 1 : 0; 00118 } 00119 00120 void C027::mdmReset(void) 00121 { 00122 if (mdmIsEnabled) 00123 { 00124 mdmRst = 0; // RESET: 0=reset 00125 // power on sequence is triggered by reset low 00126 // LISA-U200 50ms 00127 // SARA-G350 50ms 00128 // LISA-C200 300ms 00129 Thread::wait(300); 00130 mdmRst = 1; // RESET: 0=reset -> 1=operating 00131 } 00132 } 00133 00134 void C027::mdmWakeup(void) 00135 { 00136 if (mdmIsEnabled) 00137 { 00138 mdmPwrOn = 0; 00139 // wakeup the device by low pulse: 00140 // LISA-U200 50-80us 00141 // SARA-G350 5ms 00142 // LISA-C200 150ms 00143 Thread::wait(150); 00144 mdmPwrOn = 1; 00145 } 00146 } 00147 00148 void C027::mdmSleep(void) 00149 { 00150 if (mdmIsEnabled) 00151 { 00152 mdmPwrOn = 0; 00153 // going to sleep is triggerd by low pulse: 00154 // LISA-U200 1000ms 00155 // SARA-G350 n/a 00156 // LISA-C200 n/a 00157 Thread::wait(1000); 00158 mdmPwrOn = 1; 00159 } 00160 } 00161 00162 void C027::gpsPower(bool enable) 00163 { 00164 if (!gpsIsEnabled && enable) // enable gps 00165 { 00166 gpsRst = 0; // RESET: 0=reset 00167 gpsEn = 1; // LDOEN: 0=off -> 1=on 00168 Thread::wait(1); // wait until stable 00169 gpsRst = 1; // RESET: 0=reset -> 1=operating 00170 gpsIsEnabled = true; 00171 // the gps schould be fully ready after 50ms 00172 if (mdmIsEnabled) 00173 mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c) 00174 } 00175 else if (gpsIsEnabled && !enable) // diasble gps 00176 { 00177 gpsIsEnabled = false; 00178 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) 00179 gpsRst = 0; // RESET: 1=operating -> 0=reset 00180 #ifdef C027_REVA 00181 // the gps ldo may have to remain enabled for the level shifters of the modem 00182 if (!mdmIsEnabled) 00183 gpsEn = 0; // LDOEN: 1=on -> 0=off 00184 #else 00185 gpsEn = 0; // LDOEN: 1=on -> 0=off 00186 #endif 00187 } 00188 } 00189 00190 void C027::gpsReset(void) 00191 { 00192 if (gpsIsEnabled) 00193 { 00194 gpsRst = 0; // RESET: 0=reset,1=operating 00195 Thread::wait(1); 00196 gpsRst = 1; // RESET: 1=operating,0=reset 00197 } 00198 }
Generated on Tue Jul 26 2022 05:08:19 by 1.7.2