Skip to content

Commit f1fa9a0

Browse files
committed
Added support for C027. Small re-factor to LPC1768 to accommodate this.
1 parent 210cead commit f1fa9a0

File tree

15 files changed

+1156
-9
lines changed

15 files changed

+1156
-9
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Supported Microcontrollers
2424
--------------------------
2525
NXP:
2626
* [LPC1768](http://mbed.org/platforms/mbed-LPC1768/) (Cortex-M3)
27+
* [LPC1768](http://mbed.org/platforms/u-blox-C027/) (Cortex-M3)
2728
* [LPC11U24](http://mbed.org/platforms/mbed-LPC11U24/) (Cortex-M0)
2829
* LPC2368 (ARM7TDMI-S)
2930
* LPC810 (Cortex-M0+)

libraries/mbed/common/board.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919

2020
WEAK void mbed_die(void);
2121
WEAK void mbed_die(void) {
22-
#if defined(DEVICE_ERROR_RED)
22+
#if defined(DEVICE_ERROR_RED)
2323
gpio_t led_red; gpio_init(&led_red, LED_RED, PIN_OUTPUT);
2424

25-
#elif defined(DEVICE_ERROR_PATTERN)
25+
#elif (DEVICE_ERROR_PATTERN == 1)
2626
gpio_t led_1; gpio_init(&led_1, LED1, PIN_OUTPUT);
2727
gpio_t led_2; gpio_init(&led_2, LED2, PIN_OUTPUT);
2828
gpio_t led_3; gpio_init(&led_3, LED3, PIN_OUTPUT);
@@ -33,18 +33,18 @@ WEAK void mbed_die(void) {
3333
#if defined(DEVICE_ERROR_RED)
3434
gpio_write(&led_red, 1);
3535

36-
#elif defined(DEVICE_ERROR_PATTERN)
36+
#elif (DEVICE_ERROR_PATTERN == 1)
3737
gpio_write(&led_1, 1);
3838
gpio_write(&led_2, 0);
3939
gpio_write(&led_3, 0);
4040
gpio_write(&led_4, 1);
4141
#endif
4242
wait_ms(150);
4343

44-
#if defined(DEVICE_ERROR_RED)
44+
#if defined(DEVICE_ERROR_RED)
4545
gpio_write(&led_red, 0);
4646

47-
#elif defined(DEVICE_ERROR_PATTERN)
47+
#elif (DEVICE_ERROR_PATTERN == 1)
4848
gpio_write(&led_1, 0);
4949
gpio_write(&led_2, 1);
5050
gpio_write(&led_3, 1);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// List of reserved pins for LPC1114
2+
3+
#ifndef RESERVED_PINS_H
4+
#define RESERVED_PINS_H
5+
6+
#define TARGET_RESERVED_PINS {P0_0, P0_11, P1_0, P1_1, P1_2}
7+
8+
#endif
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
#include "C027.h"
2+
3+
void mbed_die(void)
4+
{
5+
DigitalOut led(LED);
6+
led = 0;
7+
// Send SOS in Morse Code: // "... --- ... "
8+
const char sos[] = "=.=.=...===.===.===...=.=.=......";
9+
const int dot = 100; // length of the dot in milliseconds (typical: 50-100 ms)
10+
// lengths of symbols:
11+
// di = dot
12+
// dah = 3 dot
13+
// char space = 3 dot
14+
// word space = 6 dot
15+
for (int i = 0; /* nothing */; i = sos[i+1] ? i+1 : 0)
16+
{
17+
led = (sos[i] == '=');
18+
wait_ms(dot);
19+
}
20+
}
21+
22+
C027::C027() :
23+
mdmEn(MDMEN), mdmRst(MDMRST), mdmPwrOn(MDMPWRON), // MDM CTRL
24+
mdmLvlOe(MDMLVLOE), mdmILvlOe(MDMILVLOE), mdmUsbDet(MDMUSBDET), // MDM IF
25+
gpsEn(GPSEN), gpsRst(GPSRST) // GPS CTRL
26+
{
27+
DigitalOut led(LED);
28+
DigitalOut mdmRts(MDMRTS);
29+
led = 0; // LED1: 0=off
30+
mdmRts = 0; // RTS: 0=ready to send
31+
// we start with the gps disabled
32+
gpsEn = 0; // LDOEN: 1=on,0=off
33+
gpsRst = 0; // RESET: 0=reset,1=operating
34+
gpsIsEnabled = false;
35+
// we start with the modem disabled
36+
mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio)
37+
mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c)
38+
mdmUsbDet = 0; // USBDET: 0=disabled
39+
mdmPwrOn = 1; // PWRON: 1=idle, 0=action
40+
mdmEn = 0; // LDOEN: 1=on, 0=off
41+
mdmRst = 0; // RESET: 0=reset, 1=operating
42+
mdmIsEnabled = false;
43+
mdmUseUsb = false;
44+
wait_ms(50); // when USB cable is inserted the interface chip issues
45+
// multiple resets to the target CPU We wait here for a short period to
46+
// prevent those resets from propagating to the modem and other
47+
// components.
48+
}
49+
50+
void C027::mdmPower(bool enable)
51+
{
52+
if (!mdmIsEnabled && enable) // enable modem
53+
{
54+
#ifdef C027_REVA
55+
// we need the gps ldo for the level shifters of the modem
56+
gpsEn = 1; // LDOEN(gps): 0=off -> 1=on
57+
#endif
58+
mdmPwrOn = 0; // PWRON: 0=turn on
59+
mdmEn = 0; // LDOEN: 0=off
60+
mdmRst = 0; // RESET: 0=reset
61+
mdmLvlOe = 1; // LVLEN: 1=disabled
62+
mdmILvlOe = 0; // ILVLEN: 0=disabled
63+
mdmUsbDet = mdmUseUsb ? 1 : 0; // USBDET: 0=disabled, 1=enabled
64+
wait_ms( 10); // wait until supply switched off
65+
mdmEn = 1; // LDOEN: 0=off -> 1=on
66+
wait_ms( 10); // wait until supply stable and on
67+
wait_ms(300); // power on sequence is triggered by keeping reset 50ms-300ms low
68+
mdmRst = 1; // RESET: 0=reset -> 1=operating
69+
wait_ms(150); // LISA-C requires 150ms low to turn on
70+
mdmPwrOn = 1; // PWRON: 0=turn on -> 1=idle
71+
mdmIsEnabled = true;
72+
// the interfaces of the modem should be fully ready after a certain period
73+
// LISA-U200 5000ms
74+
// SARA-G350 3000ms
75+
// LISA-C200
76+
wait_ms(1000);
77+
mdmLvlOe = 0; // LVLEN: 0=enabled (uart/gpio)
78+
if (gpsIsEnabled)
79+
mdmILvlOe = 1; // ILVLEN: 1=enabled (i2c)
80+
}
81+
else if (mdmIsEnabled && !enable) // disable modem
82+
{
83+
mdmIsEnabled = false;
84+
// initiate power off sequence by setting PwnOn low for >1s
85+
mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c)
86+
mdmLvlOe = 1; // LVLEN: 1=disabled (uart/gpio)
87+
mdmUsbDet = 0; // USBDET: 0=disabled
88+
mdmPwrOn = 0; // PWRON: 0=active
89+
wait_ms(1000); // send to sleep
90+
mdmPwrOn = 1; // PWRON: 0=active -> 1=idle
91+
// now we can savely switch off the ldo
92+
mdmRst = 0; // RESET: 1=operating -> 0=reset
93+
mdmEn = 0; // LDOEN: 1=on -> 0=off
94+
#ifdef C027_REVA
95+
// the gps ldo may no longer be needed level shifters of the modem
96+
// so we switch it off if the gps is not enabled
97+
if (!gpsIsEnabled)
98+
gpsEn = 0; // LDOEN(gps): 1=on -> 0=off
99+
#endif
100+
}
101+
102+
}
103+
104+
void C027::mdmUsbEnable(bool enable)
105+
{
106+
mdmUseUsb = enable;
107+
if (mdmIsEnabled)
108+
mdmUsbDet = mdmUseUsb ? 1 : 0;
109+
}
110+
111+
void C027::mdmReset(void)
112+
{
113+
if (mdmIsEnabled)
114+
{
115+
mdmRst = 0; // RESET: 0=reset
116+
// power on sequence is triggered by reset low
117+
// LISA-U200 50ms
118+
// SARA-G350 50ms
119+
// LISA-C200 300ms
120+
wait_ms(300);
121+
mdmRst = 1; // RESET: 0=reset -> 1=operating
122+
}
123+
}
124+
125+
void C027::mdmWakeup(void)
126+
{
127+
if (mdmIsEnabled)
128+
{
129+
mdmPwrOn = 0;
130+
// wakeup the device by low pulse:
131+
// LISA-U200 50-80us
132+
// SARA-G350 5ms
133+
// LISA-C200 150ms
134+
wait_ms(150);
135+
mdmPwrOn = 1;
136+
}
137+
}
138+
139+
void C027::mdmSleep(void)
140+
{
141+
if (mdmIsEnabled)
142+
{
143+
mdmPwrOn = 0;
144+
// going to sleep is triggerd by low pulse:
145+
// LISA-U200 1000ms
146+
// SARA-G350 n/a
147+
// LISA-C200 n/a
148+
wait_ms(1000);
149+
mdmPwrOn = 1;
150+
}
151+
}
152+
153+
void C027::gpsPower(bool enable)
154+
{
155+
if (!gpsIsEnabled && enable) // enable gps
156+
{
157+
gpsRst = 0; // RESET: 0=reset
158+
gpsEn = 1; // LDOEN: 0=off -> 1=on
159+
wait_ms(1); // wait until stable
160+
gpsRst = 1; // RESET: 0=reset -> 1=operating
161+
gpsIsEnabled = true;
162+
// the gps schould be fully ready after 50ms
163+
if (mdmIsEnabled)
164+
mdmILvlOe = 1; // ILVLEN: 0=enabled (i2c)
165+
}
166+
else if (gpsIsEnabled && !enable) // diasble gps
167+
{
168+
gpsIsEnabled = false;
169+
mdmILvlOe = 0; // ILVLEN: 0=disabled (i2c)
170+
gpsRst = 0; // RESET: 1=operating -> 0=reset
171+
#ifdef C027_REVA
172+
// the gps ldo may have to remain enabled for the level shifters of the modem
173+
if (!mdmIsEnabled)
174+
gpsEn = 0; // LDOEN: 1=on -> 0=off
175+
#else
176+
gpsEn = 0; // LDOEN: 1=on -> 0=off
177+
#endif
178+
}
179+
}
180+
181+
void C027::gpsReset(void)
182+
{
183+
if (gpsIsEnabled)
184+
{
185+
gpsRst = 0; // RESET: 0=reset,1=operating
186+
wait_ms(1);
187+
gpsRst = 1; // RESET: 1=operating,0=reset
188+
}
189+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* Platform header file, for the u-blox C27-C20/U20/G35
2+
* mbed Internet of Things Starter Kit
3+
* http://mbed.org/platforms/u-blox-C027/
4+
*
5+
*/
6+
7+
#ifndef C027_H
8+
#define C027_H
9+
10+
#include "mbed.h"
11+
12+
// Override the weak mbed die function that flashes the leds.
13+
// We do not have fancy leds that can be flashed on the C027.
14+
void mbed_die(void);
15+
16+
//#define C027_REVA // remove this define for the revision B boards
17+
18+
class C027
19+
{
20+
public:
21+
C027();
22+
23+
void mdmPower(bool enable);
24+
void mdmUsbEnable(bool enable); // enable the USB interface
25+
void mdmReset(void);
26+
void mdmWakeup(void);
27+
void mdmSleep(void);
28+
void gpsPower(bool enable);
29+
void gpsReset(void);
30+
31+
private:
32+
// modem pins
33+
DigitalOut mdmEn;
34+
DigitalOut mdmRst;
35+
DigitalOut mdmPwrOn;
36+
DigitalOut mdmLvlOe;
37+
DigitalOut mdmILvlOe;
38+
DigitalOut mdmUsbDet;
39+
bool mdmIsEnabled;
40+
bool mdmUseUsb;
41+
// gps pins
42+
DigitalOut gpsEn;
43+
DigitalOut gpsRst;
44+
bool gpsIsEnabled;
45+
};
46+
47+
#endif

0 commit comments

Comments
 (0)