Initial commit, code based on LPC1224 support and LPC812-MAX CMSIS-DAP interface...
[lpc11u3x] / apps / mbed_lpc1224 / chenillard / main.c
1 /****************************************************************************
2  *   apps/mbed_lpc1224/chenillard/main.c
3  *
4  * LPC1224-mbed firmware for onboard LPC11U35 bridge
5  *
6  * Copyright 2013-2014 Nathael Pajani <nathael.pajani@ed3l.fr>
7  *
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  *************************************************************************** */
25 #include <stdint.h>
26 #include "core/lpc_regs_11u3x.h"
27 #include "core/lpc_core_cm0.h"
28 #include "core/pio.h"
29 #include "core/system.h"
30 #include "core/systick.h"
31 #include "lib/stdio.h"
32 #include "drivers/serial.h"
33 #include "drivers/gpio.h"
34 #include "extdrv/status_led.h"
37 #define MODULE_VERSION    0x02
38 #define MODULE_NAME "LPC1224-mbed"
41 #define SELECTED_FREQ  FREQ_SEL_48MHz
43 /***************************************************************************** */
44 /* Pins configuration */
45 /* pins blocks are passed to set_pins() for pins configuration.
46  * Unused pin blocks can be removed safely with the corresponding set_pins() call
47  * All pins blocks may be safelly merged in a single block for single set_pins() call..
48  */
49 const struct pio_config common_pins[] = {
50         /* UART 0 */
51         { LPC_UART0_RX_PIO_0_18,  LPC_IO_DIGITAL },
52         { LPC_UART0_TX_PIO_0_19,  LPC_IO_DIGITAL },
53         /* USB */
54         { LPC_USB_FTOGGLE_PIO_0_1, LPC_IO_DIGITAL },
55         { LPC_USB_VBUS_PIO_0_3, (LPC_IO_DIGITAL | LPC_IO_MODE_PULL_DOWN) },
56         { LPC_USB_CONNECT_PIO_0_6, LPC_IO_DIGITAL },
57         ARRAY_LAST_PIO,
58 };
60 const struct pio status_led_blue = LPC_GPIO_0_11; /* Serial */
61 const struct pio status_led_red = LPC_GPIO_0_20; /* MSD */
62 const struct pio status_led_green = LPC_GPIO_0_21; /* DAP */
64 const struct pio button_target_reset = LPC_GPIO_0_1; /* ISP button for us */
65 const struct pio button_target_isp = LPC_GPIO_0_17;
67 const struct pio target_swd_swclk = LPC_GPIO_0_7;
68 const struct pio target_swd_swdio = LPC_GPIO_0_8;
72 uint8_t gpio_get_pin_loader_state(void)
73 {
74         uint8_t* gpio_bytes = LPC_GPIO_ALL_BYTES;
75         uint8_t offset = ((button_target_reset.port << 5) + button_target_reset.pin);
76         return gpio_bytes[offset];
77 }
79 /***************************************************************************** */
80 void system_init()
81 {
82         /* Stop the watchdog */
83         stop_watchdog(); /* Do it right now, before it gets a chance to break in */
84         system_brown_out_detection_config(0);
85         system_set_default_power_state();
86         clock_config(SELECTED_FREQ, LPC_SYSCLK_SRC_XTAL_OSC);
87         set_pins(common_pins);
88         gpio_on();
89         status_led_config(&status_led_green, &status_led_red, &status_led_blue);
90         /* System tick timer MUST be configured and running in order to use the sleeping
91          * functions */
92         systick_timer_on(1); /* 1ms */
93         systick_start();
94 }
96 /* Define our fault handler. This one is not mandatory, the dummy fault handler
97  * will be used when it's not overridden here.
98  * Note : The default one does a simple infinite loop. If the watchdog is deactivated
99  * the system will hang.
100  */
101 void fault_info(const char* name, uint32_t len)
103         serial_write(0, name, len);
104         /*FIXME : wait for end of Tx and perform soft reset of the micro-controller ! */
108 volatile uint32_t flag = 0;
109 void stop_leds(uint32_t num)
111         flag = 1;
114 /***************************************************************************** */
115 int main(void) {
116         system_init();
117         uart_on(0, 115200, NULL);
119         set_gpio_callback(stop_leds, 0, &button_target_isp, EDGES_BOTH);
120         set_gpio_callback(stop_leds, 1, &button_target_reset, EDGES_BOTH);
122         while (1) {
123                 status_led(all);
124                 msleep(500);
125                 status_led(none);
126                 msleep(200);
127                 status_led(red_only);
128                 msleep(200);
129                 status_led(green_only);
130                 msleep(200);
131                 status_led(blue_only);
132                 msleep(200);
133                 status_led(red_only);
134                 msleep(200);
135                 status_led(green_only);
136                 msleep(200);
137                 status_led(blue_only);
138                 msleep(200);
139                 status_led(red_on);
140                 msleep(200);
141                 status_led(green_on);
142                 msleep(200);
143                 status_led(blue_on);
144                 msleep(200);
145                 status_led(red_off);
146                 msleep(200);
147                 status_led(green_off);
148                 msleep(200);
149                 status_led(none);
150                 if (flag != 0) {
151                         msleep(2000);
152                         flag = 0;
153                 } else {
154                         msleep(200);
155                 }
156         }
157         return 0;