diff options
Diffstat (limited to 'keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c')
-rw-r--r-- | keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c | 179 |
1 files changed, 169 insertions, 10 deletions
diff --git a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c b/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c index 9d10fbd75..7c09bd997 100644 --- a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c +++ b/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio | 2 | ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio |
3 | 3 | ||
4 | Licensed under the Apache License, Version 2.0 (the "License"); | 4 | Licensed under the Apache License, Version 2.0 (the "License"); |
5 | you may not use this file except in compliance with the License. | 5 | you may not use this file except in compliance with the License. |
@@ -20,14 +20,76 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include "hal.h" | 22 | #include "hal.h" |
23 | #include "stm32_gpio.h" | ||
24 | |||
25 | /*===========================================================================*/ | ||
26 | /* Driver local definitions. */ | ||
27 | /*===========================================================================*/ | ||
28 | |||
29 | /*===========================================================================*/ | ||
30 | /* Driver exported variables. */ | ||
31 | /*===========================================================================*/ | ||
32 | |||
33 | /*===========================================================================*/ | ||
34 | /* Driver local variables and types. */ | ||
35 | /*===========================================================================*/ | ||
36 | |||
37 | /** | ||
38 | * @brief Type of STM32 GPIO port setup. | ||
39 | */ | ||
40 | typedef struct { | ||
41 | uint32_t moder; | ||
42 | uint32_t otyper; | ||
43 | uint32_t ospeedr; | ||
44 | uint32_t pupdr; | ||
45 | uint32_t odr; | ||
46 | uint32_t afrl; | ||
47 | uint32_t afrh; | ||
48 | } gpio_setup_t; | ||
49 | |||
50 | /** | ||
51 | * @brief Type of STM32 GPIO initialization data. | ||
52 | */ | ||
53 | typedef struct { | ||
54 | #if STM32_HAS_GPIOA || defined(__DOXYGEN__) | ||
55 | gpio_setup_t PAData; | ||
56 | #endif | ||
57 | #if STM32_HAS_GPIOB || defined(__DOXYGEN__) | ||
58 | gpio_setup_t PBData; | ||
59 | #endif | ||
60 | #if STM32_HAS_GPIOC || defined(__DOXYGEN__) | ||
61 | gpio_setup_t PCData; | ||
62 | #endif | ||
63 | #if STM32_HAS_GPIOD || defined(__DOXYGEN__) | ||
64 | gpio_setup_t PDData; | ||
65 | #endif | ||
66 | #if STM32_HAS_GPIOE || defined(__DOXYGEN__) | ||
67 | gpio_setup_t PEData; | ||
68 | #endif | ||
69 | #if STM32_HAS_GPIOF || defined(__DOXYGEN__) | ||
70 | gpio_setup_t PFData; | ||
71 | #endif | ||
72 | #if STM32_HAS_GPIOG || defined(__DOXYGEN__) | ||
73 | gpio_setup_t PGData; | ||
74 | #endif | ||
75 | #if STM32_HAS_GPIOH || defined(__DOXYGEN__) | ||
76 | gpio_setup_t PHData; | ||
77 | #endif | ||
78 | #if STM32_HAS_GPIOI || defined(__DOXYGEN__) | ||
79 | gpio_setup_t PIData; | ||
80 | #endif | ||
81 | #if STM32_HAS_GPIOJ || defined(__DOXYGEN__) | ||
82 | gpio_setup_t PJData; | ||
83 | #endif | ||
84 | #if STM32_HAS_GPIOK || defined(__DOXYGEN__) | ||
85 | gpio_setup_t PKData; | ||
86 | #endif | ||
87 | } gpio_config_t; | ||
23 | 88 | ||
24 | #if HAL_USE_PAL || defined(__DOXYGEN__) | ||
25 | /** | 89 | /** |
26 | * @brief PAL setup. | 90 | * @brief STM32 GPIO static initialization data. |
27 | * @details Digital I/O ports static configuration as defined in @p board.h. | ||
28 | * This variable is used by the HAL when initializing the PAL driver. | ||
29 | */ | 91 | */ |
30 | const PALConfig pal_default_config = { | 92 | static const gpio_config_t gpio_default_config = { |
31 | #if STM32_HAS_GPIOA | 93 | #if STM32_HAS_GPIOA |
32 | {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, | 94 | {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, |
33 | VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, | 95 | VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, |
@@ -62,23 +124,118 @@ const PALConfig pal_default_config = { | |||
62 | #endif | 124 | #endif |
63 | #if STM32_HAS_GPIOI | 125 | #if STM32_HAS_GPIOI |
64 | {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, | 126 | {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, |
65 | VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} | 127 | VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH}, |
128 | #endif | ||
129 | #if STM32_HAS_GPIOJ | ||
130 | {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR, | ||
131 | VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH}, | ||
132 | #endif | ||
133 | #if STM32_HAS_GPIOK | ||
134 | {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR, | ||
135 | VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH} | ||
66 | #endif | 136 | #endif |
67 | }; | 137 | }; |
138 | |||
139 | /*===========================================================================*/ | ||
140 | /* Driver local functions. */ | ||
141 | /*===========================================================================*/ | ||
142 | |||
143 | static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) { | ||
144 | |||
145 | gpiop->OTYPER = config->otyper; | ||
146 | gpiop->OSPEEDR = config->ospeedr; | ||
147 | gpiop->PUPDR = config->pupdr; | ||
148 | gpiop->ODR = config->odr; | ||
149 | gpiop->AFRL = config->afrl; | ||
150 | gpiop->AFRH = config->afrh; | ||
151 | gpiop->MODER = config->moder; | ||
152 | } | ||
153 | |||
154 | static void stm32_gpio_init(void) { | ||
155 | |||
156 | /* Enabling GPIO-related clocks, the mask comes from the | ||
157 | registry header file.*/ | ||
158 | rccResetAHB(STM32_GPIO_EN_MASK); | ||
159 | rccEnableAHB(STM32_GPIO_EN_MASK, true); | ||
160 | |||
161 | /* Initializing all the defined GPIO ports.*/ | ||
162 | #if STM32_HAS_GPIOA | ||
163 | gpio_init(GPIOA, &gpio_default_config.PAData); | ||
164 | #endif | ||
165 | #if STM32_HAS_GPIOB | ||
166 | gpio_init(GPIOB, &gpio_default_config.PBData); | ||
68 | #endif | 167 | #endif |
168 | #if STM32_HAS_GPIOC | ||
169 | gpio_init(GPIOC, &gpio_default_config.PCData); | ||
170 | #endif | ||
171 | #if STM32_HAS_GPIOD | ||
172 | gpio_init(GPIOD, &gpio_default_config.PDData); | ||
173 | #endif | ||
174 | #if STM32_HAS_GPIOE | ||
175 | gpio_init(GPIOE, &gpio_default_config.PEData); | ||
176 | #endif | ||
177 | #if STM32_HAS_GPIOF | ||
178 | gpio_init(GPIOF, &gpio_default_config.PFData); | ||
179 | #endif | ||
180 | #if STM32_HAS_GPIOG | ||
181 | gpio_init(GPIOG, &gpio_default_config.PGData); | ||
182 | #endif | ||
183 | #if STM32_HAS_GPIOH | ||
184 | gpio_init(GPIOH, &gpio_default_config.PHData); | ||
185 | #endif | ||
186 | #if STM32_HAS_GPIOI | ||
187 | gpio_init(GPIOI, &gpio_default_config.PIData); | ||
188 | #endif | ||
189 | #if STM32_HAS_GPIOJ | ||
190 | gpio_init(GPIOJ, &gpio_default_config.PJData); | ||
191 | #endif | ||
192 | #if STM32_HAS_GPIOK | ||
193 | gpio_init(GPIOK, &gpio_default_config.PKData); | ||
194 | #endif | ||
195 | } | ||
196 | |||
197 | /*===========================================================================*/ | ||
198 | /* Driver interrupt handlers. */ | ||
199 | /*===========================================================================*/ | ||
69 | 200 | ||
70 | void enter_bootloader_mode_if_requested(void); | 201 | /*===========================================================================*/ |
202 | /* Driver exported functions. */ | ||
203 | /*===========================================================================*/ | ||
71 | 204 | ||
72 | /** | 205 | /** |
73 | * @brief Early initialization code. | 206 | * @brief Early initialization code. |
74 | * @details This initialization must be performed just after stack setup | 207 | * @details GPIO ports and system clocks are initialized before everything |
75 | * and before any other initialization. | 208 | * else. |
76 | */ | 209 | */ |
77 | void __early_init(void) { | 210 | void __early_init(void) { |
211 | extern void enter_bootloader_mode_if_requested(void); | ||
78 | enter_bootloader_mode_if_requested(); | 212 | enter_bootloader_mode_if_requested(); |
213 | stm32_gpio_init(); | ||
79 | stm32_clock_init(); | 214 | stm32_clock_init(); |
80 | } | 215 | } |
81 | 216 | ||
217 | #if HAL_USE_SDC || defined(__DOXYGEN__) | ||
218 | /** | ||
219 | * @brief SDC card detection. | ||
220 | */ | ||
221 | bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { | ||
222 | |||
223 | (void)sdcp; | ||
224 | /* TODO: Fill the implementation.*/ | ||
225 | return true; | ||
226 | } | ||
227 | |||
228 | /** | ||
229 | * @brief SDC card write protection detection. | ||
230 | */ | ||
231 | bool sdc_lld_is_write_protected(SDCDriver *sdcp) { | ||
232 | |||
233 | (void)sdcp; | ||
234 | /* TODO: Fill the implementation.*/ | ||
235 | return false; | ||
236 | } | ||
237 | #endif /* HAL_USE_SDC */ | ||
238 | |||
82 | #if HAL_USE_MMC_SPI || defined(__DOXYGEN__) | 239 | #if HAL_USE_MMC_SPI || defined(__DOXYGEN__) |
83 | /** | 240 | /** |
84 | * @brief MMC_SPI card detection. | 241 | * @brief MMC_SPI card detection. |
@@ -106,4 +263,6 @@ bool mmc_lld_is_write_protected(MMCDriver *mmcp) { | |||
106 | * @todo Add your board-specific code, if any. | 263 | * @todo Add your board-specific code, if any. |
107 | */ | 264 | */ |
108 | void boardInit(void) { | 265 | void boardInit(void) { |
266 | SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP; | ||
267 | SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP); | ||
109 | } | 268 | } |