Board support library for C027
Dependents: IoTWorkshopLCD IoTWorkshopBuzzer IoTWorkshopSensors C027_USSDTest ... more
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 #if defined(TARGET_UBLOX_C027) 00007 00008 #include "C027.h" 00009 00010 C027::C027() : 00011 // Modem 00012 mdmEn(MDMEN, 0), // LDO off 00013 mdmRst(MDMRST, 1), // not reset 00014 mdmPwrOn(MDMPWRON, 1), // Power On idle 00015 mdmLvlOe(MDMLVLOE, 1), // GPIO/Serial velel shifters off 00016 mdmILvlOe(MDMILVLOE, 0), // I2C Level shifter off 00017 mdmUsbDet(MDMUSBDET, 0), // USB not used 00018 // GPS 00019 gpsEn(GPSEN, 0), // LDO off 00020 gpsRst(GPSRST, 1) // not reset 00021 { 00022 DigitalOut led(LED, 0); // start with leds off 00023 DigitalOut mdmRts(MDMRTS, 0); // make sure that rts is low 00024 00025 gpsIsEnabled = false; 00026 mdmIsEnabled = false; 00027 mdmUseUsb = false; 00028 } 00029 00030 void C027::mdmPower(bool enable) 00031 { 00032 if (!mdmIsEnabled && enable) // enable modem 00033 { 00034 #ifdef C027_REVA 00035 // we need the gps ldo for the level shifters of the modem 00036 if (!gpsIsEnabled) 00037 gpsEn = 1; // LDOEN(gps): 0=off -> 1=on 00038 #endif 00039 mdmLvlOe = 1; // LVLEN: 1=disabled 00040 mdmILvlOe = 0; // ILVLEN: 0=disabled 00041 // turn on the mode by enabling power with power on pin low and correct USB detect level 00042 mdmUsbDet = mdmUseUsb ? 1 : 0; // USBDET: 0=disabled, 1=enabled 00043 mdmPwrOn = 0; // PWRON: 0=turn on 00044 mdmEn = 1; // LDOEN: 1=on 00045 wait_ms( 1); // wait until supply switched off 00046 // mnake sure reset is also off 00047 mdmRst = 1; // RESET: 0=not reset 00048 wait_ms(300); // power on sequence is triggered by keeping reset 50ms-300ms low 00049 mdmPwrOn = 1; // PWRON: 0=turn on -> 1=idle 00050 mdmIsEnabled = true; 00051 // the interfaces of the modem should be fully ready after a certain period 00052 // LISA-U200 5000ms 00053 // SARA-G350 3000ms 00054 // LISA-C200 00055 wait_ms(1000); 00056 // now we can safely enable the level shifters 00057 mdmLvlOe = 0; // LVLEN: 0=enabled (uart/gpio) 00058 if (gpsIsEnabled) 00059 mdmILvlOe = 1; // ILVLEN: 1=enabled (i2c) 00060 } 00061 else if (mdmIsEnabled && !enable) // disable modem 00062 { 00063 mdmIsEnabled = false; 00064 // diable all level shifters 00065 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) 00066 mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio) 00067 mdmUsbDet = 0; // USBDET: 0=disabled 00068 // initiate power off sequence by setting PwnOn low for >1s 00069 mdmPwrOn = 0; // PWRON: 0=active 00070 wait_ms(1000); // send to sleep 00071 mdmPwrOn = 1; // PWRON: 0=active -> 1=idle 00072 // now we can savely switch off the ldo 00073 mdmEn = 0; // LDOEN: 1=on -> 0=off 00074 #ifdef C027_REVA 00075 // the gps ldo may no longer be needed level shifters of the modem 00076 // so we switch it off if the gps is not enabled 00077 if (!gpsIsEnabled) 00078 gpsEn = 0; // LDOEN(gps): 1=on -> 0=off 00079 #endif 00080 } 00081 00082 } 00083 00084 void C027::mdmUsbEnable(bool enable) 00085 { 00086 mdmUseUsb = enable; 00087 if (mdmIsEnabled) 00088 mdmUsbDet = mdmUseUsb ? 1 : 0; 00089 } 00090 00091 void C027::mdmReset(void) 00092 { 00093 if (mdmIsEnabled) 00094 { 00095 mdmRst = 0; // RESET: 0=reset 00096 // power on sequence is triggered by reset low 00097 // LISA-U200 50ms 00098 // SARA-G350 50ms 00099 // LISA-C200 300ms 00100 wait_ms(300); 00101 mdmRst = 1; // RESET: 0=reset -> 1=operating 00102 } 00103 } 00104 00105 void C027::mdmWakeup(void) 00106 { 00107 if (mdmIsEnabled) 00108 { 00109 mdmPwrOn = 0; 00110 // wakeup the device by low pulse: 00111 // LISA-U200 50-80us 00112 // SARA-G350 5ms 00113 // LISA-C200 300ms 00114 wait_ms(300); 00115 mdmPwrOn = 1; 00116 } 00117 } 00118 00119 void C027::mdmSleep(void) 00120 { 00121 if (mdmIsEnabled) 00122 { 00123 mdmPwrOn = 0; 00124 // going to sleep is triggerd by low pulse: 00125 // LISA-U200 1000ms 00126 // SARA-G350 n/a 00127 // LISA-C200 n/a 00128 wait_ms(1000); 00129 mdmPwrOn = 1; 00130 } 00131 } 00132 00133 void C027::gpsPower(bool enable) 00134 { 00135 if (!gpsIsEnabled && enable) // enable gps 00136 { 00137 // switch on power supply 00138 gpsEn = 1; // LDOEN: 0=off -> 1=on 00139 wait_ms(1); // wait until stable 00140 // make sure we are not in reset 00141 gpsRst = 1; // RESET: 0=reset -> 1=operating 00142 gpsIsEnabled = true; 00143 // the gps schould be fully ready after 50ms 00144 if (mdmIsEnabled) 00145 mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c) 00146 } 00147 else if (gpsIsEnabled && !enable) // diasble gps 00148 { 00149 gpsIsEnabled = false; 00150 mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c) 00151 #ifdef C027_REVA 00152 // the gps ldo may have to remain enabled for the level shifters of the modem 00153 if (!mdmIsEnabled) 00154 gpsEn = 0; // LDOEN: 1=on -> 0=off 00155 #else 00156 gpsEn = 0; // LDOEN: 1=on -> 0=off 00157 #endif 00158 } 00159 } 00160 00161 void C027::gpsReset(void) 00162 { 00163 if (gpsIsEnabled) 00164 { 00165 gpsRst = 0; // RESET: 0=reset,1=operating 00166 wait_ms(1); 00167 gpsRst = 1; // RESET: 1=operating,0=reset 00168 } 00169 } 00170 #endif
Generated on Tue Jul 12 2022 22:40:06 by 1.7.2