diff --git a/ports/stm32/boards/OPENMVPT/board_init.c b/ports/stm32/boards/OPENMVPT/board_init.c index c0c5e9b6863..937abbcc2c9 100644 --- a/ports/stm32/boards/OPENMVPT/board_init.c +++ b/ports/stm32/boards/OPENMVPT/board_init.c @@ -5,6 +5,53 @@ #define OMV_BOOTLOADER_MAGIC_ADDR (0x2001FFFCU) #define OMV_BOOTLOADER_MAGIC_VALUE (0xB00710ADU) +void board_early_init(void) { + // Bring FLIR Lepton out of reset. + mp_hal_pin_config(pyb_pin_LEPTON_RSTN, MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_NONE, 0); + mp_hal_pin_config_speed(pyb_pin_LEPTON_RSTN, MP_HAL_PIN_SPEED_LOW); + mp_hal_pin_write(pyb_pin_LEPTON_RSTN, 1); + + // Release powerdown. + mp_hal_pin_config(pyb_pin_LEPTON_PWDN, MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_NONE, 0); + mp_hal_pin_config_speed(pyb_pin_LEPTON_PWDN, MP_HAL_PIN_SPEED_LOW); + mp_hal_pin_write(pyb_pin_LEPTON_PWDN, 1); + + // Enable FLIR Lepton MCLK. + mp_hal_pin_config(pyb_pin_LEPTON_MCLK, MP_HAL_PIN_MODE_ALT, MP_HAL_PIN_PULL_NONE, 4); + mp_hal_pin_config_speed(pyb_pin_LEPTON_MCLK, MP_HAL_PIN_SPEED_HIGH); + + // Hardcode the clock frequency as SystemClock_Config() hasn't been called yet. + int tclk = 120000000 * 2; // HAL_RCC_GetPCLK2Freq() * 2 + int period = (tclk / 24000000) - 1; + + TIM_HandleTypeDef mclk_tim_handle; + mclk_tim_handle.Instance = TIM15; + mclk_tim_handle.Init.Prescaler = 0; + mclk_tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP; + mclk_tim_handle.Init.Period = period; + mclk_tim_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + mclk_tim_handle.Init.RepetitionCounter = 0; + mclk_tim_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + + TIM_OC_InitTypeDef mclk_tim_oc_handle; + mclk_tim_oc_handle.Pulse = (period + 1) / 2; + mclk_tim_oc_handle.OCMode = TIM_OCMODE_PWM1; + mclk_tim_oc_handle.OCPolarity = TIM_OCPOLARITY_HIGH; + mclk_tim_oc_handle.OCNPolarity = TIM_OCNPOLARITY_HIGH; + mclk_tim_oc_handle.OCFastMode = TIM_OCFAST_DISABLE; + mclk_tim_oc_handle.OCIdleState = TIM_OCIDLESTATE_RESET; + mclk_tim_oc_handle.OCNIdleState = TIM_OCNIDLESTATE_RESET; + + __HAL_RCC_TIM15_CLK_ENABLE(); + __HAL_RCC_TIM15_CLK_SLEEP_ENABLE(); + __HAL_RCC_TIM15_FORCE_RESET(); + __HAL_RCC_TIM15_RELEASE_RESET(); + + HAL_TIM_PWM_Init(&mclk_tim_handle); + HAL_TIM_PWM_ConfigChannel(&mclk_tim_handle, &mclk_tim_oc_handle, TIM_CHANNEL_2); + HAL_TIM_PWM_Start(&mclk_tim_handle, TIM_CHANNEL_2); +} + void board_low_power(int mode) { switch (mode) { case 0: // Leave stop mode. diff --git a/ports/stm32/boards/OPENMVPT/mpconfigboard.h b/ports/stm32/boards/OPENMVPT/mpconfigboard.h index 29dc9f4e50e..da4903f1ba1 100644 --- a/ports/stm32/boards/OPENMVPT/mpconfigboard.h +++ b/ports/stm32/boards/OPENMVPT/mpconfigboard.h @@ -42,6 +42,9 @@ typedef unsigned int mp_uint_t; // must be pointer size #define MICROPY_HW_SPIFLASH_SOFT_RESET (1) #define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0) +#define MICROPY_BOARD_EARLY_INIT board_early_init +void board_early_init(void); + extern void board_enter_bootloader(void); #define MICROPY_BOARD_ENTER_BOOTLOADER(nargs, args) board_enter_bootloader() diff --git a/ports/stm32/boards/OPENMVPT/pins.csv b/ports/stm32/boards/OPENMVPT/pins.csv index 15b9ba5182f..af75cb3653d 100644 --- a/ports/stm32/boards/OPENMVPT/pins.csv +++ b/ports/stm32/boards/OPENMVPT/pins.csv @@ -19,6 +19,7 @@ LED_WHITE,PG3 LED_RED,-PC0 LED_GREEN,-PC2 LED_BLUE,-PC1 +BUZZER,PA1 PA4,PA4 PA15,PA15 PB3,PB3 @@ -105,3 +106,6 @@ TOUCH_SCL,PJ13 TOUCH_SDA,PJ14 TOUCH_INT,PJ6 WINC_INT,-PH5 +LEPTON_RSTN,PD5 +LEPTON_PWDN,PD4 +LEPTON_MCLK,PA3