cpu_conf.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2020 iosabi
3  * SPDX-License-Identifier: LGPL-2.1-only
4  */
5 
6 #pragma once
7 
18 #include "cpu_conf_common.h"
19 
20 #include "vendor/QN908XC.h"
21 #include "vendor/QN908XC_features.h"
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
31 #define CPU_DEFAULT_IRQ_PRIO (1U)
37 #define CPU_IRQ_NUMOF (NUMBER_OF_INT_VECTORS - 16)
45 #define CPU_FLASH_BASE (QN908X_ROM_START_ADDR)
49 #define CPU_HAS_BITBAND 1
69 #if !defined(CONFIG_BOARD_HAS_XTAL32K) || DOXYGEN
70 #define CONFIG_BOARD_HAS_XTAL32K 0
71 #endif
72 
77 #ifdef DOXYGEN
81 #define CONFIG_CPU_CLK_32K_XTAL
85 #define CONFIG_CPU_CLK_32K_RCO
86 #endif /* def DOXYGEN */
89 /* Default 32K clock selector config. */
90 #if !defined(CONFIG_CPU_CLK_32K_XTAL) && !defined(CONFIG_CPU_CLK_32K_RCO)
91 #if CONFIG_BOARD_HAS_XTAL32K
92 #define CONFIG_CPU_CLK_32K_XTAL 1
93 #else
94 #define CONFIG_CPU_CLK_32K_RCO 1
95 #endif
96 #endif
97 
102 #ifndef CONFIG_BOARD_HAS_XTAL
103 #define CONFIG_BOARD_HAS_XTAL 0
104 #endif
105 
109 #ifdef DOXYGEN
113 #define CONFIG_CPU_CLK_XTAL_16M
117 #define CONFIG_CPU_CLK_XTAL_32M
118 #endif /* def DOXYGEN */
121 /* Default XTAL setting. */
122 #if CONFIG_BOARD_HAS_XTAL && \
123  !defined(CONFIG_BOARD_HAS_XTAL_16M) && !defined(CONFIG_BOARD_HAS_XTAL_32M)
124 #define CONFIG_BOARD_HAS_XTAL_32M 1
125 #endif
126 
130 #ifndef CONFIG_CPU_CLK_OSC32M_DIV
131 #define CONFIG_CPU_CLK_OSC32M_DIV 0
132 #endif
133 
137 #ifndef CONFIG_CPU_CLK_XTAL_DIV
138 #define CONFIG_CPU_CLK_XTAL_DIV 0
139 #endif
140 
145 #ifdef DOXYGEN
149 #define CONFIG_CPU_CLK_SYS_XTAL
153 #define CONFIG_CPU_CLK_SYS_OSC32M
157 #define CONFIG_CPU_CLK_SYS_32K
158 #endif /* def DOXYGEN */
161 /* Default system clock configuration selector */
162 #if !defined(CONFIG_CPU_CLK_SYS_XTAL) && !defined(CONFIG_CPU_CLK_SYS_OSC32M) && \
163  !defined(CONFIG_CPU_CLK_SYS_32K)
164 #if CONFIG_BOARD_HAS_XTAL
165 #define CONFIG_CPU_CLK_SYS_XTAL 1
166 #else
167 #define CONFIG_CPU_CLK_SYS_OSC32M 1
168 #endif
169 #endif
170 
181 #ifndef CONFIG_CPU_CLK_AHB_DIV
182 #define CONFIG_CPU_CLK_AHB_DIV 1u
183 #endif
184 
193 #ifndef CONFIG_CPU_CLK_APB_DIV
194 #define CONFIG_CPU_CLK_APB_DIV 1u
195 #endif
196 
230 #define QN908X_CRP_PROTECT_PAGES(X) (255 - (X))
231 
235 #define QN908X_CRP_MASS_ERASE_ALLOW (0x800)
239 #define QN908X_CRP_MASS_ERASE_DISALLOW (0x400)
240 
244 #define QN908X_CRP_PAGE_ERASE_WRITE_ALLOW (0x2000)
248 #define QN908X_CRP_PAGE_ERASE_WRITE_DISALLOW (0x1000)
249 
253 #define QN908X_CRP_FLASH_READ_ALLOW (0x8000)
257 #define QN908X_CRP_FLASH_READ_DISALLOW (0x4000)
258 
262 #define QN908X_CRP_ISP_ENTRY_ALLOW (0x20000)
266 #define QN908X_CRP_ISP_ENTRY_DISALLOW (0x10000)
267 
271 #define QN908X_CRP_EXTERNAL_ACCESS_ALLOW (0x80000)
275 #define QN908X_CRP_EXTERNAL_ACCESS_DISALLOW (0x40000)
276 
282 #ifndef QN908X_CRP
283 #define QN908X_CRP \
284  (QN908X_CRP_PROTECT_PAGES(0) \
285  | QN908X_CRP_MASS_ERASE_ALLOW \
286  | QN908X_CRP_PAGE_ERASE_WRITE_ALLOW \
287  | QN908X_CRP_FLASH_READ_ALLOW \
288  | QN908X_CRP_ISP_ENTRY_ALLOW \
289  | QN908X_CRP_EXTERNAL_ACCESS_ALLOW)
290 #endif /* QN908X_CRP */
291 
297 #define CORTEXM_VECTOR_RESERVED_0X20 QN908X_CRP
298 
299 /* Safety checks that the QN908X_CRP value is valid. */
300 #if !(QN908X_CRP & QN908X_CRP_MASS_ERASE_ALLOW) == \
301  !(QN908X_CRP & QN908X_CRP_MASS_ERASE_DISALLOW)
302 #error "Must select exactly one of QN908X_CRP_MASS_ERASE_* in the QN908X_CRP"
303 #endif
304 #if !(QN908X_CRP & QN908X_CRP_PAGE_ERASE_WRITE_ALLOW) == \
305  !(QN908X_CRP & QN908X_CRP_PAGE_ERASE_WRITE_DISALLOW)
306 #error \
307  "Must select exactly one of QN908X_CRP_PAGE_ERASE_WRITE_* in the QN908X_CRP"
308 #endif
309 #if !(QN908X_CRP & QN908X_CRP_FLASH_READ_ALLOW) == \
310  !(QN908X_CRP & QN908X_CRP_FLASH_READ_DISALLOW)
311 #error "Must select exactly one of QN908X_CRP_FLASH_READ_* in the QN908X_CRP"
312 #endif
313 #if !(QN908X_CRP & QN908X_CRP_ISP_ENTRY_ALLOW) == \
314  !(QN908X_CRP & QN908X_CRP_ISP_ENTRY_DISALLOW)
315 #error "Must select exactly one of QN908X_CRP_ISP_ENTRY_* in the QN908X_CRP"
316 #endif
317 #if !(QN908X_CRP & QN908X_CRP_EXTERNAL_ACCESS_ALLOW) == \
318  !(QN908X_CRP & QN908X_CRP_EXTERNAL_ACCESS_DISALLOW)
319 #error \
320  "Must select exactly one of QN908X_CRP_EXTERNAL_ACCESS_* in the QN908X_CRP"
321 #endif
322 
323 #ifdef __cplusplus
324 }
325 #endif
326