Fork to support REVB hardware.

Dependents:   C027_BootTest_revb C027_EthernetSniffTest C027_M3_SerialEcho C027_HelloWorld_revb ... more

Fork of C027 by u-blox

C027.cpp

Committer:
dixter1
Date:
2013-12-13
Revision:
21:db7c445289f5
Parent:
20:2ae219d82c0e
Child:
22:2ab87e985526

File content as of revision 21:db7c445289f5:

/*  Platform source file, for the u-blox C27-C20/U20/G35 
*   mbed Internet of Things Starter Kit
*   http://mbed.org/platforms/u-blox-C027/
*   
*/

#include "C027.h"

void mbed_die(void)
{
    DigitalOut led(LED);
    led = 0;
    // Send SOS in Morse Code: // "... --- ...  "
    const char sos[] = "=.=.=...===.===.===...=.=.=......"; 
    const int  dot = 100; // length of the dot in milliseconds (typical: 50-100 ms)
    // lengths of symbols: 
    // di         =   dot 
    // dah        = 3 dot 
    // char space = 3 dot 
    // word space = 6 dot 
    for (int i = 0; /* nothing */; i = sos[i+1] ? i+1 : 0)
    {
        led = (sos[i] == '=');
        wait_ms(dot);
    }
}

C027::C027():
    mdmEn(MDMEN),       mdmRst(MDMRST),         mdmPwrOn(MDMPWRON),   // MDM CTRL
    mdmLvlOe(MDMLVLOE), mdmILvlOe(MDMILVLOE),   mdmUsbDet(MDMUSBDET), // MDM IF
    gpsEn(GPSEN),       gpsRst(GPSRST)                                // GPS CTRL
{
    DigitalOut led(LED);
    DigitalOut mdmRts(MDMRTS);
    led       = 0;  // LED1:   0=off
    mdmRts    = 0;  // RTS:    0=ready to send 
    // we start with the gps disabled
    gpsEn     = 0;  // LDOEN:  1=on,0=off
    gpsRst    = 0;  // RESET:  0=reset,1=operating
    gpsIsEnabled = false;
    // we start with the modem disabled
    mdmLvlOe  = 1;  // LVLEN:  1=disabled (uart/gpio)
    mdmILvlOe = 1;  // ILVLEN: 0=disabled (i2c)
    mdmUsbDet = 1;  // USBDET: 0=disabled
  

    mdmPwrOn  = 1;  // PWRON:  1=idle, 0=action
    mdmEn     = 0;  // LDOEN:  1=on, 0=off
    mdmRst    = 1;  // RESET:  0=reset, 1=operating
    mdmIsEnabled = false;
    mdmUseUsb = false;    

    // The USB insertion and removal, and the Reset Button 
    // can cause multiple resets to the device.  Wait for
    // a period of time for this to settle before proceeding
    // with turning on various components on the board.
    wait_ms(3000);      
}

void C027::LeakageTest( void )
{
    mdmEn = 0;      //disable
    gpsEn = 1;      //enable
    mdmLvlOe = 0;   //enable
    mdmILvlOe = 1;  //enable
    mdmPwrOn  = 1;  //hi (no meaning this context)
}

void C027::mdmPower(bool enable, bool use_mdmuart)
{
    if (!mdmIsEnabled && enable) // enable modem
    {
        mdmUsbDet = ( use_mdmuart? 0:1 ); // USBDET: 0=enable uart, 1=USB Only
        wait_ms(10); 
        mdmEn     = 1;  // LDOEN:  0=off -> 1=on
        wait_ms(50);    //         RST line will come up as soon as 
        mdmPwrOn  = 0;  // PWRON:  0=turn on -> 1=idle
        wait_ms(300);   //         power on sequence is triggered by keeping reset 50ms-300ms low
        mdmPwrOn  = 1;  // PWRON:  0=turn on -> 1=idle
        mdmIsEnabled = true;
        wait_ms(1000);
        mdmLvlOe  = 0;  // LVLEN:  0=enabled;
    }
    else if (mdmIsEnabled && !enable) // disable modem
    {
        mdmIsEnabled = false;
        // initiate power off sequence by setting PwnOn low for >1s
        mdmILvlOe = 0;  // ILVLEN: 0=disabled (i2c)
        mdmLvlOe  = 1;  // LVLEN:  1=disabled (uart/gpio)
        mdmUsbDet = 0;  // USBDET: 0=disabled
        mdmPwrOn  = 0;  // PWRON:  0=active
        wait_ms(1000);  //         send to sleep
        mdmPwrOn  = 1;  // PWRON:  0=active -> 1=idle
        // now we can savely switch off the ldo
        mdmRst    = 0;  // RESET:  1=operating -> 0=reset
        mdmEn     = 0;  // LDOEN:  1=on -> 0=off
        gpsEn     = 0;  // LDOEN(gps): 1=on -> 0=off
    }
        
}

void C027::mdmUsbEnable(bool enable)
{
    mdmUseUsb = enable;
    if (mdmIsEnabled)
        mdmUsbDet = mdmUseUsb ? 1 : 0;
}

void C027::mdmReset(void)
{
    if (mdmIsEnabled)
    {
        mdmRst   = 0;   // RESET: 0=reset
        // power on sequence is triggered by reset low
        // LISA-U200   50ms
        // SARA-G350   50ms
        // LISA-C200  300ms
        wait_ms(300);
        mdmRst   = 1;   // RESET: 0=reset -> 1=operating
    }
}

void C027::mdmWakeup(void)
{
    if (mdmIsEnabled)
    {
        mdmPwrOn = 0;
        // wakeup the device by low pulse: 
        // LISA-U200 50-80us
        // SARA-G350     5ms
        // LISA-C200   150ms 
        wait_ms(150);   
        mdmPwrOn = 1;
    }
}

// delete this function?  
// pwr_on signal has no function once modem is powered on.
void C027::mdmSleep(void)
{
    if (mdmIsEnabled)
    {
        mdmPwrOn = 0;
        // going to sleep is triggerd by low pulse: 
        // LISA-U200  1000ms
        // SARA-G350     n/a
        // LISA-C200     n/a
        wait_ms(1000);  
        mdmPwrOn = 1;
    }
}

// enable:    enable the gps power
// lisa_gps:  connect GPS to the LISA chip
void C027::gpsPower(bool enable, bool lisa_gps )
{
    if (!gpsIsEnabled && enable) // enable gps
    {
        gpsRst   = 0;   // RESET: 0=reset
        gpsEn    = 1;   // LDOEN: 0=off -> 1=on
        wait_ms(1);     //        wait until stable
        gpsRst   = 1;   // RESET: 0=reset -> 1=operating
        gpsIsEnabled = true;
        // the gps schould be fully ready after 50ms
        if (mdmIsEnabled && lisa_gps ) 
        {
            mdmILvlOe = 0; // ILVLEN: 0=enabled (i2c)
        }
        else
        {
            mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c)        
        }
    }
    else if (gpsIsEnabled && !enable) // diasble gps
    {
        gpsIsEnabled = false;
        mdmILvlOe = 0;   // ILVLEN: 0=disabled (i2c)
        gpsRst    = 0;   // RESET: 1=operating -> 0=reset
        gpsEn     = 0;   // LDOEN: 1=on -> 0=off 
    }
}

void C027::gpsReset(void)
{
    if (gpsIsEnabled)
    {
        gpsRst   = 0;    // RESET: 0=reset,1=operating
        wait_ms(1);
        gpsRst   = 1;    // RESET: 1=operating,0=reset
    }
}