1 /* SPDX-License-Identifier: BSD-3-Clause */
3 /******************************************************************************
5 * Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/
7 ******************************************************************************/
9 #ifndef OPENOCD_LOADERS_FLASH_MSP432_DRIVERLIB_H
10 #define OPENOCD_LOADERS_FLASH_MSP432_DRIVERLIB_H
19 #if defined(__MSP432E4X__)
20 #include "msp432e4x.h"
21 #elif defined(__MSP432P401X__)
22 #include "msp432p401x.h"
23 #elif defined(__MSP432P411X__)
24 #include "msp432p411x.h"
26 #error "Failed to match a device specific include file"
29 /* Structure type to access the System Control Block (SCB). */
31 volatile uint32_t CPUID; /* CPUID Base Register */
32 volatile uint32_t ICSR; /* Interrupt Control and State Register */
33 volatile uint32_t VTOR; /* Vector Table Offset Register */
34 volatile uint32_t AIRCR; /* Application Interrupt and Reset Control */
35 volatile uint32_t SCR; /* System Control Register */
36 volatile uint32_t CCR; /* Configuration Control Register */
37 volatile uint8_t SHP[12U]; /* System Handlers Priority Registers */
38 volatile uint32_t SHCSR; /* System Handler Control and State */
39 volatile uint32_t CFSR; /* Configurable Fault Status Register */
40 volatile uint32_t HFSR; /* HardFault Status Register */
41 volatile uint32_t DFSR; /* Debug Fault Status Register */
42 volatile uint32_t MMFAR; /* MemManage Fault Address Register */
43 volatile uint32_t BFAR; /* BusFault Address Register */
44 volatile uint32_t AFSR; /* Auxiliary Fault Status Register */
45 volatile uint32_t PFR[2U]; /* Processor Feature Register */
46 volatile uint32_t DFR; /* Debug Feature Register */
47 volatile uint32_t ADR; /* Auxiliary Feature Register */
48 volatile uint32_t MMFR[4U]; /* Memory Model Feature Register */
49 volatile uint32_t ISAR[5U]; /* Instruction Set Attributes Register */
50 uint32_t RESERVED0[5U];
51 volatile uint32_t CPACR; /* Coprocessor Access Control Register */
54 /* SCB:SCR register bits */
55 #define SCB_SCR_SLEEPDEEP_POS 2U
56 #define SCB_SCR_SLEEPDEEP_MSK (1UL << SCB_SCR_SLEEPDEEP_POS)
58 /* Memory mapping of Core Hardware */
59 #define SCS_BASE (0xE000E000UL) /* System Control Space Base Address */
60 #define SCB_BASE (SCS_BASE + 0x0D00UL) /* System Control Block Base Address */
61 #define SCB ((struct SCB_Type *)SCB_BASE) /* SCB configuration struct */
63 /* Definitions of standard bits */
64 #define BIT0 (uint16_t)(0x0001)
65 #define BIT1 (uint16_t)(0x0002)
66 #define BIT2 (uint16_t)(0x0004)
67 #define BIT3 (uint16_t)(0x0008)
68 #define BIT4 (uint16_t)(0x0010)
69 #define BIT5 (uint16_t)(0x0020)
70 #define BIT6 (uint16_t)(0x0040)
71 #define BIT7 (uint16_t)(0x0080)
72 #define BIT8 (uint16_t)(0x0100)
73 #define BIT9 (uint16_t)(0x0200)
74 #define BITA (uint16_t)(0x0400)
75 #define BITB (uint16_t)(0x0800)
76 #define BITC (uint16_t)(0x1000)
77 #define BITD (uint16_t)(0x2000)
78 #define BITE (uint16_t)(0x4000)
79 #define BITF (uint16_t)(0x8000)
80 #define BIT(x) ((uint16_t)1 << (x))
82 /* CPU Module prototypes */
83 extern uint32_t cpu_cpsid(void);
84 extern void cpu_wfi(void);
86 /* Clock Signal Module constants */
87 #define CS_DCO_FREQUENCY_3 CS_CTL0_DCORSEL_1
88 #define CS_DCO_FREQUENCY_24 CS_CTL0_DCORSEL_4
90 /* Power Control Module constants */
91 #define PCM_KEY 0x695A0000
92 #define PCM_AM_LDO_VCORE0 0x00
93 #define PCM_AM_LDO_VCORE1 0x01
94 #define PCM_AM_DCDC_VCORE0 0x04
95 #define PCM_AM_DCDC_VCORE1 0x05
96 #define PCM_AM_LF_VCORE0 0x08
97 #define PCM_AM_LF_VCORE1 0x09
98 #define PCM_LPM0_LDO_VCORE0 0x10
99 #define PCM_LPM0_LDO_VCORE1 0x11
100 #define PCM_LPM0_DCDC_VCORE0 0x14
101 #define PCM_LPM0_DCDC_VCORE1 0x15
102 #define PCM_LPM0_LF_VCORE0 0x18
103 #define PCM_LPM0_LF_VCORE1 0x19
104 #define PCM_LPM3 0x20
105 #define PCM_LPM4 0x21
106 #define PCM_LPM35_VCORE0 0xC0
107 #define PCM_LPM45 0xA0
108 #define PCM_VCORE0 0x00
109 #define PCM_VCORE1 0x01
110 #define PCM_VCORELPM3 0x02
111 #define PCM_LDO_MODE 0x00
112 #define PCM_DCDC_MODE 0x01
113 #define PCM_LF_MODE 0x02
115 /* Power Control Module prototypes */
116 extern bool pcm_set_core_voltage_level(uint_fast8_t voltage_level);
117 extern uint8_t pcm_get_core_voltage_level(void);
118 extern bool pcm_set_power_mode(uint_fast8_t power_mode);
119 extern uint8_t pcm_get_power_mode(void);
120 extern bool pcm_set_power_state(uint_fast8_t power_state);
121 extern uint8_t pcm_get_power_state(void);
122 extern bool pcm_shutdown_device(uint32_t shutdown_mode);
123 extern bool pcm_goto_lpm0(void);
124 extern bool pcm_goto_lpm3(void);
125 extern bool pcm_goto_lpm4(void);
127 /* ROM API Function Pointers */
128 #define ROM_API_TABLE ((unsigned long *)0x02000800)
129 #define ROM_FLASH_CTL_TABLE ((unsigned long *)(ROM_API_TABLE[7]))
130 #define ROM_PCM_TABLE ((unsigned long *)(ROM_API_TABLE[13]))
131 #define ROM_WDT_TABLE ((unsigned long *)(ROM_API_TABLE[25]))
132 #define ROM_SYS_CTL_A_TABLE ((unsigned long *)(ROM_API_TABLE[26]))
133 #define ROM_FLASH_CTL_A_TABLE ((unsigned long *)(ROM_API_TABLE[27]))
135 #if defined(__MSP432P401X__)
136 #define ROM_FLASH_CTL_UNPROTECT_SECTOR \
137 ((bool (*)(uint_fast8_t memory_space, \
138 uint32_t sector_mask))ROM_FLASH_CTL_TABLE[4])
140 #if defined(__MSP432P401X__)
141 #define ROM_FLASH_CTL_PROTECT_SECTOR \
142 ((bool (*)(uint_fast8_t memory_space, \
143 uint32_t sector_mask))ROM_FLASH_CTL_TABLE[5])
145 #if defined(__MSP432P401X__)
146 #define ROM_FLASH_CTL_PERFORM_MASS_ERASE \
147 ((bool (*)(void))ROM_FLASH_CTL_TABLE[8])
149 #if defined(__MSP432P401X__)
150 #define ROM_FLASH_CTL_ERASE_SECTOR \
151 ((bool (*)(uint32_t addr))ROM_FLASH_CTL_TABLE[9])
153 #if defined(__MSP432P401X__)
154 #define ROM_FLASH_CTL_PROGRAM_MEMORY \
155 ((bool (*)(void *src, void *dest, uint32_t length))ROM_FLASH_CTL_TABLE[10])
157 #if defined(__MSP432P401X__)
158 #define ROM_FLASH_CTL_SET_WAIT_STATE \
159 ((void (*)(uint32_t bank, uint32_t wait_state))ROM_FLASH_CTL_TABLE[21])
161 #if defined(__MSP432P401X__)
162 #define ROM_FLASH_CTL_GET_WAIT_STATE \
163 ((uint32_t (*)(uint32_t bank))ROM_FLASH_CTL_TABLE[22])
165 #if defined(__MSP432P401X__)
166 #define ROM_PCM_SET_CORE_VOLTAGE_LEVEL \
167 ((bool (*)(uint_fast8_t voltage_level))ROM_PCM_TABLE[0])
169 #if defined(__MSP432P401X__)
170 #define ROM_PCM_GET_CORE_VOLTAGE_LEVEL \
171 ((uint8_t (*)(void))ROM_PCM_TABLE[1])
173 #if defined(__MSP432P401X__)
174 #define ROM_PCM_SET_POWER_STATE \
175 ((bool (*)(uint_fast8_t power_state))ROM_PCM_TABLE[6])
177 #if defined(__MSP432P401X__)
178 #define ROM_PCM_GET_POWER_STATE \
179 ((uint8_t (*)(void))ROM_PCM_TABLE[8])
181 #if defined(__MSP432P401X__) || defined(__MSP432P411X__)
182 #define ROM_WDT_A_HOLD_TIMER \
183 ((void (*)(void))ROM_WDT_TABLE[0])
185 #if defined(__MSP432P411X__)
186 #define ROM_SYS_CTL_A_GET_FLASH_SIZE \
187 ((uint_least32_t (*)(void))ROM_SYS_CTL_A_TABLE[1])
189 #if defined(__MSP432P411X__)
190 #define ROM_SYS_CTL_A_GET_INFO_FLASH_SIZE \
191 ((uint_least32_t (*)(void))ROM_SYS_CTL_A_TABLE[18])
193 #if defined(__MSP432P411X__)
194 #define ROM_FLASH_CTL_A_UNPROTECT_MEMORY \
195 ((bool (*)(uint32_t start_addr, uint32_t end_addr))ROM_FLASH_CTL_A_TABLE[4])
197 #if defined(__MSP432P411X__)
198 #define ROM_FLASH_CTL_A_PROTECT_MEMORY \
199 ((bool (*)(uint32_t start_addr, uint32_t end_addr))ROM_FLASH_CTL_A_TABLE[5])
201 #if defined(__MSP432P411X__)
202 #define ROM_FLASH_CTL_A_PERFORM_MASS_ERASE \
203 ((bool (*)(void))ROM_FLASH_CTL_A_TABLE[8])
205 #if defined(__MSP432P411X__)
206 #define ROM_FLASH_CTL_A_ERASE_SECTOR \
207 ((bool (*)(uint32_t addr))ROM_FLASH_CTL_A_TABLE[9])
209 #if defined(__MSP432P411X__)
210 #define ROM_FLASH_CTL_A_PROGRAM_MEMORY \
211 ((bool (*)(void *src, void *dest, uint32_t length)) \
212 ROM_FLASH_CTL_A_TABLE[10])
214 #if defined(__MSP432P411X__)
215 #define ROM_FLASH_CTL_A_SET_WAIT_STATE \
216 ((void (*)(uint32_t bank, uint32_t wait_state))ROM_FLASH_CTL_A_TABLE[21])
218 #if defined(__MSP432P411X__)
219 #define ROM_FLASH_CTL_A_GET_WAIT_STATE \
220 ((uint32_t (*)(uint32_t bank))ROM_FLASH_CTL_A_TABLE[22])
223 /* Map API functions to ROM or locally built functions */
224 #ifdef ROM_FLASH_CTL_UNPROTECT_SECTOR
225 #define MAP_FLASH_CTL_UNPROTECT_SECTOR ROM_FLASH_CTL_UNPROTECT_SECTOR
227 #define MAP_FLASH_CTL_UNPROTECT_SECTOR flash_ctl_unprotect_sector
229 #ifdef ROM_FLASH_CTL_PROTECT_SECTOR
230 #define MAP_FLASH_CTL_PROTECT_SECTOR ROM_FLASH_CTL_PROTECT_SECTOR
232 #define MAP_FLASH_CTL_PROTECT_SECTOR flash_ctl_protect_sector
234 #ifdef ROM_FLASH_CTL_PERFORM_MASS_ERASE
235 #define MAP_FLASH_CTL_PERFORM_MASS_ERASE ROM_FLASH_CTL_PERFORM_MASS_ERASE
237 #define MAP_FLASH_CTL_PERFORM_MASS_ERASE flash_ctl_perform_mass_erase
239 #ifdef ROM_FLASH_CTL_ERASE_SECTOR
240 #define MAP_FLASH_CTL_ERASE_SECTOR ROM_FLASH_CTL_ERASE_SECTOR
242 #define MAP_FLASH_CTL_ERASE_SECTOR flash_ctl_erase_sector
244 #ifdef ROM_FLASH_CTL_PROGRAM_MEMORY
245 #define MAP_FLASH_CTL_PROGRAM_MEMORY ROM_FLASH_CTL_PROGRAM_MEMORY
247 #define MAP_FLASH_CTL_PROGRAM_MEMORY flash_ctl_program_memory
249 #ifdef ROM_FLASH_CTL_SET_WAIT_STATE
250 #define MAP_FLASH_CTL_SET_WAIT_STATE ROM_FLASH_CTL_SET_WAIT_STATE
252 #define MAP_FLASH_CTL_SET_WAIT_STATE flash_ctl_set_wait_state
254 #ifdef ROM_FLASH_CTL_GET_WAIT_STATE
255 #define MAP_FLASH_CTL_GET_WAIT_STATE ROM_FLASH_CTL_GET_WAIT_STATE
257 #define MAP_FLASH_CTL_GET_WAIT_STATE flash_ctl_get_wait_state
259 #ifdef ROM_PCM_SET_CORE_VOLTAGE_LEVEL
260 #define MAP_PCM_SET_CORE_VOLTAGE_LEVEL ROM_PCM_SET_CORE_VOLTAGE_LEVEL
262 #define MAP_PCM_SET_CORE_VOLTAGE_LEVEL pcm_set_core_voltage_level
264 #ifdef ROM_PCM_GET_CORE_VOLTAGE_LEVEL
265 #define MAP_PCM_GET_CORE_VOLTAGE_LEVEL ROM_PCM_GET_CORE_VOLTAGE_LEVEL
267 #define MAP_PCM_GET_CORE_VOLTAGE_LEVEL pcm_get_core_voltage_level
269 #ifdef ROM_PCM_SET_POWER_STATE
270 #define MAP_PCM_SET_POWER_STATE ROM_PCM_SET_POWER_STATE
272 #define MAP_PCM_SET_POWER_STATE pcm_set_power_state
274 #ifdef ROM_PCM_GET_POWER_STATE
275 #define MAP_PCM_GET_POWER_STATE ROM_PCM_GET_POWER_STATE
277 #define MAP_PCM_GET_POWER_STATE pcm_get_power_state
279 #ifdef ROM_WDT_A_HOLD_TIMER
280 #define MAP_WDT_A_HOLD_TIMER ROM_WDT_A_HOLD_TIMER
282 #define MAP_WDT_A_HOLD_TIMER wdt_a_hold_timer
284 #ifdef ROM_SYS_CTL_A_GET_FLASH_SIZE
285 #define MAP_SYS_CTL_A_GET_FLASH_SIZE ROM_SYS_CTL_A_GET_FLASH_SIZE
287 #define MAP_SYS_CTL_A_GET_FLASH_SIZE sys_ctl_a_get_flash_size
289 #ifdef ROM_SYS_CTL_A_GET_INFO_FLASH_SIZE
290 #define MAP_SYS_CTL_A_GET_INFO_FLASH_SIZE ROM_SYS_CTL_A_GET_INFO_FLASH_SIZE
292 #define MAP_SYS_CTL_A_GET_INFO_FLASH_SIZE sys_ctl_a_get_info_flash_size
294 #ifdef ROM_FLASH_CTL_A_UNPROTECT_MEMORY
295 #define MAP_FLASH_CTL_A_UNPROTECT_MEMORY ROM_FLASH_CTL_A_UNPROTECT_MEMORY
297 #define MAP_FLASH_CTL_A_UNPROTECT_MEMORY flash_ctl_a_unprotect_memory
299 #ifdef ROM_FLASH_CTL_A_PROTECT_MEMORY
300 #define MAP_FLASH_CTL_A_PROTECT_MEMORY ROM_FLASH_CTL_A_PROTECT_MEMORY
302 #define MAP_FLASH_CTL_A_PROTECT_MEMORY flash_ctl_a_protect_memory
304 #ifdef ROM_FLASH_CTL_A_PERFORM_MASS_ERASE
305 #define MAP_FLASH_CTL_A_PERFORM_MASS_ERASE ROM_FLASH_CTL_A_PERFORM_MASS_ERASE
307 #define MAP_FLASH_CTL_A_PERFORM_MASS_ERASE flash_ctl_a_perform_mass_erase
309 #ifdef ROM_FLASH_CTL_A_ERASE_SECTOR
310 #define MAP_FLASH_CTL_A_ERASE_SECTOR ROM_FLASH_CTL_A_ERASE_SECTOR
312 #define MAP_FLASH_CTL_A_ERASE_SECTOR flash_ctl_a_erase_sector
314 #ifdef ROM_FLASH_CTL_A_PROGRAM_MEMORY
315 #define MAP_FLASH_CTL_A_PROGRAM_MEMORY ROM_FLASH_CTL_A_PROGRAM_MEMORY
317 #define MAP_FLASH_CTL_A_PROGRAM_MEMORY flash_ctl_a_program_memory
319 #ifdef ROM_FLASH_CTL_A_SET_WAIT_STATE
320 #define MAP_FLASH_CTL_A_SET_WAIT_STATE ROM_FLASH_CTL_A_SET_WAIT_STATE
322 #define MAP_FLASH_CTL_A_SET_WAIT_STATE flash_ctl_a_set_wait_state
324 #ifdef ROM_FLASH_CTL_A_GET_WAIT_STATE
325 #define MAP_FLASH_CTL_A_GET_WAIT_STATE ROM_FLASH_CTL_A_GET_WAIT_STATE
327 #define MAP_FLASH_CTL_A_GET_WAIT_STATE flash_ctl_a_get_wait_state
330 /* Real Time Clock Module prototypes */
331 extern void rtc_c_hold_clock(void);
333 /* Watchdog Timer Module prototypes */
334 extern void wdt_a_hold_timer(void);
336 #if defined(__MCU_HAS_FLCTL_A__)
337 #define FLASH_A_BANK0 0x00
338 #define FLASH_A_BANK1 0x01
339 #define __INFO_FLASH_A_TECH_START__ 0x00200000
340 #define __INFO_FLASH_A_TECH_MIDDLE__ 0x00204000
343 #if defined(__MCU_HAS_FLCTL__)
344 #define FLASH_BANK0 0x00
345 #define FLASH_BANK1 0x01
346 #define FLASH_MAIN_MEMORY_SPACE_BANK0 0x01
347 #define FLASH_MAIN_MEMORY_SPACE_BANK1 0x02
348 #define FLASH_INFO_MEMORY_SPACE_BANK0 0x03
349 #define FLASH_INFO_MEMORY_SPACE_BANK1 0x04
350 #define FLASH_SECTOR0 FLCTL_BANK0_MAIN_WEPROT_PROT0
351 #define FLASH_SECTOR1 FLCTL_BANK0_MAIN_WEPROT_PROT1
358 #endif /* OPENOCD_LOADERS_FLASH_MSP432_DRIVERLIB_H */