blob: 73f27854af5c7ead93a46f4c526fbf645eb8535f [file] [log] [blame] [edit]
#include "gpio.hpp"
namespace gpio {
void init_pin(GPIO_TypeDef *port, uint32_t pin, uint32_t mode, uint32_t pull, uint32_t speed = 0, uint32_t alt = 0) {
GPIO_InitTypeDef gpio = {pin, mode, pull, speed, alt};
HAL_GPIO_Init(port, &gpio);
}
// initialises all of the pins of the MCU into the correct
// configuration for 32blit
void init()
{
// enable clocks
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN | RCC_AHB4ENR_GPIOBEN | RCC_AHB4ENR_GPIOCEN | RCC_AHB4ENR_GPIODEN | RCC_AHB4ENR_GPIOEEN | RCC_AHB4ENR_GPIOHEN;
(void)RCC->AHB4ENR; // read back
// set initial output states where needed
write(AMP_SHUTDOWN_GPIO_Port, AMP_SHUTDOWN_Pin, true);
write(GPIOA, LCD_CS_Pin|LCD_RESET_Pin|SD_SPI1_CS_Pin, false);
write(USB_SWAP_GPIO_Port, USB_SWAP_Pin, false);
// usb otg
init_pin(GPIOB, GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_15, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF12_OTG2_FS);
// usb vbus detect
init_pin(GPIOB, GPIO_PIN_13, GPIO_MODE_INPUT, GPIO_NOPULL);
// usb "swap" pin?
init_pin(GPIOD, USB_SWAP_Pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL);
// qspi
init_pin(GPIOB, GPIO_PIN_2, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_AF9_QUADSPI);
init_pin(GPIOE, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_AF10_QUADSPI);
init_pin(GPIOC, GPIO_PIN_11, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_AF9_QUADSPI);
// spi1
init_pin(GPIOA, SD_SPI1_MOSI_Pin, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_AF5_SPI1);
init_pin(GPIOB, SD_SPI1_MISO_Pin | SD_SPI1_SCK_Pin, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_AF5_SPI1);
// spi4
init_pin(GPIOE, LCD_SPI4_MOSI_Pin | LCD_SPI4_SCK_Pin, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF5_SPI4);
// i2c4
init_pin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13, GPIO_MODE_AF_OD, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF4_I2C4);
// dac1
init_pin(GPIOA, GPIO_PIN_5, GPIO_MODE_ANALOG, GPIO_NOPULL);
// joystick axes
init_pin(GPIOC, JOYSTICK_Y_Pin | JOYSTICK_X_Pin, GPIO_MODE_ANALOG, GPIO_NOPULL);
init_pin(GPIOC, JOYSTICK_BUTTON_Pin, GPIO_MODE_INPUT, GPIO_PULLUP); // button
// dpad/action buttons
auto button_pins = DPAD_UP_Pin | DPAD_LEFT_Pin | DPAD_DOWN_Pin | DPAD_RIGHT_Pin | BUTTON_X_Pin | BUTTON_Y_Pin | BUTTON_A_Pin | BUTTON_B_Pin;
init_pin(GPIOD, button_pins, GPIO_MODE_INPUT, GPIO_PULLUP);
// system buttons
init_pin(GPIOD, BUTTON_MENU_Pin, GPIO_MODE_INPUT, GPIO_PULLUP);
init_pin(GPIOD, BUTTON_HOME_Pin, GPIO_MODE_IT_RISING_FALLING, GPIO_PULLDOWN);
/* EXTI interrupt init for channels 9..5 */
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
// user hack headers
init_pin(GPIOC, USER_LEFT1_Pin | USER_RIGHT1_Pin, GPIO_MODE_ANALOG, GPIO_NOPULL); // analog
init_pin(GPIOC, USER_LEFT2_Pin | USER_RIGHT2_Pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL); // digital
// battery sense
init_pin(GPIOC, BATTERY_SENSE_Pin, GPIO_MODE_ANALOG, GPIO_NOPULL); // battery sense
// "gpio" pin on extension header
init_pin(GPIOC, EXTENSION_GPIO_Pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL); // left digital
// vibration motor
init_pin(GPIOB, VIBE_EN_Pin, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_AF2_TIM4);
// backlight pwm
init_pin(GPIOE, LCD_BACKLIGHT_EN_Pin, GPIO_MODE_AF_OD, GPIO_PULLUP, GPIO_SPEED_FREQ_HIGH, GPIO_AF4_TIM15);
// audio amp enable
init_pin(GPIOC, AMP_SHUTDOWN_Pin, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP);
// rgb led pwm
init_pin(GPIOC, LED_RED_Pin | LED_GREEN_Pin, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF2_TIM3);
init_pin(GPIOB, LED_BLUE_Pin, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF2_TIM3);
// lcd
init_pin(GPIOA, LCD_CS_Pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL); // chip select
init_pin(GPIOA, LCD_RESET_Pin, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP); // reset
// sd card
init_pin(GPIOA, SD_SPI1_CS_Pin, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP); // chip select
init_pin(GPIOD, SD_DETECT_Pin, GPIO_MODE_INPUT, GPIO_PULLUP); // card detect
// ltdc interface
uint32_t ltdc_a14 = 0, ltdc_b9 = 0, ltdc_b14 = 0, ltdc_c = 0, ltdc_d = 0, ltdc_e = 0;
ltdc_a14 |= GPIO_PIN_4; // vsync
ltdc_c |= GPIO_PIN_6; // hsync
ltdc_e |= GPIO_PIN_13; // de
ltdc_e |= GPIO_PIN_14; // clk
// ltdc interface red
ltdc_a14 |= GPIO_PIN_1; // r2
ltdc_b9 |= GPIO_PIN_0; // r3
ltdc_a14 |= GPIO_PIN_11; // r4
ltdc_a14 |= GPIO_PIN_9; // r5
ltdc_b9 |= GPIO_PIN_1; // r6
ltdc_e |= GPIO_PIN_15; // r7
// ltdc interface green
ltdc_a14 |= GPIO_PIN_6; // g2
ltdc_e |= GPIO_PIN_11; // g3
ltdc_b14 |= GPIO_PIN_10; // g4
ltdc_b14 |= GPIO_PIN_11; // g5
ltdc_c |= GPIO_PIN_7; // g6
ltdc_d |= GPIO_PIN_3; // g7
// ltdc interface blue
ltdc_d |= GPIO_PIN_6; // b2
init_pin(GPIOA, GPIO_PIN_8, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF13_LTDC); // b3
ltdc_e |= GPIO_PIN_12; // b4
ltdc_a14 |= GPIO_PIN_3; // b5
ltdc_b14 |= GPIO_PIN_8; // b6
ltdc_b14 |= GPIO_PIN_9; // b7
init_pin(GPIOA, ltdc_a14, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF14_LTDC);
init_pin(GPIOB, ltdc_b9, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF9_LTDC);
init_pin(GPIOB, ltdc_b14, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF14_LTDC);
init_pin(GPIOC, ltdc_c, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF14_LTDC);
init_pin(GPIOD, ltdc_d, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF14_LTDC);
init_pin(GPIOE, ltdc_e, GPIO_MODE_AF_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, GPIO_AF14_LTDC);
// beta/final versioning pin
init_pin(GPIOE, VERSION_Pin, GPIO_MODE_INPUT, GPIO_PULLUP);
// Charge LED
init_pin(LED_CHG_RED_Port, LED_CHG_RED_Pin, GPIO_MODE_OUTPUT_OD, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH);
init_pin(LED_CHG_GREEN_Port, LED_CHG_GREEN_Pin, GPIO_MODE_OUTPUT_OD, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH);
init_pin(LED_CHG_BLUE_Port, LED_CHG_BLUE_Pin, GPIO_MODE_OUTPUT_OD, GPIO_NOPULL, GPIO_SPEED_FREQ_VERY_HIGH);
write(LED_CHG_RED_Port, LED_CHG_RED_Pin, true);
write(LED_CHG_GREEN_Port, LED_CHG_GREEN_Pin, true);
write(LED_CHG_BLUE_Port, LED_CHG_BLUE_Pin, true);
}
}