cpu_conf.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2020 iosabi
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser General
5  * Public License v2.1. See the file LICENSE in the top level directory for more
6  * details.
7  */
8 
9 #pragma once
10 
21 #include "cpu_conf_common.h"
22 
23 #include "vendor/QN908XC.h"
24 #include "vendor/QN908XC_features.h"
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
34 #define CPU_DEFAULT_IRQ_PRIO (1U)
40 #define CPU_IRQ_NUMOF (NUMBER_OF_INT_VECTORS - 16)
48 #define CPU_FLASH_BASE (QN908X_ROM_START_ADDR)
52 #define CPU_HAS_BITBAND 1
72 #if !defined(CONFIG_BOARD_HAS_XTAL32K) || DOXYGEN
73 #define CONFIG_BOARD_HAS_XTAL32K 0
74 #endif
75 
80 #ifdef DOXYGEN
84 #define CONFIG_CPU_CLK_32K_XTAL
88 #define CONFIG_CPU_CLK_32K_RCO
89 #endif /* def DOXYGEN */
92 /* Default 32K clock selector config. */
93 #if !defined(CONFIG_CPU_CLK_32K_XTAL) && !defined(CONFIG_CPU_CLK_32K_RCO)
94 #if CONFIG_BOARD_HAS_XTAL32K
95 #define CONFIG_CPU_CLK_32K_XTAL 1
96 #else
97 #define CONFIG_CPU_CLK_32K_RCO 1
98 #endif
99 #endif
100 
105 #ifndef CONFIG_BOARD_HAS_XTAL
106 #define CONFIG_BOARD_HAS_XTAL 0
107 #endif
108 
112 #ifdef DOXYGEN
116 #define CONFIG_CPU_CLK_XTAL_16M
120 #define CONFIG_CPU_CLK_XTAL_32M
121 #endif /* def DOXYGEN */
124 /* Default XTAL setting. */
125 #if CONFIG_BOARD_HAS_XTAL && \
126  !defined(CONFIG_BOARD_HAS_XTAL_16M) && !defined(CONFIG_BOARD_HAS_XTAL_32M)
127 #define CONFIG_BOARD_HAS_XTAL_32M 1
128 #endif
129 
133 #ifndef CONFIG_CPU_CLK_OSC32M_DIV
134 #define CONFIG_CPU_CLK_OSC32M_DIV 0
135 #endif
136 
140 #ifndef CONFIG_CPU_CLK_XTAL_DIV
141 #define CONFIG_CPU_CLK_XTAL_DIV 0
142 #endif
143 
148 #ifdef DOXYGEN
152 #define CONFIG_CPU_CLK_SYS_XTAL
156 #define CONFIG_CPU_CLK_SYS_OSC32M
160 #define CONFIG_CPU_CLK_SYS_32K
161 #endif /* def DOXYGEN */
164 /* Default system clock configuration selector */
165 #if !defined(CONFIG_CPU_CLK_SYS_XTAL) && !defined(CONFIG_CPU_CLK_SYS_OSC32M) && \
166  !defined(CONFIG_CPU_CLK_SYS_32K)
167 #if CONFIG_BOARD_HAS_XTAL
168 #define CONFIG_CPU_CLK_SYS_XTAL 1
169 #else
170 #define CONFIG_CPU_CLK_SYS_OSC32M 1
171 #endif
172 #endif
173 
184 #ifndef CONFIG_CPU_CLK_AHB_DIV
185 #define CONFIG_CPU_CLK_AHB_DIV 1u
186 #endif
187 
196 #ifndef CONFIG_CPU_CLK_APB_DIV
197 #define CONFIG_CPU_CLK_APB_DIV 1u
198 #endif
199 
233 #define QN908X_CRP_PROTECT_PAGES(X) (255 - (X))
234 
238 #define QN908X_CRP_MASS_ERASE_ALLOW (0x800)
242 #define QN908X_CRP_MASS_ERASE_DISALLOW (0x400)
243 
247 #define QN908X_CRP_PAGE_ERASE_WRITE_ALLOW (0x2000)
251 #define QN908X_CRP_PAGE_ERASE_WRITE_DISALLOW (0x1000)
252 
256 #define QN908X_CRP_FLASH_READ_ALLOW (0x8000)
260 #define QN908X_CRP_FLASH_READ_DISALLOW (0x4000)
261 
265 #define QN908X_CRP_ISP_ENTRY_ALLOW (0x20000)
269 #define QN908X_CRP_ISP_ENTRY_DISALLOW (0x10000)
270 
274 #define QN908X_CRP_EXTERNAL_ACCESS_ALLOW (0x80000)
278 #define QN908X_CRP_EXTERNAL_ACCESS_DISALLOW (0x40000)
279 
285 #ifndef QN908X_CRP
286 #define QN908X_CRP \
287  (QN908X_CRP_PROTECT_PAGES(0) \
288  | QN908X_CRP_MASS_ERASE_ALLOW \
289  | QN908X_CRP_PAGE_ERASE_WRITE_ALLOW \
290  | QN908X_CRP_FLASH_READ_ALLOW \
291  | QN908X_CRP_ISP_ENTRY_ALLOW \
292  | QN908X_CRP_EXTERNAL_ACCESS_ALLOW)
293 #endif /* QN908X_CRP */
294 
300 #define CORTEXM_VECTOR_RESERVED_0X20 QN908X_CRP
301 
302 /* Safety checks that the QN908X_CRP value is valid. */
303 #if !(QN908X_CRP & QN908X_CRP_MASS_ERASE_ALLOW) == \
304  !(QN908X_CRP & QN908X_CRP_MASS_ERASE_DISALLOW)
305 #error "Must select exactly one of QN908X_CRP_MASS_ERASE_* in the QN908X_CRP"
306 #endif
307 #if !(QN908X_CRP & QN908X_CRP_PAGE_ERASE_WRITE_ALLOW) == \
308  !(QN908X_CRP & QN908X_CRP_PAGE_ERASE_WRITE_DISALLOW)
309 #error \
310  "Must select exactly one of QN908X_CRP_PAGE_ERASE_WRITE_* in the QN908X_CRP"
311 #endif
312 #if !(QN908X_CRP & QN908X_CRP_FLASH_READ_ALLOW) == \
313  !(QN908X_CRP & QN908X_CRP_FLASH_READ_DISALLOW)
314 #error "Must select exactly one of QN908X_CRP_FLASH_READ_* in the QN908X_CRP"
315 #endif
316 #if !(QN908X_CRP & QN908X_CRP_ISP_ENTRY_ALLOW) == \
317  !(QN908X_CRP & QN908X_CRP_ISP_ENTRY_DISALLOW)
318 #error "Must select exactly one of QN908X_CRP_ISP_ENTRY_* in the QN908X_CRP"
319 #endif
320 #if !(QN908X_CRP & QN908X_CRP_EXTERNAL_ACCESS_ALLOW) == \
321  !(QN908X_CRP & QN908X_CRP_EXTERNAL_ACCESS_DISALLOW)
322 #error \
323  "Must select exactly one of QN908X_CRP_EXTERNAL_ACCESS_* in the QN908X_CRP"
324 #endif
325 
326 #ifdef __cplusplus
327 }
328 #endif
329