Stephen Dickey / C027-REVB

Dependents:   C027_BootTest_revb C027_EthernetSniffTest C027_M3_SerialEcho C027_HelloWorld_revb ... more

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 void mbed_die(void)
00010 {
00011     DigitalOut led(LED);
00012     led = 0;
00013     // Send SOS in Morse Code: // "... --- ...  "
00014     const char sos[] = "=.=.=...===.===.===...=.=.=......"; 
00015     const int  dot = 100; // length of the dot in milliseconds (typical: 50-100 ms)
00016     // lengths of symbols: 
00017     // di         =   dot 
00018     // dah        = 3 dot 
00019     // char space = 3 dot 
00020     // word space = 6 dot 
00021     for (int i = 0; /* nothing */; i = sos[i+1] ? i+1 : 0)
00022     {
00023         led = (sos[i] == '=');
00024         wait_ms(dot);
00025     }
00026 }
00027 
00028 C027::C027():
00029     mdmEn(MDMEN),       mdmRst(MDMRST),         mdmPwrOn(MDMPWRON),   // MDM CTRL
00030     mdmLvlOe(MDMLVLOE), mdmILvlOe(MDMILVLOE),   mdmUsbDet(MDMUSBDET), // MDM IF
00031     gpsEn(GPSEN),       gpsRst(GPSRST)                                // GPS CTRL
00032 {
00033     DigitalOut led(LED);
00034     DigitalOut mdmRts(MDMRTS);
00035     led       = 0;  // LED1:   0=off
00036     mdmRts    = 0;  // RTS:    0=ready to send 
00037     // we start with the gps disabled
00038     gpsEn     = 0;  // LDOEN:  1=on,0=off
00039     gpsRst    = 0;  // RESET:  0=reset,1=operating
00040     gpsIsEnabled = false;
00041     // we start with the modem disabled
00042     mdmLvlOe  = 1;  // LVLEN:  1=disabled (uart/gpio)
00043     mdmILvlOe = 1;  // ILVLEN: 0=disabled (i2c)
00044     mdmUsbDet = 1;  // USBDET: 0=disabled
00045   
00046 
00047     mdmPwrOn  = 1;  // PWRON:  1=idle, 0=action
00048     mdmEn     = 0;  // LDOEN:  1=on, 0=off
00049     mdmRst    = 1;  // RESET:  0=reset, 1=operating
00050     mdmIsEnabled = false;
00051     mdmUseUsb = false;    
00052 
00053     // The USB insertion and removal, and the Reset Button 
00054     // can cause multiple resets to the device.  Wait for
00055     // a period of time for this to settle before proceeding
00056     // with turning on various components on the board.
00057     wait_ms(3000);      
00058 }
00059 
00060 
00061 // this is a test function designed to turn on all hardware that
00062 //   might leak current into the LISA chip, while disabling the 
00063 //   LISA chip itself.  This is intended to be as harsh as possible,
00064 //   and is most relevant to REV B hardware.
00065 void C027::LeakageTest( void )
00066 {
00067     mdmEn = 0;      //disable
00068     gpsEn = 1;      //enable
00069     mdmLvlOe = 0;   //enable
00070     mdmILvlOe = 1;  //enable
00071     mdmPwrOn  = 1;  //hi (no meaning this context)
00072 }
00073 
00074 void C027::mdmPower(bool enable, bool use_mdmuart)
00075 {
00076     if (!mdmIsEnabled && enable) // enable modem
00077     {
00078         mdmUsbDet = ( use_mdmuart? 0:1 ); // USBDET: 0=enable uart, 1=USB Only
00079         wait_ms(10); 
00080         mdmEn     = 1;  // LDOEN:  0=off -> 1=on
00081         wait_ms(50);    //         
00082         mdmPwrOn  = 0;  // PWRON:  0=turn on -> 1=idle
00083         wait_ms(300);   //         power on is triggered by asserting PwrOn
00084         mdmPwrOn  = 1;  // PWRON:  0=turn on -> 1=idle
00085         mdmIsEnabled = true;
00086         wait_ms(1000);
00087         mdmLvlOe  = 0;  // LVLEN:  0=enabled;
00088     }
00089     else if (mdmIsEnabled && !enable) // disable modem
00090     {
00091         mdmIsEnabled = false;
00092         // initiate power off sequence by setting PwnOn low for >1s
00093         mdmILvlOe = 0;  // ILVLEN: 0=disabled (i2c)
00094         mdmLvlOe  = 1;  // LVLEN:  1=disabled (uart/gpio)
00095         mdmUsbDet = 0;  // USBDET: 0=disabled
00096         mdmPwrOn  = 0;  // PWRON:  0=active
00097         wait_ms(1000);  //         send to sleep
00098         mdmPwrOn  = 1;  // PWRON:  0=active -> 1=idle
00099         // now we can savely switch off the ldo
00100         mdmRst    = 0;  // RESET:  1=operating -> 0=reset
00101         mdmEn     = 0;  // LDOEN:  1=on -> 0=off
00102         gpsEn     = 0;  // LDOEN(gps): 1=on -> 0=off
00103     }
00104         
00105 }
00106 
00107 void C027::mdmUsbEnable(bool enable)
00108 {
00109     mdmUseUsb = enable;
00110     if (mdmIsEnabled)
00111         mdmUsbDet = mdmUseUsb ? 1 : 0;
00112 }
00113 
00114 void C027::mdmReset(void)
00115 {
00116     if (mdmIsEnabled)
00117     {
00118         mdmRst   = 0;   // RESET: 0=reset
00119         // power on sequence is triggered by reset low
00120         // LISA-U200   50ms
00121         // SARA-G350   50ms
00122         // LISA-C200  300ms
00123         wait_ms(300);
00124         mdmRst   = 1;   // RESET: 0=reset -> 1=operating
00125     }
00126 }
00127 
00128 void C027::mdmWakeup(void)
00129 {
00130     if (mdmIsEnabled)
00131     {
00132         mdmPwrOn = 0;
00133         // wakeup the device by low pulse: 
00134         // LISA-U200 50-80us
00135         // SARA-G350     5ms
00136         // LISA-C200   150ms 
00137         wait_ms(150);   
00138         mdmPwrOn = 1;
00139     }
00140 }
00141 
00142 // delete this function?  
00143 // pwr_on signal has no function once modem is powered on.
00144 void C027::mdmSleep(void)
00145 {
00146     if (mdmIsEnabled)
00147     {
00148         mdmPwrOn = 0;
00149         // going to sleep is triggerd by low pulse: 
00150         // LISA-U200  1000ms
00151         // SARA-G350     n/a
00152         // LISA-C200     n/a
00153         wait_ms(1000);  
00154         mdmPwrOn = 1;
00155     }
00156 }
00157 
00158 // enable:    enable the gps power
00159 // lisa_gps:  connect GPS to the LISA chip
00160 void C027::gpsPower(bool enable, bool lisa_gps )
00161 {
00162     if (!gpsIsEnabled && enable) // enable gps
00163     {
00164         gpsRst   = 0;   // RESET: 0=reset
00165         gpsEn    = 1;   // LDOEN: 0=off -> 1=on
00166         wait_ms(1);     //        wait until stable
00167         gpsRst   = 1;   // RESET: 0=reset -> 1=operating
00168         gpsIsEnabled = true;
00169         // the gps schould be fully ready after 50ms
00170         if (mdmIsEnabled && lisa_gps ) 
00171         {
00172             mdmILvlOe = 0; // ILVLEN: 0=enabled (i2c)
00173         }
00174         else
00175         {
00176             mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c)        
00177         }
00178     }
00179     else if (gpsIsEnabled && !enable) // diasble gps
00180     {
00181         gpsIsEnabled = false;
00182         mdmILvlOe = 0;   // ILVLEN: 0=disabled (i2c)
00183         gpsRst    = 0;   // RESET: 1=operating -> 0=reset
00184         gpsEn     = 0;   // LDOEN: 1=on -> 0=off 
00185     }
00186 }
00187 
00188 void C027::gpsReset(void)
00189 {
00190     if (gpsIsEnabled)
00191     {
00192         gpsRst   = 0;    // RESET: 0=reset,1=operating
00193         wait_ms(1);
00194         gpsRst   = 1;    // RESET: 1=operating,0=reset
00195     }
00196 }