You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.1 KiB
134 lines
4.1 KiB
#ifdef BOOTSTUB
|
|
void gpio_usb_init(void) {
|
|
#else
|
|
static void gpio_usb_init(void) {
|
|
#endif
|
|
// A11,A12: USB
|
|
set_gpio_alternate(GPIOA, 11, GPIO_AF10_OTG1_FS);
|
|
set_gpio_alternate(GPIOA, 12, GPIO_AF10_OTG1_FS);
|
|
GPIOA->OSPEEDR = GPIO_OSPEEDR_OSPEED11 | GPIO_OSPEEDR_OSPEED12;
|
|
}
|
|
|
|
#ifdef ENABLE_SPI
|
|
void gpio_spi_init(void) {
|
|
set_gpio_alternate(GPIOE, 11, GPIO_AF5_SPI4);
|
|
set_gpio_alternate(GPIOE, 12, GPIO_AF5_SPI4);
|
|
set_gpio_alternate(GPIOE, 13, GPIO_AF5_SPI4);
|
|
set_gpio_alternate(GPIOE, 14, GPIO_AF5_SPI4);
|
|
register_set_bits(&(GPIOE->OSPEEDR), GPIO_OSPEEDR_OSPEED11 | GPIO_OSPEEDR_OSPEED12 | GPIO_OSPEEDR_OSPEED13 | GPIO_OSPEEDR_OSPEED14);
|
|
}
|
|
#endif
|
|
|
|
#ifdef BOOTSTUB
|
|
void gpio_usart2_init(void) {
|
|
// A2,A3: USART 2 for debugging
|
|
set_gpio_alternate(GPIOA, 2, GPIO_AF7_USART2);
|
|
set_gpio_alternate(GPIOA, 3, GPIO_AF7_USART2);
|
|
}
|
|
#endif
|
|
|
|
void gpio_uart7_init(void) {
|
|
// E7,E8: UART 7 for debugging
|
|
set_gpio_alternate(GPIOE, 7, GPIO_AF7_UART7);
|
|
set_gpio_alternate(GPIOE, 8, GPIO_AF7_UART7);
|
|
}
|
|
|
|
// Common GPIO initialization
|
|
void common_init_gpio(void) {
|
|
//F11: VOLT_S
|
|
set_gpio_pullup(GPIOF, 11, PULL_NONE);
|
|
set_gpio_mode(GPIOF, 11, MODE_ANALOG);
|
|
|
|
gpio_usb_init();
|
|
|
|
// B8,B9: FDCAN1
|
|
set_gpio_pullup(GPIOB, 8, PULL_NONE);
|
|
set_gpio_alternate(GPIOB, 8, GPIO_AF9_FDCAN1);
|
|
|
|
set_gpio_pullup(GPIOB, 9, PULL_NONE);
|
|
set_gpio_alternate(GPIOB, 9, GPIO_AF9_FDCAN1);
|
|
|
|
// B5,B6 (mplex to B12,B13): FDCAN2
|
|
set_gpio_pullup(GPIOB, 12, PULL_NONE);
|
|
set_gpio_pullup(GPIOB, 13, PULL_NONE);
|
|
|
|
set_gpio_pullup(GPIOB, 5, PULL_NONE);
|
|
set_gpio_alternate(GPIOB, 5, GPIO_AF9_FDCAN2);
|
|
|
|
set_gpio_pullup(GPIOB, 6, PULL_NONE);
|
|
set_gpio_alternate(GPIOB, 6, GPIO_AF9_FDCAN2);
|
|
|
|
// G9,G10: FDCAN3
|
|
set_gpio_pullup(GPIOG, 9, PULL_NONE);
|
|
set_gpio_alternate(GPIOG, 9, GPIO_AF2_FDCAN3);
|
|
|
|
set_gpio_pullup(GPIOG, 10, PULL_NONE);
|
|
set_gpio_alternate(GPIOG, 10, GPIO_AF2_FDCAN3);
|
|
}
|
|
|
|
#ifdef BOOTSTUB
|
|
void flasher_peripherals_init(void) {
|
|
RCC->AHB1ENR |= RCC_AHB1ENR_USB1OTGHSEN;
|
|
|
|
// SPI + DMA
|
|
RCC->APB2ENR |= RCC_APB2ENR_SPI4EN;
|
|
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
|
|
}
|
|
#endif
|
|
|
|
// Peripheral initialization
|
|
void peripherals_init(void) {
|
|
// enable GPIO(A,B,C,D,E,F,G,H)
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN;
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOBEN;
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOCEN;
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_GPIODEN;
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOEEN;
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOFEN;
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOGEN;
|
|
|
|
// Enable CPU access to SRAMs for DMA
|
|
RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN | RCC_AHB2ENR_SRAM2EN;
|
|
|
|
// Supplemental
|
|
RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; // DAC DMA
|
|
RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; // SPI DMA
|
|
RCC->APB4ENR |= RCC_APB4ENR_SYSCFGEN;
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_BDMAEN; // Audio DMA
|
|
|
|
// Connectivity
|
|
RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; // SPI
|
|
RCC->APB1LENR |= RCC_APB1LENR_I2C5EN; // codec I2C
|
|
RCC->AHB1ENR |= RCC_AHB1ENR_USB1OTGHSEN; // USB
|
|
RCC->AHB1LPENR |= RCC_AHB1LPENR_USB1OTGHSLPEN; // USB LP needed for CSleep state(__WFI())
|
|
RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_USB1OTGHSULPILPEN); // disable USB ULPI
|
|
RCC->APB1LENR |= RCC_APB1LENR_UART7EN; // SOM uart
|
|
RCC->APB1HENR |= RCC_APB1HENR_FDCANEN; // FDCAN core enable
|
|
|
|
// Analog
|
|
RCC->AHB1ENR |= RCC_AHB1ENR_ADC12EN; // Enable ADC12 clocks
|
|
RCC->APB1LENR |= RCC_APB1LENR_DAC12EN; // DAC
|
|
|
|
// Audio
|
|
RCC->APB2ENR |= RCC_APB2ENR_DFSDM1EN; // D/S demodulator for mic
|
|
RCC->APB4ENR |= RCC_APB4ENR_SAI4EN; // SAI4
|
|
|
|
// Timers
|
|
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // clock source timer
|
|
RCC->APB1LENR |= RCC_APB1LENR_TIM2EN; // main counter
|
|
RCC->APB1LENR |= RCC_APB1LENR_TIM3EN; // fan pwm
|
|
RCC->APB1LENR |= RCC_APB1LENR_TIM6EN; // interrupt timer
|
|
RCC->APB1LENR |= RCC_APB1LENR_TIM7EN; // DMA trigger timer
|
|
RCC->APB2ENR |= RCC_APB2ENR_TIM8EN; // tick timer
|
|
RCC->APB1LENR |= RCC_APB1LENR_TIM12EN; // slow loop
|
|
RCC->APB1LENR |= RCC_APB1LENR_TIM5EN; // sound trigger timer
|
|
|
|
#ifdef PANDA_JUNGLE
|
|
RCC->AHB3ENR |= RCC_AHB3ENR_SDMMC1EN; // SDMMC
|
|
RCC->AHB4ENR |= RCC_AHB4ENR_ADC3EN; // Enable ADC3 clocks
|
|
#endif
|
|
}
|
|
|
|
void enable_interrupt_timer(void) {
|
|
register_set_bits(&(RCC->APB1LENR), RCC_APB1LENR_TIM6EN); // Enable interrupt timer peripheral
|
|
}
|
|
|