diff --git a/board/boards/dos.h b/board/boards/dos.h index 1a0187971b..436ddfa982 100644 --- a/board/boards/dos.h +++ b/board/boards/dos.h @@ -152,10 +152,6 @@ void dos_init(void) { pwm_init(TIM4, 2); dos_set_ir_power(0U); - // Initialize fan and set to 0% - fan_init(); - dos_set_fan_enabled(false); - // Initialize harness harness_init(); diff --git a/board/boards/red_chiplet.h b/board/boards/red_chiplet.h index 3eb09832da..05cbd6c341 100644 --- a/board/boards/red_chiplet.h +++ b/board/boards/red_chiplet.h @@ -35,14 +35,14 @@ void red_chiplet_enable_can_transceivers(bool enabled) { } } -void red_chiplet_set_usb_load_switch(bool enabled) { +void red_chiplet_set_fan_or_usb_load_switch(bool enabled) { set_gpio_output(GPIOD, 3, enabled); } void red_chiplet_init(void) { common_init_gpio(); - //A8, A9 : OBD_SBU1_RELAY, OBD_SBU2_RELAY + // A8, A9: OBD_SBU1_RELAY, OBD_SBU2_RELAY set_gpio_output_type(GPIOA, 8, OUTPUT_TYPE_OPEN_DRAIN); set_gpio_pullup(GPIOA, 8, PULL_NONE); set_gpio_mode(GPIOA, 8, MODE_OUTPUT); @@ -75,7 +75,7 @@ void red_chiplet_init(void) { set_gpio_mode(GPIOB, 0, MODE_ANALOG); // Turn on USB load switch. - red_chiplet_set_usb_load_switch(true); + red_chiplet_set_fan_or_usb_load_switch(true); // Initialize harness harness_init(); diff --git a/board/boards/tres.h b/board/boards/tres.h index 17836e6777..f3fb04cdd9 100644 --- a/board/boards/tres.h +++ b/board/boards/tres.h @@ -20,6 +20,9 @@ void tres_init(void) { 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); + + // fan setup + set_gpio_alternate(GPIOC, 8, GPIO_AF2_TIM3); } const board board_tres = { @@ -33,7 +36,7 @@ const board board_tres = { .has_spi = true, .has_canfd = true, .has_rtc_battery = true, - .fan_max_rpm = 0U, + .fan_max_rpm = 6500U, // TODO: verify this, copied from dos .init = tres_init, .enable_can_transceiver = red_chiplet_enable_can_transceiver, .enable_can_transceivers = red_chiplet_enable_can_transceivers, @@ -42,7 +45,7 @@ const board board_tres = { .set_can_mode = red_set_can_mode, .check_ignition = red_check_ignition, .read_current = unused_read_current, - .set_fan_enabled = unused_set_fan_enabled, + .set_fan_enabled = red_chiplet_set_fan_or_usb_load_switch, .set_ir_power = unused_set_ir_power, .set_phone_power = unused_set_phone_power, .set_siren = unused_set_siren diff --git a/board/boards/uno.h b/board/boards/uno.h index b2762b0668..c401fb2998 100644 --- a/board/boards/uno.h +++ b/board/boards/uno.h @@ -192,10 +192,6 @@ void uno_init(void) { pwm_init(TIM4, 2); uno_set_ir_power(0U); - // Initialize fan and set to 0% - fan_init(); - uno_set_fan_enabled(false); - // Initialize harness harness_init(); diff --git a/board/drivers/fan.h b/board/drivers/fan.h index cb5fbabe63..d5e32ae5f9 100644 --- a/board/drivers/fan.h +++ b/board/drivers/fan.h @@ -27,7 +27,7 @@ void fan_tick(void){ current_board->set_fan_enabled(fan_state.target_rpm > 0U); // Stall detection - if(fan_state.power > 0U) { + if (fan_state.power > 0U) { if (fan_rpm_fast == 0U) { fan_state.stall_counter = MIN(fan_state.stall_counter + 1U, 255U); } else { diff --git a/board/main.c b/board/main.c index 94d0c7f741..3fb67d201b 100644 --- a/board/main.c +++ b/board/main.c @@ -239,8 +239,9 @@ void tick_handler(void) { // Also disable IR when the heartbeat goes missing current_board->set_ir_power(0U); + // TODO: need a SPI equivalent // If enumerated but no heartbeat (phone up, boardd not running), turn the fan on to cool the device - if(usb_enumerated){ + if (usb_enumerated) { fan_set_power(50U); } else { fan_set_power(0U); @@ -341,7 +342,7 @@ int main(void) { uart_init(&uart_ring_gps, 115200); } - if(current_board->has_lin){ + if (current_board->has_lin) { // enable LIN uart_init(&uart_ring_lin1, 10400); UART5->CR2 |= USART_CR2_LINEN; @@ -349,6 +350,10 @@ int main(void) { USART3->CR2 |= USART_CR2_LINEN; } + if (current_board->fan_max_rpm > 0U) { + llfan_init(); + } + microsecond_timer_init(); // init to SILENT and can silent diff --git a/board/stm32fx/llfan.h b/board/stm32fx/llfan.h index 403314153d..3e4b0fa3fd 100644 --- a/board/stm32fx/llfan.h +++ b/board/stm32fx/llfan.h @@ -1,23 +1,23 @@ // TACH interrupt handler void EXTI2_IRQ_Handler(void) { - volatile unsigned int pr = EXTI->PR & (1U << 2); - if ((pr & (1U << 2)) != 0U) { - fan_state.tach_counter++; - } - EXTI->PR = (1U << 2); + volatile unsigned int pr = EXTI->PR & (1U << 2); + if ((pr & (1U << 2)) != 0U) { + fan_state.tach_counter++; + } + EXTI->PR = (1U << 2); } -void fan_init(void){ - // 5000RPM * 4 tach edges / 60 seconds - REGISTER_INTERRUPT(EXTI2_IRQn, EXTI2_IRQ_Handler, 700U, FAULT_INTERRUPT_RATE_TACH) +void llfan_init(void) { + // 5000RPM * 4 tach edges / 60 seconds + REGISTER_INTERRUPT(EXTI2_IRQn, EXTI2_IRQ_Handler, 700U, FAULT_INTERRUPT_RATE_TACH) - // Init PWM speed control - pwm_init(TIM3, 3); + // Init PWM speed control + pwm_init(TIM3, 3); - // Init TACH interrupt - register_set(&(SYSCFG->EXTICR[0]), SYSCFG_EXTICR1_EXTI2_PD, 0xF00U); - register_set_bits(&(EXTI->IMR), (1U << 2)); - register_set_bits(&(EXTI->RTSR), (1U << 2)); - register_set_bits(&(EXTI->FTSR), (1U << 2)); - NVIC_EnableIRQ(EXTI2_IRQn); + // Init TACH interrupt + register_set(&(SYSCFG->EXTICR[0]), SYSCFG_EXTICR1_EXTI2_PD, 0xF00U); + register_set_bits(&(EXTI->IMR), (1U << 2)); + register_set_bits(&(EXTI->RTSR), (1U << 2)); + register_set_bits(&(EXTI->FTSR), (1U << 2)); + NVIC_EnableIRQ(EXTI2_IRQn); } diff --git a/board/stm32h7/llfan.h b/board/stm32h7/llfan.h index fc529dcbe2..dce622503a 100644 --- a/board/stm32h7/llfan.h +++ b/board/stm32h7/llfan.h @@ -1,2 +1,23 @@ -void EXTI2_IRQ_Handler(void) { } -void fan_init(void){ } +// TACH interrupt handler +void EXTI2_IRQ_Handler(void) { + volatile unsigned int pr = EXTI->PR1 & (1U << 2); + if ((pr & (1U << 2)) != 0U) { + fan_state.tach_counter++; + } + EXTI->PR1 = (1U << 2); +} + +void llfan_init(void) { + // 5000RPM * 4 tach edges / 60 seconds + REGISTER_INTERRUPT(EXTI2_IRQn, EXTI2_IRQ_Handler, 700U, FAULT_INTERRUPT_RATE_TACH) + + // Init PWM speed control + pwm_init(TIM3, 3); + + // Init TACH interrupt + register_set(&(SYSCFG->EXTICR[0]), SYSCFG_EXTICR1_EXTI2_PD, 0xF00U); + register_set_bits(&(EXTI->IMR1), (1U << 2)); + register_set_bits(&(EXTI->RTSR1), (1U << 2)); + register_set_bits(&(EXTI->FTSR1), (1U << 2)); + NVIC_EnableIRQ(EXTI2_IRQn); +} diff --git a/board/stm32h7/peripherals.h b/board/stm32h7/peripherals.h index 01e9ff7c73..f87acd4960 100644 --- a/board/stm32h7/peripherals.h +++ b/board/stm32h7/peripherals.h @@ -102,6 +102,7 @@ void peripherals_init(void) { RCC->APB2ENR |= RCC_APB2ENR_SPI4EN; // SPI RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; // SPI DMA 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_UART7EN; // SOM uart RCC->APB2ENR |= RCC_APB2ENR_TIM8EN; // clock source timer