Initial commit, code based on LPC1224 support and LPC812-MAX CMSIS-DAP interface...
[lpc11u3x] / include / core / lpc_regs_11u3x.h
1 /****************************************************************************
2  *   core/lpc12xx_regs.h
3  *
4  * Cortex-M0 Core Registers definitions
5  *
6  * Copyright 2012 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  *************************************************************************** */
23 #ifndef LPC_REGS_H
24 #define LPC_REGS_H
26 /* Get size_t, and NULL from <stddef.h>.  */
27 #undef __need_malloc_and_calloc
28 #define __need_size_t
29 #define __need_NULL
30 #include <stddef.h>
31 #include <stdint.h>
35 /***************************************************************************** */
36 /*                          Memory Map                                         */
37 /***************************************************************************** */
38 /* Base addresses */
39 #define LPC_FLASH_BASE        (0x00000000UL)
40 #define LPC_RAM_BASE          (0x10000000UL)
41 #define LPC_RAM1_BASE         (0x20000000UL)
42 #define LPC_USB_RAM_BASE      (0x20004000UL)
43 #define LPC_APB0_BASE         (0x40000000UL)
44 #define LPC_APB1_BASE         (0x40080000UL) /* USB in LPC11U3x */
45 #define LPC_AHB_BASE          (0x50000000UL)
47 /* Memory mapping of Cortex-M0 Hardware */
48 #define LPC_SCS_BASE        (0xE000E000UL)         /* System Control Space Base Address */
49 #define LPC_COREDEBUG_BASE  (0xE000EDF0UL)         /* Core Debug Base Address */
50 #define LPC_SYSTICK_BASE    (LPC_SCS_BASE + 0x0010UL)  /* SysTick Base Address */
51 #define LPC_NVIC_BASE       (LPC_SCS_BASE + 0x0100UL)  /* NVIC Base Address */
52 #define LPC_SCB_BASE        (LPC_SCS_BASE + 0x0D00UL)  /* System Control Block Base Address */
54 /* APB0 peripherals */
55 #define LPC_I2C0_BASE          (LPC_APB0_BASE + 0x00000)
56 #define LPC_WDT_BASE           (LPC_APB0_BASE + 0x04000)
57 #define LPC_UART0_BASE         (LPC_APB0_BASE + 0x08000)
58 #define LPC_TIMER0_BASE        (LPC_APB0_BASE + 0x0C000)
59 #define LPC_TIMER1_BASE        (LPC_APB0_BASE + 0x10000)
60 #define LPC_TIMER2_BASE        (LPC_APB0_BASE + 0x14000)
61 #define LPC_TIMER3_BASE        (LPC_APB0_BASE + 0x18000)
62 #define LPC_ADC_BASE           (LPC_APB0_BASE + 0x1C000)
63 #define LPC_PMU_BASE           (LPC_APB0_BASE + 0x38000)
64 #define LPC_FLASH_EEPROM_BASE  (LPC_APB0_BASE + 0x3C000)
65 #define LPC_SSP0_BASE          (LPC_APB0_BASE + 0x40000)
66 #define LPC_IOCON_BASE         (LPC_APB0_BASE + 0x44000)
67 #define LPC_SYSCON_BASE        (LPC_APB0_BASE + 0x48000)
68 #define LPC_GPIO_INTR_BASE     (LPC_APB0_BASE + 0x4C000)
69 #define LPC_SSP1_BASE          (LPC_APB0_BASE + 0x58000)
70 #define LPC_GPIO_GRP0_INT_BASE (LPC_APB0_BASE + 0x5C000)
71 #define LPC_GPIO_GRP1_INT_BASE (LPC_APB0_BASE + 0x60000)
73 /* APB1 peripherals */
74 #define LPC_USB_BASE           (LPC_APB1_BASE + 0x00000)
76 /* AHB peripherals */
77 #define LPC_GPIO_BASE          (LPC_AHB_BASE + 0x00000)
81 /***************************************************************************** */
82 /*                     System Control                                          */
83 /***************************************************************************** */
84 /* System Control (SYSCON) */
85 struct lpc_sys_start_logic_ctrl
86 {
87         volatile uint32_t edge_ctrl;  /* 0x00 : edge control Register 0 (R/W) */
88         volatile uint32_t signal_en;  /* 0x04 : signal enable Register 0 (R/W) */
89         volatile uint32_t reset;      /* 0x08 : reset Register 0  (-/W) */
90         volatile uint32_t status;     /* 0x0C : status Register 0 (R/-) */
91 };
92 struct lpc_sys_control
93 {
94         volatile uint32_t sys_mem_remap;   /* 0x000 System memory remap (R/W) */
95         volatile uint32_t peripheral_reset_ctrl; /* 0x004 Peripheral reset control (R/W) */
96         volatile uint32_t sys_pll_ctrl;    /* 0x008 System PLL control (R/W) */
97         volatile uint32_t sys_pll_status;  /* 0x00C System PLL status (R/ ) */
98         volatile uint32_t usb_pll_ctrl;    /* 0x010 USB PLL control (R/W) */
99         volatile uint32_t usb_pll_status;  /* 0x014 USB PLL status (R/ ) */
100         uint32_t reserved_0[2];
102         volatile uint32_t sys_osc_ctrl;    /* 0x020 : System oscillator control (R/W) */
103         volatile uint32_t WDT_osc_ctrl;    /* 0x024 : Watchdog oscillator control (R/W) */
104         volatile uint32_t IRC_ctrl;        /* 0x028 : IRC control (R/W) */
105         uint32_t reserved_1[1];
106         volatile uint32_t sys_reset_status;    /* 0x030 : System reset status Register (R/ ) */
107         uint32_t reserved_2[3];
108         volatile uint32_t sys_pll_clk_sel;     /* 0x040 : System PLL clock source select (R/W) */
109         volatile uint32_t sys_pll_clk_upd_en;  /* 0x044 : System PLL clock source update enable (R/W) */
110         volatile uint32_t usb_pll_clk_sel;     /* 0x048 : USB PLL clock source select (R/W) */
111         volatile uint32_t usb_pll_clk_upd_en;  /* 0x04C : USB PLL clock source update enable (R/W) */
112         uint32_t reserved_3[8];
114         volatile uint32_t main_clk_sel;     /* 0x070 : Main clock source select (R/W) */
115         volatile uint32_t main_clk_upd_en;  /* 0x074 : Main clock source update enable (R/W) */
116         volatile uint32_t sys_AHB_clk_div;  /* 0x078 : System AHB clock divider (R/W) */
117         uint32_t reserved_4[1];
118         volatile uint32_t sys_AHB_clk_ctrl; /* 0x080 : System AHB clock control (R/W) */
119         uint32_t reserved_5[4];
121         volatile uint32_t ssp0_clk_div;   /* 0x094 : SSP0 clock divider (R/W) */
122         volatile uint32_t uart_clk_div;   /* 0x098 : UART0 clock divider (R/W) */
123         volatile uint32_t ssp1_clk_div;   /* 0x09C : SSP1 clock divider (R/W) */
124         uint32_t reserved_6a[8];
125         volatile uint32_t usb_clk_sel;    /* 0x0C0 : USB clock source select (R/W) */
126         volatile uint32_t usb_clk_upd_en; /* 0x0C4 : USB clock source update enable (R/W) */
127         volatile uint32_t usb_clk_div;    /* 0x0C8 : USB clock source divider (R/W) */
128         uint32_t reserved_6b[5];
130         volatile uint32_t clk_out_src_sel; /* 0x0E0 : CLKOUT clock source select (R/W) */
131         volatile uint32_t clk_out_upd_en;  /* 0x0E4 : CLKOUT clock source update enable (R/W) */
132         volatile uint32_t clk_out_div;     /* 0x0E8 : CLKOUT clock divider (R/W) */
133         uint32_t reserved_7[5];
135         volatile uint32_t por_captured_io_status[2];  /* 0x100 - 0x104 : POR captured PIO status 0 and 1 (R/ ) */
136         uint32_t reserved_8[11];
138         volatile uint32_t IO_config_clk_div[7]; /* 0x134 - 0x14C : Peripheral clocks 6 to 0 for glitch filter */
140         volatile uint32_t BOD_ctrl;      /* 0x150 : BOD control (R/W) */
141         volatile uint32_t sys_tick_cal;  /* 0x154 : System tick counter calibration (R/W) */
142         volatile uint32_t ahb_prio_set;  /* 0x158 : AHB priority setting (-/-) */
143         uint32_t reserved_9[5];
144         volatile uint32_t irq_latency;   /* 0x170 : IRQ delay, alloxs trade-off bw latency and determinism (R/W) */
145         volatile uint32_t int_nmi_cfg;   /* 0x174 : NMI interrupt source configuration control (R/W) */
146         volatile uint32_t gpio_int_sel[8]; /* 0x178 - 0x194 : GPIO Pin Interrupt Select 0 to 8 (R/W) */
147         volatile uint32_t usb_clk_ctrl;    /* 0x198 : USB Clock control (R/W) */
148         volatile uint32_t usb_clk_status;  /* 0x198 : USB Clock status (R/W) */
149         uint32_t reserved_10[24];
151         struct lpc_sys_start_logic_ctrl start_log_strl[2]; /* 0x200 to 0x20C and 0x210 to 0x21C :
152                                                                                                  Start logic 0 and Start logic 1/peripheral interrupts */
153         uint32_t reserved_11[4];
155         volatile uint32_t powerdown_sleep_cfg;  /* 0x230 : Power-down states in Deep-sleep mode (R/W) */
156         volatile uint32_t powerdown_awake_cfg;  /* 0x234 : Power-down states after wake-up (R/W) */
157         volatile uint32_t powerdown_run_cfg;        /* 0x238 : Power-down configuration Register (R/W) */
158         uint32_t reserved_12[110];
159         volatile const uint32_t device_id;  /* 0x3F4 : Device ID (R/ ) */
160 };
162 #define LPC_SYS_CONTROL ((struct lpc_sys_control *) LPC_SYSCON_BASE)
164 /* AHB control bits
165  *   0 (System (cortexM0, syscon, PMU, ...)) is a read only bit (system cannot be disabled)
166  */
167 #define LPC_SYS_ABH_CLK_CTRL_SYSTEM     (1 <<  0) /* Read only */
168 #define LPC_SYS_ABH_CLK_CTRL_ROM        (1 <<  1)
169 #define LPC_SYS_ABH_CLK_CTRL_RAM        (1 <<  2)
170 #define LPC_SYS_ABH_CLK_CTRL_FLASH_REG  (1 <<  3)
171 #define LPC_SYS_ABH_CLK_CTRL_FLASH      (1 <<  4)
172 #define LPC_SYS_ABH_CLK_CTRL_I2C        (1 <<  5)
173 #define LPC_SYS_ABH_CLK_CTRL_GPIO       (1 <<  6)
174 #define LPC_SYS_ABH_CLK_CTRL_CT16B0     (1 <<  7)
175 #define LPC_SYS_ABH_CLK_CTRL_CT16B1     (1 <<  8)
176 #define LPC_SYS_ABH_CLK_CTRL_CT32B0     (1 <<  9)
177 #define LPC_SYS_ABH_CLK_CTRL_CT32B1     (1 << 10)
178 #define LPC_SYS_ABH_CLK_CTRL_SSP0       (1 << 11)
179 #define LPC_SYS_ABH_CLK_CTRL_UART0      (1 << 12)
180 #define LPC_SYS_ABH_CLK_CTRL_ADC        (1 << 13)
181 #define LPC_SYS_ABH_CLK_CTRL_USB        (1 << 14)
182 #define LPC_SYS_ABH_CLK_CTRL_Watchdog   (1 << 15)
183 #define LPC_SYS_ABH_CLK_CTRL_IO_CONFIG  (1 << 16)
184 #define LPC_SYS_ABH_CLK_CTRL_SSP1       (1 << 18)
185 #define LPC_SYS_ABH_CLK_CTRL_PINT       (1 << 19)
186 #define LPC_SYS_ABH_CLK_CTRL_P0INT      (1 << 23)
187 #define LPC_SYS_ABH_CLK_CTRL_P1INT      (1 << 24)
188 #define LPC_SYS_ABH_CLK_CTRL_RAM1       (1 << 26)
189 #define LPC_SYS_ABH_CLK_CTRL_USBRAM     (1 << 27)
190 /* Helper */
191 #define LPC_SYS_ABH_CLK_CTRL_MEM_ALL    0x0000001F
193 #define LPC_SSP0_RESET_N       (1 << 0)
194 #define LPC_I2C_RESET_N        (1 << 1)
195 #define LPC_SSP1_RESET_N       (1 << 2)
197 #define LPC_POWER_DOWN_IRC_OUT      (1 << 0)
198 #define LPC_POWER_DOWN_IRC          (1 << 1)
199 #define LPC_POWER_DOWN_FLASH        (1 << 2)
200 #define LPC_POWER_DOWN_BOD          (1 << 3)
201 #define LPC_POWER_DOWN_ADC          (1 << 4)
202 #define LPC_POWER_DOWN_SYS_OSC      (1 << 5)
203 #define LPC_POWER_DOWN_WDT_OSC      (1 << 6)
204 #define LPC_POWER_DOWN_SYSPLL       (1 << 7)
205 #define LPC_POWER_DOWN_USBPLL       (1 << 8)
206 #define LPC_POWER_DOWN_USB          (1 << 10)
207                              /* write bit 11, 13, 14, 15 always as ones   and   bits 9 and 12 always as zeroes */
208 #define LPC_POWER_DOWN_MASK(x)    (  ((x) | (1 << 11) | (0x07 << 13))   &   ~((1 << 9) | (1 << 12))  )
210 #define LPC_DEEP_SLEEP_CFG_NOWDTLOCK_BOD_ON  0x0000FFF7
211 #define LPC_DEEP_SLEEP_CFG_NOWDTLOCK_BOD_OFF 0x0000FFFF
213 #define LPC_CLKOUT_SRC_IRC_OSC       0x00
214 #define LPC_CLKOUT_SRC_XTAL_OSC      0x01
215 #define LPC_CLKOUT_SRC_WATCHDOG_OSC  0x02
216 #define LPC_CLKOUT_SRC_MAIN_CLK      0x03
218 #define LPC_SYSCLK_SRC_IRC_OSC       0x00
219 #define LPC_SYSCLK_SRC_XTAL_OSC      0x01
220 #define LPC_SYSCLK_SRC_PLL_INPUT     0x01
221 #define LPC_SYSCLK_SRC_WATCHDOG_OSC  0x02
222 #define LPC_SYSCLK_SRC_MAIN_CLK      0x03
223 #define LPC_SYSCLK_SRC_PLL_OUTPUT    0x03
225 #define LPC_USBPLLCLK_SRC_IRC_OSC    0x00
226 #define LPC_USBPLLCLK_SRC_XTAL_OSC   0x01
228 #define LPC_USBCLK_SRC_USB_PLL_OUT   0x00
229 #define LPC_USBCLK_SRC_MAIN_CLK      0x01
232 /***************************************************************************** */
233 /*                  Flash Control                                              */
234 /***************************************************************************** */
235 /* Flash configuration */
236 struct lpc_flash_control
238         uint32_t reserved_0[4];
239         volatile uint32_t flash_cfg; /* 0x028 Flash configuration (R/W) */
240         uint32_t reserved_1[3];
241         /* Flash Memory Signature */
242         volatile uint32_t flash_signature_start;  /* 0x020 : Signature start address (R/W) */
243         volatile uint32_t flash_signature_end;    /* 0x024 : Signature end address (R/W) */
244         uint32_t reserved_2[1];
245         volatile uint32_t flash_signature[4];     /* 0x02C - 0x038 : Signature Words (R/-) */
246         uint32_t reserved_3[24];
247         /* EEPROM Memory Signature */
248         volatile uint32_t eeprom_signature_start;  /* 0x09C : Signature start address (R/W) */
249         volatile uint32_t eeprom_signature_end;    /* 0x0A0 : Signature end address (R/W) */
250         volatile uint32_t eeprom_signature;        /* 0x0A4 : Signature (R/-) */
251         uint32_t reserved_4[975];
252         /* Flash Memory Signature Generation */
253         volatile uint32_t flash_sig_gen_status;    /* 0xFE0 : Flash signature generation status (R/-) */
254         uint32_t reserved_5[1];
255         volatile uint32_t flash_sig_gen_stat_clr;  /* 0xFE8 : Flash signature generation status clear (R/W) */
256 };
257 #define LPC_FLASH_CONTROL ((struct lpc_flash_control *) LPC_FLASH_EEPROM_BASE)
258 #define LPC_FLASH_CFG_MASK   0x03
259 #define LPC_FLASH_CFG_SHIFT  0
263 /***************************************************************************** */
264 /*                     Cortex-M0 NVIC                                          */
265 /***************************************************************************** */
266 /* Cortex-M0 NVIC Registers */
267 struct nvic_regs {
268         volatile uint32_t int_set_enable;  /* 0x000 : Interrupt Set Enable Register (R/W) */
269         uint32_t reserved_0[31];
270         volatile uint32_t int_clear_enable;  /* 0x080 : Interrupt Clear Enable Register (R/W) */
271         uint32_t reserved_1[31];
272         volatile uint32_t int_set_pending;  /* 0x100 : Interrupt Set Pending Register (R/W) */
273         uint32_t reserved_2[31];
274         volatile uint32_t int_clear_pending;  /* 0x180 : Interrupt Clear Pending Register (R/W) */
275         uint32_t reserved_3[31];
276         uint32_t reserved_4[64];
277         volatile uint32_t int_priority[8]; /* 0x3EC : Interrupt Priority Register (R/W) */
278 };
279 #define LPC_NVIC      ((struct nvic_regs *) LPC_NVIC_BASE)        /* NVIC configuration struct */
282 /***************************************************************************** */
283 /*                    Cortex-M0 System Control Block                           */
284 /***************************************************************************** */
285 /* Cortex-M0 System Control Block Registers */
286 struct syst_ctrl_block_regs {
287         volatile const uint32_t cpuid; /* 0x000 : CPU ID Base Register (R/ ) */
288         volatile uint32_t icsr;        /* 0x004 : Interrupt Control State Register (R/W) */
289         uint32_t reserved_0;
290         volatile uint32_t aircr;       /* 0x00C : Application Interrupt / Reset Control Register (R/W) */
291         volatile uint32_t scr;         /* 0x010 : System Control Register (R/W) */
292         volatile uint32_t ccr;         /* 0x014 : Configuration Control Register (R/W) */
293         uint32_t reserved_1;
294         volatile uint32_t shp[2];      /* 0x01C : System Handlers Priority Registers. [0] is reserved_ (R/W) */
295 };
296 #define LPC_SCB       ((struct syst_ctrl_block_regs *) LPC_SCB_BASE) /* SCB configuration struct */
298 /* SCB CPUID Register Definitions */
299 #define SCB_CPUID_IMPLEMENTER      (0xFFUL << 24)     /* SCB CPUID: IMPLEMENTER Mask */
300 #define SCB_CPUID_VARIANT          (0xFUL << 20)      /* SCB CPUID: VARIANT Mask */
301 #define SCB_CPUID_ARCHITECTURE     (0xFUL << 16)      /* SCB CPUID: ARCHITECTURE Mask */
302 #define SCB_CPUID_PARTNO           (0xFFFUL << 4)     /* SCB CPUID: PARTNO Mask */
303 #define SCB_CPUID_REVISION         (0xFUL << 0)       /* SCB CPUID: REVISION Mask */
305 /* SCB Interrupt Control State Register Definitions */
306 #define SCB_ICSR_NMIPENDSET        (1UL << 31)        /* SCB ICSR: NMIPENDSET Mask */
307 #define SCB_ICSR_PENDSVSET         (1UL << 28)        /* SCB ICSR: PENDSVSET Mask */
308 #define SCB_ICSR_PENDSVCLR         (1UL << 27)        /* SCB ICSR: PENDSVCLR Mask */
309 #define SCB_ICSR_PENDSTSET         (1UL << 26)        /* SCB ICSR: PENDSTSET Mask */
310 #define SCB_ICSR_PENDSTCLR         (1UL << 25)        /* SCB ICSR: PENDSTCLR Mask */
311 #define SCB_ICSR_ISRPREEMPT        (1UL << 23)        /* SCB ICSR: ISRPREEMPT Mask */
312 #define SCB_ICSR_ISRPENDING        (1UL << 22)        /* SCB ICSR: ISRPENDING Mask */
313 #define SCB_ICSR_VECTPENDING       (0x1FFUL << 12)    /* SCB ICSR: VECTPENDING Mask */
314 #define SCB_ICSR_VECTACTIVE        (0x1FFUL << 0)     /* SCB ICSR: VECTACTIVE Mask */
316 /* SCB Application Interrupt and Reset Control Register Definitions */
317 #define SCB_AIRCR_VECTKEY_OFFSET   16
318 #define SCB_AIRCR_VECTKEY          (0xFFFFUL << 16)   /* SCB AIRCR: VECTKEY Mask */
319 #define SCB_AIRCR_VECTKEYSTAT      (0xFFFFUL << 16)   /* SCB AIRCR: VECTKEYSTAT Mask */
320 #define SCB_AIRCR_ENDIANESS        (1UL << 15)        /* SCB AIRCR: ENDIANESS Mask */
321 #define SCB_AIRCR_SYSRESETREQ      (1UL << 2)         /* SCB AIRCR: SYSRESETREQ Mask */
322 #define SCB_AIRCR_VECTCLRACTIVE    (1UL << 1)         /* SCB AIRCR: VECTCLRACTIVE Mask */
324 /* SCB System Control Register Definitions */
325 #define SCB_SCR_SEVONPEND          (1UL << 4)         /* SCB SCR: SEVONPEND Mask */
326 #define SCB_SCR_SLEEPDEEP          (1UL << 2)         /* SCB SCR: SLEEPDEEP Mask */
327 #define SCB_SCR_SLEEPONEXIT        (1UL << 1)         /* SCB SCR: SLEEPONEXIT Mask */
329 /* SCB Configuration Control Register Definitions */
330 #define SCB_CCR_STKALIGN           (1UL << 9)         /* SCB CCR: STKALIGN Mask */
331 #define SCB_CCR_UNALIGN_TRP        (1UL << 3)         /* SCB CCR: UNALIGN_TRP Mask */
335 /***************************************************************************** */
336 /*                    Cortex-M0 System Timer                                   */
337 /***************************************************************************** */
338 /* Cortex-M0 System Timer Registers */
339 struct lpc_system_tick {
340         volatile uint32_t control;     /* 0x000 : SysTick Control and Status Register (R/W) */
341         volatile uint32_t reload_val;  /* 0x004 : SysTick Reload Value Register (R/W) */
342         volatile uint32_t value;       /* 0x008 : SysTick Current Value Register (R/W) */
343         volatile const uint32_t calibration;  /* 0x00C : SysTick Calibration Register (R/ ) */
344 };
345 #define LPC_SYSTICK  ((struct lpc_system_tick*) LPC_SYSTICK_BASE) /* SysTick configuration struct */
347 /* SysTick Control / Status Register Definitions */
348 #define LPC_SYSTICK_CTRL_COUNTFLAG  (1UL << 16)   /* SysTick CTRL: COUNTFLAG Mask */
349 #define LPC_SYSTICK_CTRL_CLKSOURCE  (1UL << 2)    /* SysTick CTRL: CLKSOURCE Mask */
350 #define LPC_SYSTICK_CTRL_CLK_MAIN   (1UL << 2)    /* SysTick CTRL: CLKSOURCE is main clock */
351 #define LPC_SYSTICK_CTRL_TICKINT    (1UL << 1)    /* SysTick CTRL: TICKINT Mask */
352 #define LPC_SYSTICK_CTRL_ENABLE     (1UL << 0)    /* SysTick CTRL: ENABLE Mask */
354 /* SysTick Reload Register Definitions */
355 #define LPC_SYSTICK_LOAD_RELOAD     (0xFFFFFFUL)  /* SysTick LOAD: RELOAD Mask */
357 /* SysTick Current Register Definitions */
358 #define LPC_SYSTICK_VAL_CURRENT     (0xFFFFFFUL)  /* SysTick VAL: CURRENT Mask */
360 /* SysTick Calibration Register Definitions */
361 #define LPC_SYSTICK_CALIB_NOREF     (1UL << 31)   /* SysTick CALIB: NOREF Mask */
362 #define LPC_SYSTICK_CALIB_SKEW      (1UL << 30)   /* SysTick CALIB: SKEW Mask */
363 #define LPC_SYSTICK_CALIB_TENMS     (0xFFFFFFUL)  /* SysTick CALIB: TENMS Mask */
368 /***************************************************************************** */
369 /*                     Power Management Unit                                   */
370 /***************************************************************************** */
371 /* Power Management Unit (PMU) */
372 struct lpc_pm_unit
374         volatile uint32_t power_ctrl;  /* 0x000 : Power control Register (R/W) */
375         volatile uint32_t gp_data[4];  /* 0x004 to 0x010 : General purpose Register 0 to 3 (R/W) */
376         volatile uint32_t system_config; /* 0x014 : System configuration register (R/W) */
377                                                         /* (RTC clock control and hysteresis of the WAKEUP pin) */
378 };
379 #define LPC_PMU         ((struct lpc_pm_unit *) LPC_PMU_BASE)
381 /* System config register */
382 #define LPC_WAKEUP_PIN_HYST_MASK    (0x01 << 10)
383 #define LPC_RTC_CLK_SRC_SHIFT       11
384 #define LPC_RTC_CLK_SRC_MASK        (0x0F << LPC_RTC_CLK_SRC_SHIFT)
385 /* See RTC section above for RTC Clock source selection bits */
388 /***************************************************************************** */
389 /*                     IO Control                                              */
390 /***************************************************************************** */
391 /* Pin Connect Block (IOCON) */
392 struct lpc_io_control
394         volatile uint32_t pio0_0;    /* 0x000 : I/O configuration for pin pio0_0 (R/W) */
395         volatile uint32_t pio0_1;    /* 0x004 : I/O configuration for pin pio0_1 (R/W) */
396         volatile uint32_t pio0_2;    /* 0x008 : I/O configuration for pin pio0_2 (R/W) */
397         volatile uint32_t pio0_3;    /* 0x00C : I/O configuration for pin pio0_3 (R/W) */
398         volatile uint32_t pio0_4;    /* 0x010 : I/O configuration for pin pio0_4 (R/W) */
399         volatile uint32_t pio0_5;    /* 0x014 : I/O configuration for pin pio0_5 (R/W) */
400         volatile uint32_t pio0_6;    /* 0x018 : I/O configuration for pin pio0_6 (R/W) */
401         volatile uint32_t pio0_7;    /* 0x01C : I/O configuration for pin pio0_7 (R/W) */
402         volatile uint32_t pio0_8;    /* 0x020 : I/O configuration for pin pio0_8 (R/W) */
403         volatile uint32_t pio0_9;    /* 0x024 : I/O configuration for pin pio0_9 (R/W) */
404         volatile uint32_t pio0_10;   /* 0x028 : I/O configuration for pin SWD0_10 (R/W) */
405         volatile uint32_t pio0_11;   /* 0x02C : I/O configuration for pin pio0_11 (R/W) */
406         volatile uint32_t pio0_12;   /* 0x030 : I/O configuration for pin pio0_12 (R/W) */
407         volatile uint32_t pio0_13;   /* 0x034 : I/O configuration for pin pio0_13 (R/W) */
408         volatile uint32_t pio0_14;   /* 0x038 : I/O configuration for pin pio0_14 (R/W) */
409         volatile uint32_t pio0_15;   /* 0x03C : I/O configuration for pin pio0_15 (R/W) */
410         volatile uint32_t pio0_16;   /* 0x040 : I/O configuration for pin pio0_16 (R/W) */
411         volatile uint32_t pio0_17;   /* 0x044 : I/O configuration for pin pio0_17 (R/W) */
412         volatile uint32_t pio0_18;   /* 0x048 : I/O configuration for pin pio0_18 (R/W) */
413         volatile uint32_t pio0_19;   /* 0x04C : I/O configuration for pin pio0_19 (R/W) */
414         volatile uint32_t pio0_20;   /* 0x050 : I/O configuration for pin pio0_20 (R/W) */
415         volatile uint32_t pio0_21;   /* 0x054 : I/O configuration for pin pio0_21 (R/W) */
416         volatile uint32_t pio0_22;   /* 0x058 : I/O configuration for pin pio0_22 (R/W) */
417         volatile uint32_t pio0_23;   /* 0x05C : I/O configuration for pin pio0_23 (R/W) */
419         volatile uint32_t pio1_0;    /* 0x060 : I/O configuration for pin pio1_0 (R/W) */
420         volatile uint32_t pio1_1;    /* 0x064 : I/O configuration for pin pio1_1 (R/W) */
421         volatile uint32_t pio1_2;    /* 0x068 : I/O configuration for pin pio1_2 (R/W) */
422         volatile uint32_t pio1_3;    /* 0x06C : I/O configuration for pin pio1_3 (R/W) */
423         volatile uint32_t pio1_4;    /* 0x070 : I/O configuration for pin pio1_4 (R/W) */
424         volatile uint32_t pio1_5;    /* 0x074 : I/O configuration for pin pio1_5 (R/W) */
425         volatile uint32_t pio1_6;    /* 0x078 : I/O configuration for pin pio1_6 (R/W) */
426         volatile uint32_t pio1_7;    /* 0x07C : I/O configuration for pin pio0_7 (R/W) */
427         volatile uint32_t pio1_8;    /* 0x080 : I/O configuration for pin pio0_8 (R/W) */
428         volatile uint32_t pio1_9;    /* 0x084 : I/O configuration for pin pio0_9 (R/W) */
429         volatile uint32_t pio1_10;   /* 0x088 : I/O configuration for pin SWD0_10 (R/W) */
430         volatile uint32_t pio1_11;   /* 0x08C : I/O configuration for pin pio0_11 (R/W) */
431         volatile uint32_t pio1_12;   /* 0x090 : I/O configuration for pin pio0_12 (R/W) */
432         volatile uint32_t pio1_13;   /* 0x094 : I/O configuration for pin pio0_13 (R/W) */
433         volatile uint32_t pio1_14;   /* 0x098 : I/O configuration for pin pio0_14 (R/W) */
434         volatile uint32_t pio1_15;   /* 0x09C : I/O configuration for pin pio0_15 (R/W) */
435         volatile uint32_t pio1_16;   /* 0x0A0 : I/O configuration for pin pio0_16 (R/W) */
436         volatile uint32_t pio1_17;   /* 0x0A4 : I/O configuration for pin pio0_17 (R/W) */
437         volatile uint32_t pio1_18;   /* 0x0A8 : I/O configuration for pin pio0_18 (R/W) */
438         volatile uint32_t pio1_19;   /* 0x0AC : I/O configuration for pin pio0_19 (R/W) */
439         volatile uint32_t pio1_20;   /* 0x0B0 : I/O configuration for pin pio0_20 (R/W) */
440         volatile uint32_t pio1_21;   /* 0x0B4 : I/O configuration for pin pio0_21 (R/W) */
441         volatile uint32_t pio1_22;   /* 0x0B8 : I/O configuration for pin pio0_22 (R/W) */
442         volatile uint32_t pio1_23;   /* 0x0BC : I/O configuration for pin pio0_23 (R/W) */
443         volatile uint32_t pio1_24;   /* 0x0C0 : I/O configuration for pin pio0_24 (R/W) */
444         volatile uint32_t pio1_25;   /* 0x0C4 : I/O configuration for pin pio0_25 (R/W) */
445         volatile uint32_t pio1_26;   /* 0x0C8 : I/O configuration for pin pio0_26 (R/W) */
446         volatile uint32_t pio1_27;   /* 0x0CC : I/O configuration for pin pio0_27 (R/W) */
447         volatile uint32_t pio1_28;   /* 0x0D0 : I/O configuration for pin pio0_28 (R/W) */
448         volatile uint32_t pio1_29;   /* 0x0D4 : I/O configuration for pin pio0_29 (R/W) */
449         uint32_t reserved_1[1];
450         volatile uint32_t pio1_31;   /* 0x0DC : I/O configuration for pin pio0_31 (R/W) */
451 };
452 #define LPC_IO_CONTROL  ((struct lpc_io_control *) LPC_IOCON_BASE)
454 /* FIXME : to be completed */
455 #define LPC_IO_FUNC_ALT(x) ((x & 0x07) << 0)
457 #define LPC_IO_MODE_INACTIVE  (0x00 << 3)
458 #define LPC_IO_MODE_PULL_DOWN (0x01 << 3)
459 #define LPC_IO_MODE_PULL_UP   (0x02 << 3)
460 #define LPC_IO_MODE_REPEATER  (0x03 << 3)
462 #define LPC_IO_HISTERESIS_EN  (0x01 << 5)
463 #define LPC_IO_INVERTED  (0x01 << 6)
465 #define LPC_IO_ANALOG    (0x00 << 7)
466 #define LPC_IO_DIGITAL   (0x01 << 7)
468 #define LPC_IO_FILTERING_DISABLE (0x01 << 8)
470 #define LPC_IO_DRIVE_LOWCURENT  (0x00 << 9)
471 #define LPC_IO_DRIVE_HIGHCURENT (0x01 << 9)
473 #define LPC_IO_OPEN_DRAIN_ENABLE (0x01 << 10)
475 #define LPC_IO_SAMPLE_MODE_BYP    (0x00 << 11)
476 #define LPC_FILTER_ONE_CLK    1
477 #define LPC_FILTER_TWO_CLK    2
478 #define LPC_FILTER_THREE_CLK  3
479 #define LPC_IO_SAMPLE_MODE(x)     ((x & 0x03) << 11)
480 #define LPC_IO_SAMPLE_CLK_DIV(x)  ((x & 0x07) << 13)
483 /***************************************************************************** */
484 /*                     General Purpose Input/Output (GPIO)                     */
485 /***************************************************************************** */
486 /* General Purpose Input/Output (GPIO) */
487 struct lpc_gpio
489         volatile uint32_t data_dir;   /* 0x000 : Data direction Register (R/W) */
490         uint32_t reserved_0[31];
491         volatile uint32_t mask;       /* 0x080 : Pin mask, affects in, out, set, clear and toggle */
492         uint32_t reserved_1[31];
493         volatile uint32_t value;      /* 0x100 : Port data Register (R/-) */
494         uint32_t reserved_2[31];
495         volatile uint32_t masked_val; /* 0x180 : Port masked data Register (R/W) */
496         uint32_t reserved_3[31];
497         volatile uint32_t set;        /* 0x200 : Port output set Register (-/W) */
498         uint32_t reserved_4[31];
499         volatile uint32_t clear;      /* 0x280 : Port output clear Register (-/W) */
500         uint32_t reserved_5[31];
501         volatile uint32_t toggle;     /* 0x300 : Port output invert Register (-/W) */
502 };
503 #define LPC_GPIO_0      ((struct lpc_gpio *) (LPC_GPIO_BASE + 0x2000))
504 #define LPC_GPIO_1      ((struct lpc_gpio *) (LPC_GPIO_BASE + 0x2004))
506 #define LPC_GPIO_REGS(x)  ((struct lpc_gpio *) (LPC_GPIO_BASE + 0x2000 + ((x) * 4)))
508 #define GPIO_DIR_IN 0
509 #define GPIO_DIR_OUT 1
511 #define LPC_GPIO_ALL_BYTES  ((uint8_t*) (LPC_GPIO_BASE + 0x0000))
512 #define LPC_GPIO_0_BYTES  ((uint8_t*) (LPC_GPIO_BASE + 0x0000))
513 #define LPC_GPIO_1_BYTES  ((uint8_t*) (LPC_GPIO_BASE + 0x0020))
514 #define LPC_GPIO_ALL_WORDS  ((uint32_t*) (LPC_GPIO_BASE + 0x1000))
515 #define LPC_GPIO_0_WORDS  ((uint32_t*) (LPC_GPIO_BASE + 0x1000))
516 #define LPC_GPIO_1_WORDS  ((uint32_t*) (LPC_GPIO_BASE + 0x1080))
518 /* General Purpose Input/Output (GPIO) : multiple ports access */
519 #define LPC_NB_GPIO_PORTS 2
520 struct lpc_gpio_all
522         volatile uint32_t data_dir[LPC_NB_GPIO_PORTS];   /* 0x000 : Data direction Register (R/W) */
523         uint32_t reserved_0[32 - LPC_NB_GPIO_PORTS];
524         volatile uint32_t mask[LPC_NB_GPIO_PORTS];       /* 0x080 : Pin mask, affects in, out, set, clear and toggle */
525         uint32_t reserved_1[32 - LPC_NB_GPIO_PORTS];
526         volatile uint32_t value[LPC_NB_GPIO_PORTS];      /* 0x100 : Port data Register (R/-) */
527         uint32_t reserved_2[32 - LPC_NB_GPIO_PORTS];
528         volatile uint32_t masked_val[LPC_NB_GPIO_PORTS]; /* 0x180 : Port masked data Register (R/W) */
529         uint32_t reserved_3[32 - LPC_NB_GPIO_PORTS];
530         volatile uint32_t set[LPC_NB_GPIO_PORTS];        /* 0x200 : Port output set Register (-/W) */
531         uint32_t reserved_4[32 - LPC_NB_GPIO_PORTS];
532         volatile uint32_t clear[LPC_NB_GPIO_PORTS];      /* 0x280 : Port output clear Register (-/W) */
533         uint32_t reserved_5[32 - LPC_NB_GPIO_PORTS];
534         volatile uint32_t toggle[LPC_NB_GPIO_PORTS];     /* 0x300 : Port output invert Register (-/W) */
535 };
536 #define LPC_GPIO_ALL     ((struct lpc_gpio_all *) (LPC_GPIO_BASE + 0x2000))
538 /***************************************************************************** */
539 /*                     GPIO Interrupts Control                                 */
540 /***************************************************************************** */
542 struct lpc_gpio_pin_edge_interrupt
544         volatile uint32_t mode;       /* 0x000 : Pin interrupt mode (level/edge) (R/W) */
545         volatile uint32_t rising_enable;       /* 0x004 : Rising edge interrupt enable (R/W) */
546         volatile uint32_t rising_enable_set;   /* 0x008 : Set above reg .... (-/W) */
547         volatile uint32_t rising_enable_clear; /* 0x00C : Clear above reg .... (-/W) */
548         volatile uint32_t falling_enable;        /* 0x010 : Falling edge interrupt enable (R/W) */
549         volatile uint32_t falling_enable_set;    /* 0x014 : Set above reg .... (-/W) */
550         volatile uint32_t falling_enable_clear;  /* 0x018 : Clear above reg .... (-/W) */
551         volatile uint32_t rising_edge_detected;  /* 0x01C : Rising edge detected (R/W) */
552         volatile uint32_t falling_edge_detected; /* 0x020 : Falling edge detected (R/W) */
553         volatile uint32_t status;     /* 0x024 : Int status / clear both edge detection status (R/W) */
554 };
555 #define LPC_GPIO_INT_EDGE      ((struct lpc_gpio_pin_edge_interrupt *) LPC_GPIO_INTR_BASE)
557 struct lpc_gpio_pin_level_interrupt
559         volatile uint32_t mode;       /* 0x000 : Pin interrupt mode (level/edge) (R/W) */
560         volatile uint32_t enable;     /* 0x004 : Level interrupt enable (R/W) */
561         volatile uint32_t enable_set;      /* 0x008 : Set above reg .... (-/W) */
562         volatile uint32_t enable_clear;    /* 0x00C : Clear above reg .... (-/W) */
563         volatile uint32_t active_level;    /* 0x010 : Set active level (R/W) */
564         volatile uint32_t set_active_high; /* 0x014 : Set active level to high (-/W) */
565         volatile uint32_t set_active_low;  /* 0x018 : Set active level to low (-/W) */
566         uint32_t reserved[2];
567         volatile uint32_t status_and_toggle; /* 0x024 : Int status / toggle level (R/W) */
568 };
569 #define LPC_GPIO_INT_LEVEL     ((struct lpc_gpio_pin_level_interrupt *) LPC_GPIO_INTR_BASE)
571 #define LPC_GPIO_INT_MODE_EDGE    0
572 #define LPC_GPIO_INT_MODE_LEVEL   1
574 #define LPC_GPIO_INT(x)  (0x01 << (x & 0x07))
576 struct group_gpio_int
578         volatile uint32_t control;     /* 0x000 : Grouped interrupt control (R/W) */
579         uint32_t reserved_0[7];
580         volatile uint32_t polarity[2]; /* 0x020 - 0x024 : Port 0/1 pins polarity (R/W) */
581         uint32_t reserved_1[6];
582         volatile uint32_t enable[2];   /* 0x040 - 0x044 : Port 0/1 pins interrupt enable (R/W) */
583 };
584 #define LPC_GROUP0_GPIO_INT     ((struct group_gpio_int *) LPC_GPIO_GRP0_INT_BASE)
585 #define LPC_GROUP1_GPIO_INT     ((struct group_gpio_int *) LPC_GPIO_GRP1_INT_BASE)
589 /***************************************************************************** */
590 /*                     Universal Asynchronous Receiver Transmitter             */
591 /***************************************************************************** */
592 /* Universal Asynchronous Receiver Transmitter (UART) */
593 struct lpc_uart_func {
594         volatile uint32_t buffer; /* 0x000 : Transmit / Receiver Buffer Register (R/W) */
595         volatile uint32_t intr_enable; /* 0x004 : Interrupt Enable Register (R/W) */
596         volatile uint32_t intr_pending; /* 0x008 : Interrupt ID Register (R/-) */
597 };
598 struct lpc_uart_ctrl {
599         volatile uint32_t divisor_latch_lsb;  /* 0x000 : Divisor Latch LSB (R/W) */
600         volatile uint32_t divisor_latch_msb;  /* 0x004 : Divisor Latch MSB (R/W) */
601         volatile uint32_t fifo_ctrl;  /* 0x008 : Fifo Control Register (-/W) */
602 };
603 struct lpc_uart
605         union {
606                 struct lpc_uart_func func;
607                 struct lpc_uart_ctrl ctrl;
608         };
609         volatile uint32_t line_ctrl;   /* 0x00C : Line Control Register (R/W) */
610         volatile uint32_t modem_ctrl;  /* 0x010 : Modem control Register (R/W) */
611         volatile const uint32_t line_status;   /* 0x014 : Line Status Register (R/ ) */
612         volatile const uint32_t modem_status;  /* 0x018 : Modem status Register (R/ ) */
613         volatile uint32_t scratch_pad;  /* 0x01C : Scratch Pad Register (R/W) */
614         volatile uint32_t auto_baud_ctrl;  /* 0x020 : Auto-baud Control Register (R/W) */
615         volatile uint32_t irda_ctrl;       /* 0x024 : UART IrDA Control Register (R/W) */
616         volatile uint32_t fractional_div;  /* 0x028 : Fractional Divider Register (R/W) */
617         volatile uint32_t oversampling;    /* 0x02C : Oversampling Register (R/W) */
618         volatile uint32_t transmit_enable; /* 0x030 : Transmit Enable Register (R/W) */
619         uint32_t reserved_1[3];
620         volatile uint32_t half_duplex_en;  /* 0x040 :  Half-duplex Enable Register (R/W) */
621         uint32_t reserved_2;
622         volatile uint32_t smart_card_ctrl;  /* 0x048 : Smart Card Interface Control Register (R/W) */
623         volatile uint32_t RS485_ctrl;       /* 0x04C : RS-485/EIA-485 Control Register (R/W) */
624         volatile uint32_t RS485_addr_match; /* 0x050 : RS-485/EIA-485 address match Register (R/W) */
625         volatile uint32_t RS485_dir_ctrl_delay;  /* 0x054 : RS-485/EIA-485 direction control delay Register (R/W) */
626         volatile uint32_t sync_ctrl;  /* 0x058 : Synchronous Mode Control Register (R/W) */
627 };
628 #define LPC_UART_0        ((struct lpc_uart *) LPC_UART0_BASE)
630 /* Line Control Register */
631 #define LPC_UART_5BIT          (0x00 << 0)
632 #define LPC_UART_6BIT          (0x01 << 0)
633 #define LPC_UART_7BIT          (0x02 << 0)
634 #define LPC_UART_8BIT          (0x03 << 0)
635 #define LPC_UART_1STOP         (0x00 << 2)
636 #define LPC_UART_2STOP         (0x01 << 2)
637 #define LPC_UART_NO_PAR        (0x00 << 3)
638 #define LPC_UART_ODD_PAR      ((0x01 << 3) | (0x00 << 4))
639 #define LPC_UART_EVEN_PAR      ((0x01 << 3) | (0x01 << 4))
640 #define LPC_UART_ENABLE_DLAB   (0x01 << 7)
641 /* FIFO Control Register */
642 #define LPC_UART_FIFO_EN       (0x01 << 0)
643 #define LPC_UART_TX_CLR        (0x01 << 1)
644 #define LPC_UART_RX_CLR        (0x01 << 2)
645 #define LPC_UART_FIFO_TRIG(x)  ((x & 0x03) << 6) /* 1 / 4 / 8 / 14 chars */
646 /* Interrupt Enable Register */
647 #define LPC_UART_RX_INT_EN     (0x01 << 0)
648 #define LPC_UART_TX_INT_EN     (0x01 << 1)
649 #define LPC_UART_RX_STATUS_INT_EN   (0x01 << 2)
650 /* Interrupt status */
651 #define LPC_UART_INT_MASK      (0x7 << 1)
652 #define LPC_UART_INT_MODEM     (0x0 << 1)
653 #define LPC_UART_INT_TX        (0x1 << 1)
654 #define LPC_UART_INT_RX        (0x2 << 1)
655 #define LPC_UART_INT_RX_STATUS (0x3 << 1)
656 #define LPC_UART_INT_TIMEOUT   (0x6 << 1)
657 /* RS485 Control */
658 #define LPC_RS485_ENABLE       (0x1 << 0)
659 #define LPC_RS485_RX_DIS       (0x1 << 1)
660 #define LPC_RS485_AUTO_ADDR_EN (0x1 << 2)
661 #define LPC_RS485_DIR_PIN_RTS  (0x0 << 3)
662 #define LPC_RS485_DIR_PIN_DTR  (0x1 << 3)
663 #define LPC_RS485_AUTO_DIR_EN  (0x1 << 4)
664 #define LPC_RS485_DIR_CTRL_INV (0x1 << 5)
665 /* RS485 */
666 #define LPC_RS485_ADDR(x)  ((x) & 0xFF)
667 #define LPC_RS485_DIR_DELAY(x)  ((x) & 0xFF)
668 /* IrDA */
669 #define LPC_IRDA_PULSEDIV(x)  (((x) & 0x07) << 3)
672 /***************************************************************************** */
673 /*                     Inter-Integrated Circuit                                */
674 /***************************************************************************** */
675 /* Inter-Integrated Circuit (I2C) */
676 struct lpc_i2c
678         volatile uint32_t ctrl_set;      /* 0x000 : I2C Control Set Register (R/W) */
679         volatile const uint32_t status;  /* 0x004 : I2C Status Register (R/-) */
680         volatile uint32_t data;          /* 0x008 : I2C Data Register (R/W) */
681         volatile uint32_t slave_addr_0;  /* 0x00C : I2C Slave Address Register 0 (R/W) */
682         volatile uint32_t clk_duty_high; /* 0x010 : SCL Duty Cycle Register High Half Word (R/W) */
683         volatile uint32_t clk_duty_low;  /* 0x014 : SCL Duty Cycle Register Low Half Word (R/W) */
684         volatile  uint32_t ctrl_clear;   /* 0x018 : I2C Control Clear Register (-/W) */
685         volatile uint32_t monitor_mode_ctrl;  /* 0x01C : Monitor mode control register (R/W) */
686         volatile uint32_t slave_addr_1;  /* 0x020 : I2C Slave Address Register 1 (R/W) */
687         volatile uint32_t slave_addr_2;  /* 0x024 : I2C Slave Address Register 2 (R/W) */
688         volatile uint32_t slave_addr_3;  /* 0x028 : I2C Slave Address Register 3 (R/W) */
689         volatile const uint32_t data_buffer;  /* 0x02C : Data buffer register (-/W) */
690         volatile uint32_t slave_addr_mask[4]; /* 0x030 to 0x03C : I2C Slave address mask register 0 to 3 (R/W) */
691 };
692 #define LPC_I2C0         ((struct lpc_i2c *) LPC_I2C0_BASE)
694 #define I2C_ASSERT_ACK   (0x01 << 2)
695 #define I2C_INTR_FLAG    (0x01 << 3)
696 #define I2C_STOP_FLAG    (0x01 << 4)
697 #define I2C_START_FLAG   (0x01 << 5)
698 #define I2C_ENABLE_FLAG  (0x01 << 6)
701 /***************************************************************************** */
702 /*                     Synchronous Serial Communication                        */
703 /***************************************************************************** */
704 /* Synchronous Serial Communication (SSP) */
705 struct lpc_ssp
707         volatile uint32_t ctrl_0;        /* 0x000 : Control Register 0 (R/W) */
708         volatile uint32_t ctrl_1;        /* 0x004 : Control Register 1 (R/W) */
709         volatile uint32_t data;          /* 0x008 : Data Register (R/W) */
710         volatile const uint32_t status;  /* 0x00C : Status Registe (R/-) */
711         volatile uint32_t clk_prescale;  /* 0x010 : Clock Prescale Register (R/W) */
712         volatile uint32_t int_mask;      /* 0x014 : Interrupt Mask Set and Clear Register (R/W) */
713         volatile uint32_t raw_int_status;     /* 0x018 : Raw Interrupt Status Register (R/-) */
714         volatile uint32_t masked_int_status;  /* 0x01C : Masked Interrupt Status Register (R/-) */
715         volatile uint32_t int_clear;     /* 0x020 : SSPICR Interrupt Clear Register (-/W) */
716 };
717 #define LPC_SSP0        ((struct lpc_ssp *) LPC_SSP0_BASE)
718 #define LPC_SSP1        ((struct lpc_ssp *) LPC_SSP1_BASE)
720 /* SSP Control 0 register */
721 #define LPC_SSP_DATA_WIDTH(x)    (((x) - 1) & 0x0F) /* Use 4 for 4 bits, 5 for 5 bits, .... */
722 #define LPC_SSP_FRAME_SPI        (0x00 << 4)
723 #define LPC_SSP_FRAME_TI         (0x01 << 4)
724 #define LPC_SSP_FRAME_MICROWIRE  (0x02 << 4)
725 #define LPC_SSP_SPI_CLK_LOW      (0x00 << 6)
726 #define LPC_SSP_SPI_CLK_HIGH     (0x01 << 6)
727 #define LPC_SSP_SPI_CLK_FIRST    (0x00 << 7)
728 #define LPC_SSP_SPI_CLK_LAST     (0x01 << 7)
729 #define LPC_SSP_SPI_CLK_RATE_DIV(x) (((x) & 0xFF) << 8)
730 /* SSP Control 1 register */
731 #define LPC_SSP_LOOPBACK_MODE      (0x01 << 0)
732 #define LPC_SSP_ENABLE             (0x01 << 1)
733 #define LPC_SSP_MASTER_MODE        (0x00 << 2)
734 #define LPC_SSP_SLAVE_MODE         (0x01 << 2)
735 #define LPC_SSP_SLAVE_OUT_DISABLE  (0x01 << 3)
737 /* SSP Status register */
738 #define LPC_SSP_ST_TX_EMPTY      (0x01 << 0)
739 #define LPC_SSP_ST_TX_NOT_FULL   (0x01 << 1)
740 #define LPC_SSP_ST_RX_NOT_EMPTY  (0x01 << 2)
741 #define LPC_SSP_ST_RX_FULL       (0x01 << 3)
742 #define LPC_SSP_ST_BUSY          (0x01 << 4)
744 /* SSP Interrupt Mask, Raw, Status, Clear */
745 #define LPC_SSP_INTR_RX_OVERRUN      (0x01 << 0)
746 #define LPC_SSP_INTR_RX_TIMEOUT      (0x01 << 1)
747 #define LPC_SSP_INTR_RX_HALF_FULL    (0x01 << 2)
748 #define LPC_SSP_INTR_TX_HALF_EMPTY   (0x01 << 3)
750 /* SSP DMA Control */
751 #define LPC_SSP_RX_DMA_EN   (0x01 << 0)
752 #define LPC_SSP_TX_DMA_EN   (0x01 << 1)
756 /***************************************************************************** */
757 /*                     Timer                                                   */
758 /***************************************************************************** */
759 /* Timer (TMR) */
760 struct lpc_timer
762         volatile uint32_t int_reg;        /* 0x000 : Interrupt Register (R/W) */
763         volatile uint32_t timer_ctrl;     /* 0x004 : Timer Control Register (R/W) */
764         volatile uint32_t timer_counter;  /* 0x008 : Timer Counter Register (R/W) */
765         volatile uint32_t prescale;       /* 0x00C : Prescale Register (R/W) */
766         volatile uint32_t prescale_counter;  /* 0x010 : Prescale Counter Register (R/W) */
767         volatile uint32_t match_ctrl;     /* 0x014 : Match Control Register (R/W) */
768         volatile uint32_t match_reg[4];    /* 0x018 : Match Register 0 to 3 (R/W) */
769         volatile uint32_t capture_ctrl;   /* 0x028 : Capture Control Register (R/W) */
770         volatile const uint32_t capture_reg[4]; /* 0x02C : Capture Register 0 to 3 (R/ ) */
771         volatile uint32_t external_match; /* 0x03C : External Match Register (R/W) */
772         uint32_t reserved_2[12];
773         volatile uint32_t count_ctrl;     /* 0x070 : Count Control Register (R/W) */
774         volatile uint32_t pwm_ctrl;       /* 0x074 : PWM Control Register (R/W) */
775 };
776 #define LPC_TMR16B0     ((struct lpc_timer *) LPC_TIMER0_BASE)
777 #define LPC_TMR16B1     ((struct lpc_timer *) LPC_TIMER1_BASE)
778 #define LPC_TMR32B0     ((struct lpc_timer *) LPC_TIMER2_BASE)
779 #define LPC_TMR32B1     ((struct lpc_timer *) LPC_TIMER3_BASE)
781 #define LPC_TIMER_COUNTER_ENABLE (1 << 0) /* CEN */
782 #define LPC_TIMER_COUNTER_RESET  (1 << 1) /* CRST */
784 /* Match internal configuration */
785 #define LPC_TIMER_INTERRUPT_ON_MATCH   0x01
786 #define LPC_TIMER_RESET_ON_MATCH       0x02
787 #define LPC_TIMER_STOP_ON_MATCH        0x04
788 #define LPC_TIMER_MATCH_ERASE(x)       (0x07 << ((x) * 3))
789 #define LPC_TIMER_MATCH_SHIFT(x)       ((x) * 3)
790 /* Capture internal configuration */
791 #define LPC_TIMER_CAP_ON_RISING_EDGE   0x01
792 #define LPC_TIMER_CAP_ON_FALLING_EDGE  0x02
793 #define LPC_TIMER_INTERRUPT_ON_CAPTURE 0x04
794 #define LPC_TIMER_CAPTURE_ERASE(x)     (0x07 << ((x) * 3))
795 #define LPC_TIMER_CAPTURE_SHIFT(x)     ((x) * 3)
796 /* Match external configuration */
797 #define LPC_TIMER_NOTHING_ON_MATCH     0x00
798 #define LPC_TIMER_CLEAR_ON_MATCH       0x01
799 #define LPC_TIMER_SET_ON_MATCH         0x02
800 #define LPC_TIMER_TOGGLE_ON_MATCH      0x03
801 #define LPC_TIMER_EXT_MATCH0_SHIFT     4
802 #define LPC_TIMER_EXT_MATCH1_SHIFT     6
803 #define LPC_TIMER_EXT_MATCH2_SHIFT     8
804 #define LPC_TIMER_EXT_MATCH3_SHIFT     10
805 /* Counter */
806 #define LPC_COUNTER_IS_TIMER           0x00
807 #define LPC_COUNTER_INC_ON_RISING      0x01
808 #define LPC_COUNTER_INC_ON_FALLING     0x02
809 #define LPC_COUNTER_INC_ON_BOTH        0x03
810 #define LPC_COUNTER_INC_INPUT_SHIFT    2
811 #define LPC_COUNTER_INC_INPUT(x)       (((x) & 0x03) << LPC_COUNTER_INC_INPUT_SHIFT)
812 #define LPC_COUNTER_CLEAR_ON_EVENT_EN  (0x01 << 4)
813 #define LPC_COUNTER_CLEAR_ON_EVENT_SHIFT  5
814 #define LPC_COUNTER_CLEAR_ON_CHAN0_RISE   0x00
815 #define LPC_COUNTER_CLEAR_ON_CHAN0_FALL   0x01
816 #define LPC_COUNTER_CLEAR_ON_CHAN1_RISE   0x02
817 #define LPC_COUNTER_CLEAR_ON_CHAN1_FALL   0x03
818 #define LPC_COUNTER_CLEAR_ON_CHAN2_RISE   0x04
819 #define LPC_COUNTER_CLEAR_ON_CHAN2_FALL   0x05
820 #define LPC_COUNTER_CLEAR_ON_CHAN3_RISE   0x06
821 #define LPC_COUNTER_CLEAR_ON_CHAN3_FALL   0x07
822 /* PWM */
823 #define LPC_PWM_CHANNEL_ENABLE(x)    (0x01 << (x))
827 /***************************************************************************** */
828 /*                     Watchdog Timer                                          */
829 /***************************************************************************** */
830 /* Watchdog Timer (WDT) */
831 struct lpc_watchdog
833         volatile uint32_t mode;          /* 0x000 : Watchdog mode register (R/W) */
834         volatile uint32_t timer_const;   /* 0x004 : Watchdog timer constant register (R/W) */
835         volatile uint32_t feed_seqence;  /* 0x008 : Watchdog feed sequence register ( /W) */
836         volatile const uint32_t timer_value;  /* 0x00C : Watchdog timer value register (R/ ) */
837         volatile uint32_t clk_src_sel;   /* 0x010 : Wathdog Clock Source Selection Register (R/W) */
838         volatile uint32_t warning_int_compare; /* 0x014 : Watchdog Warning Interrupt compare value. */
839         volatile uint32_t window_compare;      /* 0x018 : Watchdog Window compare value. */
840 };
841 #define LPC_WDT         ((struct lpc_watchdog *) LPC_WDT_BASE)
844 /***************************************************************************** */
845 /*                     Analog-to-Digital Converter                             */
846 /***************************************************************************** */
847 /* Analog-to-Digital Converter (ADC) */
848 struct lpc_adc
850         volatile uint32_t ctrl;         /* 0x000 : A/D Control Register (R/W) */
851         volatile uint32_t global_data;  /* 0x004 : A/D Global Data Register (R/W) */
852         uint32_t reserved_0;
853         volatile uint32_t int_en;  /* 0x00C : A/D Interrupt Enable Register (R/W) */
854         volatile uint32_t data[8]; /* Offset: 0x010-0x02C A/D Channel 0..7 Data Register (R/W) */
855         volatile const uint32_t status; /* 0x030 : A/D Status Register (R/ ) */
856 };
857 #define LPC_ADC         ((struct lpc_adc *) LPC_ADC_BASE)
859 /* ADC Control register bits */
860 #define LPC_ADC_CTRL_MASK  0x0F0FFFFF
861 /* LPC_ADC_CHANNEL_* are also used for interrupt register */
862 #define LPC_ADC_CHANNEL_MASK (0xFF << 0)
863 #define LPC_ADC_CHANNEL(x)  (0x01 << ((x) & 0x07))
864 #define LPC_ADC_BURST     (0x01 << 16)
866 #define LPC_ADC_10BITS  (0x00 << 17)
867 #define LPC_ADC_9BITS   (0x01 << 17)
868 #define LPC_ADC_8BITS   (0x02 << 17)
869 #define LPC_ADC_7BITS   (0x03 << 17)
870 #define LPC_ADC_6BITS   (0x04 << 17)
871 #define LPC_ADC_5BITS   (0x05 << 17)
872 #define LPC_ADC_4BITS   (0x06 << 17)
873 #define LPC_ADC_3BITS   (0x07 << 17)
874 #define LPC_ADC_BITS_MASK  (0x07 << 17)
876 #define LPC_ADC_START_CONV_NOW  (0x01 << 24)
877 enum lpc_adc_start_conv_events {
878         LPC_ADC_START_CONV_EDGE_CT16B0_CAP0 = 2,
879         LPC_ADC_START_CONV_EDGE_CT32B0_CAP0,
880         LPC_ADC_START_CONV_EDGE_CT32B0_MAT0,
881         LPC_ADC_START_CONV_EDGE_CT32B0_MAT1,
882         LPC_ADC_START_CONV_EDGE_CT16B0_MAT0,
883         LPC_ADC_START_CONV_EDGE_CT16B0_MAT1,
884 };
885 #define LPC_ADC_START_CONV_EVENT(x) (((x) & 0x7) << 24)
886 #define LPC_ADC_START_EDGE_FALLING  (0x1 << 27)
887 #define LPC_ADC_START_EDGE_RISING   (0x0 << 27)
888 #define LPC_ADC_START_CONV_MASK (0x07 << 24)
890 /* ADC Data register bits */
891 #define LPC_ADC_RESULT_SHIFT  6
892 #define LPC_ADC_RESULT_MASK   0x3FF
893 #define LPC_ADC_OVERRUN    (0x01 << 30)
894 #define LPC_ADC_CONV_DONE  (0x01 << 31)
896 /* For more readability when selecting a channel number */
897 #define LPC_ADC_NUM(x)    (x)
900 /***************************************************************************** */
901 /*                     USB (Universal Serial Bus)                              */
902 /***************************************************************************** */
903 /* USB Device Controller */
904 struct lpc_usb_device
906     volatile uint32_t dev_cmd_status;     /* 0x000 : USB Device Command and Status register (R/W) */
907     volatile uint32_t info;               /* 0x004 : USb Info register (R/W) */
908     volatile uint32_t ep_list_start;      /* 0x008 : USB EP Command and Status List start address (R/W) */
909     volatile uint32_t data_buff_start;    /* 0x00C : USB Data buffer start address (R/W) */
910     volatile uint32_t link_pm;            /* 0x010 : USB Link Power Management register (R/W) */
911     volatile uint32_t ep_skip;            /* 0x014 : USB Endpoint skip (R/W) */
912     volatile uint32_t ep_in_use;          /* 0x018 : USB Endpoint Buffer in use (R/W) */
913     volatile uint32_t ep_buff_config;     /* 0x01C : USB Endpoint Buffer Configuration register (R/W) */
914     volatile uint32_t intr_status;        /* 0x020 : USB interrupt status register (R/W) */
915     volatile uint32_t intr_enable;        /* 0x024 : USB interrupt enable register (R/W) */
916     volatile uint32_t set_intr_status;    /* 0x028 : USB set interrupt status register (R/W) */
917     volatile uint32_t intr_routing;       /* 0x02C : USB interrupt routing register (R/W) */
918         uint32_t reserved_0;
919     volatile uint32_t ep_toggle;          /* 0x034 : USB Endpoint toggle register (R/W) */
920 };
921 #define LPC_USB         ((struct lpc_usb_device *) LPC_USB_BASE)
926 #endif  /* LPC_REGS_H */