Files
pebble/src/fw/drivers/stm32f4/gpio_defaults.c
2025-01-27 11:38:16 -08:00

76 lines
2.7 KiB
C

/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "drivers/gpio.h"
#include "board/board.h"
void gpio_init_all(void) {
GPIO_InitTypeDef gpio_init = (GPIO_InitTypeDef) {
.GPIO_Mode = GPIO_Mode_AN,
.GPIO_Speed = GPIO_Speed_2MHz,
.GPIO_PuPd = GPIO_PuPd_NOPULL
};
// We program all the pins to be analog inputs to save power.
// We expect the following configuration after initialization code has run:
//
// GPIOA - don't touch PA0 (WKUP), PA13 (JTMS), PA14 (JTCK), PA15 (JTDI),
// PA1 & PA2 will be configured as analog pins.
// Expected non-analog mask: 0xff.f9
//
// GPIOB - don't touch PB3 (JTDO), PB4 (NJTRST). PB0, PB1, PB2, PB5, PB11,
// PB13 unused. Expected non-analog mask: 0xd7.d8
//
// GPIOC - PC0-PC9 are unused, PC14 (OSC32_IN) ok to set (see 8.3.13
// of ref manual) Expected non-analog mask: 0x1c.00
//
// GPIOD - PD0-PD15 are all for the parallel flash.
// Expected non-analog mask: 0xff.ff
//
// GPIOE - PE0-PE1 are accessory connector, PE2-PE15 are for flash.
// Expected non-analog mask: 0xff.ff
//
// GPIOF - PF6-PF9 (Audio SAI, not used?), PF5, PF10-PF12, PF15 unused.
// Expected non-analog mask: 0x60.1f
//
// GPIOG - PG0 unused, PG11 (PROG_SO) unused? Expected non-analog mask: 0xf7.fe
//
// GPIOH - Only PH0-PH1 on actual watch, PH2-PH15 unused on BB.
// Expected non-analog mask: 0x00.00
//
// GPIOI - Only on BB, nothing used. Expected non-analog mask: 0x00.00
int tot_gpios = BOARD_CONFIG.num_avail_gpios;
const int num_gpios_per_port = 16;
for (uint32_t gpio_addr = (uint32_t)GPIOA;
(gpio_addr <= (uint32_t)GPIOK) && (tot_gpios > 0); gpio_addr += 0x400) {
if (gpio_addr == (uint32_t)GPIOA) {
gpio_init.GPIO_Pin =
GPIO_Pin_All & ~(GPIO_Pin_0 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
} else if (gpio_addr == (uint32_t)GPIOB) {
gpio_init.GPIO_Pin = GPIO_Pin_All & ~(GPIO_Pin_3 | GPIO_Pin_4);
} else {
gpio_init.GPIO_Pin = GPIO_Pin_All;
}
gpio_use((GPIO_TypeDef *)gpio_addr);
GPIO_Init((GPIO_TypeDef *)gpio_addr, &gpio_init);
gpio_release((GPIO_TypeDef *)gpio_addr);
tot_gpios -= num_gpios_per_port;
}
}