Initial commit, code based on LPC1224 support and LPC812-MAX CMSIS-DAP interface...
[lpc11u3x] / include / core / system.h
1 /****************************************************************************
2  *   core/system.h
3  *
4  * All low-level functions for clocks configuration and switch, system
5  *  power-up, reset, and power-down.
6  *
7  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
8  *
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  *************************************************************************** */
25 #ifndef CORE_SYSTEM_H
26 #define CORE_SYSTEM_H
28 #include <stdint.h>
30 #include "core/lpc_regs_11u3x.h"
31 #include "core/lpc_core_cm0.h"
34 /* Error Values, from glibc errno.h and errno-base.h */
35 #define EIO          5 /* Bad one: Input or Output error. */
36 #define E2BIG        7 /* Argument list too long or Data size beyond buffer size */
37 #define EAGAIN      11 /* Device already in use */
38 #define EFAULT      14 /* Address error */
39 #define EBUSY       16 /* Device or ressource Busy */
40 #define ENODEV      19 /* No such device */
41 #define EINVAL      22 /* Invalid argument */
42 #define EBADFD      77 /* Device not initialized */
43 #define EREMOTEIO  121 /* Device did not acknowledge */
45 /* Note on error values for I2C :
46  *  EIO : Bad one: Illegal start or stop, or illegal state in i2c state machine
47  *  EFAULT : address above eeprom size
48  *  EBUSY : Device or ressource Busy or Arbitration lost
49  *  EREMOTEIO : Device did not acknowledge
50  */
52 /***************************************************************************** */
53 /*                       Power up defaults                                     */
54 /***************************************************************************** */
55 /* Change reset power state to our default, removing power from unused
56  * interfaces */
57 void system_set_default_power_state(void);
59 /* Configure all default pin functions for dtplug, even if modules or functions
60  * are not used */
61 void system_set_default_pins(void);
63 /* Stop the watchdog */
64 void stop_watchdog(void);
66 /***************************************************************************** */
67 /*                       Power                                                 */
68 /***************************************************************************** */
69 void enter_deep_sleep(void);
71 /* Power on or off a subsystem */
72 void subsystem_power(uint32_t power_bit, uint32_t on_off);
74 /* Configure the brown-out detection. */
75 void system_brown_out_detection_config(uint32_t level);
77 /***************************************************************************** */
78 /*                      System Clock                                           */
79 /***************************************************************************** */
80 /* A clock frequency is defined as the integer value in MHz divided by 12, shifted
81  * by 3 and or'ed with the value to be programmed in the flash config register for
82  * the flash access time at the given frequency
83  */
84 /* PLL may fail to lock for frenquencies above 60MHz */
85 #define FREQ_SEL_60MHz   ((5 << 3) | 0x02)
86 #define FREQ_SEL_48MHz   ((4 << 3) | 0x02)
87 #define FREQ_SEL_36MHz   ((3 << 3) | 0x01)
88 #define FREQ_SEL_24MHz   ((2 << 3) | 0x01)
89 #define FREQ_SEL_12MHz   ((1 << 3) | 0x00)
90 #define FREQ_SEL_IRC     ((0 << 3) | 0x00)
92 /* Main clock config : set up the system clock
93  * We use requested oscilator as sys_pllclkin if pll is ussed (LPC_CLK_SRC_*)
94  * Note that during PLL lock wait we are running on internal RC
95  *
96  * freq_sel : set to one of the predefined values. See core/system.h
97  * clk_src : set to one of the available sources. Use LPC_SYSCLK_SRC_* defines
98  *           from core/lpc_regs_*.h
99  */
100 void clock_config(uint32_t freq_sel, uint32_t clk_src);
102 /* return current main clock in HZ */
103 uint32_t get_main_clock(void);
105 /* IO config clock */
106 /* To change GPIO config the io config block must be powered on */
107 void io_config_clk_on(void);
108 void io_config_clk_off(void);
110 /* This is mainly a debug feature, but can be used to provide a clock to an
111  * external peripheral */
112 void clkout_on(uint32_t src, uint32_t div);
113 void clkout_off(void);
116 /* Calibrate Internal RC Clock based on the 32-bit timer0 counter
117  *  and an external high precision 1ms interrupt.
118  */
119 void IRC_osc_calibration_init(uint32_t timer_num, uint32_t precision);
120 void IRC_osc_calibration_done(void);
121 /* Move IRC trim value depending on delta.
122  * Return the number of trim cycles without modifications or -1 if no modifications were
123  *   possible (already at maximum trim value)
124  * Return -2 if trimming has not been initiated with a call to IRC_osc_calibration_init()
125  */
126 int IRC_osc_calibration(void);
129 /***************************************************************************** */
130 /* Sleeping functions : these use systick if the systick code is kept. Otherwise
131  *   it will use a decrementing while loop which is (badly) calibrated for a 24MHz
132  *   main clock.
133  */
134 void msleep(uint32_t ms);
135 void usleep(uint32_t us);
138 #endif /* CORE_SYSTEM_H */