Board support library for C027 - updated with thread-safe wait()

Fork of C027 by u-blox

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers C027.cpp Source File

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 }