diff --git a/src/drivers/pixart/src/pixspi.c b/src/drivers/pixart/src/pixspi.c index 11d09dde4..3f23224b1 100644 --- a/src/drivers/pixart/src/pixspi.c +++ b/src/drivers/pixart/src/pixspi.c @@ -1,44 +1,52 @@ -#include "pixspi.h" -#include -#include STM32_HAL_H +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2021 Lake Fu at + * Copyright (c) 2023 Ibrahim Abdelkader + * Copyright (c) 2023 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * Pixart SPI driver. + */ +#include "omv_boardconfig.h" +#ifdef ISC_SPI + #include #include +#include +#include STM32_HAL_H #include "common.h" -#include "omv_boardconfig.h" -#include +#include "omv_gpio.h" -#ifdef ISC_SPI -#define SPI_TIMEOUT (5000) /* in ms */ +#include "pixspi.h" -#define CS_PORT ISC_SPI_SSEL_PORT -#define CS_PIN ISC_SPI_SSEL_PIN -#define W_CS_LOW() HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET) -#define W_CS_HIGH() HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET) +#define SPI_TIMEOUT (5000) // in ms extern SPI_HandleTypeDef ISC_SPIHandle; static bool spi_send(uint8_t *data, uint16_t len) { HAL_StatusTypeDef status = HAL_OK; - W_CS_LOW(); - //mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); + omv_gpio_write(ISC_SPI_SSEL_PIN, 0); + // mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); status = HAL_SPI_Transmit( &ISC_SPIHandle, data, len, SPI_TIMEOUT); - //MICROPY_END_ATOMIC_SECTION(atomic_state); - W_CS_HIGH(); + // MICROPY_END_ATOMIC_SECTION(atomic_state); + omv_gpio_write(ISC_SPI_SSEL_PIN, 1); return (status == HAL_OK); } static bool spi_send_recv(uint8_t *txData, uint8_t *rxData, uint16_t len) { - W_CS_LOW(); - //mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); + omv_gpio_write(ISC_SPI_SSEL_PIN, 0); + // mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION(); bool res = (HAL_SPI_Transmit(&ISC_SPIHandle, txData, 1, SPI_TIMEOUT) == HAL_OK); res = (HAL_SPI_Receive(&ISC_SPIHandle, rxData, len, SPI_TIMEOUT) == HAL_OK); - //MICROPY_END_ATOMIC_SECTION(atomic_state); - W_CS_HIGH(); + // MICROPY_END_ATOMIC_SECTION(atomic_state); + omv_gpio_write(ISC_SPI_SSEL_PIN, 1); return res; } @@ -59,47 +67,38 @@ bool pixspi_init() ISC_SPIHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; ISC_SPIHandle.Init.CRCPolynomial = 0; - if (HAL_SPI_Init(&ISC_SPIHandle) != HAL_OK) - { - /* Initialization Error */ + if (HAL_SPI_Init(&ISC_SPIHandle) != HAL_OK) { + // Initialization Error return false; } - GPIO_InitTypeDef GPIO_InitStructure; // Re-Init GPIO for SPI SS(CS) pin, software control. - GPIO_InitStructure.Pin = ISC_SPI_SSEL_PIN; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Alternate = ISC_SPI_SSEL_AF; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(ISC_SPI_SSEL_PORT, &GPIO_InitStructure); + omv_gpio_config(ISC_SPI_SSEL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); // Default high. - W_CS_HIGH(); + omv_gpio_write(ISC_SPI_SSEL_PIN, 1); return true; } void pixspi_release() { - W_CS_LOW(); + omv_gpio_write(ISC_SPI_SSEL_PIN, 0); HAL_SPI_DeInit(&ISC_SPIHandle); } int pixspi_regs_read(uint8_t addr, uint8_t * data, uint16_t length) { - if ((addr & 0x80)) - { -#ifdef DEBUG + if ((addr & 0x80)) { + #ifdef DEBUG printf("pixspi_regs_read() address (0x%x) overflow.\n", addr); -#endif + #endif return -1; } addr |= 0x80; - if (!spi_send_recv(&addr, data, length)) - { -#ifdef DEBUG + if (!spi_send_recv(&addr, data, length)) { + #ifdef DEBUG printf("spi_send_recv() failed.\n"); -#endif + #endif return -1; } return 0; @@ -108,38 +107,29 @@ int pixspi_regs_read(uint8_t addr, uint8_t * data, uint16_t length) int pixspi_regs_write(uint8_t addr, const uint8_t * data, uint16_t length) { uint8_t buff[64] = {}; - if ((addr & 0x80) == 0x80) - { -#ifdef DEBUG + if ((addr & 0x80) == 0x80) { + #ifdef DEBUG printf("pixspi_regs_read() address (0x%x) overflow.\n", addr); -#endif + #endif return -1; } int32_t remaining = length; const static uint16_t MAX_LENGTH = 255; - do - { + do { uint16_t len = remaining>MAX_LENGTH?MAX_LENGTH:remaining; buff[0] = addr; memcpy(buff+1, data, len); bool res = spi_send(buff, len + 1); - if (!res) - { -#ifdef DEBUG + if (!res) { + #ifdef DEBUG printf("spi_send() failed.\n"); -#endif + #endif return -1; } remaining = remaining - MAX_LENGTH; - } - while (remaining > 0); + } while (remaining > 0); return 0; } -#else -bool pixspi_init() { return false; } -void pixspi_release() {} -int pixspi_regs_read(uint8_t addr, uint8_t * data, uint16_t length) { return -1; } -int pixspi_regs_write(uint8_t addr, const uint8_t * data, uint16_t length) { return -1; } -#endif \ No newline at end of file +#endif diff --git a/src/drivers/winc1500/src/nm_bsp.c b/src/drivers/winc1500/src/nm_bsp.c index 592038bc5..5eb01b0b7 100644 --- a/src/drivers/winc1500/src/nm_bsp.c +++ b/src/drivers/winc1500/src/nm_bsp.c @@ -10,10 +10,9 @@ #include "extint.h" #include "systick.h" #include "omv_boardconfig.h" +#include "omv_gpio.h" static tpfNmBspIsr gpfIsr; -static const mp_obj_fun_builtin_fixed_t irq_callback_obj; - /* * @fn nm_bsp_init * @brief Initialize BSP @@ -23,45 +22,21 @@ sint8 nm_bsp_init(void) { gpfIsr = NULL; - // Enable SPI clock - WINC_SPI_CLK_ENABLE(); - // Configure SPI pins - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_PULLDOWN; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; - GPIO_InitStructure.Alternate = WINC_SPI_AF; - - GPIO_InitStructure.Pin = WINC_SPI_MISO_PIN; - HAL_GPIO_Init(WINC_SPI_MISO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = WINC_SPI_MOSI_PIN; - HAL_GPIO_Init(WINC_SPI_MOSI_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = WINC_SPI_SCLK_PIN; - HAL_GPIO_Init(WINC_SPI_SCLK_PORT, &GPIO_InitStructure); + omv_gpio_config(WINC_SPI_MISO_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(WINC_SPI_MOSI_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(WINC_SPI_SCLK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_DOWN, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(WINC_SPI_SSEL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(WINC_SPI_SSEL_PIN, 1); // Configure GPIO pins - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; - GPIO_InitStructure.Alternate = 0; + omv_gpio_config(WINC_EN_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(WINC_EN_PIN, 1); - GPIO_InitStructure.Pin = WINC_EN_PIN; - HAL_GPIO_Init(WINC_EN_PORT, &GPIO_InitStructure); + omv_gpio_config(WINC_RST_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(WINC_RST_PIN, 1); - GPIO_InitStructure.Pin = WINC_CS_PIN; - HAL_GPIO_Init(WINC_CS_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = WINC_RST_PIN; - HAL_GPIO_Init(WINC_RST_PORT, &GPIO_InitStructure); - - HAL_GPIO_WritePin(WINC_EN_PORT, WINC_EN_PIN, GPIO_PIN_SET); - HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_SET); - HAL_GPIO_WritePin(WINC_RST_PORT, WINC_RST_PIN, GPIO_PIN_SET); - - /* Perform chip reset. */ + // Perform chip reset. nm_bsp_reset(); return M2M_SUCCESS; @@ -74,12 +49,12 @@ sint8 nm_bsp_init(void) */ void nm_bsp_reset(void) { - HAL_GPIO_WritePin(WINC_EN_PORT, WINC_EN_PIN, GPIO_PIN_RESET); - HAL_GPIO_WritePin(WINC_RST_PORT, WINC_RST_PIN, GPIO_PIN_RESET); + omv_gpio_write(WINC_EN_PIN, 0); + omv_gpio_write(WINC_RST_PIN, 0); nm_bsp_sleep(100); - HAL_GPIO_WritePin(WINC_EN_PORT, WINC_EN_PIN, GPIO_PIN_SET); + omv_gpio_write(WINC_EN_PIN, 1); nm_bsp_sleep(100); - HAL_GPIO_WritePin(WINC_RST_PORT, WINC_RST_PIN, GPIO_PIN_SET); + omv_gpio_write(WINC_RST_PIN, 1); nm_bsp_sleep(100); } @@ -95,6 +70,14 @@ void nm_bsp_sleep(uint32 u32TimeMsec) systick_sleep(u32TimeMsec); } +// Pin IRQ handler +static void nm_bsp_extint_callback(omv_gpio_t pin, void *data) +{ + if (gpfIsr) { + gpfIsr(); + } +} + /* * @fn nm_bsp_register_isr * @brief Register interrupt service routine @@ -104,9 +87,9 @@ void nm_bsp_sleep(uint32 u32TimeMsec) void nm_bsp_register_isr(tpfNmBspIsr pfIsr) { gpfIsr = pfIsr; - // register EXTI - extint_register((mp_obj_t)WINC_IRQ_PIN, GPIO_MODE_IT_FALLING, GPIO_PULLUP, (mp_obj_t)&irq_callback_obj, true); - extint_enable(WINC_IRQ_PIN->pin); + omv_gpio_config(WINC_IRQ_PIN, OMV_GPIO_MODE_IT_FALL, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_irq_register(WINC_IRQ_PIN, nm_bsp_extint_callback, NULL); + omv_gpio_irq_enable(WINC_IRQ_PIN, true); } /* @@ -115,20 +98,7 @@ void nm_bsp_register_isr(tpfNmBspIsr pfIsr) * @param[IN] u8Enable * '0' disable interrupts. '1' enable interrupts */ -void nm_bsp_interrupt_ctrl(uint8 u8Enable) +void nm_bsp_interrupt_ctrl(uint8 enable) { - if (u8Enable) { - extint_enable(WINC_IRQ_PIN->pin); - } else { - extint_disable(WINC_IRQ_PIN->pin); - } + omv_gpio_irq_enable(WINC_IRQ_PIN, enable); } - -static mp_obj_t irq_callback(mp_obj_t line) { - if (gpfIsr) { - gpfIsr(); - } - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(irq_callback_obj, irq_callback); diff --git a/src/drivers/winc1500/src/nm_bus_wrapper.c b/src/drivers/winc1500/src/nm_bus_wrapper.c index 127d0c6eb..88c26fa35 100644 --- a/src/drivers/winc1500/src/nm_bus_wrapper.c +++ b/src/drivers/winc1500/src/nm_bus_wrapper.c @@ -52,6 +52,7 @@ #include "genhdr/pins.h" #include "extint.h" #include "omv_boardconfig.h" +#include "omv_gpio.h" static SPI_HandleTypeDef SPI_HANDLE; @@ -93,7 +94,7 @@ static sint8 nm_i2c_write_special(uint8 *wb1, uint16 sz1, uint8 *wb2, uint16 sz2 static sint8 spi_rw(uint8 *tx_buf, uint8 *rx_buf, uint16 u16Sz) { sint8 result = M2M_SUCCESS; - WINC_CS_LOW(); + omv_gpio_write(WINC_SPI_SSEL_PIN, 0); if (tx_buf != 0) { if (HAL_SPI_Transmit(&SPI_HANDLE, tx_buf, u16Sz, WINC_SPI_TIMEOUT) != HAL_OK) { result = M2M_ERR_BUS_FAIL; @@ -104,7 +105,7 @@ static sint8 spi_rw(uint8 *tx_buf, uint8 *rx_buf, uint16 u16Sz) result = M2M_ERR_BUS_FAIL; } } - WINC_CS_HIGH(); + omv_gpio_write(WINC_SPI_SSEL_PIN, 1); return result; } #endif @@ -118,7 +119,7 @@ sint8 nm_bus_init(void *pvinit) { sint8 result = M2M_SUCCESS; - WINC_CS_HIGH(); + omv_gpio_write(WINC_SPI_SSEL_PIN, 1); // SPI configuration SPI_HANDLE.Instance = WINC_SPI; @@ -134,6 +135,9 @@ sint8 nm_bus_init(void *pvinit) SPI_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; SPI_HANDLE.Init.CRCPolynomial = 7; + // Enable SPI clock + WINC_SPI_CLK_ENABLE(); + // Init SPI HAL_SPI_DeInit(&SPI_HANDLE); if (HAL_SPI_Init(&SPI_HANDLE) != HAL_OK) { @@ -141,7 +145,7 @@ sint8 nm_bus_init(void *pvinit) } nm_bsp_reset(); - WINC_CS_HIGH(); + omv_gpio_write(WINC_SPI_SSEL_PIN, 1); return result; } diff --git a/src/drivers/winc1500/src/winc.c b/src/drivers/winc1500/src/winc.c index c29bbb21f..c24ca6208 100644 --- a/src/drivers/winc1500/src/winc.c +++ b/src/drivers/winc1500/src/winc.c @@ -8,13 +8,13 @@ * * WINC1500 driver. */ -#include "winc.h" -#include "common.h" +#include STM32_HAL_H #include #include #include #include -#include STM32_HAL_H +#include "winc.h" +#include "common.h" // WINC's includes #include "driver/include/nmasic.h" diff --git a/src/micropython b/src/micropython index 84260c659..ad78d24e4 160000 --- a/src/micropython +++ b/src/micropython @@ -1 +1 @@ -Subproject commit 84260c659ca1dfda9b94e5821b57dfdc005d9154 +Subproject commit ad78d24e47cb1d0f7940c039d873f832bbcf7c0f diff --git a/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/omv_boardconfig.h b/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/omv_boardconfig.h index ddc05e57e..1d1be0d91 100644 --- a/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/omv_boardconfig.h +++ b/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/omv_boardconfig.h @@ -134,16 +134,6 @@ extern unsigned char *OMV_UNIQUE_ID_ADDR; // Unique address. #define LCD_RST_PIN (4) #define LCD_RS_PIN (0) -// WiFi/NINA config. -#define WIFI_SPI (spi1) -#define WIFI_CS_PIN (9) -#define WIFI_MOSI_PIN (11) -#define WIFI_MISO_PIN (8) -#define WIFI_SCLK_PIN (14) -#define WIFI_RST_PIN (3) -#define WIFI_GPIO0_PIN (2) -#define WIFI_ACK_PIN (10) - // AUDIO config. #define PDM_PIO (pio1) #define PDM_SM (0) @@ -161,7 +151,7 @@ extern unsigned char *OMV_UNIQUE_ID_ADDR; // Unique address. #define DCMI_DMA_IRQ (DMA_IRQ_0) #define DCMI_DMA_CHANNEL (0) -#define DCMI_PWDN_PIN (0) +#define DCMI_POWER_PIN (0) #define DCMI_RESET_PIN (1) #define DCMI_D0_PIN (15) @@ -175,24 +165,9 @@ extern unsigned char *OMV_UNIQUE_ID_ADDR; // Unique address. #define DCMI_XCLK_PIN (28) +// Must match the pins defined in dcmi.pio. #define DCMI_PXCLK_PIN (29) #define DCMI_HSYNC_PIN (27) #define DCMI_VSYNC_PIN (26) -#if defined(DCMI_RESET_PIN) -#define DCMI_RESET_LOW() gpio_put(DCMI_RESET_PIN, 0) -#define DCMI_RESET_HIGH() gpio_put(DCMI_RESET_PIN, 1) -#else -#define DCMI_RESET_LOW() -#define DCMI_RESET_HIGH() -#endif - -#if defined(DCMI_PWDN_PIN) -#define DCMI_PWDN_LOW() gpio_put(DCMI_PWDN_PIN, 0) -#define DCMI_PWDN_HIGH() gpio_put(DCMI_PWDN_PIN, 1) -#else -#define DCMI_PWDN_LOW() -#define DCMI_PWDN_HIGH() -#endif - #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h b/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h index 50a011163..c25eeb025 100644 --- a/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h +++ b/src/omv/boards/ARDUINO_NICLA_VISION/omv_boardconfig.h @@ -23,10 +23,10 @@ #define OMV_XCLK_TIM (1U) #define OMV_XCLK_OSC (2U) -// Sensor external clock source. +// Sensor external clock source #define OMV_XCLK_SOURCE (OMV_XCLK_TIM) -// Sensor external clock timer frequency. +// Sensor external clock timer frequency #define OMV_XCLK_FREQUENCY (12000000) // GC4145 Sensor Settings @@ -35,10 +35,18 @@ // Enable hardware JPEG #define OMV_HARDWARE_JPEG (1) -// Enable MDMA sensor offload. +// Enable MDMA sensor offload #define OMV_ENABLE_SENSOR_MDMA (1) -// Enable sensor drivers +// Enable additional GPIO banks +#define OMV_ENABLE_GPIO_BANK_F (1) +#define OMV_ENABLE_GPIO_BANK_G (1) +#define OMV_ENABLE_GPIO_BANK_H (1) +#define OMV_ENABLE_GPIO_BANK_I (1) +#define OMV_ENABLE_GPIO_BANK_J (1) +#define OMV_ENABLE_GPIO_BANK_K (1) + +// Configure image sensor drivers #define OMV_ENABLE_OV2640 (0) #define OMV_ENABLE_OV5640 (0) #define OMV_ENABLE_OV7690 (1) @@ -50,8 +58,12 @@ #define OMV_ENABLE_HM01B0 (0) #define OMV_ENABLE_GC2145 (1) -// Enable sensor features -#define OMV_ENABLE_OV5640_AF (0) +// Configure FIR sensors drivers +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (1) // Enable WiFi debug #define OMV_ENABLE_WIFIDBG (0) @@ -76,9 +88,8 @@ // USB IRQn. #define OMV_USB_IRQN (OTG_HS_IRQn) #define OMV_USB_ULPI (1) -#define OMV_USB_ULPI_DIR_PORT (GPIOC) -#define OMV_USB_ULPI_DIR_PIN (GPIO_PIN_2) -#define OMV_USB_ULPI_DIR_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define OMV_USB_ULPI_STP_PIN (&omv_pin_C0_OTG_HS) +#define OMV_USB_ULPI_DIR_PIN (&omv_pin_C2_OTG_HS) // Defined for cpu frequency scaling to override the revid. #define OMV_MAX_CPU_FREQ (400) @@ -210,118 +221,53 @@ // Image sensor I2C #define ISC_I2C (I2C3) #define ISC_I2C_ID (3) -#define ISC_I2C_AF (GPIO_AF4_I2C3) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_A8_I2C3) +#define ISC_I2C_SDA_PIN (&omv_pin_C9_I2C3) #define ISC_I2C_CLK_ENABLE() __I2C3_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __I2C3_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOA) -#define ISC_I2C_SCL_PIN (GPIO_PIN_8) -#define ISC_I2C_SDA_PORT (GPIOC) -#define ISC_I2C_SDA_PIN (GPIO_PIN_9) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C3_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C3_RELEASE_RESET() // FIR I2C #define FIR_I2C (I2C1) #define FIR_I2C_ID (1) -#define FIR_I2C_AF (GPIO_AF4_I2C1) +#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) +#define FIR_I2C_SCL_PIN (&omv_pin_B8_I2C1) +#define FIR_I2C_SDA_PIN (&omv_pin_B9_I2C1) #define FIR_I2C_CLK_ENABLE() __I2C1_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __I2C1_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOB) -#define FIR_I2C_SCL_PIN (GPIO_PIN_8) -#define FIR_I2C_SDA_PORT (GPIOB) -#define FIR_I2C_SDA_PIN (GPIO_PIN_9) -#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() +#define SOFT_I2C_SIOC_PIN (&omv_pin_C10_GPIO) +#define SOFT_I2C_SIOD_PIN (&omv_pin_C11_GPIO) +#define SOFT_I2C_SPIN_DELAY 64 + /* DCMI */ #define DCMI_TIM (TIM3) -#define DCMI_TIM_PORT (GPIOA) -#define DCMI_TIM_PIN (GPIO_PIN_7) -#define DCMI_TIM_AF (GPIO_AF2_TIM3) +#define DCMI_TIM_PIN (&omv_pin_A7_TIM3) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_2) #define DCMI_TIM_CLK_ENABLE() __TIM3_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM3_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK1Freq() -//#define DCMI_RESET_PORT (GPIOA) -//#define DCMI_RESET_PIN (GPIO_PIN_10) +//#define DCMI_RESET_PIN (&omv_pin_A10_GPIO) +//#define DCMI_POWER_PIN (&omv_pin_G3_GPIO) +//#define DCMI_FSYNC_PIN (&omv_pin_B4_GPIO) -//#define DCMI_PWDN_PORT (GPIOG) -//#define DCMI_PWDN_PIN (GPIO_PIN_3) +#define DCMI_D0_PIN (&omv_pin_C6_DCMI) +#define DCMI_D1_PIN (&omv_pin_C7_DCMI) +#define DCMI_D2_PIN (&omv_pin_E0_DCMI) +#define DCMI_D3_PIN (&omv_pin_E1_DCMI) +#define DCMI_D4_PIN (&omv_pin_E4_DCMI) +#define DCMI_D5_PIN (&omv_pin_D3_DCMI) +#define DCMI_D6_PIN (&omv_pin_E5_DCMI) +#define DCMI_D7_PIN (&omv_pin_E6_DCMI) -//#define DCMI_FSYNC_PORT (GPIOB) -//#define DCMI_FSYNC_PIN (GPIO_PIN_4) - -#define DCMI_D0_PORT (GPIOC) -#define DCMI_D0_PIN (GPIO_PIN_6) - -#define DCMI_D1_PORT (GPIOC) -#define DCMI_D1_PIN (GPIO_PIN_7) - -#define DCMI_D2_PORT (GPIOE) -#define DCMI_D2_PIN (GPIO_PIN_0) - -#define DCMI_D3_PORT (GPIOE) -#define DCMI_D3_PIN (GPIO_PIN_1) - -#define DCMI_D4_PORT (GPIOE) -#define DCMI_D4_PIN (GPIO_PIN_4) - -#define DCMI_D5_PORT (GPIOD) -#define DCMI_D5_PIN (GPIO_PIN_3) - -#define DCMI_D6_PORT (GPIOE) -#define DCMI_D6_PIN (GPIO_PIN_5) - -#define DCMI_D7_PORT (GPIOE) -#define DCMI_D7_PIN (GPIO_PIN_6) - -#define DCMI_HSYNC_PORT (GPIOA) -#define DCMI_HSYNC_PIN (GPIO_PIN_4) - -#define DCMI_VSYNC_PORT (GPIOG) -#define DCMI_VSYNC_PIN (GPIO_PIN_9) - -#define DCMI_PXCLK_PORT (GPIOA) -#define DCMI_PXCLK_PIN (GPIO_PIN_6) - -#if defined(DCMI_RESET_PIN) -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) -#else -#define DCMI_RESET_LOW() -#define DCMI_RESET_HIGH() -#endif - -#if defined(DCMI_PWDN_PIN) -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#else -#define DCMI_PWDN_LOW() -#define DCMI_PWDN_HIGH() -#endif - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (9) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOG) -#define DCMI_VSYNC_EXTI_SHARED (0) - -#define SOFT_I2C_PORT GPIOC -#define SOFT_I2C_SIOC_PIN GPIO_PIN_10 -#define SOFT_I2C_SIOD_PIN GPIO_PIN_11 - -#define SOFT_I2C_SIOC_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOC_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOD_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_READ() HAL_GPIO_ReadPin (SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN) -#define SOFT_I2C_SIOD_WRITE(bit) HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, bit); - -#define SOFT_I2C_SPIN_DELAY 64 +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_VSYNC_PIN (&omv_pin_G9_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) // DFSDM1 #define AUDIO_DFSDM (DFSDM1_Channel2) @@ -331,13 +277,8 @@ #define AUDIO_DFSDM_FREQMHZ (50) #define AUDIO_MAX_CHANNELS (1) // Maximum number of channels. -#define AUDIO_DFSDM_CK_PORT (GPIOD) -#define AUDIO_DFSDM_CK_PIN (GPIO_PIN_10) -#define AUDIO_DFSDM_CK_AF (GPIO_AF3_DFSDM1) - -#define AUDIO_DFSDM_D1_PORT (GPIOE) -#define AUDIO_DFSDM_D1_PIN (GPIO_PIN_7) -#define AUDIO_DFSDM_D1_AF (GPIO_AF3_DFSDM1) +#define AUDIO_DFSDM_CK_PIN (&omv_pin_D10_DFSDM1) +#define AUDIO_DFSDM_D1_PIN (&omv_pin_E7_DFSDM1) #define AUDIO_DFSDM_FLT0 DFSDM1_Filter0 #define AUDIO_DFSDM_FLT0_IRQ DFSDM1_FLT0_IRQn @@ -351,9 +292,7 @@ #define AUDIO_DFSDM_CLK_DISABLE() __HAL_RCC_DFSDM1_CLK_DISABLE() #define AUDIO_DFSDM_DMA_CLK_ENABLE() __HAL_RCC_DMA1_CLK_ENABLE() -#define IMU_CHIP_LSM6DSOX (1) #define IMU_SPI (SPI5) -#define IMU_SPI_AF (GPIO_AF5_SPI5) // SPI4/5 clock source is PLL3 (160MHz/16 == 10MHz). #define IMU_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_16) @@ -363,67 +302,37 @@ #define IMU_SPI_CLK_ENABLE() __HAL_RCC_SPI5_CLK_ENABLE() #define IMU_SPI_CLK_DISABLE() __HAL_RCC_SPI5_CLK_DISABLE() -#define IMU_SPI_SSEL_PORT (GPIOF) -#define IMU_SPI_SSEL_PIN (GPIO_PIN_6) +#define IMU_SPI_SCLK_PIN (&omv_pin_F7_SPI5) +#define IMU_SPI_MISO_PIN (&omv_pin_F8_SPI5) +#define IMU_SPI_MOSI_PIN (&omv_pin_F11_SPI5) +#define IMU_SPI_SSEL_PIN (&omv_pin_F6_SPI5) -#define IMU_SPI_SCLK_PORT (GPIOF) -#define IMU_SPI_SCLK_PIN (GPIO_PIN_7) - -#define IMU_SPI_MISO_PORT (GPIOF) -#define IMU_SPI_MISO_PIN (GPIO_PIN_8) - -#define IMU_SPI_MOSI_PORT (GPIOF) -#define IMU_SPI_MOSI_PIN (GPIO_PIN_11) +// IMU configuration +#define OMV_IMU_X_Y_ROTATION_DEGREES 90 +#define OMV_IMU_MOUNTING_Z_DIRECTION -1 +#define IMU_CHIP_LSM6DSOX (1) // SPI LCD Interface #define OMV_SPI_LCD_CONTROLLER (&spi_obj[3]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI4) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_14) -#define OMV_SPI_LCD_MOSI_PORT (GPIOE) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI4) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_E14_SPI4) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_E13_SPI4) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_E12_SPI4) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_E11_GPIO) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_MISO_PORT (GPIOE) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI4) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_C11_GPIO) +//#define OMV_SPI_LCD_BL_PIN (&omv_pin_A4_GPIO) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_C10_GPIO) -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_SCLK_PORT (GPIOE) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI4) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_11) -#define OMV_SPI_LCD_CS_PORT (GPIOE) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_10) -#define OMV_SPI_LCD_RST_PORT (GPIOC) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_11) -#define OMV_SPI_LCD_RS_PORT (GPIOC) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -//#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_4) -//#define OMV_SPI_LCD_BL_PORT (GPIOA) -//#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -//#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) - -//#define OMV_SPI_LCD_BL_DAC (DAC1) -//#define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_1) -//#define OMV_SPI_LCD_BL_DAC_CLK_ENABLE() __HAL_RCC_DAC12_CLK_ENABLE() -//#define OMV_SPI_LCD_BL_DAC_CLK_DISABLE() __HAL_RCC_DAC12_CLK_DISABLE() -//#define OMV_SPI_LCD_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET() -//#define OMV_SPI_LCD_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET() - -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (1) +#ifdef OMV_SPI_LCD_BL_PIN +#define OMV_SPI_LCD_BL_DAC (DAC1) +#define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_1) +#define OMV_SPI_LCD_BL_DAC_CLK_ENABLE() __HAL_RCC_DAC12_CLK_ENABLE() +#define OMV_SPI_LCD_BL_DAC_CLK_DISABLE() __HAL_RCC_DAC12_CLK_DISABLE() +#define OMV_SPI_LCD_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET() +#define OMV_SPI_LCD_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET() +#endif // FIR Lepton #define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID) @@ -431,33 +340,9 @@ #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[3]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI4) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_14) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOE) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF5_SPI4) - -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_13) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOE) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF5_SPI4) - -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_12) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOE) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF5_SPI4) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_11) -#define OMV_FIR_LEPTON_CS_PORT (GPIOE) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) - -// IMU Orientation -#define OMV_IMU_X_Y_ROTATION_DEGREES 90 -#define OMV_IMU_MOUNTING_Z_DIRECTION -1 - -// Enable additional GPIO banks for DRAM... -#define OMV_ENABLE_GPIO_BANK_F -#define OMV_ENABLE_GPIO_BANK_G -#define OMV_ENABLE_GPIO_BANK_H -#define OMV_ENABLE_GPIO_BANK_I -#define OMV_ENABLE_GPIO_BANK_J -#define OMV_ENABLE_GPIO_BANK_K +#define OMV_FIR_LEPTON_MOSI_PIN (&omv_pin_E14_SPI4) +#define OMV_FIR_LEPTON_MISO_PIN (&omv_pin_E13_SPI4) +#define OMV_FIR_LEPTON_SCLK_PIN (&omv_pin_E12_SPI4) +#define OMV_FIR_LEPTON_SSEL_PIN (&omv_pin_E11_GPIO) #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/ARDUINO_NICLA_VISION/omv_pins.h b/src/omv/boards/ARDUINO_NICLA_VISION/omv_pins.h new file mode 100644 index 000000000..8498345bf --- /dev/null +++ b/src/omv/boards/ARDUINO_NICLA_VISION/omv_pins.h @@ -0,0 +1,34 @@ +OMV_GPIO_DEFINE(A, 4, NONE, GPIO) +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 7, AF2, TIM3) +OMV_GPIO_DEFINE(A, 8, AF4, I2C3) +OMV_GPIO_DEFINE(A, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 4, NONE, GPIO) +OMV_GPIO_DEFINE(B, 8, AF4, I2C1) +OMV_GPIO_DEFINE(B, 9, AF4, I2C1) +OMV_GPIO_DEFINE(C, 0, AF10, OTG_HS) +OMV_GPIO_DEFINE(C, 2, AF10, OTG_HS) +OMV_GPIO_DEFINE(C, 6, AF13, DCMI) +OMV_GPIO_DEFINE(C, 7, AF13, DCMI) +OMV_GPIO_DEFINE(C, 9, AF4, I2C3) +OMV_GPIO_DEFINE(C, 10, NONE, GPIO) +OMV_GPIO_DEFINE(C, 11, NONE, GPIO) +OMV_GPIO_DEFINE(D, 3, AF13, DCMI) +OMV_GPIO_DEFINE(D, 10, AF3, DFSDM1) +OMV_GPIO_DEFINE(E, 0, AF13, DCMI) +OMV_GPIO_DEFINE(E, 1, AF13, DCMI) +OMV_GPIO_DEFINE(E, 4, AF13, DCMI) +OMV_GPIO_DEFINE(E, 5, AF13, DCMI) +OMV_GPIO_DEFINE(E, 6, AF13, DCMI) +OMV_GPIO_DEFINE(E, 7, AF3, DFSDM1) +OMV_GPIO_DEFINE(E, 11, NONE, GPIO) +OMV_GPIO_DEFINE(E, 12, AF5, SPI4) +OMV_GPIO_DEFINE(E, 13, AF5, SPI4) +OMV_GPIO_DEFINE(E, 14, AF5, SPI4) +OMV_GPIO_DEFINE(F, 6, AF5, SPI5) +OMV_GPIO_DEFINE(F, 7, AF5, SPI5) +OMV_GPIO_DEFINE(F, 8, AF5, SPI5) +OMV_GPIO_DEFINE(F, 11, AF5, SPI5) +OMV_GPIO_DEFINE(G, 3, NONE, GPIO) +OMV_GPIO_DEFINE(G, 9, AF13, DCMI) diff --git a/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h b/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h index fa468b5fc..f6c7d640a 100644 --- a/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h +++ b/src/omv/boards/ARDUINO_PORTENTA_H7/omv_boardconfig.h @@ -28,27 +28,20 @@ // Sensor external clock timer frequency. #define OMV_XCLK_FREQUENCY (12000000) -// Sensor PLL register value. -#define OMV_OV7725_PLL_CONFIG (0x41) // x4 - -// Sensor Banding Filter Value -#define OMV_OV7725_BANDING (0x7F) - -// OV5640 Sensor Settings -#define OMV_OV5640_XCLK_FREQ (12500000) -#define OMV_OV5640_PLL_CTRL2 (0x7E) -#define OMV_OV5640_PLL_CTRL3 (0x13) -#define OMV_OV5640_REV_Y_CHECK (0) -#define OMV_OV5640_REV_Y_FREQ (12500000) -#define OMV_OV5640_REV_Y_CTRL2 (0x7E) -#define OMV_OV5640_REV_Y_CTRL3 (0x13) - // Enable hardware JPEG #define OMV_HARDWARE_JPEG (1) // Enable MDMA sensor offload. #define OMV_ENABLE_SENSOR_MDMA (1) +// Enable additional GPIO banks. +#define OMV_ENABLE_GPIO_BANK_F (1) +#define OMV_ENABLE_GPIO_BANK_G (1) +#define OMV_ENABLE_GPIO_BANK_H (1) +#define OMV_ENABLE_GPIO_BANK_I (1) +#define OMV_ENABLE_GPIO_BANK_J (1) +#define OMV_ENABLE_GPIO_BANK_K (1) + // Enable sensor drivers #define OMV_ENABLE_OV2640 (0) #define OMV_ENABLE_OV5640 (1) @@ -62,10 +55,30 @@ #define OMV_ENABLE_HM0360 (1) #define OMV_ENABLE_GC2145 (0) -// Enable sensor features -#define OMV_ENABLE_OV5640_AF (1) +// OV7725 sensor settings +#define OMV_OV7725_PLL_CONFIG (0x41) // x4 +#define OMV_OV7725_BANDING (0x7F) + +// MT9V0XX sensor settings #define MT9V0XX_XCLK_FREQ (25000000) +// OV5640 sensor settings +#define OMV_ENABLE_OV5640_AF (1) +#define OMV_OV5640_XCLK_FREQ (12500000) +#define OMV_OV5640_PLL_CTRL2 (0x7E) +#define OMV_OV5640_PLL_CTRL3 (0x13) +#define OMV_OV5640_REV_Y_CHECK (0) +#define OMV_OV5640_REV_Y_FREQ (12500000) +#define OMV_OV5640_REV_Y_CTRL2 (0x7E) +#define OMV_OV5640_REV_Y_CTRL3 (0x13) + +// FIR Module +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (1) + // Enable WiFi debug #define OMV_ENABLE_WIFIDBG (0) @@ -89,9 +102,8 @@ // USB IRQn. #define OMV_USB_IRQN (OTG_HS_IRQn) #define OMV_USB_ULPI (1) -#define OMV_USB_ULPI_DIR_PORT (GPIOI) -#define OMV_USB_ULPI_DIR_PIN (GPIO_PIN_11) -#define OMV_USB_ULPI_DIR_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() +#define OMV_USB_ULPI_STP_PIN (&omv_pin_C0_OTG_HS) +#define OMV_USB_ULPI_DIR_PIN (&omv_pin_I11_OTG_HS) // Defined for cpu frequency scaling to override the revid. #define OMV_MAX_CPU_FREQ (400) @@ -223,146 +235,78 @@ // Image sensor I2C #define ISC_I2C (I2C3) #define ISC_I2C_ID (3) -#define ISC_I2C_AF (GPIO_AF4_I2C3) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_H7_I2C3) +#define ISC_I2C_SDA_PIN (&omv_pin_H8_I2C3) #define ISC_I2C_CLK_ENABLE() __I2C3_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __I2C3_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOH) -#define ISC_I2C_SCL_PIN (GPIO_PIN_7) -#define ISC_I2C_SDA_PORT (GPIOH) -#define ISC_I2C_SDA_PIN (GPIO_PIN_8) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C3_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C3_RELEASE_RESET() // Alternate I2C bus for the Portenta breakout #define ISC_I2C_ALT (I2C4) #define ISC_I2C_ALT_ID (4) -#define ISC_I2C_ALT_AF (GPIO_AF4_I2C4) +#define ISC_I2C_ALT_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_ALT_SCL_PIN (&omv_pin_H11_I2C4) +#define ISC_I2C_ALT_SDA_PIN (&omv_pin_H12_I2C4) #define ISC_I2C_ALT_CLK_ENABLE() __HAL_RCC_I2C4_CLK_ENABLE() #define ISC_I2C_ALT_CLK_DISABLE() __HAL_RCC_I2C4_CLK_DISABLE() -#define ISC_I2C_ALT_SCL_PORT (GPIOH) -#define ISC_I2C_ALT_SCL_PIN (GPIO_PIN_11) -#define ISC_I2C_ALT_SDA_PORT (GPIOH) -#define ISC_I2C_ALT_SDA_PIN (GPIO_PIN_12) -#define ISC_I2C_ALT_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_ALT_FORCE_RESET() __HAL_RCC_I2C4_FORCE_RESET() #define ISC_I2C_ALT_RELEASE_RESET() __HAL_RCC_I2C4_RELEASE_RESET() // FIR I2C #define FIR_I2C (I2C3) #define FIR_I2C_ID (3) -#define FIR_I2C_AF (GPIO_AF4_I2C3) +#define FIR_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define FIR_I2C_SCL_PIN (&omv_pin_H7_I2C3) +#define FIR_I2C_SDA_PIN (&omv_pin_H8_I2C3) #define FIR_I2C_CLK_ENABLE() __I2C3_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __I2C3_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOH) -#define FIR_I2C_SCL_PIN (GPIO_PIN_7) -#define FIR_I2C_SDA_PORT (GPIOH) -#define FIR_I2C_SDA_PIN (GPIO_PIN_8) -#define FIR_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C3_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C3_RELEASE_RESET() +//#define SOFT_I2C_SIOC_PIN (&omv_pin_B10_GPIO) +//#define SOFT_I2C_SIOD_PIN (&omv_pin_B11_GPIO) +//#define SOFT_I2C_SPIN_DELAY 64 + // GPIO.0 is connected to the sensor module reset pin on the Portenta // breakout board and to the LDO's LDO_ENABLE pin on the Himax shield. // The sensor probing process will detect the right reset or powerdown // polarity, so it should be fine to enable it for both boards. -#define DCMI_RESET_PIN (GPIO_PIN_13) -#define DCMI_RESET_PORT (GPIOC) +#define DCMI_RESET_PIN (&omv_pin_C13_GPIO) // GPIO.1 is connected to the sensor module frame sync pin (OUTPUT) on // the Portenta breakout board and to the INT pin (OUTPUT) on the Himax // shield, so it can't be enabled for the two boards at the same time. -//#define DCMI_FSYNC_PIN (GPIO_PIN_15) -//#define DCMI_FSYNC_PORT (GPIOC) +//#define DCMI_FSYNC_PIN (&omv_pin_C15_GPIO) // GPIO.3 is connected to the powerdown pin on the Portenta breakout board, // and to the STROBE pin on the Himax shield, however it's not actually // used on the Himax shield and can be safely enable for the two boards. -#define DCMI_PWDN_PIN (GPIO_PIN_5) -#define DCMI_PWDN_PORT (GPIOD) +#define DCMI_POWER_PIN (&omv_pin_D5_GPIO) /* DCMI */ #define DCMI_TIM (TIM1) -#define DCMI_TIM_PIN (GPIO_PIN_1) -#define DCMI_TIM_PORT (GPIOK) +#define DCMI_TIM_PIN (&omv_pin_K1_TIM1) // Enable TIM1-CH1 on PA8 too for Portenta breakout. -#define DCMI_TIM_EXT_PIN (GPIO_PIN_8) -#define DCMI_TIM_EXT_PORT (GPIOA) -#define DCMI_TIM_AF (GPIO_AF1_TIM1) +#define DCMI_TIM_EXT_PIN (&omv_pin_A8_TIM1) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1) #define DCMI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() -#define DCMI_D0_PIN (GPIO_PIN_9) -#define DCMI_D1_PIN (GPIO_PIN_10) -#define DCMI_D2_PIN (GPIO_PIN_11) -#define DCMI_D3_PIN (GPIO_PIN_12) -#define DCMI_D4_PIN (GPIO_PIN_14) -#define DCMI_D5_PIN (GPIO_PIN_4) -#define DCMI_D6_PIN (GPIO_PIN_6) -#define DCMI_D7_PIN (GPIO_PIN_7) +#define DCMI_D0_PIN (&omv_pin_H9_DCMI) +#define DCMI_D1_PIN (&omv_pin_H10_DCMI) +#define DCMI_D2_PIN (&omv_pin_H11_DCMI) +#define DCMI_D3_PIN (&omv_pin_H12_DCMI) +#define DCMI_D4_PIN (&omv_pin_H14_DCMI) +#define DCMI_D5_PIN (&omv_pin_I4_DCMI) +#define DCMI_D6_PIN (&omv_pin_I6_DCMI) +#define DCMI_D7_PIN (&omv_pin_I7_DCMI) -#define DCMI_D0_PORT (GPIOH) -#define DCMI_D1_PORT (GPIOH) -#define DCMI_D2_PORT (GPIOH) -#define DCMI_D3_PORT (GPIOH) -#define DCMI_D4_PORT (GPIOH) -#define DCMI_D5_PORT (GPIOI) -#define DCMI_D6_PORT (GPIOI) -#define DCMI_D7_PORT (GPIOI) - -#define DCMI_HSYNC_PIN (GPIO_PIN_4) -#define DCMI_VSYNC_PIN (GPIO_PIN_5) -#define DCMI_PXCLK_PIN (GPIO_PIN_6) - -#define DCMI_HSYNC_PORT (GPIOA) -#define DCMI_VSYNC_PORT (GPIOI) -#define DCMI_PXCLK_PORT (GPIOA) - -#if defined(DCMI_RESET_PIN) -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) -#else -#define DCMI_RESET_LOW() -#define DCMI_RESET_HIGH() -#endif - -#if defined(DCMI_PWDN_PIN) -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) -#else -#define DCMI_PWDN_LOW() -#define DCMI_PWDN_HIGH() -#endif - -#if defined(DCMI_FSYNC_PIN) -#define DCMI_FSYNC_LOW() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_RESET) -#define DCMI_FSYNC_HIGH() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_SET) -#else -#define DCMI_FSYNC_LOW() -#define DCMI_FSYNC_HIGH() -#endif - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (5) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOI) -#define DCMI_VSYNC_EXTI_SHARED (1) - -#define SOFT_I2C_PORT GPIOB -#define SOFT_I2C_SIOC_PIN GPIO_PIN_10 -#define SOFT_I2C_SIOD_PIN GPIO_PIN_11 - -#define SOFT_I2C_SIOC_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOC_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOD_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_READ() HAL_GPIO_ReadPin (SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN) -#define SOFT_I2C_SIOD_WRITE(bit) HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, bit); - -#define SOFT_I2C_SPIN_DELAY 64 +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_VSYNC_PIN (&omv_pin_I5_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) // SAI4 #define AUDIO_SAI (SAI4_Block_A) @@ -371,13 +315,8 @@ #define AUDIO_SAI_FREQKHZ (2048U) // 2048KHz #define AUDIO_MAX_CHANNELS (2) // Maximum number of channels. -#define AUDIO_SAI_CK_PORT (GPIOE) -#define AUDIO_SAI_CK_PIN (GPIO_PIN_2) -#define AUDIO_SAI_CK_AF (GPIO_AF10_SAI4) - -#define AUDIO_SAI_D1_PORT (GPIOB) -#define AUDIO_SAI_D1_PIN (GPIO_PIN_2) -#define AUDIO_SAI_D1_AF (GPIO_AF10_SAI4) +#define AUDIO_SAI_CK_PIN (&omv_pin_E2_SAI4) +#define AUDIO_SAI_D1_PIN (&omv_pin_B2_SAI4) #define AUDIO_SAI_DMA_STREAM BDMA_Channel1 #define AUDIO_SAI_DMA_REQUEST BDMA_REQUEST_SAI4_A @@ -395,13 +334,8 @@ // #define AUDIO_SAI_FREQKHZ (2048U) // 2048KHz // #define AUDIO_MAX_CHANNELS (2) // Maximum number of channels. // -// #define AUDIO_SAI_CK_PORT (GPIOE) -// #define AUDIO_SAI_CK_PIN (GPIO_PIN_2) -// #define AUDIO_SAI_CK_AF (GPIO_AF2_SAI1) -// -// #define AUDIO_SAI_D1_PORT (GPIOB) -// #define AUDIO_SAI_D1_PIN (GPIO_PIN_2) -// #define AUDIO_SAI_D1_AF (GPIO_AF2_SAI1) +// #define AUDIO_SAI_CK_PIN (&omv_pin_E2_SAI1) +// #define AUDIO_SAI_D1_PIN (&omv_pin_B2_SAI1) // // #define AUDIO_SAI_DMA_STREAM DMA2_Stream6 // #define AUDIO_SAI_DMA_REQUEST DMA_REQUEST_SAI1_A @@ -430,37 +364,14 @@ #define OMV_SPI_LCD_CONTROLLER (&spi_obj[1]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI2) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_3) -#define OMV_SPI_LCD_MOSI_PORT (GPIOC) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI2) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_C3_SPI2) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_C2_SPI2) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_I1_SPI2) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_I0_GPIO) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_2) -#define OMV_SPI_LCD_MISO_PORT (GPIOC) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_1) -#define OMV_SPI_LCD_SCLK_PORT (GPIOI) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_15) -#define OMV_SPI_LCD_RST_PORT (GPIOH) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_1) -#define OMV_SPI_LCD_RS_PORT (GPIOK) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_0) -#define OMV_SPI_LCD_CS_PORT (GPIOI) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_4) -#define OMV_SPI_LCD_BL_PORT (GPIOA) -#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_K1_GPIO) +#define OMV_SPI_LCD_BL_PIN (&omv_pin_A4_GPIO) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_H15_GPIO) #define OMV_SPI_LCD_BL_DAC (DAC1) #define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_1) @@ -469,42 +380,15 @@ #define OMV_SPI_LCD_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET() #define OMV_SPI_LCD_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET() -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (1) - // FIR Lepton #define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID) #define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED) #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[1]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI2) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_3) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOC) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_2) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOC) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_1) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOI) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_0) -#define OMV_FIR_LEPTON_CS_PORT (GPIOI) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) - -// Enable additional GPIO banks for DRAM... -#define OMV_ENABLE_GPIO_BANK_F -#define OMV_ENABLE_GPIO_BANK_G -#define OMV_ENABLE_GPIO_BANK_H -#define OMV_ENABLE_GPIO_BANK_I -#define OMV_ENABLE_GPIO_BANK_J -#define OMV_ENABLE_GPIO_BANK_K +#define OMV_FIR_LEPTON_MOSI_PIN (&omv_pin_C3_SPI2) +#define OMV_FIR_LEPTON_MISO_PIN (&omv_pin_C2_SPI2) +#define OMV_FIR_LEPTON_SCLK_PIN (&omv_pin_I1_SPI2) +#define OMV_FIR_LEPTON_SSEL_PIN (&omv_pin_I0_GPIO) #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/ARDUINO_PORTENTA_H7/omv_pins.h b/src/omv/boards/ARDUINO_PORTENTA_H7/omv_pins.h new file mode 100644 index 000000000..65f77e6bf --- /dev/null +++ b/src/omv/boards/ARDUINO_PORTENTA_H7/omv_pins.h @@ -0,0 +1,33 @@ +OMV_GPIO_DEFINE(A, 4, NONE, GPIO) +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 8, AF1, TIM1) +OMV_GPIO_DEFINE(B, 2, AF2, SAI1) +OMV_GPIO_DEFINE(B, 2, AF10, SAI4) +OMV_GPIO_DEFINE(C, 0, AF10, OTG_HS) +OMV_GPIO_DEFINE(C, 2, AF5, SPI2) +OMV_GPIO_DEFINE(C, 3, AF5, SPI2) +OMV_GPIO_DEFINE(C, 13, NONE, GPIO) +OMV_GPIO_DEFINE(C, 15, NONE, GPIO) +OMV_GPIO_DEFINE(D, 5, NONE, GPIO) +OMV_GPIO_DEFINE(E, 2, AF2, SAI1) +OMV_GPIO_DEFINE(E, 2, AF10, SAI4) +OMV_GPIO_DEFINE(H, 7, AF4, I2C3) +OMV_GPIO_DEFINE(H, 8, AF4, I2C3) +OMV_GPIO_DEFINE(H, 9, AF13, DCMI) +OMV_GPIO_DEFINE(H, 10, AF13, DCMI) +OMV_GPIO_DEFINE(H, 11, AF4, I2C4) +OMV_GPIO_DEFINE(H, 11, AF13, DCMI) +OMV_GPIO_DEFINE(H, 12, AF4, I2C4) +OMV_GPIO_DEFINE(H, 12, AF13, DCMI) +OMV_GPIO_DEFINE(H, 14, AF13, DCMI) +OMV_GPIO_DEFINE(H, 15, NONE, GPIO) +OMV_GPIO_DEFINE(I, 0, NONE, GPIO) +OMV_GPIO_DEFINE(I, 1, AF5, SPI2) +OMV_GPIO_DEFINE(I, 4, AF13, DCMI) +OMV_GPIO_DEFINE(I, 5, AF13, DCMI) +OMV_GPIO_DEFINE(I, 6, AF13, DCMI) +OMV_GPIO_DEFINE(I, 7, AF13, DCMI) +OMV_GPIO_DEFINE(I, 11, AF10, OTG_HS) +OMV_GPIO_DEFINE(K, 1, NONE, GPIO) +OMV_GPIO_DEFINE(K, 1, AF1, TIM1) diff --git a/src/omv/boards/OPENMV2/omv_boardconfig.h b/src/omv/boards/OPENMV2/omv_boardconfig.h index 2ad6c6273..428401aa6 100644 --- a/src/omv/boards/OPENMV2/omv_boardconfig.h +++ b/src/omv/boards/OPENMV2/omv_boardconfig.h @@ -48,6 +48,11 @@ #define OMV_ENABLE_HM01B0 (0) #define OMV_ENABLE_PAJ6100 (0) #define OMV_ENABLE_FROGEYE2020 (0) +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (1) // Enable sensor features #define OMV_ENABLE_OV5640_AF (0) @@ -127,160 +132,80 @@ // Image sensor I2C #define ISC_I2C (I2C1) #define ISC_I2C_ID (1) -#define ISC_I2C_AF (GPIO_AF4_I2C1) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_B8_I2C1) +#define ISC_I2C_SDA_PIN (&omv_pin_B9_I2C1) #define ISC_I2C_CLK_ENABLE() __I2C1_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __I2C1_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOB) -#define ISC_I2C_SCL_PIN (GPIO_PIN_8) -#define ISC_I2C_SDA_PORT (GPIOB) -#define ISC_I2C_SDA_PIN (GPIO_PIN_9) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() -// FIR I2C +// FIR I2C configuration. #define FIR_I2C (I2C2) #define FIR_I2C_ID (2) -#define FIR_I2C_AF (GPIO_AF4_I2C2) +#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) +#define FIR_I2C_SCL_PIN (&omv_pin_B10_I2C2) +#define FIR_I2C_SDA_PIN (&omv_pin_B11_I2C2) #define FIR_I2C_CLK_ENABLE() __I2C2_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __I2C2_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOB) -#define FIR_I2C_SCL_PIN (GPIO_PIN_10) -#define FIR_I2C_SDA_PORT (GPIOB) -#define FIR_I2C_SDA_PIN (GPIO_PIN_11) -#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C2_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C2_RELEASE_RESET() -/* DCMI */ +// Soft I2C bus. +#define SOFT_I2C_SIOC_PIN (&omv_pin_B10_GPIO) +#define SOFT_I2C_SIOD_PIN (&omv_pin_B11_GPIO) +#define SOFT_I2C_SPIN_DELAY 16 + +// DCMI pins. #define DCMI_TIM (TIM1) -#define DCMI_TIM_PIN (GPIO_PIN_8) -#define DCMI_TIM_PORT (GPIOA) -#define DCMI_TIM_AF (GPIO_AF1_TIM1) +#define DCMI_TIM_PIN (&omv_pin_A8_TIM1) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1) #define DCMI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() -#define DCMI_RESET_PIN (GPIO_PIN_10) -#define DCMI_RESET_PORT (GPIOA) +// DCMI pins. +#define DCMI_RESET_PIN (&omv_pin_A10_GPIO) +#define DCMI_POWER_PIN (&omv_pin_B5_GPIO) -#define DCMI_PWDN_PIN (GPIO_PIN_5) -#define DCMI_PWDN_PORT (GPIOB) +#define DCMI_D0_PIN (&omv_pin_C6_DCMI) +#define DCMI_D1_PIN (&omv_pin_C7_DCMI) +#define DCMI_D2_PIN (&omv_pin_E0_DCMI) +#define DCMI_D3_PIN (&omv_pin_E1_DCMI) +#define DCMI_D4_PIN (&omv_pin_E4_DCMI) +#define DCMI_D5_PIN (&omv_pin_B6_DCMI) +#define DCMI_D6_PIN (&omv_pin_E5_DCMI) +#define DCMI_D7_PIN (&omv_pin_E6_DCMI) -#define DCMI_D0_PIN (GPIO_PIN_6) -#define DCMI_D1_PIN (GPIO_PIN_7) -#define DCMI_D2_PIN (GPIO_PIN_0) -#define DCMI_D3_PIN (GPIO_PIN_1) -#define DCMI_D4_PIN (GPIO_PIN_4) -#define DCMI_D5_PIN (GPIO_PIN_6) -#define DCMI_D6_PIN (GPIO_PIN_5) -#define DCMI_D7_PIN (GPIO_PIN_6) - -#define DCMI_D0_PORT (GPIOC) -#define DCMI_D1_PORT (GPIOC) -#define DCMI_D2_PORT (GPIOE) -#define DCMI_D3_PORT (GPIOE) -#define DCMI_D4_PORT (GPIOE) -#define DCMI_D5_PORT (GPIOB) -#define DCMI_D6_PORT (GPIOE) -#define DCMI_D7_PORT (GPIOE) - -#define DCMI_HSYNC_PIN (GPIO_PIN_4) -#define DCMI_VSYNC_PIN (GPIO_PIN_7) -#define DCMI_PXCLK_PIN (GPIO_PIN_6) - -#define DCMI_HSYNC_PORT (GPIOA) -#define DCMI_VSYNC_PORT (GPIOB) -#define DCMI_PXCLK_PORT (GPIOA) - -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) - -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (7) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOB) -#define DCMI_VSYNC_EXTI_SHARED (0) +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_VSYNC_PIN (&omv_pin_B7_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) #define WINC_SPI (SPI2) -#define WINC_SPI_AF (GPIO_AF5_SPI2) #define WINC_SPI_TIMEOUT (1000) #define WINC_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_2) #define WINC_SPI_CLK_ENABLE() __HAL_RCC_SPI2_CLK_ENABLE() +#define WINC_SPI_SCLK_PIN (&omv_pin_B13_SPI2) +#define WINC_SPI_MISO_PIN (&omv_pin_B14_SPI2) +#define WINC_SPI_MOSI_PIN (&omv_pin_B15_SPI2) +#define WINC_SPI_SSEL_PIN (&omv_pin_B12_GPIO) -#define WINC_SPI_SCLK_PIN (GPIO_PIN_13) -#define WINC_SPI_MISO_PIN (GPIO_PIN_14) -#define WINC_SPI_MOSI_PIN (GPIO_PIN_15) - -#define WINC_SPI_SCLK_PORT (GPIOB) -#define WINC_SPI_MISO_PORT (GPIOB) -#define WINC_SPI_MOSI_PORT (GPIOB) - -#define WINC_EN_PIN (GPIO_PIN_5) -#define WINC_CS_PIN (GPIO_PIN_12) -#define WINC_RST_PIN (GPIO_PIN_12) -#define WINC_IRQ_PIN (pin_D13) - -#define WINC_EN_PORT (GPIOA) -#define WINC_CS_PORT (GPIOB) -#define WINC_RST_PORT (GPIOD) - -#define WINC_CS_LOW() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_RESET) -#define WINC_CS_HIGH() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_SET) - -#define SOFT_I2C_PORT GPIOB -#define SOFT_I2C_SIOC_PIN GPIO_PIN_10 -#define SOFT_I2C_SIOD_PIN GPIO_PIN_11 - -#define SOFT_I2C_SIOC_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOC_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOD_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_READ() HAL_GPIO_ReadPin (SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN) -#define SOFT_I2C_SIOD_WRITE(bit) HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, bit); - -#define SOFT_I2C_SPIN_DELAY 16 +#define WINC_EN_PIN (&omv_pin_A5_GPIO) +#define WINC_RST_PIN (&omv_pin_D12_GPIO) +#define WINC_IRQ_PIN (&omv_pin_D13_GPIO) // SPI LCD Interface #define OMV_SPI_LCD_CONTROLLER (&spi_obj[1]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI2) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_15) -#define OMV_SPI_LCD_MOSI_PORT (GPIOB) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI2) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_B12_GPIO) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_14) -#define OMV_SPI_LCD_MISO_PORT (GPIOB) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_SCLK_PORT (GPIOB) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_RST_PORT (GPIOD) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_RS_PORT (GPIOD) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_CS_PORT (GPIOB) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_5) -#define OMV_SPI_LCD_BL_PORT (GPIOA) -#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_D13_GPIO) +#define OMV_SPI_LCD_BL_PIN (&omv_pin_A5_GPIO) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_D12_GPIO) #define OMV_SPI_LCD_BL_DAC (DAC) #define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_2) @@ -289,34 +214,14 @@ #define OMV_SPI_LCD_BL_DAC_FORCE_RESET() __HAL_RCC_DAC_FORCE_RESET() #define OMV_SPI_LCD_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC_RELEASE_RESET() -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (1) - // FIR Lepton #define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID) #define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED) #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[1]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI2) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_15) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOB) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_14) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOB) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_13) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOB) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_12) -#define OMV_FIR_LEPTON_CS_PORT (GPIOB) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) - +#define OMV_FIR_LEPTON_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_FIR_LEPTON_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_FIR_LEPTON_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_FIR_LEPTON_SSEL_PIN (&omv_pin_B12_GPIO) #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/OPENMV2/omv_pins.h b/src/omv/boards/OPENMV2/omv_pins.h new file mode 100644 index 000000000..1ce2747ce --- /dev/null +++ b/src/omv/boards/OPENMV2/omv_pins.h @@ -0,0 +1,27 @@ +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 5, NONE, GPIO) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 8, AF1, TIM1) +OMV_GPIO_DEFINE(A, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 5, NONE, GPIO) +OMV_GPIO_DEFINE(B, 6, AF13, DCMI) +OMV_GPIO_DEFINE(B, 7, AF13, DCMI) +OMV_GPIO_DEFINE(B, 8, AF4, I2C1) +OMV_GPIO_DEFINE(B, 9, AF4, I2C1) +OMV_GPIO_DEFINE(B, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 10, AF4, I2C2) +OMV_GPIO_DEFINE(B, 11, NONE, GPIO) +OMV_GPIO_DEFINE(B, 11, AF4, I2C2) +OMV_GPIO_DEFINE(B, 12, NONE, GPIO) +OMV_GPIO_DEFINE(B, 13, AF5, SPI2) +OMV_GPIO_DEFINE(B, 14, AF5, SPI2) +OMV_GPIO_DEFINE(B, 15, AF5, SPI2) +OMV_GPIO_DEFINE(C, 6, AF13, DCMI) +OMV_GPIO_DEFINE(C, 7, AF13, DCMI) +OMV_GPIO_DEFINE(D, 12, NONE, GPIO) +OMV_GPIO_DEFINE(D, 13, NONE, GPIO) +OMV_GPIO_DEFINE(E, 0, AF13, DCMI) +OMV_GPIO_DEFINE(E, 1, AF13, DCMI) +OMV_GPIO_DEFINE(E, 4, AF13, DCMI) +OMV_GPIO_DEFINE(E, 5, AF13, DCMI) +OMV_GPIO_DEFINE(E, 6, AF13, DCMI) diff --git a/src/omv/boards/OPENMV3/omv_boardconfig.h b/src/omv/boards/OPENMV3/omv_boardconfig.h index fe65daacc..da003332a 100644 --- a/src/omv/boards/OPENMV3/omv_boardconfig.h +++ b/src/omv/boards/OPENMV3/omv_boardconfig.h @@ -48,6 +48,11 @@ #define OMV_ENABLE_HM01B0 (0) #define OMV_ENABLE_PAJ6100 (0) #define OMV_ENABLE_FROGEYE2020 (0) +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (1) // Enable sensor features #define OMV_ENABLE_OV5640_AF (0) @@ -127,161 +132,81 @@ // Image sensor I2C #define ISC_I2C (I2C1) #define ISC_I2C_ID (1) -#define ISC_I2C_AF (GPIO_AF4_I2C1) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_B8_I2C1) +#define ISC_I2C_SDA_PIN (&omv_pin_B9_I2C1) #define ISC_I2C_CLK_ENABLE() __I2C1_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __I2C1_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOB) -#define ISC_I2C_SCL_PIN (GPIO_PIN_8) -#define ISC_I2C_SDA_PORT (GPIOB) -#define ISC_I2C_SDA_PIN (GPIO_PIN_9) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() -/* FIR I2C */ +// FIR I2C configuration. #define FIR_I2C (I2C2) #define FIR_I2C_ID (2) -#define FIR_I2C_AF (GPIO_AF4_I2C2) +#define FIR_I2C_SCL_PIN (&omv_pin_B10_I2C2) +#define FIR_I2C_SDA_PIN (&omv_pin_B11_I2C2) #define FIR_I2C_CLK_ENABLE() __I2C2_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __I2C2_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOB) -#define FIR_I2C_SCL_PIN (GPIO_PIN_10) -#define FIR_I2C_SDA_PORT (GPIOB) -#define FIR_I2C_SDA_PIN (GPIO_PIN_11) #define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C2_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C2_RELEASE_RESET() +// Soft I2C bus. +#define SOFT_I2C_SIOC_PIN (&omv_pin_B10_GPIO) +#define SOFT_I2C_SIOD_PIN (&omv_pin_B11_GPIO) +#define SOFT_I2C_SPIN_DELAY 24 + /* DCMI */ #define DCMI_TIM (TIM1) -#define DCMI_TIM_PIN (GPIO_PIN_8) -#define DCMI_TIM_PORT (GPIOA) -#define DCMI_TIM_AF (GPIO_AF1_TIM1) +#define DCMI_TIM_PIN (&omv_pin_A8_TIM1) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1) #define DCMI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() -#define DCMI_RESET_PIN (GPIO_PIN_10) -#define DCMI_RESET_PORT (GPIOA) +#define DCMI_RESET_PIN (&omv_pin_A10_GPIO) +#define DCMI_POWER_PIN (&omv_pin_B5_GPIO) -#define DCMI_PWDN_PIN (GPIO_PIN_5) -#define DCMI_PWDN_PORT (GPIOB) +#define DCMI_D0_PIN (&omv_pin_C6_DCMI) +#define DCMI_D1_PIN (&omv_pin_C7_DCMI) +#define DCMI_D2_PIN (&omv_pin_E0_DCMI) +#define DCMI_D3_PIN (&omv_pin_E1_DCMI) +#define DCMI_D4_PIN (&omv_pin_E4_DCMI) +#define DCMI_D5_PIN (&omv_pin_B6_DCMI) +#define DCMI_D6_PIN (&omv_pin_E5_DCMI) +#define DCMI_D7_PIN (&omv_pin_E6_DCMI) -#define DCMI_D0_PIN (GPIO_PIN_6) -#define DCMI_D1_PIN (GPIO_PIN_7) -#define DCMI_D2_PIN (GPIO_PIN_0) -#define DCMI_D3_PIN (GPIO_PIN_1) -#define DCMI_D4_PIN (GPIO_PIN_4) -#define DCMI_D5_PIN (GPIO_PIN_6) -#define DCMI_D6_PIN (GPIO_PIN_5) -#define DCMI_D7_PIN (GPIO_PIN_6) - -#define DCMI_D0_PORT (GPIOC) -#define DCMI_D1_PORT (GPIOC) -#define DCMI_D2_PORT (GPIOE) -#define DCMI_D3_PORT (GPIOE) -#define DCMI_D4_PORT (GPIOE) -#define DCMI_D5_PORT (GPIOB) -#define DCMI_D6_PORT (GPIOE) -#define DCMI_D7_PORT (GPIOE) - -#define DCMI_HSYNC_PIN (GPIO_PIN_4) -#define DCMI_VSYNC_PIN (GPIO_PIN_7) -#define DCMI_PXCLK_PIN (GPIO_PIN_6) - -#define DCMI_HSYNC_PORT (GPIOA) -#define DCMI_VSYNC_PORT (GPIOB) -#define DCMI_PXCLK_PORT (GPIOA) - -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) - -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (7) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOB) -#define DCMI_VSYNC_EXTI_SHARED (0) +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_VSYNC_PIN (&omv_pin_B7_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) #define WINC_SPI (SPI2) -#define WINC_SPI_AF (GPIO_AF5_SPI2) #define WINC_SPI_TIMEOUT (1000) // SPI1/2/3 clock source is PCLK1 (54MHz/2 == 27MHz). #define WINC_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_2) #define WINC_SPI_CLK_ENABLE() __HAL_RCC_SPI2_CLK_ENABLE() -#define WINC_SPI_SCLK_PIN (GPIO_PIN_13) -#define WINC_SPI_MISO_PIN (GPIO_PIN_14) -#define WINC_SPI_MOSI_PIN (GPIO_PIN_15) +#define WINC_SPI_SCLK_PIN (&omv_pin_B13_SPI2) +#define WINC_SPI_MISO_PIN (&omv_pin_B14_SPI2) +#define WINC_SPI_MOSI_PIN (&omv_pin_B15_SPI2) +#define WINC_SPI_SSEL_PIN (&omv_pin_B12_GPIO) -#define WINC_SPI_SCLK_PORT (GPIOB) -#define WINC_SPI_MISO_PORT (GPIOB) -#define WINC_SPI_MOSI_PORT (GPIOB) - -#define WINC_EN_PIN (GPIO_PIN_5) -#define WINC_CS_PIN (GPIO_PIN_12) -#define WINC_RST_PIN (GPIO_PIN_12) -#define WINC_IRQ_PIN (pin_D13) - -#define WINC_EN_PORT (GPIOA) -#define WINC_CS_PORT (GPIOB) -#define WINC_RST_PORT (GPIOD) - -#define WINC_CS_LOW() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_RESET) -#define WINC_CS_HIGH() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_SET) - -#define SOFT_I2C_PORT GPIOB -#define SOFT_I2C_SIOC_PIN GPIO_PIN_10 -#define SOFT_I2C_SIOD_PIN GPIO_PIN_11 - -#define SOFT_I2C_SIOC_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOC_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOD_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_READ() HAL_GPIO_ReadPin (SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN) -#define SOFT_I2C_SIOD_WRITE(bit) HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, bit); - -#define SOFT_I2C_SPIN_DELAY 24 +#define WINC_EN_PIN (&omv_pin_A5_GPIO) +#define WINC_RST_PIN (&omv_pin_D12_GPIO) +#define WINC_IRQ_PIN (&omv_pin_D13_GPIO) // SPI LCD Interface #define OMV_SPI_LCD_CONTROLLER (&spi_obj[1]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI2) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_15) -#define OMV_SPI_LCD_MOSI_PORT (GPIOB) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI2) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_B12_GPIO) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_14) -#define OMV_SPI_LCD_MISO_PORT (GPIOB) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_SCLK_PORT (GPIOB) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_RST_PORT (GPIOD) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_RS_PORT (GPIOD) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_CS_PORT (GPIOB) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_5) -#define OMV_SPI_LCD_BL_PORT (GPIOA) -#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_D13_GPIO) +#define OMV_SPI_LCD_BL_PIN (&omv_pin_A5_GPIO) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_D12_GPIO) #define OMV_SPI_LCD_BL_DAC (DAC) #define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_2) @@ -290,34 +215,14 @@ #define OMV_SPI_LCD_BL_DAC_FORCE_RESET() __HAL_RCC_DAC_FORCE_RESET() #define OMV_SPI_LCD_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC_RELEASE_RESET() -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (1) - // FIR Lepton #define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID) #define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED) #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[1]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI2) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_15) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOB) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_14) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOB) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_13) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOB) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_12) -#define OMV_FIR_LEPTON_CS_PORT (GPIOB) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) - +#define OMV_FIR_LEPTON_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_FIR_LEPTON_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_FIR_LEPTON_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_FIR_LEPTON_SSEL_PIN (&omv_pin_B12_GPIO) #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/OPENMV3/omv_pins.h b/src/omv/boards/OPENMV3/omv_pins.h new file mode 100644 index 000000000..1ce2747ce --- /dev/null +++ b/src/omv/boards/OPENMV3/omv_pins.h @@ -0,0 +1,27 @@ +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 5, NONE, GPIO) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 8, AF1, TIM1) +OMV_GPIO_DEFINE(A, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 5, NONE, GPIO) +OMV_GPIO_DEFINE(B, 6, AF13, DCMI) +OMV_GPIO_DEFINE(B, 7, AF13, DCMI) +OMV_GPIO_DEFINE(B, 8, AF4, I2C1) +OMV_GPIO_DEFINE(B, 9, AF4, I2C1) +OMV_GPIO_DEFINE(B, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 10, AF4, I2C2) +OMV_GPIO_DEFINE(B, 11, NONE, GPIO) +OMV_GPIO_DEFINE(B, 11, AF4, I2C2) +OMV_GPIO_DEFINE(B, 12, NONE, GPIO) +OMV_GPIO_DEFINE(B, 13, AF5, SPI2) +OMV_GPIO_DEFINE(B, 14, AF5, SPI2) +OMV_GPIO_DEFINE(B, 15, AF5, SPI2) +OMV_GPIO_DEFINE(C, 6, AF13, DCMI) +OMV_GPIO_DEFINE(C, 7, AF13, DCMI) +OMV_GPIO_DEFINE(D, 12, NONE, GPIO) +OMV_GPIO_DEFINE(D, 13, NONE, GPIO) +OMV_GPIO_DEFINE(E, 0, AF13, DCMI) +OMV_GPIO_DEFINE(E, 1, AF13, DCMI) +OMV_GPIO_DEFINE(E, 4, AF13, DCMI) +OMV_GPIO_DEFINE(E, 5, AF13, DCMI) +OMV_GPIO_DEFINE(E, 6, AF13, DCMI) diff --git a/src/omv/boards/OPENMV4/omv_boardconfig.h b/src/omv/boards/OPENMV4/omv_boardconfig.h index f9fdee4f8..443c8ee09 100644 --- a/src/omv/boards/OPENMV4/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4/omv_boardconfig.h @@ -64,6 +64,11 @@ #define OMV_ENABLE_HM01B0 (0) #define OMV_ENABLE_PAJ6100 (1) #define OMV_ENABLE_FROGEYE2020 (1) +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (1) // Set which OV767x sensor is used #define OMV_OV7670_VERSION (70) @@ -214,131 +219,70 @@ // Image sensor I2C #define ISC_I2C (I2C1) #define ISC_I2C_ID (1) -#define ISC_I2C_AF (GPIO_AF4_I2C1) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_B8_I2C1) +#define ISC_I2C_SDA_PIN (&omv_pin_B9_I2C1) #define ISC_I2C_CLK_ENABLE() __I2C1_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __I2C1_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOB) -#define ISC_I2C_SCL_PIN (GPIO_PIN_8) -#define ISC_I2C_SDA_PORT (GPIOB) -#define ISC_I2C_SDA_PIN (GPIO_PIN_9) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() -/* FIR I2C */ +// FIR I2C configuration. #define FIR_I2C (I2C2) #define FIR_I2C_ID (2) -#define FIR_I2C_AF (GPIO_AF4_I2C2) +#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) +#define FIR_I2C_SCL_PIN (&omv_pin_B10_I2C2) +#define FIR_I2C_SDA_PIN (&omv_pin_B11_I2C2) #define FIR_I2C_CLK_ENABLE() __I2C2_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __I2C2_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOB) -#define FIR_I2C_SCL_PIN (GPIO_PIN_10) -#define FIR_I2C_SDA_PORT (GPIOB) -#define FIR_I2C_SDA_PIN (GPIO_PIN_11) -#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C2_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C2_RELEASE_RESET() -/* DCMI */ +// Soft I2C bus. +#define SOFT_I2C_SIOC_PIN (&omv_pin_B10_GPIO) +#define SOFT_I2C_SIOD_PIN (&omv_pin_B11_GPIO) +#define SOFT_I2C_SPIN_DELAY 64 + +// DCMI timer. #define DCMI_TIM (TIM1) -#define DCMI_TIM_PIN (GPIO_PIN_8) -#define DCMI_TIM_PORT (GPIOA) -#define DCMI_TIM_AF (GPIO_AF1_TIM1) +#define DCMI_TIM_PIN (&omv_pin_A8_TIM1) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1) #define DCMI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() -#define DCMI_RESET_PIN (GPIO_PIN_10) -#define DCMI_RESET_PORT (GPIOA) +// DCMI pins. +#define DCMI_RESET_PIN (&omv_pin_A10_GPIO) +#define DCMI_POWER_PIN (&omv_pin_D7_GPIO) +#define DCMI_FSYNC_PIN (&omv_pin_B4_GPIO) -#define DCMI_PWDN_PIN (GPIO_PIN_7) -#define DCMI_PWDN_PORT (GPIOD) +#define DCMI_D0_PIN (&omv_pin_C6_DCMI) +#define DCMI_D1_PIN (&omv_pin_C7_DCMI) +#define DCMI_D2_PIN (&omv_pin_E0_DCMI) +#define DCMI_D3_PIN (&omv_pin_E1_DCMI) +#define DCMI_D4_PIN (&omv_pin_E4_DCMI) +#define DCMI_D5_PIN (&omv_pin_B6_DCMI) +#define DCMI_D6_PIN (&omv_pin_E5_DCMI) +#define DCMI_D7_PIN (&omv_pin_E6_DCMI) -#define DCMI_FSYNC_PIN (GPIO_PIN_4) -#define DCMI_FSYNC_PORT (GPIOB) - -#define DCMI_D0_PIN (GPIO_PIN_6) -#define DCMI_D1_PIN (GPIO_PIN_7) -#define DCMI_D2_PIN (GPIO_PIN_0) -#define DCMI_D3_PIN (GPIO_PIN_1) -#define DCMI_D4_PIN (GPIO_PIN_4) -#define DCMI_D5_PIN (GPIO_PIN_6) -#define DCMI_D6_PIN (GPIO_PIN_5) -#define DCMI_D7_PIN (GPIO_PIN_6) - -#define DCMI_D0_PORT (GPIOC) -#define DCMI_D1_PORT (GPIOC) -#define DCMI_D2_PORT (GPIOE) -#define DCMI_D3_PORT (GPIOE) -#define DCMI_D4_PORT (GPIOE) -#define DCMI_D5_PORT (GPIOB) -#define DCMI_D6_PORT (GPIOE) -#define DCMI_D7_PORT (GPIOE) - -#define DCMI_HSYNC_PIN (GPIO_PIN_4) -#define DCMI_VSYNC_PIN (GPIO_PIN_7) -#define DCMI_PXCLK_PIN (GPIO_PIN_6) - -#define DCMI_HSYNC_PORT (GPIOA) -#define DCMI_VSYNC_PORT (GPIOB) -#define DCMI_PXCLK_PORT (GPIOA) - -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) - -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) - -#define DCMI_FSYNC_LOW() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_RESET) -#define DCMI_FSYNC_HIGH() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_SET) - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (7) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOB) -#define DCMI_VSYNC_EXTI_SHARED (0) +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_VSYNC_PIN (&omv_pin_B7_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) #define WINC_SPI (SPI2) -#define WINC_SPI_AF (GPIO_AF5_SPI2) #define WINC_SPI_TIMEOUT (1000) // SPI1/2/3 clock source is PLL2 (160MHz/4 == 40MHz). #define WINC_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_4) #define WINC_SPI_CLK_ENABLE() __HAL_RCC_SPI2_CLK_ENABLE() -#define WINC_SPI_SCLK_PIN (GPIO_PIN_13) -#define WINC_SPI_MISO_PIN (GPIO_PIN_14) -#define WINC_SPI_MOSI_PIN (GPIO_PIN_15) +#define WINC_SPI_SCLK_PIN (&omv_pin_B13_SPI2) +#define WINC_SPI_MISO_PIN (&omv_pin_B14_SPI2) +#define WINC_SPI_MOSI_PIN (&omv_pin_B15_SPI2) +#define WINC_SPI_SSEL_PIN (&omv_pin_B12_GPIO) -#define WINC_SPI_SCLK_PORT (GPIOB) -#define WINC_SPI_MISO_PORT (GPIOB) -#define WINC_SPI_MOSI_PORT (GPIOB) - -#define WINC_EN_PIN (GPIO_PIN_5) -#define WINC_CS_PIN (GPIO_PIN_12) -#define WINC_RST_PIN (GPIO_PIN_12) -#define WINC_IRQ_PIN (pin_D13) - -#define WINC_EN_PORT (GPIOA) -#define WINC_CS_PORT (GPIOB) -#define WINC_RST_PORT (GPIOD) - -#define WINC_CS_LOW() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_RESET) -#define WINC_CS_HIGH() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_SET) - -#define SOFT_I2C_PORT GPIOB -#define SOFT_I2C_SIOC_PIN GPIO_PIN_10 -#define SOFT_I2C_SIOD_PIN GPIO_PIN_11 - -#define SOFT_I2C_SIOC_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOC_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOD_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_READ() HAL_GPIO_ReadPin (SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN) -#define SOFT_I2C_SIOD_WRITE(bit) HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, bit); - -#define SOFT_I2C_SPIN_DELAY 64 +#define WINC_EN_PIN (&omv_pin_A5_GPIO) +#define WINC_RST_PIN (&omv_pin_D12_GPIO) +#define WINC_IRQ_PIN (&omv_pin_D13_GPIO) #define ISC_SPI (SPI3) // SPI1/2/3 clock source is PLL3 (160MHz/8 == 20MHz) - Minimum (164*240*8*27 = 8,501,760Hz) @@ -359,81 +303,23 @@ #define ISC_SPI_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE() #define ISC_SPI_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE() -#define ISC_SPI_SCLK_AF (GPIO_AF6_SPI3) -#define ISC_SPI_MISO_AF (GPIO_AF6_SPI3) -#define ISC_SPI_MOSI_AF (GPIO_AF7_SPI3) -#define ISC_SPI_SSEL_AF (GPIO_AF6_SPI3) - -#define ISC_SPI_SCLK_PIN (GPIO_PIN_3) -#define ISC_SPI_MISO_PIN (GPIO_PIN_4) -#define ISC_SPI_MOSI_PIN (GPIO_PIN_5) -#define ISC_SPI_SSEL_PIN (GPIO_PIN_15) - -#define ISC_SPI_SCLK_PORT (GPIOB) -#define ISC_SPI_MISO_PORT (GPIOB) -#define ISC_SPI_MOSI_PORT (GPIOB) -#define ISC_SPI_SSEL_PORT (GPIOA) - -// The IMU sensor is on the same SPI bus pins as the camera module interface -// SPI bus. While the buses overlap both devices will never be in-use at once. - -#define IMU_CHIP_LSM6DS3 (1) -#define IMU_SPI (SPI1) -#define IMU_SPI_AF (GPIO_AF5_SPI1) -// SPI1/2/3 clock source is PLL2 (160MHz/16 == 10MHz). -#define IMU_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_16) - -#define IMU_SPI_RESET() __HAL_RCC_SPI1_FORCE_RESET() -#define IMU_SPI_RELEASE() __HAL_RCC_SPI1_RELEASE_RESET() - -#define IMU_SPI_CLK_ENABLE() __HAL_RCC_SPI1_CLK_ENABLE() -#define IMU_SPI_CLK_DISABLE() __HAL_RCC_SPI1_CLK_DISABLE() - -#define IMU_SPI_SCLK_PIN (GPIO_PIN_3) -#define IMU_SPI_MISO_PIN (GPIO_PIN_4) -#define IMU_SPI_MOSI_PIN (GPIO_PIN_5) -#define IMU_SPI_SSEL_PIN (GPIO_PIN_15) - -#define IMU_SPI_SCLK_PORT (GPIOB) -#define IMU_SPI_MISO_PORT (GPIOB) -#define IMU_SPI_MOSI_PORT (GPIOB) -#define IMU_SPI_SSEL_PORT (GPIOA) +#define ISC_SPI_SCLK_PIN (&omv_pin_B3_SPI3) +#define ISC_SPI_MISO_PIN (&omv_pin_B4_SPI3) +#define ISC_SPI_MOSI_PIN (&omv_pin_B5_SPI3) +#define ISC_SPI_SSEL_PIN (&omv_pin_A15_SPI3) // SPI LCD Interface #define OMV_SPI_LCD_CONTROLLER (&spi_obj[1]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI2) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_15) -#define OMV_SPI_LCD_MOSI_PORT (GPIOB) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI2) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_B12_GPIO) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_14) -#define OMV_SPI_LCD_MISO_PORT (GPIOB) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_SCLK_PORT (GPIOB) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_RST_PORT (GPIOD) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_RS_PORT (GPIOD) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_CS_PORT (GPIOB) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_5) -#define OMV_SPI_LCD_BL_PORT (GPIOA) -#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_D13_GPIO) +#define OMV_SPI_LCD_BL_PIN (&omv_pin_A5_GPIO) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_D12_GPIO) #define OMV_SPI_LCD_BL_DAC (DAC1) #define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_2) @@ -442,34 +328,14 @@ #define OMV_SPI_LCD_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET() #define OMV_SPI_LCD_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET() -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (1) - // FIR Lepton #define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID) #define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED) #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[1]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI2) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_15) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOB) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_14) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOB) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_13) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOB) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_12) -#define OMV_FIR_LEPTON_CS_PORT (GPIOB) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) - +#define OMV_FIR_LEPTON_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_FIR_LEPTON_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_FIR_LEPTON_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_FIR_LEPTON_SSEL_PIN (&omv_pin_B12_GPIO) #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/OPENMV4/omv_pins.h b/src/omv/boards/OPENMV4/omv_pins.h new file mode 100644 index 000000000..16e65388b --- /dev/null +++ b/src/omv/boards/OPENMV4/omv_pins.h @@ -0,0 +1,32 @@ +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 5, NONE, GPIO) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 8, AF1, TIM1) +OMV_GPIO_DEFINE(A, 10, NONE, GPIO) +OMV_GPIO_DEFINE(A, 15, AF6, SPI3) +OMV_GPIO_DEFINE(B, 3, AF6, SPI3) +OMV_GPIO_DEFINE(B, 4, NONE, GPIO) +OMV_GPIO_DEFINE(B, 4, AF6, SPI3) +OMV_GPIO_DEFINE(B, 5, AF7, SPI3) +OMV_GPIO_DEFINE(B, 6, AF13, DCMI) +OMV_GPIO_DEFINE(B, 7, AF13, DCMI) +OMV_GPIO_DEFINE(B, 8, AF4, I2C1) +OMV_GPIO_DEFINE(B, 9, AF4, I2C1) +OMV_GPIO_DEFINE(B, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 10, AF4, I2C2) +OMV_GPIO_DEFINE(B, 11, NONE, GPIO) +OMV_GPIO_DEFINE(B, 11, AF4, I2C2) +OMV_GPIO_DEFINE(B, 12, NONE, GPIO) +OMV_GPIO_DEFINE(B, 13, AF5, SPI2) +OMV_GPIO_DEFINE(B, 14, AF5, SPI2) +OMV_GPIO_DEFINE(B, 15, AF5, SPI2) +OMV_GPIO_DEFINE(C, 6, AF13, DCMI) +OMV_GPIO_DEFINE(C, 7, AF13, DCMI) +OMV_GPIO_DEFINE(D, 7, NONE, GPIO) +OMV_GPIO_DEFINE(D, 12, NONE, GPIO) +OMV_GPIO_DEFINE(D, 13, NONE, GPIO) +OMV_GPIO_DEFINE(E, 0, AF13, DCMI) +OMV_GPIO_DEFINE(E, 1, AF13, DCMI) +OMV_GPIO_DEFINE(E, 4, AF13, DCMI) +OMV_GPIO_DEFINE(E, 5, AF13, DCMI) +OMV_GPIO_DEFINE(E, 6, AF13, DCMI) diff --git a/src/omv/boards/OPENMV4P/omv_boardconfig.h b/src/omv/boards/OPENMV4P/omv_boardconfig.h index bc7c7c97e..64086dc39 100644 --- a/src/omv/boards/OPENMV4P/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4P/omv_boardconfig.h @@ -63,6 +63,17 @@ #define OMV_ENABLE_HM01B0 (0) #define OMV_ENABLE_PAJ6100 (1) #define OMV_ENABLE_FROGEYE2020 (1) +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (1) + +// Enable additional GPIO banks. +#define OMV_ENABLE_GPIO_BANK_F (1) +#define OMV_ENABLE_GPIO_BANK_G (1) +#define OMV_ENABLE_GPIO_BANK_H (1) +#define OMV_ENABLE_GPIO_BANK_I (1) // Enable sensor features #define OMV_ENABLE_OV5640_AF (0) @@ -208,134 +219,72 @@ #define OMV_AXI_QOS_MDMA_R_PRI 15 // Max pri to move data. #define OMV_AXI_QOS_MDMA_W_PRI 15 // Max pri to move data. -// Image sensor I2C +// Image sensor I2C. #define ISC_I2C (I2C1) #define ISC_I2C_ID (1) -#define ISC_I2C_AF (GPIO_AF4_I2C1) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_B8_I2C1) +#define ISC_I2C_SDA_PIN (&omv_pin_B9_I2C1) #define ISC_I2C_CLK_ENABLE() __I2C1_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __I2C1_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOB) -#define ISC_I2C_SCL_PIN (GPIO_PIN_8) -#define ISC_I2C_SDA_PORT (GPIOB) -#define ISC_I2C_SDA_PIN (GPIO_PIN_9) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() -/* FIR I2C */ +// FIR I2C configuration. #define FIR_I2C (I2C2) #define FIR_I2C_ID (2) -#define FIR_I2C_AF (GPIO_AF4_I2C2) +#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) +#define FIR_I2C_SCL_PIN (&omv_pin_B10_I2C2) +#define FIR_I2C_SDA_PIN (&omv_pin_B11_I2C2) #define FIR_I2C_CLK_ENABLE() __I2C2_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __I2C2_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOB) -#define FIR_I2C_SCL_PIN (GPIO_PIN_10) -#define FIR_I2C_SDA_PORT (GPIOB) -#define FIR_I2C_SDA_PIN (GPIO_PIN_11) -#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C2_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C2_RELEASE_RESET() -/* DCMI */ +// Soft I2C bus. +#define SOFT_I2C_SIOC_PIN (&omv_pin_B10_GPIO) +#define SOFT_I2C_SIOD_PIN (&omv_pin_B11_GPIO) +#define SOFT_I2C_SPIN_DELAY 64 + +// DCMI timer. #define DCMI_TIM (TIM1) -#define DCMI_TIM_PIN (GPIO_PIN_8) -#define DCMI_TIM_PORT (GPIOA) -#define DCMI_TIM_AF (GPIO_AF1_TIM1) +#define DCMI_TIM_PIN (&omv_pin_A8_TIM1) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1) #define DCMI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() -#define DCMI_RESET_PIN (GPIO_PIN_10) -#define DCMI_RESET_PORT (GPIOA) +// DCMI pins. +#define DCMI_RESET_PIN (&omv_pin_A10_GPIO) +#define DCMI_POWER_PIN (&omv_pin_D7_GPIO) +#define DCMI_FSYNC_PIN (&omv_pin_B4_GPIO) -#define DCMI_PWDN_PIN (GPIO_PIN_7) -#define DCMI_PWDN_PORT (GPIOD) +#define DCMI_D0_PIN (&omv_pin_C6_DCMI) +#define DCMI_D1_PIN (&omv_pin_C7_DCMI) +#define DCMI_D2_PIN (&omv_pin_G10_DCMI) +#define DCMI_D3_PIN (&omv_pin_G11_DCMI) +#define DCMI_D4_PIN (&omv_pin_E4_DCMI) +#define DCMI_D5_PIN (&omv_pin_B6_DCMI) +#define DCMI_D6_PIN (&omv_pin_E5_DCMI) +#define DCMI_D7_PIN (&omv_pin_E6_DCMI) -#define DCMI_FSYNC_PIN (GPIO_PIN_4) -#define DCMI_FSYNC_PORT (GPIOB) - -#define DCMI_D0_PIN (GPIO_PIN_6) -#define DCMI_D1_PIN (GPIO_PIN_7) -#define DCMI_D2_PIN (GPIO_PIN_10) -#define DCMI_D3_PIN (GPIO_PIN_11) -#define DCMI_D4_PIN (GPIO_PIN_4) -#define DCMI_D5_PIN (GPIO_PIN_6) -#define DCMI_D6_PIN (GPIO_PIN_5) -#define DCMI_D7_PIN (GPIO_PIN_6) - -#define DCMI_D0_PORT (GPIOC) -#define DCMI_D1_PORT (GPIOC) -#define DCMI_D2_PORT (GPIOG) -#define DCMI_D3_PORT (GPIOG) -#define DCMI_D4_PORT (GPIOE) -#define DCMI_D5_PORT (GPIOB) -#define DCMI_D6_PORT (GPIOE) -#define DCMI_D7_PORT (GPIOE) - -#define DCMI_HSYNC_PIN (GPIO_PIN_4) -#define DCMI_VSYNC_PIN (GPIO_PIN_7) -#define DCMI_PXCLK_PIN (GPIO_PIN_6) - -#define DCMI_HSYNC_PORT (GPIOA) -#define DCMI_VSYNC_PORT (GPIOB) -#define DCMI_PXCLK_PORT (GPIOA) - -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) - -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) - -#define DCMI_FSYNC_LOW() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_RESET) -#define DCMI_FSYNC_HIGH() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_SET) - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (7) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOB) -#define DCMI_VSYNC_EXTI_SHARED (0) +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_VSYNC_PIN (&omv_pin_B7_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) #define WINC_SPI (SPI2) -#define WINC_SPI_AF (GPIO_AF5_SPI2) #define WINC_SPI_TIMEOUT (1000) // SPI1/2/3 clock source is PLL2 (160MHz/4 == 40MHz). #define WINC_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_4) #define WINC_SPI_CLK_ENABLE() __HAL_RCC_SPI2_CLK_ENABLE() +#define WINC_SPI_SCLK_PIN (&omv_pin_B13_SPI2) +#define WINC_SPI_MISO_PIN (&omv_pin_B14_SPI2) +#define WINC_SPI_MOSI_PIN (&omv_pin_B15_SPI2) +#define WINC_SPI_SSEL_PIN (&omv_pin_B12_GPIO) -#define WINC_SPI_SCLK_PIN (GPIO_PIN_13) -#define WINC_SPI_MISO_PIN (GPIO_PIN_14) -#define WINC_SPI_MOSI_PIN (GPIO_PIN_15) - -#define WINC_SPI_SCLK_PORT (GPIOB) -#define WINC_SPI_MISO_PORT (GPIOB) -#define WINC_SPI_MOSI_PORT (GPIOB) - -#define WINC_EN_PIN (GPIO_PIN_5) -#define WINC_CS_PIN (GPIO_PIN_12) -#define WINC_RST_PIN (GPIO_PIN_12) -#define WINC_IRQ_PIN (pin_D13) - -#define WINC_EN_PORT (GPIOA) -#define WINC_CS_PORT (GPIOB) -#define WINC_RST_PORT (GPIOD) - -#define WINC_CS_LOW() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_RESET) -#define WINC_CS_HIGH() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_SET) - -#define SOFT_I2C_PORT GPIOB -#define SOFT_I2C_SIOC_PIN GPIO_PIN_10 -#define SOFT_I2C_SIOD_PIN GPIO_PIN_11 - -#define SOFT_I2C_SIOC_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOC_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOD_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_READ() HAL_GPIO_ReadPin (SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN) -#define SOFT_I2C_SIOD_WRITE(bit) HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, bit); - -#define SOFT_I2C_SPIN_DELAY 64 +#define WINC_EN_PIN (&omv_pin_A5_GPIO) +#define WINC_RST_PIN (&omv_pin_D12_GPIO) +#define WINC_IRQ_PIN (&omv_pin_D13_GPIO) #define ISC_SPI (SPI3) // SPI1/2/3 clock source is PLL3 (160MHz/8 == 20MHz) - Minimum (164*240*8*27 = 8,501,760Hz) @@ -356,56 +305,23 @@ #define ISC_SPI_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE() #define ISC_SPI_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE() -#define ISC_SPI_SCLK_AF (GPIO_AF6_SPI3) -#define ISC_SPI_MISO_AF (GPIO_AF6_SPI3) -#define ISC_SPI_MOSI_AF (GPIO_AF7_SPI3) -#define ISC_SPI_SSEL_AF (GPIO_AF6_SPI3) - -#define ISC_SPI_SCLK_PIN (GPIO_PIN_3) -#define ISC_SPI_MISO_PIN (GPIO_PIN_4) -#define ISC_SPI_MOSI_PIN (GPIO_PIN_5) -#define ISC_SPI_SSEL_PIN (GPIO_PIN_15) - -#define ISC_SPI_SCLK_PORT (GPIOB) -#define ISC_SPI_MISO_PORT (GPIOB) -#define ISC_SPI_MOSI_PORT (GPIOB) -#define ISC_SPI_SSEL_PORT (GPIOA) +#define ISC_SPI_SCLK_PIN (&omv_pin_B3_SPI3) +#define ISC_SPI_MISO_PIN (&omv_pin_B4_SPI3) +#define ISC_SPI_MOSI_PIN (&omv_pin_B5_SPI3) +#define ISC_SPI_SSEL_PIN (&omv_pin_A15_SPI3) // SPI LCD Interface #define OMV_SPI_LCD_CONTROLLER (&spi_obj[1]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI2) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_15) -#define OMV_SPI_LCD_MOSI_PORT (GPIOB) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI2) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_B12_GPIO) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_14) -#define OMV_SPI_LCD_MISO_PORT (GPIOB) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_SCLK_PORT (GPIOB) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_RST_PORT (GPIOD) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_RS_PORT (GPIOD) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_CS_PORT (GPIOB) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_5) -#define OMV_SPI_LCD_BL_PORT (GPIOA) -#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_D13_GPIO) +#define OMV_SPI_LCD_BL_PIN (&omv_pin_A5_GPIO) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_D12_GPIO) #define OMV_SPI_LCD_BL_DAC (DAC1) #define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_2) @@ -414,40 +330,15 @@ #define OMV_SPI_LCD_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET() #define OMV_SPI_LCD_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET() -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (1) - // FIR Lepton #define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID) #define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED) #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[1]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI2) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_15) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOB) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_14) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOB) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_13) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOB) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_12) -#define OMV_FIR_LEPTON_CS_PORT (GPIOB) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) - -// Enable additional GPIO banks for DRAM... -#define OMV_ENABLE_GPIO_BANK_F -#define OMV_ENABLE_GPIO_BANK_G -#define OMV_ENABLE_GPIO_BANK_H -#define OMV_ENABLE_GPIO_BANK_I +#define OMV_FIR_LEPTON_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_FIR_LEPTON_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_FIR_LEPTON_SCLK_PIN (&omv_pin_B13_SPI2) +#define OMV_FIR_LEPTON_SSEL_PIN (&omv_pin_B12_GPIO) #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/OPENMV4P/omv_pins.h b/src/omv/boards/OPENMV4P/omv_pins.h new file mode 100644 index 000000000..fe54ca7ae --- /dev/null +++ b/src/omv/boards/OPENMV4P/omv_pins.h @@ -0,0 +1,32 @@ +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 5, NONE, GPIO) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 8, AF1, TIM1) +OMV_GPIO_DEFINE(A, 10, NONE, GPIO) +OMV_GPIO_DEFINE(A, 15, AF6, SPI3) +OMV_GPIO_DEFINE(B, 3, AF6, SPI3) +OMV_GPIO_DEFINE(B, 4, NONE, GPIO) +OMV_GPIO_DEFINE(B, 4, AF6, SPI3) +OMV_GPIO_DEFINE(B, 5, AF7, SPI3) +OMV_GPIO_DEFINE(B, 6, AF13, DCMI) +OMV_GPIO_DEFINE(B, 7, AF13, DCMI) +OMV_GPIO_DEFINE(B, 8, AF4, I2C1) +OMV_GPIO_DEFINE(B, 9, AF4, I2C1) +OMV_GPIO_DEFINE(B, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 10, AF4, I2C2) +OMV_GPIO_DEFINE(B, 11, NONE, GPIO) +OMV_GPIO_DEFINE(B, 11, AF4, I2C2) +OMV_GPIO_DEFINE(B, 12, NONE, GPIO) +OMV_GPIO_DEFINE(B, 13, AF5, SPI2) +OMV_GPIO_DEFINE(B, 14, AF5, SPI2) +OMV_GPIO_DEFINE(B, 15, AF5, SPI2) +OMV_GPIO_DEFINE(C, 6, AF13, DCMI) +OMV_GPIO_DEFINE(C, 7, AF13, DCMI) +OMV_GPIO_DEFINE(D, 7, NONE, GPIO) +OMV_GPIO_DEFINE(D, 12, NONE, GPIO) +OMV_GPIO_DEFINE(D, 13, NONE, GPIO) +OMV_GPIO_DEFINE(E, 4, AF13, DCMI) +OMV_GPIO_DEFINE(E, 5, AF13, DCMI) +OMV_GPIO_DEFINE(E, 6, AF13, DCMI) +OMV_GPIO_DEFINE(G, 10, AF13, DCMI) +OMV_GPIO_DEFINE(G, 11, AF13, DCMI) diff --git a/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h b/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h index 720a7cf4e..8a05ad08e 100644 --- a/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4_PRO/omv_boardconfig.h @@ -30,28 +30,21 @@ // Sensor external clock timer frequency. #define OMV_XCLK_FREQUENCY (24000000) -// Sensor PLL register value. -#define OMV_OV7725_PLL_CONFIG (0x41) // x4 - -// Sensor Banding Filter Value -#define OMV_OV7725_BANDING (0x7F) - -// OV5640 Sensor Settings -#define OMV_OV5640_XCLK_FREQ (24000000) -#define OMV_OV5640_PLL_CTRL2 (0x64) -#define OMV_OV5640_PLL_CTRL3 (0x13) -#define OMV_OV5640_REV_Y_CHECK (1) -#define OMV_OV5640_REV_Y_FREQ (25000000) -#define OMV_OV5640_REV_Y_CTRL2 (0x54) -#define OMV_OV5640_REV_Y_CTRL3 (0x13) - // Enable hardware JPEG #define OMV_HARDWARE_JPEG (1) // Enable MDMA sensor offload. #define OMV_ENABLE_SENSOR_MDMA (1) -// Enable sensor drivers +// Enable additional GPIO banks +#define OMV_ENABLE_GPIO_BANK_F (1) +#define OMV_ENABLE_GPIO_BANK_G (1) +#define OMV_ENABLE_GPIO_BANK_H (1) +#define OMV_ENABLE_GPIO_BANK_I (1) +#define OMV_ENABLE_GPIO_BANK_J (1) +#define OMV_ENABLE_GPIO_BANK_K (1) + +// Configure image sensor drivers #define OMV_ENABLE_OV2640 (1) #define OMV_ENABLE_OV5640 (1) #define OMV_ENABLE_OV7690 (0) @@ -64,7 +57,26 @@ #define OMV_ENABLE_PAJ6100 (1) #define OMV_ENABLE_FROGEYE2020 (1) -// Enable sensor features +// Configure FIR sensors drivers +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (0) +#define OMV_ENABLE_TOF_VL53L5CX (1) + +// OV7725 sensor settings +#define OMV_OV7725_PLL_CONFIG (0x41) // x4 +#define OMV_OV7725_BANDING (0x7F) + +// OV5640 sensor settings +#define OMV_OV5640_XCLK_FREQ (24000000) +#define OMV_OV5640_PLL_CTRL2 (0x64) +#define OMV_OV5640_PLL_CTRL3 (0x13) +#define OMV_OV5640_REV_Y_CHECK (1) +#define OMV_OV5640_REV_Y_FREQ (25000000) +#define OMV_OV5640_REV_Y_CTRL2 (0x54) +#define OMV_OV5640_REV_Y_CTRL3 (0x13) #define OMV_ENABLE_OV5640_AF (0) // Enable WiFi debug @@ -90,8 +102,8 @@ // USB IRQn. #define OMV_USB_IRQN (OTG_HS_IRQn) #define OMV_USB_ULPI (1) -#define OMV_USB_ULPI_DIR_PORT (GPIOI) -#define OMV_USB_ULPI_DIR_PIN (GPIO_PIN_11) +#define OMV_USB_ULPI_DIR_PIN (&omv_pin_I11_OTG_HS) +#define OMV_USB_ULPI_STP_PIN (&omv_pin_C0_OTG_HS) #define OMV_USB_ULPI_DIR_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() //PLL1 48MHz for USB, SDMMC and FDCAN @@ -164,7 +176,7 @@ #define OMV_FB_ALLOC_SIZE (11M) // minimum fb alloc size #define OMV_FB_OVERLAY_SIZE (496*1024) // Fast fb_alloc memory size. #define OMV_STACK_SIZE (64K) -#define OMV_HEAP_SIZE (197K) +#define OMV_HEAP_SIZE (196K) #define OMV_SDRAM_SIZE (32 * 1024 * 1024) // This needs to be here for UVC firmware. #define OMV_LINE_BUF_SIZE (11 * 1024) // Image line buffer round(2592 * 2BPP * 2 buffers). @@ -221,106 +233,78 @@ #define OMV_AXI_QOS_MDMA_R_PRI 15 // Max pri to move data. #define OMV_AXI_QOS_MDMA_W_PRI 15 // Max pri to move data. -// Image sensor I2C +// Image sensor I2C configuration #define ISC_I2C (I2C2) #define ISC_I2C_ID (2) -#define ISC_I2C_AF (GPIO_AF4_I2C2) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_H4_I2C2) +#define ISC_I2C_SDA_PIN (&omv_pin_H5_I2C2) #define ISC_I2C_CLK_ENABLE() __HAL_RCC_I2C2_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __HAL_RCC_I2C2_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOH) -#define ISC_I2C_SCL_PIN (GPIO_PIN_4) -#define ISC_I2C_SDA_PORT (GPIOH) -#define ISC_I2C_SDA_PIN (GPIO_PIN_5) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C2_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C2_RELEASE_RESET() -// FIR I2C +// FIR sensor I2C configuration #define FIR_I2C (I2C1) #define FIR_I2C_ID (1) -#define FIR_I2C_AF (GPIO_AF4_I2C1) +#define FIR_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define FIR_I2C_SCL_PIN (&omv_pin_B8_I2C1) +#define FIR_I2C_SDA_PIN (&omv_pin_B9_I2C1) #define FIR_I2C_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __HAL_RCC_I2C1_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOB) -#define FIR_I2C_SCL_PIN (GPIO_PIN_8) -#define FIR_I2C_SDA_PORT (GPIOB) -#define FIR_I2C_SDA_PIN (GPIO_PIN_9) -#define FIR_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() -// TOF I2C +// TOF sensor I2C configuration #define TOF_I2C (I2C4) #define TOF_I2C_ID (4) -#define TOF_I2C_AF (GPIO_AF6_I2C4) +#define TOF_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define TOF_I2C_SCL_PIN (&omv_pin_B6_I2C4) +#define TOF_I2C_SDA_PIN (&omv_pin_B7_I2C4) #define TOF_I2C_CLK_ENABLE() __HAL_RCC_I2C4_CLK_ENABLE() #define TOF_I2C_CLK_DISABLE() __HAL_RCC_I2C4_CLK_DISABLE() -#define TOF_I2C_SCL_PORT (GPIOB) -#define TOF_I2C_SCL_PIN (GPIO_PIN_6) -#define TOF_I2C_SDA_PORT (GPIOB) -#define TOF_I2C_SDA_PIN (GPIO_PIN_7) -#define TOF_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define TOF_I2C_FORCE_RESET() __HAL_RCC_I2C4_FORCE_RESET() #define TOF_I2C_RELEASE_RESET() __HAL_RCC_I2C4_RELEASE_RESET() -/* DCMI */ +// IMU I2C configuration +#define IMU_I2C (I2C4) +#define IMU_I2C_ID (4) +#define IMU_I2C_SPEED (0x4030040B) +#define IMU_I2C_SCL_PIN (&omv_pin_B6_I2C4) +#define IMU_I2C_SDA_PIN (&omv_pin_B7_I2C4) +#define IMU_I2C_CLK_ENABLE() __HAL_RCC_I2C4_CLK_ENABLE() +#define IMU_I2C_CLK_DISABLE() __HAL_RCC_I2C4_CLK_DISABLE() +#define IMU_I2C_FORCE_RESET() __HAL_RCC_I2C4_FORCE_RESET() +#define IMU_I2C_RELEASE_RESET() __HAL_RCC_I2C4_RELEASE_RESET() +#define IMU_CHIP_LSM6DS3 (1) +#define OMV_IMU_X_Y_ROTATION_DEGREES 0 +#define OMV_IMU_MOUNTING_Z_DIRECTION -1 + +// DCMI timer configuration #define DCMI_TIM (TIM1) -#define DCMI_TIM_PIN (GPIO_PIN_8) -#define DCMI_TIM_PORT (GPIOA) -#define DCMI_TIM_AF (GPIO_AF1_TIM1) +#define DCMI_TIM_PIN (&omv_pin_A8_TIM1) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1) #define DCMI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() -#define DCMI_RESET_PIN (GPIO_PIN_13) -#define DCMI_RESET_PORT (GPIOC) +// DCMI pins configuration +#define DCMI_RESET_PIN (&omv_pin_C13_GPIO) +#define DCMI_POWER_PIN (&omv_pin_I8_GPIO) +#define DCMI_FSYNC_PIN (&omv_pin_D5_GPIO) -#define DCMI_PWDN_PIN (GPIO_PIN_8) -#define DCMI_PWDN_PORT (GPIOI) +#define DCMI_D0_PIN (&omv_pin_A9_DCMI) +#define DCMI_D1_PIN (&omv_pin_A10_DCMI) +#define DCMI_D2_PIN (&omv_pin_G10_DCMI) +#define DCMI_D3_PIN (&omv_pin_G11_DCMI) +#define DCMI_D4_PIN (&omv_pin_E4_DCMI) +#define DCMI_D5_PIN (&omv_pin_D3_DCMI) +#define DCMI_D6_PIN (&omv_pin_E5_DCMI) +#define DCMI_D7_PIN (&omv_pin_E6_DCMI) -#define DCMI_FSYNC_PIN (GPIO_PIN_5) -#define DCMI_FSYNC_PORT (GPIOD) - -#define DCMI_VSYNC_PIN (GPIO_PIN_9) -#define DCMI_VSYNC_PORT (GPIOG) - -#define DCMI_HSYNC_PIN (GPIO_PIN_4) -#define DCMI_HSYNC_PORT (GPIOA) - -#define DCMI_PXCLK_PIN (GPIO_PIN_6) -#define DCMI_PXCLK_PORT (GPIOA) - -#define DCMI_D0_PIN (GPIO_PIN_9) -#define DCMI_D0_PORT (GPIOA) -#define DCMI_D1_PIN (GPIO_PIN_10) -#define DCMI_D1_PORT (GPIOA) -#define DCMI_D2_PIN (GPIO_PIN_10) -#define DCMI_D2_PORT (GPIOG) -#define DCMI_D3_PIN (GPIO_PIN_11) -#define DCMI_D3_PORT (GPIOG) -#define DCMI_D4_PIN (GPIO_PIN_4) -#define DCMI_D4_PORT (GPIOE) -#define DCMI_D5_PIN (GPIO_PIN_3) -#define DCMI_D5_PORT (GPIOD) -#define DCMI_D6_PIN (GPIO_PIN_5) -#define DCMI_D6_PORT (GPIOE) -#define DCMI_D7_PIN (GPIO_PIN_6) -#define DCMI_D7_PORT (GPIOE) - -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) - -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) - -#define DCMI_FSYNC_LOW() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_RESET) -#define DCMI_FSYNC_HIGH() HAL_GPIO_WritePin(DCMI_FSYNC_PORT, DCMI_FSYNC_PIN, GPIO_PIN_SET) - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (9) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOG) -#define DCMI_VSYNC_EXTI_SHARED (0) +#define DCMI_VSYNC_PIN (&omv_pin_G9_DCMI) +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) #define ISC_SPI (SPI6) // SPI6 clock source is PLL3Q (80MHz/4 == 20MHz) - Minimum (164*240*8*27 = 8,501,760Hz) @@ -342,82 +326,23 @@ #define ISC_SPI_CLK_DISABLE() __HAL_RCC_SPI6_CLK_DISABLE() #define ISC_SPI_DMA_CLK_ENABLE() __HAL_RCC_BDMA_CLK_ENABLE() -#define ISC_SPI_SCLK_PIN (GPIO_PIN_13) -#define ISC_SPI_SCLK_PORT (GPIOG) -#define ISC_SPI_SCLK_AF (GPIO_AF5_SPI6) - -#define ISC_SPI_MISO_PIN (GPIO_PIN_12) -#define ISC_SPI_MISO_PORT (GPIOG) -#define ISC_SPI_MISO_AF (GPIO_AF5_SPI6) - -#define ISC_SPI_MOSI_PIN (GPIO_PIN_14) -#define ISC_SPI_MOSI_PORT (GPIOG) -#define ISC_SPI_MOSI_AF (GPIO_AF5_SPI6) - -#define ISC_SPI_SSEL_PIN (GPIO_PIN_15) -#define ISC_SPI_SSEL_PORT (GPIOA) -#define ISC_SPI_SSEL_AF (GPIO_AF7_SPI6) - -#define IMU_CHIP_LSM6DS3 (1) -#define OMV_IMU_X_Y_ROTATION_DEGREES 0 -#define OMV_IMU_MOUNTING_Z_DIRECTION -1 - -#define IMU_I2C (I2C4) -#define IMU_I2C_ID (4) -#define IMU_I2C_AF (GPIO_AF6_I2C4) -#define IMU_I2C_CLK_ENABLE() __HAL_RCC_I2C4_CLK_ENABLE() -#define IMU_I2C_CLK_DISABLE() __HAL_RCC_I2C4_CLK_DISABLE() -#define IMU_I2C_SCL_PORT (GPIOB) -#define IMU_I2C_SCL_PIN (GPIO_PIN_6) -#define IMU_I2C_SDA_PORT (GPIOB) -#define IMU_I2C_SDA_PIN (GPIO_PIN_7) -#define IMU_I2C_SPEED (0x4030040B) -#define IMU_I2C_FORCE_RESET() __HAL_RCC_I2C4_FORCE_RESET() -#define IMU_I2C_RELEASE_RESET() __HAL_RCC_I2C4_RELEASE_RESET() +#define ISC_SPI_SCLK_PIN (&omv_pin_G13_SPI6) +#define ISC_SPI_MISO_PIN (&omv_pin_G12_SPI6) +#define ISC_SPI_MOSI_PIN (&omv_pin_G14_SPI6) +#define ISC_SPI_SSEL_PIN (&omv_pin_A15_SPI6) // SPI LCD Interface #define OMV_SPI_LCD_CONTROLLER (&spi_obj[1]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI2) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_1) -#define OMV_SPI_LCD_MOSI_PORT (GPIOC) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI2) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_C1_SPI2) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_C2_SPI2) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_A12_SPI2) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_A11_GPIO) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_2) -#define OMV_SPI_LCD_MISO_PORT (GPIOC) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_SCLK_PORT (GPIOA) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_6) -#define OMV_SPI_LCD_RST_PORT (GPIOC) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_7) -#define OMV_SPI_LCD_RS_PORT (GPIOC) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_11) -#define OMV_SPI_LCD_CS_PORT (GPIOA) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_5) -#define OMV_SPI_LCD_BL_PORT (GPIOC) -#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) - -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (0) -#define OMV_ENABLE_TOF_VL53L5CX (1) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_C6_GPIO) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_C7_GPIO) +#define OMV_SPI_LCD_BL_PIN (&omv_pin_C5_GPIO) #if 0 // FIR Lepton @@ -426,30 +351,9 @@ #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[1]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI2) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_1) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOC) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_2) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOC) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_12) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOA) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_11) -#define OMV_FIR_LEPTON_CS_PORT (GPIOA) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) +#define OMV_FIR_LEPTON_MOSI_PORT (&omv_pin_C1_SPI2) +#define OMV_FIR_LEPTON_MISO_PORT (&omv_pin_C2_SPI2) +#define OMV_FIR_LEPTON_SCLK_PORT (&omv_pin_A12_SPI2) +#define OMV_FIR_LEPTON_CS_PORT (&omv_pin_A11_GPIO) #endif - -// Enable additional GPIO banks for DRAM... -#define OMV_ENABLE_GPIO_BANK_F -#define OMV_ENABLE_GPIO_BANK_G -#define OMV_ENABLE_GPIO_BANK_H -#define OMV_ENABLE_GPIO_BANK_I -#define OMV_ENABLE_GPIO_BANK_J -#define OMV_ENABLE_GPIO_BANK_K - #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/OPENMV4_PRO/omv_pins.h b/src/omv/boards/OPENMV4_PRO/omv_pins.h new file mode 100644 index 000000000..f5d2aa7a5 --- /dev/null +++ b/src/omv/boards/OPENMV4_PRO/omv_pins.h @@ -0,0 +1,34 @@ +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 8, AF1, TIM1) +OMV_GPIO_DEFINE(A, 9, AF13, DCMI) +OMV_GPIO_DEFINE(A, 10, AF13, DCMI) +OMV_GPIO_DEFINE(A, 11, NONE, GPIO) +OMV_GPIO_DEFINE(A, 12, AF5, SPI2) +OMV_GPIO_DEFINE(A, 15, AF7, SPI6) +OMV_GPIO_DEFINE(B, 6, AF6, I2C4) +OMV_GPIO_DEFINE(B, 7, AF6, I2C4) +OMV_GPIO_DEFINE(B, 8, AF4, I2C1) +OMV_GPIO_DEFINE(B, 9, AF4, I2C1) +OMV_GPIO_DEFINE(C, 0, AF10, OTG_HS) +OMV_GPIO_DEFINE(C, 1, AF5, SPI2) +OMV_GPIO_DEFINE(C, 2, AF5, SPI2) +OMV_GPIO_DEFINE(C, 5, NONE, GPIO) +OMV_GPIO_DEFINE(C, 6, NONE, GPIO) +OMV_GPIO_DEFINE(C, 7, NONE, GPIO) +OMV_GPIO_DEFINE(C, 13, NONE, GPIO) +OMV_GPIO_DEFINE(D, 3, AF13, DCMI) +OMV_GPIO_DEFINE(D, 5, NONE, GPIO) +OMV_GPIO_DEFINE(E, 4, AF13, DCMI) +OMV_GPIO_DEFINE(E, 5, AF13, DCMI) +OMV_GPIO_DEFINE(E, 6, AF13, DCMI) +OMV_GPIO_DEFINE(G, 9, AF13, DCMI) +OMV_GPIO_DEFINE(G, 10, AF13, DCMI) +OMV_GPIO_DEFINE(G, 11, AF13, DCMI) +OMV_GPIO_DEFINE(G, 12, AF5, SPI6) +OMV_GPIO_DEFINE(G, 13, AF5, SPI6) +OMV_GPIO_DEFINE(G, 14, AF5, SPI6) +OMV_GPIO_DEFINE(H, 4, AF4, I2C2) +OMV_GPIO_DEFINE(H, 5, AF4, I2C2) +OMV_GPIO_DEFINE(I, 8, NONE, GPIO) +OMV_GPIO_DEFINE(I, 11, AF10, OTG_HS) diff --git a/src/omv/boards/OPENMVPT/omv_boardconfig.h b/src/omv/boards/OPENMVPT/omv_boardconfig.h index 83abcb8e4..55b807e3d 100644 --- a/src/omv/boards/OPENMVPT/omv_boardconfig.h +++ b/src/omv/boards/OPENMVPT/omv_boardconfig.h @@ -60,6 +60,19 @@ #define OMV_ENABLE_HM01B0 (0) #define OMV_ENABLE_PAJ6100 (0) #define OMV_ENABLE_FROGEYE2020 (0) +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (1) + +// Enable additional GPIO banks. +#define OMV_ENABLE_GPIO_BANK_F (1) +#define OMV_ENABLE_GPIO_BANK_G (1) +#define OMV_ENABLE_GPIO_BANK_H (1) +#define OMV_ENABLE_GPIO_BANK_I (1) +#define OMV_ENABLE_GPIO_BANK_J (1) +#define OMV_ENABLE_GPIO_BANK_K (1) // Enable sensor features #define OMV_ENABLE_OV5640_AF (1) @@ -215,129 +228,71 @@ // Image sensor I2C #define ISC_I2C (I2C1) #define ISC_I2C_ID (1) -#define ISC_I2C_AF (GPIO_AF4_I2C1) +#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) +#define ISC_I2C_SCL_PIN (&omv_pin_B8_I2C1) +#define ISC_I2C_SDA_PIN (&omv_pin_B9_I2C1) #define ISC_I2C_CLK_ENABLE() __I2C1_CLK_ENABLE() #define ISC_I2C_CLK_DISABLE() __I2C1_CLK_DISABLE() -#define ISC_I2C_SCL_PORT (GPIOB) -#define ISC_I2C_SCL_PIN (GPIO_PIN_8) -#define ISC_I2C_SDA_PORT (GPIOB) -#define ISC_I2C_SDA_PIN (GPIO_PIN_9) -#define ISC_I2C_SPEED (CAMBUS_SPEED_STANDARD) #define ISC_I2C_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() #define ISC_I2C_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() -/* FIR I2C */ +// FIR I2C configuration. #define FIR_I2C (I2C2) #define FIR_I2C_ID (2) -#define FIR_I2C_AF (GPIO_AF4_I2C2) +#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) +#define FIR_I2C_SCL_PIN (&omv_pin_B10_I2C2) +#define FIR_I2C_SDA_PIN (&omv_pin_B11_I2C2) #define FIR_I2C_CLK_ENABLE() __I2C2_CLK_ENABLE() #define FIR_I2C_CLK_DISABLE() __I2C2_CLK_DISABLE() -#define FIR_I2C_SCL_PORT (GPIOB) -#define FIR_I2C_SCL_PIN (GPIO_PIN_10) -#define FIR_I2C_SDA_PORT (GPIOB) -#define FIR_I2C_SDA_PIN (GPIO_PIN_11) -#define FIR_I2C_SPEED (CAMBUS_SPEED_FULL) #define FIR_I2C_FORCE_RESET() __HAL_RCC_I2C2_FORCE_RESET() #define FIR_I2C_RELEASE_RESET() __HAL_RCC_I2C2_RELEASE_RESET() +// Soft I2C bus. +#define SOFT_I2C_SIOC_PIN (&omv_pin_B10_GPIO) +#define SOFT_I2C_SIOD_PIN (&omv_pin_B11_GPIO) +#define SOFT_I2C_SPIN_DELAY 64 + + /* DCMI */ #define DCMI_TIM (TIM1) -#define DCMI_TIM_PIN (GPIO_PIN_8) -#define DCMI_TIM_PORT (GPIOA) -#define DCMI_TIM_AF (GPIO_AF1_TIM1) +#define DCMI_TIM_PIN (&omv_pin_A8_TIM1) #define DCMI_TIM_CHANNEL (TIM_CHANNEL_1) #define DCMI_TIM_CLK_ENABLE() __TIM1_CLK_ENABLE() #define DCMI_TIM_CLK_DISABLE() __TIM1_CLK_DISABLE() #define DCMI_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() -#define DCMI_RESET_PIN (GPIO_PIN_10) -#define DCMI_RESET_PORT (GPIOA) +#define DCMI_RESET_PIN (&omv_pin_A10_GPIO) +#define DCMI_POWER_PIN (&omv_pin_D7_GPIO) -#define DCMI_PWDN_PIN (GPIO_PIN_7) -#define DCMI_PWDN_PORT (GPIOD) +#define DCMI_D0_PIN (&omv_pin_C6_DCMI) +#define DCMI_D1_PIN (&omv_pin_C7_DCMI) +#define DCMI_D2_PIN (&omv_pin_G10_DCMI) +#define DCMI_D3_PIN (&omv_pin_G11_DCMI) +#define DCMI_D4_PIN (&omv_pin_E4_DCMI) +#define DCMI_D5_PIN (&omv_pin_B6_DCMI) +#define DCMI_D6_PIN (&omv_pin_E5_DCMI) +#define DCMI_D7_PIN (&omv_pin_E6_DCMI) -#define DCMI_D0_PIN (GPIO_PIN_6) -#define DCMI_D1_PIN (GPIO_PIN_7) -#define DCMI_D2_PIN (GPIO_PIN_10) -#define DCMI_D3_PIN (GPIO_PIN_11) -#define DCMI_D4_PIN (GPIO_PIN_4) -#define DCMI_D5_PIN (GPIO_PIN_6) -#define DCMI_D6_PIN (GPIO_PIN_5) -#define DCMI_D7_PIN (GPIO_PIN_6) - -#define DCMI_D0_PORT (GPIOC) -#define DCMI_D1_PORT (GPIOC) -#define DCMI_D2_PORT (GPIOG) -#define DCMI_D3_PORT (GPIOG) -#define DCMI_D4_PORT (GPIOE) -#define DCMI_D5_PORT (GPIOB) -#define DCMI_D6_PORT (GPIOE) -#define DCMI_D7_PORT (GPIOE) - -#define DCMI_HSYNC_PIN (GPIO_PIN_4) -#define DCMI_VSYNC_PIN (GPIO_PIN_7) -#define DCMI_PXCLK_PIN (GPIO_PIN_6) - -#define DCMI_HSYNC_PORT (GPIOA) -#define DCMI_VSYNC_PORT (GPIOB) -#define DCMI_PXCLK_PORT (GPIOA) - -#define DCMI_RESET_LOW() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_RESET) -#define DCMI_RESET_HIGH() HAL_GPIO_WritePin(DCMI_RESET_PORT, DCMI_RESET_PIN, GPIO_PIN_SET) - -#define DCMI_PWDN_LOW() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_RESET) -#define DCMI_PWDN_HIGH() HAL_GPIO_WritePin(DCMI_PWDN_PORT, DCMI_PWDN_PIN, GPIO_PIN_SET) - -#define DCMI_VSYNC_EXTI_IRQN (EXTI9_5_IRQn) -#define DCMI_VSYNC_EXTI_LINE (7) -#define DCMI_VSYNC_EXTI_GPIO (EXTI_GPIOB) -#define DCMI_VSYNC_EXTI_SHARED (0) +#define DCMI_HSYNC_PIN (&omv_pin_A4_DCMI) +#define DCMI_VSYNC_PIN (&omv_pin_B7_DCMI) +#define DCMI_PXCLK_PIN (&omv_pin_A6_DCMI) #define WINC_SPI (SPI5) -#define WINC_SPI_AF (GPIO_AF5_SPI5) #define WINC_SPI_TIMEOUT (1000) // SPI5 clock source is PLL2 (200MHz/4 == 50MHz) - Slightly over the maximum of 48 MHz. #define WINC_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_4) #define WINC_SPI_CLK_ENABLE() __HAL_RCC_SPI5_CLK_ENABLE() -#define WINC_SPI_SCLK_PIN (GPIO_PIN_6) -#define WINC_SPI_MISO_PIN (GPIO_PIN_7) -#define WINC_SPI_MOSI_PIN (GPIO_PIN_10) +#define WINC_SPI_SCLK_PIN (&omv_pin_H6_SPI5) +#define WINC_SPI_MISO_PIN (&omv_pin_H7_SPI5) +#define WINC_SPI_MOSI_PIN (&omv_pin_J10_SPI5) +#define WINC_SPI_SSEL_PIN (&omv_pin_K1_GPIO) -#define WINC_SPI_SCLK_PORT (GPIOH) -#define WINC_SPI_MISO_PORT (GPIOH) -#define WINC_SPI_MOSI_PORT (GPIOJ) - -#define WINC_EN_PIN (GPIO_PIN_0) -#define WINC_CS_PIN (GPIO_PIN_1) -#define WINC_RST_PIN (GPIO_PIN_3) -#define WINC_IRQ_PIN (pin_H5) -#define WINC_WAKE_PIN (GPIO_PIN_1) -#define WINC_CFG_PIN (GPIO_PIN_15) - -#define WINC_EN_PORT (GPIOA) -#define WINC_CS_PORT (GPIOK) -#define WINC_RST_PORT (GPIOC) -#define WINC_WAKE_PORT (GPIOA) -#define WINC_CFG_PORT (GPIOI) - -#define WINC_CS_LOW() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_RESET) -#define WINC_CS_HIGH() HAL_GPIO_WritePin(WINC_CS_PORT, WINC_CS_PIN, GPIO_PIN_SET) - -#define SOFT_I2C_PORT GPIOB -#define SOFT_I2C_SIOC_PIN GPIO_PIN_10 -#define SOFT_I2C_SIOD_PIN GPIO_PIN_11 - -#define SOFT_I2C_SIOC_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOC_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_H() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_SET) -#define SOFT_I2C_SIOD_L() HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, GPIO_PIN_RESET) - -#define SOFT_I2C_SIOD_READ() HAL_GPIO_ReadPin (SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN) -#define SOFT_I2C_SIOD_WRITE(bit) HAL_GPIO_WritePin(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN, bit) - -#define SOFT_I2C_SPIN_DELAY 64 +#define WINC_EN_PIN (&omv_pin_A0_GPIO) +#define WINC_RST_PIN (&omv_pin_C3_GPIO) +#define WINC_WAKE_PIN (&omv_pin_A1_GPIO) +#define WINC_CFG_PIN (&omv_pin_I15_GPIO) +#define WINC_IRQ_PIN (&omv_pin_H5_GPIO) // LCD Interface #define OMV_LCD_CONTROLLER (LTDC) @@ -346,116 +301,42 @@ #define OMV_LCD_FORCE_RESET() __HAL_RCC_LTDC_FORCE_RESET() #define OMV_LCD_RELEASE_RESET() __HAL_RCC_LTDC_RELEASE_RESET() -#define OMV_LCD_R0_PIN (GPIO_PIN_13) -#define OMV_LCD_R1_PIN (GPIO_PIN_2) -#define OMV_LCD_R2_PIN (GPIO_PIN_1) -#define OMV_LCD_R3_PIN (GPIO_PIN_2) -#define OMV_LCD_R4_PIN (GPIO_PIN_3) -#define OMV_LCD_R5_PIN (GPIO_PIN_4) -#define OMV_LCD_R6_PIN (GPIO_PIN_5) -#define OMV_LCD_R7_PIN (GPIO_PIN_0) +#define OMV_LCD_R0_PIN (&omv_pin_G13_LTDC) +#define OMV_LCD_R1_PIN (&omv_pin_A2_LTDC) +#define OMV_LCD_R2_PIN (&omv_pin_J1_LTDC) +#define OMV_LCD_R3_PIN (&omv_pin_J2_LTDC) +#define OMV_LCD_R4_PIN (&omv_pin_J3_LTDC) +#define OMV_LCD_R5_PIN (&omv_pin_J4_LTDC) +#define OMV_LCD_R6_PIN (&omv_pin_J5_LTDC) +#define OMV_LCD_R7_PIN (&omv_pin_J0_LTDC) -#define OMV_LCD_R0_PORT (GPIOG) -#define OMV_LCD_R1_PORT (GPIOA) -#define OMV_LCD_R2_PORT (GPIOJ) -#define OMV_LCD_R3_PORT (GPIOJ) -#define OMV_LCD_R4_PORT (GPIOJ) -#define OMV_LCD_R5_PORT (GPIOJ) -#define OMV_LCD_R6_PORT (GPIOJ) -#define OMV_LCD_R7_PORT (GPIOJ) +#define OMV_LCD_G0_PIN (&omv_pin_J7_LTDC) +#define OMV_LCD_G1_PIN (&omv_pin_J8_LTDC) +#define OMV_LCD_G2_PIN (&omv_pin_J9_LTDC) +#define OMV_LCD_G3_PIN (&omv_pin_J12_LTDC) +#define OMV_LCD_G4_PIN (&omv_pin_J11_LTDC) +#define OMV_LCD_G5_PIN (&omv_pin_K0_LTDC) +#define OMV_LCD_G6_PIN (&omv_pin_I11_LTDC) +#define OMV_LCD_G7_PIN (&omv_pin_D3_LTDC) -#define OMV_LCD_R0_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_R1_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_R2_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_R3_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_R4_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_R5_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_R6_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_R7_ALT (GPIO_AF9_LTDC) +#define OMV_LCD_B0_PIN (&omv_pin_G14_LTDC) +#define OMV_LCD_B1_PIN (&omv_pin_G12_LTDC) +#define OMV_LCD_B2_PIN (&omv_pin_D6_LTDC) +#define OMV_LCD_B3_PIN (&omv_pin_J15_LTDC) +#define OMV_LCD_B4_PIN (&omv_pin_K3_LTDC) +#define OMV_LCD_B5_PIN (&omv_pin_K4_LTDC) +#define OMV_LCD_B6_PIN (&omv_pin_K5_LTDC) +#define OMV_LCD_B7_PIN (&omv_pin_K6_LTDC) -#define OMV_LCD_G0_PIN (GPIO_PIN_7) -#define OMV_LCD_G1_PIN (GPIO_PIN_8) -#define OMV_LCD_G2_PIN (GPIO_PIN_9) -#define OMV_LCD_G3_PIN (GPIO_PIN_12) -#define OMV_LCD_G4_PIN (GPIO_PIN_11) -#define OMV_LCD_G5_PIN (GPIO_PIN_0) -#define OMV_LCD_G6_PIN (GPIO_PIN_11) -#define OMV_LCD_G7_PIN (GPIO_PIN_3) - -#define OMV_LCD_G0_PORT (GPIOJ) -#define OMV_LCD_G1_PORT (GPIOJ) -#define OMV_LCD_G2_PORT (GPIOJ) -#define OMV_LCD_G3_PORT (GPIOJ) -#define OMV_LCD_G4_PORT (GPIOJ) -#define OMV_LCD_G5_PORT (GPIOK) -#define OMV_LCD_G6_PORT (GPIOI) -#define OMV_LCD_G7_PORT (GPIOD) - -#define OMV_LCD_G0_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_G1_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_G2_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_G3_ALT (GPIO_AF9_LTDC) -#define OMV_LCD_G4_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_G5_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_G6_ALT (GPIO_AF9_LTDC) -#define OMV_LCD_G7_ALT (GPIO_AF14_LTDC) - -#define OMV_LCD_B0_PIN (GPIO_PIN_14) -#define OMV_LCD_B1_PIN (GPIO_PIN_12) -#define OMV_LCD_B2_PIN (GPIO_PIN_6) -#define OMV_LCD_B3_PIN (GPIO_PIN_15) -#define OMV_LCD_B4_PIN (GPIO_PIN_3) -#define OMV_LCD_B5_PIN (GPIO_PIN_4) -#define OMV_LCD_B6_PIN (GPIO_PIN_5) -#define OMV_LCD_B7_PIN (GPIO_PIN_6) - -#define OMV_LCD_B0_PORT (GPIOG) -#define OMV_LCD_B1_PORT (GPIOG) -#define OMV_LCD_B2_PORT (GPIOD) -#define OMV_LCD_B3_PORT (GPIOJ) -#define OMV_LCD_B4_PORT (GPIOK) -#define OMV_LCD_B5_PORT (GPIOK) -#define OMV_LCD_B6_PORT (GPIOK) -#define OMV_LCD_B7_PORT (GPIOK) - -#define OMV_LCD_B0_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_B1_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_B2_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_B3_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_B4_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_B5_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_B6_ALT (GPIO_AF14_LTDC) -#define OMV_LCD_B7_ALT (GPIO_AF14_LTDC) - -#define OMV_LCD_CLK_PIN (GPIO_PIN_14) -#define OMV_LCD_CLK_PORT (GPIOI) -#define OMV_LCD_CLK_ALT (GPIO_AF14_LTDC) - -#define OMV_LCD_DE_PIN (GPIO_PIN_7) -#define OMV_LCD_DE_PORT (GPIOK) -#define OMV_LCD_DE_ALT (GPIO_AF14_LTDC) - -#define OMV_LCD_HSYNC_PIN (GPIO_PIN_12) -#define OMV_LCD_HSYNC_PORT (GPIOI) -#define OMV_LCD_HSYNC_ALT (GPIO_AF14_LTDC) - -#define OMV_LCD_VSYNC_PIN (GPIO_PIN_13) -#define OMV_LCD_VSYNC_PORT (GPIOI) -#define OMV_LCD_VSYNC_ALT (GPIO_AF14_LTDC) - -#define OMV_LCD_DISP_PIN (GPIO_PIN_9) -#define OMV_LCD_DISP_PORT (GPIOG) -#define OMV_LCD_DISP_ON() HAL_GPIO_WritePin(OMV_LCD_DISP_PORT, OMV_LCD_DISP_PIN, GPIO_PIN_SET) -#define OMV_LCD_DISP_OFF() HAL_GPIO_WritePin(OMV_LCD_DISP_PORT, OMV_LCD_DISP_PIN, GPIO_PIN_RESET) - -#define OMV_LCD_BL_PIN (GPIO_PIN_0) -#define OMV_LCD_BL_PORT (GPIOB) -#define OMV_LCD_BL_ALT (GPIO_AF2_TIM3) -#define OMV_LCD_BL_FREQ (100000) -#define OMV_LCD_BL_ON() HAL_GPIO_WritePin(OMV_LCD_BL_PORT, OMV_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_LCD_BL_PORT, OMV_LCD_BL_PIN, GPIO_PIN_RESET) +#define OMV_LCD_CLK_PIN (&omv_pin_I14_LTDC) +#define OMV_LCD_DE_PIN (&omv_pin_K7_LTDC) +#define OMV_LCD_HSYNC_PIN (&omv_pin_I12_LTDC) +#define OMV_LCD_VSYNC_PIN (&omv_pin_I13_LTDC) +#define OMV_LCD_DISP_PIN (&omv_pin_G9_GPIO) +#define OMV_LCD_BL_PIN (&omv_pin_B0_TIM3) #define OMV_LCD_BL_TIM (TIM3) +#define OMV_LCD_BL_FREQ (100000) #define OMV_LCD_BL_TIM_CHANNEL (TIM_CHANNEL_3) #define OMV_LCD_BL_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE() #define OMV_LCD_BL_TIM_CLK_DISABLE() __HAL_RCC_TIM3_CLK_DISABLE() @@ -467,37 +348,14 @@ #define OMV_SPI_LCD_CONTROLLER (&spi_obj[1]) #define OMV_SPI_LCD_CONTROLLER_INSTANCE (SPI2) -#define OMV_SPI_LCD_MOSI_PIN (GPIO_PIN_15) -#define OMV_SPI_LCD_MOSI_PORT (GPIOB) -#define OMV_SPI_LCD_MOSI_ALT (GPIO_AF5_SPI2) +#define OMV_SPI_LCD_MOSI_PIN (&omv_pin_B15_SPI2) +#define OMV_SPI_LCD_MISO_PIN (&omv_pin_B14_SPI2) +#define OMV_SPI_LCD_SCLK_PIN (&omv_pin_B13_SPI2) -#define OMV_SPI_LCD_MISO_PIN (GPIO_PIN_14) -#define OMV_SPI_LCD_MISO_PORT (GPIOB) -#define OMV_SPI_LCD_MISO_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_SCLK_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_SCLK_PORT (GPIOB) -#define OMV_SPI_LCD_SCLK_ALT (GPIO_AF5_SPI2) - -#define OMV_SPI_LCD_RST_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_RST_PORT (GPIOD) -#define OMV_SPI_LCD_RST_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RST_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_RS_PIN (GPIO_PIN_13) -#define OMV_SPI_LCD_RS_PORT (GPIOD) -#define OMV_SPI_LCD_RS_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_RS_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_CS_PIN (GPIO_PIN_12) -#define OMV_SPI_LCD_CS_PORT (GPIOB) -#define OMV_SPI_LCD_CS_HIGH() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_CS_LOW() HAL_GPIO_WritePin(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN, GPIO_PIN_RESET) - -#define OMV_SPI_LCD_BL_PIN (GPIO_PIN_5) -#define OMV_SPI_LCD_BL_PORT (GPIOA) -#define OMV_SPI_LCD_BL_ON() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_SET) -#define OMV_SPI_LCD_BL_OFF() HAL_GPIO_WritePin(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN, GPIO_PIN_RESET) +#define OMV_SPI_LCD_RST_PIN (&omv_pin_D12_GPIO) +#define OMV_SPI_LCD_RS_PIN (&omv_pin_D13_GPIO) +#define OMV_SPI_LCD_SSEL_PIN (&omv_pin_B12_GPIO) +#define OMV_SPI_LCD_BL_PIN (&omv_pin_A5_GPIO) #define OMV_SPI_LCD_BL_DAC (DAC1) #define OMV_SPI_LCD_BL_DAC_CHANNEL (DAC_CHANNEL_2) @@ -508,10 +366,10 @@ // DVI TFP410PAP I/O #define OMV_DVI_PRESENT -#define OMV_DVI_RESET_PIN (pin_D11) +#define OMV_DVI_RESET_PIN (&omv_pin_D11_GPIO) #define OMV_DVI_SCL_PIN (pin_B1) #define OMV_DVI_SDA_PIN (pin_B2) -#define OMV_DVI_INT_PIN (pin_I8) +#define OMV_DVI_INT_PIN (&omv_pin_I8_GPIO) // DDC I/O #define OMV_DDC_PRESENT @@ -520,63 +378,31 @@ // Touch Screen I/O #define OMV_TOUCH_PRESENT -#define OMV_TOUCH_RESET_PIN (pin_K2) +#define OMV_TOUCH_RESET_PIN (&omv_pin_K2_GPIO) #define OMV_TOUCH_SCL_PIN (pin_J13) #define OMV_TOUCH_SDA_PIN (pin_J14) -#define OMV_TOUCH_INT_PIN (pin_J6) +#define OMV_TOUCH_INT_PIN (&omv_pin_J6_GPIO) // HDMI CEC I/O #define OMV_CEC_PRESENT #define OMV_CEC_PIN (pin_H2) -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (1) - // FIR Lepton #define OMV_FIR_LEPTON_I2C_BUS (ISC_I2C_ID) #define OMV_FIR_LEPTON_I2C_BUS_SPEED (ISC_I2C_SPEED) #define OMV_FIR_LEPTON_CONTROLLER (&spi_obj[2]) #define OMV_FIR_LEPTON_CONTROLLER_INSTANCE (SPI3) -#define OMV_FIR_LEPTON_MOSI_PIN (GPIO_PIN_5) -#define OMV_FIR_LEPTON_MOSI_PORT (GPIOB) -#define OMV_FIR_LEPTON_MOSI_ALT (GPIO_AF7_SPI3) +#define OMV_FIR_LEPTON_MOSI_PIN (&omv_pin_B5_SPI3) +#define OMV_FIR_LEPTON_MISO_PIN (&omv_pin_B4_SPI3) +#define OMV_FIR_LEPTON_SCLK_PIN (&omv_pin_B3_SPI3) +#define OMV_FIR_LEPTON_SSEL_PIN (&omv_pin_A15_GPIO) -#define OMV_FIR_LEPTON_MISO_PIN (GPIO_PIN_4) -#define OMV_FIR_LEPTON_MISO_PORT (GPIOB) -#define OMV_FIR_LEPTON_MISO_ALT (GPIO_AF6_SPI3) +#define OMV_FIR_LEPTON_RESET_PIN (&omv_pin_D5_GPIO) +#define OMV_FIR_LEPTON_POWER_PIN (&omv_pin_D4_GPIO) +#define OMV_FIR_LEPTON_VSYNC_PIN (&omv_pin_E3_GPIO) -#define OMV_FIR_LEPTON_SCLK_PIN (GPIO_PIN_3) -#define OMV_FIR_LEPTON_SCLK_PORT (GPIOB) -#define OMV_FIR_LEPTON_SCLK_ALT (GPIO_AF6_SPI3) - -#define OMV_FIR_LEPTON_CS_PIN (GPIO_PIN_15) -#define OMV_FIR_LEPTON_CS_PORT (GPIOA) -#define OMV_FIR_LEPTON_CS_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_CS_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN, GPIO_PIN_RESET) - -#define OMV_FIR_LEPTON_RST_PIN_PRESENT -#define OMV_FIR_LEPTON_RST_PIN (GPIO_PIN_5) -#define OMV_FIR_LEPTON_RST_PORT (GPIOD) -#define OMV_FIR_LEPTON_RST_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_RST_PORT, OMV_FIR_LEPTON_RST_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_RST_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_RST_PORT, OMV_FIR_LEPTON_RST_PIN, GPIO_PIN_RESET) - -#define OMV_FIR_LEPTON_PWDN_PIN_PRESENT -#define OMV_FIR_LEPTON_PWDN_PIN (GPIO_PIN_4) -#define OMV_FIR_LEPTON_PWDN_PORT (GPIOD) -#define OMV_FIR_LEPTON_PWDN_HIGH() HAL_GPIO_WritePin(OMV_FIR_LEPTON_PWDN_PORT, OMV_FIR_LEPTON_PWDN_PIN, GPIO_PIN_SET) -#define OMV_FIR_LEPTON_PWDN_LOW() HAL_GPIO_WritePin(OMV_FIR_LEPTON_PWDN_PORT, OMV_FIR_LEPTON_PWDN_PIN, GPIO_PIN_RESET) - -#define OMV_FIR_LEPTON_VSYNC_PRESENT -#define OMV_FIR_LEPTON_VSYNC_PIN (pin_E3) - -#define OMV_FIR_LEPTON_MCLK_PIN (GPIO_PIN_3) -#define OMV_FIR_LEPTON_MCLK_PORT (GPIOA) -#define OMV_FIR_LEPTON_MCLK_ALT (GPIO_AF4_TIM15) +#define OMV_FIR_LEPTON_MCLK_PIN (&omv_pin_A3_TIM15) #define OMV_FIR_LEPTON_MCLK_FREQ (24000000) #define OMV_FIR_LEPTON_MCLK_TIM (TIM15) @@ -588,9 +414,7 @@ #define OMV_FIR_LEPTON_MCLK_TIM_PCLK_FREQ() HAL_RCC_GetPCLK2Freq() // Buzzer -#define OMV_BUZZER_PIN (GPIO_PIN_1) -#define OMV_BUZZER_PORT (GPIOA) -#define OMV_BUZZER_ALT (GPIO_AF1_TIM2) +#define OMV_BUZZER_PIN (&omv_pin_A1_TIM2) #define OMV_BUZZER_FREQ (4000) #define OMV_BUZZER_TIM (TIM2) @@ -601,12 +425,4 @@ #define OMV_BUZZER_TIM_RELEASE_RESET() __HAL_RCC_TIM2_RELEASE_RESET() #define OMV_BUZZER_TIM_PCLK_FREQ() HAL_RCC_GetPCLK1Freq() -// Enable additional GPIO banks -#define OMV_ENABLE_GPIO_BANK_F -#define OMV_ENABLE_GPIO_BANK_G -#define OMV_ENABLE_GPIO_BANK_H -#define OMV_ENABLE_GPIO_BANK_I -#define OMV_ENABLE_GPIO_BANK_J -#define OMV_ENABLE_GPIO_BANK_K - #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/OPENMVPT/omv_pins.h b/src/omv/boards/OPENMVPT/omv_pins.h new file mode 100644 index 000000000..eb0631ec1 --- /dev/null +++ b/src/omv/boards/OPENMVPT/omv_pins.h @@ -0,0 +1,79 @@ +OMV_GPIO_DEFINE(A, 0, NONE, GPIO) +OMV_GPIO_DEFINE(A, 1, NONE, GPIO) +OMV_GPIO_DEFINE(A, 1, AF1, TIM2) +OMV_GPIO_DEFINE(A, 2, AF14, LTDC) +OMV_GPIO_DEFINE(A, 3, AF4, TIM15) +OMV_GPIO_DEFINE(A, 4, AF13, DCMI) +OMV_GPIO_DEFINE(A, 5, NONE, GPIO) +OMV_GPIO_DEFINE(A, 6, AF13, DCMI) +OMV_GPIO_DEFINE(A, 8, AF1, TIM1) +OMV_GPIO_DEFINE(A, 10, NONE, GPIO) +OMV_GPIO_DEFINE(A, 15, NONE, GPIO) +OMV_GPIO_DEFINE(B, 0, AF2, TIM3) +OMV_GPIO_DEFINE(B, 3, AF6, SPI3) +OMV_GPIO_DEFINE(B, 4, AF6, SPI3) +OMV_GPIO_DEFINE(B, 5, AF7, SPI3) +OMV_GPIO_DEFINE(B, 6, AF13, DCMI) +OMV_GPIO_DEFINE(B, 7, AF13, DCMI) +OMV_GPIO_DEFINE(B, 8, AF4, I2C1) +OMV_GPIO_DEFINE(B, 9, AF4, I2C1) +OMV_GPIO_DEFINE(B, 10, NONE, GPIO) +OMV_GPIO_DEFINE(B, 10, AF4, I2C2) +OMV_GPIO_DEFINE(B, 11, NONE, GPIO) +OMV_GPIO_DEFINE(B, 11, AF4, I2C2) +OMV_GPIO_DEFINE(B, 12, NONE, GPIO) +OMV_GPIO_DEFINE(B, 13, AF5, SPI2) +OMV_GPIO_DEFINE(B, 14, AF5, SPI2) +OMV_GPIO_DEFINE(B, 15, AF5, SPI2) +OMV_GPIO_DEFINE(C, 3, NONE, GPIO) +OMV_GPIO_DEFINE(C, 6, AF13, DCMI) +OMV_GPIO_DEFINE(C, 7, AF13, DCMI) +OMV_GPIO_DEFINE(D, 3, AF14, LTDC) +OMV_GPIO_DEFINE(D, 4, NONE, GPIO) +OMV_GPIO_DEFINE(D, 5, NONE, GPIO) +OMV_GPIO_DEFINE(D, 6, AF14, LTDC) +OMV_GPIO_DEFINE(D, 7, NONE, GPIO) +OMV_GPIO_DEFINE(D, 11, NONE, GPIO) +OMV_GPIO_DEFINE(D, 12, NONE, GPIO) +OMV_GPIO_DEFINE(D, 13, NONE, GPIO) +OMV_GPIO_DEFINE(E, 3, NONE, GPIO) +OMV_GPIO_DEFINE(E, 4, AF13, DCMI) +OMV_GPIO_DEFINE(E, 5, AF13, DCMI) +OMV_GPIO_DEFINE(E, 6, AF13, DCMI) +OMV_GPIO_DEFINE(G, 9, NONE, GPIO) +OMV_GPIO_DEFINE(G, 10, AF13, DCMI) +OMV_GPIO_DEFINE(G, 11, AF13, DCMI) +OMV_GPIO_DEFINE(G, 12, AF14, LTDC) +OMV_GPIO_DEFINE(G, 13, AF14, LTDC) +OMV_GPIO_DEFINE(G, 14, AF14, LTDC) +OMV_GPIO_DEFINE(H, 5, NONE, GPIO) +OMV_GPIO_DEFINE(H, 6, AF5, SPI5) +OMV_GPIO_DEFINE(H, 7, AF5, SPI5) +OMV_GPIO_DEFINE(I, 8, NONE, GPIO) +OMV_GPIO_DEFINE(I, 11, AF9, LTDC) +OMV_GPIO_DEFINE(I, 12, AF14, LTDC) +OMV_GPIO_DEFINE(I, 13, AF14, LTDC) +OMV_GPIO_DEFINE(I, 14, AF14, LTDC) +OMV_GPIO_DEFINE(I, 15, NONE, GPIO) +OMV_GPIO_DEFINE(J, 0, AF9, LTDC) +OMV_GPIO_DEFINE(J, 1, AF14, LTDC) +OMV_GPIO_DEFINE(J, 2, AF14, LTDC) +OMV_GPIO_DEFINE(J, 3, AF14, LTDC) +OMV_GPIO_DEFINE(J, 4, AF14, LTDC) +OMV_GPIO_DEFINE(J, 5, AF14, LTDC) +OMV_GPIO_DEFINE(J, 6, NONE, GPIO) +OMV_GPIO_DEFINE(J, 7, AF14, LTDC) +OMV_GPIO_DEFINE(J, 8, AF14, LTDC) +OMV_GPIO_DEFINE(J, 9, AF14, LTDC) +OMV_GPIO_DEFINE(J, 10, AF5, SPI5) +OMV_GPIO_DEFINE(J, 11, AF14, LTDC) +OMV_GPIO_DEFINE(J, 12, AF9, LTDC) +OMV_GPIO_DEFINE(J, 15, AF14, LTDC) +OMV_GPIO_DEFINE(K, 0, AF14, LTDC) +OMV_GPIO_DEFINE(K, 1, NONE, GPIO) +OMV_GPIO_DEFINE(K, 2, NONE, GPIO) +OMV_GPIO_DEFINE(K, 3, AF14, LTDC) +OMV_GPIO_DEFINE(K, 4, AF14, LTDC) +OMV_GPIO_DEFINE(K, 5, AF14, LTDC) +OMV_GPIO_DEFINE(K, 6, AF14, LTDC) +OMV_GPIO_DEFINE(K, 7, AF14, LTDC) diff --git a/src/omv/boards/PICO/omv_boardconfig.h b/src/omv/boards/PICO/omv_boardconfig.h index d7a7ed9c5..4c467bc41 100644 --- a/src/omv/boards/PICO/omv_boardconfig.h +++ b/src/omv/boards/PICO/omv_boardconfig.h @@ -130,26 +130,6 @@ extern unsigned char *OMV_UNIQUE_ID_ADDR; // Unique ID address. #define LCD_RST_PIN (20) #define LCD_RS_PIN (21) -// WiFi/NINA config. -//#define WIFI_SPI (spi1) -//#define WIFI_CS_PIN (15) -//#define WIFI_MOSI_PIN (16) -//#define WIFI_MISO_PIN (17) -//#define WIFI_SCLK_PIN (18) -//#define WIFI_RST_PIN (19) -//#define WIFI_GPIO0_PIN (20) -//#define WIFI_ACK_PIN (21) - -// AUDIO config. -//#define PDM_PIO (pio1) -//#define PDM_SM (0) -//#define PDM_DMA (1) -//#define PDM_DMA_IRQ (DMA_IRQ_1) -//#define PDM_DMA_CHANNEL (0) -// -//#define PDM_CLK_PIN (23) -//#define PDM_DIN_PIN (22) - // DCMI config. #define DCMI_PIO (pio0) #define DCMI_SM (0) @@ -157,7 +137,7 @@ extern unsigned char *OMV_UNIQUE_ID_ADDR; // Unique ID address. #define DCMI_DMA_IRQ (DMA_IRQ_0) #define DCMI_DMA_CHANNEL (0) -#define DCMI_PWDN_PIN (0) +#define DCMI_POWER_PIN (0) #define DCMI_RESET_PIN (1) #define DCMI_D0_PIN (2) @@ -169,27 +149,11 @@ extern unsigned char *OMV_UNIQUE_ID_ADDR; // Unique ID address. #define DCMI_D6_PIN (8) #define DCMI_D7_PIN (9) -// TODO: These are hard-coded in dcmi.pio need to fix. +#define DCMI_XCLK_PIN (10) + +// Must match the pins defined in dcmi.pio. #define DCMI_PXCLK_PIN (11) #define DCMI_HSYNC_PIN (12) #define DCMI_VSYNC_PIN (13) -#define DCMI_XCLK_PIN (10) - -#if defined(DCMI_RESET_PIN) -#define DCMI_RESET_LOW() gpio_put(DCMI_RESET_PIN, 0) -#define DCMI_RESET_HIGH() gpio_put(DCMI_RESET_PIN, 1) -#else -#define DCMI_RESET_LOW() -#define DCMI_RESET_HIGH() -#endif - -#if defined(DCMI_PWDN_PIN) -#define DCMI_PWDN_LOW() gpio_put(DCMI_PWDN_PIN, 0) -#define DCMI_PWDN_HIGH() gpio_put(DCMI_PWDN_PIN, 1) -#else -#define DCMI_PWDN_LOW() -#define DCMI_PWDN_HIGH() -#endif - #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/boards/arduino_nano_33_ble_sense/omv_boardconfig.h b/src/omv/boards/arduino_nano_33_ble_sense/omv_boardconfig.h index 12b74c89e..315acb306 100644 --- a/src/omv/boards/arduino_nano_33_ble_sense/omv_boardconfig.h +++ b/src/omv/boards/arduino_nano_33_ble_sense/omv_boardconfig.h @@ -44,6 +44,13 @@ #define OMV_ENABLE_PAJ6100 (0) #define OMV_ENABLE_FROGEYE2020 (0) +// FIR Module +#define OMV_ENABLE_FIR_MLX90621 (1) +#define OMV_ENABLE_FIR_MLX90640 (1) +#define OMV_ENABLE_FIR_MLX90641 (1) +#define OMV_ENABLE_FIR_AMG8833 (1) +#define OMV_ENABLE_FIR_LEPTON (0) + // Set which OV767x sensor is used #define OMV_OV7670_VERSION (75) @@ -129,7 +136,7 @@ #define PDM_PWR_PIN (17) // DCMI -#define DCMI_PWDN_PIN (29) +#define DCMI_POWER_PIN (29) #define DCMI_RESET_PIN (30) #define DCMI_D0_PIN (32+2) @@ -146,27 +153,4 @@ #define DCMI_PXCLK_PIN (4) #define DCMI_XCLK_PIN (27) -#if defined(DCMI_RESET_PIN) -#define DCMI_RESET_LOW() nrf_gpio_pin_clear(DCMI_RESET_PIN) -#define DCMI_RESET_HIGH() nrf_gpio_pin_set(DCMI_RESET_PIN) -#else -#define DCMI_RESET_LOW() -#define DCMI_RESET_HIGH() -#endif - -#if defined(DCMI_PWDN_PIN) -#define DCMI_PWDN_LOW() nrf_gpio_pin_clear(DCMI_PWDN_PIN) -#define DCMI_PWDN_HIGH() nrf_gpio_pin_set(DCMI_PWDN_PIN) -#else -#define DCMI_PWDN_LOW() -#define DCMI_PWDN_HIGH() -#endif - -// FIR Module -#define OMV_ENABLE_FIR_MLX90621 (1) -#define OMV_ENABLE_FIR_MLX90640 (1) -#define OMV_ENABLE_FIR_MLX90641 (1) -#define OMV_ENABLE_FIR_AMG8833 (1) -#define OMV_ENABLE_FIR_LEPTON (0) - #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/common/common.h b/src/omv/common/common.h index e5f07cf5c..7c6c3ebfd 100644 --- a/src/omv/common/common.h +++ b/src/omv/common/common.h @@ -1,8 +1,8 @@ /* * This file is part of the OpenMV project. * - * Copyright (c) 2013-2021 Ibrahim Abdelkader - * Copyright (c) 2013-2021 Kwabena W. Agyeman + * Copyright (c) 2013-2023 Ibrahim Abdelkader + * Copyright (c) 2013-2023 Kwabena W. Agyeman * * This work is licensed under the MIT license, see the file LICENSE for details. * @@ -14,8 +14,7 @@ #define OMV_ATTR_SECTION(x, s) x __attribute__((section(s))) #define OMV_ATTR_ALWAYS_INLINE inline __attribute__((always_inline)) #define OMV_ATTR_OPTIMIZE(o) __attribute__((optimize(o))) - -#define OMG_BREAK() __asm__ volatile ("BKPT") +#define OMV_BREAK() __asm__ volatile ("BKPT") #ifdef OMV_DEBUG_PRINTF #define debug_printf(fmt, ...) \ @@ -24,17 +23,17 @@ #define debug_printf(...) #endif -#define OMV_MAX(a,b) \ -({ \ +#define OMV_MAX(a,b) ({ \ __typeof__ (a) _a = (a); \ __typeof__ (b) _b = (b); \ _a > _b ? _a : _b; \ }) -#define OMV_MIN(a,b) \ -({ \ +#define OMV_MIN(a,b) ({ \ __typeof__ (a) _a = (a); \ __typeof__ (b) _b = (b); \ _a < _b ? _a : _b; \ }) + +#define OMV_ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) #endif //__OMV_COMMON_H__ diff --git a/src/omv/common/omv_gpio.h b/src/omv/common/omv_gpio.h new file mode 100644 index 000000000..2037a6d5f --- /dev/null +++ b/src/omv/common/omv_gpio.h @@ -0,0 +1,30 @@ +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2023 Ibrahim Abdelkader + * Copyright (c) 2023 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * GPIO abstraction layer. + */ +#ifndef __OMV_GPIO_H__ +#define __OMV_GPIO_H__ +#include +#include +#include "omv_portconfig.h" + +// Config options are defined in ports so they can be used +// directly to initialize peripherals without remapping them. + +typedef void (*omv_gpio_callback_t)(omv_gpio_t pin, void *data); + +void omv_gpio_init0(void); +void omv_gpio_config(omv_gpio_t pin, uint32_t mode, uint32_t pull, uint32_t speed, uint32_t af); +void omv_gpio_deinit(omv_gpio_t pin); +bool omv_gpio_read(omv_gpio_t pin); +void omv_gpio_write(omv_gpio_t pin, bool value); +void omv_gpio_irq_register(omv_gpio_t pin, omv_gpio_callback_t callback, void *data); +void omv_gpio_irq_enable(omv_gpio_t pin, bool enable); +void omv_gpio_clock_enable(omv_gpio_t pin, bool enable); +#endif // __OMV_GPIO_H__ diff --git a/src/omv/common/sensor_utils.c b/src/omv/common/sensor_utils.c index fd36eb8a6..b755dd0e9 100644 --- a/src/omv/common/sensor_utils.c +++ b/src/omv/common/sensor_utils.c @@ -32,6 +32,7 @@ #include "gc2145.h" #include "framebuffer.h" #include "omv_boardconfig.h" +#include "omv_gpio.h" #if (OMV_ENABLE_PAJ6100 == 1) #define OMV_ENABLE_NONI2CIS @@ -142,16 +143,18 @@ __weak int sensor_reset() // Disable the bus before reset. cambus_enable(&sensor.bus, false); + #if defined(DCMI_RESET_PIN) // Hard-reset the sensor if (sensor.reset_pol == ACTIVE_HIGH) { - DCMI_RESET_HIGH(); + omv_gpio_write(DCMI_RESET_PIN, 1); mp_hal_delay_ms(10); - DCMI_RESET_LOW(); + omv_gpio_write(DCMI_RESET_PIN, 0); } else { - DCMI_RESET_LOW(); + omv_gpio_write(DCMI_RESET_PIN, 0); mp_hal_delay_ms(10); - DCMI_RESET_HIGH(); + omv_gpio_write(DCMI_RESET_PIN, 1); } + #endif mp_hal_delay_ms(20); @@ -176,12 +179,14 @@ int sensor_probe_init(uint32_t bus_id, uint32_t bus_speed) int freq; (void) freq; + #if defined(DCMI_POWER_PIN) // Do a power cycle - DCMI_PWDN_HIGH(); + omv_gpio_write(DCMI_POWER_PIN, 1); mp_hal_delay_ms(10); - DCMI_PWDN_LOW(); + omv_gpio_write(DCMI_POWER_PIN, 0); mp_hal_delay_ms(10); + #endif /* Some sensors have different reset polarities, and we can't know which sensor is connected before initializing cambus and probing the sensor, which in turn @@ -190,12 +195,14 @@ int sensor_probe_init(uint32_t bus_id, uint32_t bus_speed) sensor.pwdn_pol = ACTIVE_HIGH; sensor.reset_pol = ACTIVE_HIGH; + #if defined(DCMI_RESET_PIN) // Reset the sensor - DCMI_RESET_HIGH(); + omv_gpio_write(DCMI_RESET_PIN, 1); mp_hal_delay_ms(10); - DCMI_RESET_LOW(); + omv_gpio_write(DCMI_RESET_PIN, 0); mp_hal_delay_ms(10); + #endif // Initialize the camera bus. cambus_init(&sensor.bus, bus_id, bus_speed); @@ -208,24 +215,30 @@ int sensor_probe_init(uint32_t bus_id, uint32_t bus_speed) so the reset line is active low */ sensor.reset_pol = ACTIVE_LOW; + #if defined(DCMI_RESET_PIN) // Pull the sensor out of the reset state. - DCMI_RESET_HIGH(); + omv_gpio_write(DCMI_RESET_PIN, 1); mp_hal_delay_ms(10); + #endif // Probe again to set the slave addr. sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0); if (sensor.slv_addr == 0) { sensor.pwdn_pol = ACTIVE_LOW; - DCMI_PWDN_HIGH(); + #if defined(DCMI_POWER_PIN) + omv_gpio_write(DCMI_POWER_PIN, 1); mp_hal_delay_ms(10); + #endif sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0); if (sensor.slv_addr == 0) { sensor.reset_pol = ACTIVE_HIGH; - DCMI_RESET_LOW(); + #if defined(DCMI_RESET_PIN) + omv_gpio_write(DCMI_RESET_PIN, 0); mp_hal_delay_ms(10); + #endif sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0); #ifndef OMV_ENABLE_NONI2CIS @@ -501,19 +514,21 @@ __weak int sensor_shutdown(int enable) // Disable any ongoing frame capture. sensor_abort(); + #if defined(DCMI_POWER_PIN) if (enable) { if (sensor.pwdn_pol == ACTIVE_HIGH) { - DCMI_PWDN_HIGH(); + omv_gpio_write(DCMI_POWER_PIN, 1); } else { - DCMI_PWDN_LOW(); + omv_gpio_write(DCMI_POWER_PIN, 0); } } else { if (sensor.pwdn_pol == ACTIVE_HIGH) { - DCMI_PWDN_LOW(); + omv_gpio_write(DCMI_POWER_PIN, 0); } else { - DCMI_PWDN_HIGH(); + omv_gpio_write(DCMI_POWER_PIN, 1); } } + #endif mp_hal_delay_ms(10); diff --git a/src/omv/ports/nrf/omv_gpio.c b/src/omv/ports/nrf/omv_gpio.c new file mode 100644 index 000000000..085ebf551 --- /dev/null +++ b/src/omv/ports/nrf/omv_gpio.c @@ -0,0 +1,41 @@ +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2023 Ibrahim Abdelkader + * Copyright (c) 2023 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * GPIO port for nrf. + */ +#include +#include + +#include "py/mphal.h" +#include "hal/nrf_gpio.h" + +#include "omv_boardconfig.h" +#include "omv_gpio.h" + +void omv_gpio_config(omv_gpio_t pin, uint32_t mode, uint32_t pull, uint32_t speed, uint32_t af) +{ + (void) af; // Unsupported. + uint32_t input = (mode == OMV_GPIO_MODE_INPUT) ? + NRF_GPIO_PIN_INPUT_CONNECT : NRF_GPIO_PIN_INPUT_DISCONNECT; + nrf_gpio_cfg(pin, mode, input, pull, NRF_GPIO_PIN_S0S1, NRF_GPIO_PIN_NOSENSE); +} + +void omv_gpio_deinit(omv_gpio_t pin) +{ + nrf_gpio_cfg_default(pin); +} + +bool omv_gpio_read(omv_gpio_t pin) +{ + return nrf_gpio_pin_read(pin); +} + +void omv_gpio_write(omv_gpio_t pin, bool value) +{ + nrf_gpio_pin_write(pin, value); +} diff --git a/src/omv/ports/nrf/omv_portconfig.h b/src/omv/ports/nrf/omv_portconfig.h index 25f7e2673..e10942742 100644 --- a/src/omv/ports/nrf/omv_portconfig.h +++ b/src/omv/ports/nrf/omv_portconfig.h @@ -13,6 +13,19 @@ #include "nrfx_twi.h" +// GPIO speeds. +#define OMV_GPIO_SPEED_LOW 0 +#define OMV_GPIO_SPEED_HIGH 0 + +// GPIO pull. +#define OMV_GPIO_PULL_NONE NRF_GPIO_PIN_NOPULL +#define OMV_GPIO_PULL_UP NRF_GPIO_PIN_PULLUP +#define OMV_GPIO_PULL_DOWN NRF_GPIO_PIN_PULLDOWN + +// GPIO modes. +#define OMV_GPIO_MODE_INPUT NRF_GPIO_PIN_DIR_INPUT +#define OMV_GPIO_MODE_OUTPUT NRF_GPIO_PIN_DIR_OUTPUT + // omv_gpio_t definition typedef uint32_t omv_gpio_t; diff --git a/src/omv/ports/nrf/sensor.c b/src/omv/ports/nrf/sensor.c index 9b9649d1b..62f585a1f 100644 --- a/src/omv/ports/nrf/sensor.c +++ b/src/omv/ports/nrf/sensor.c @@ -49,14 +49,14 @@ int sensor_init() { int init_ret = 0; - #if defined(DCMI_PWDN_PIN) - nrf_gpio_cfg_output(DCMI_PWDN_PIN); - DCMI_PWDN_HIGH(); + #if defined(DCMI_POWER_PIN) + nrf_gpio_cfg_output(DCMI_POWER_PIN); + nrf_gpio_pin_write(DCMI_POWER_PIN, 1); #endif #if defined(DCMI_RESET_PIN) nrf_gpio_cfg_output(DCMI_RESET_PIN); - DCMI_RESET_HIGH(); + nrf_gpio_pin_write(DCMI_RESET_PIN, 1); #endif // Reset the sesnor state diff --git a/src/omv/ports/rp2/omv_gpio.c b/src/omv/ports/rp2/omv_gpio.c new file mode 100644 index 000000000..f14561fad --- /dev/null +++ b/src/omv/ports/rp2/omv_gpio.c @@ -0,0 +1,51 @@ +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2023 Ibrahim Abdelkader + * Copyright (c) 2023 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * GPIO port for rp2. + */ +#include +#include +#include + +#include "py/mphal.h" +#include "pico/stdlib.h" +#include "hardware/gpio.h" + +#include "omv_boardconfig.h" +#include "omv_gpio.h" + +void omv_gpio_config(omv_gpio_t pin, uint32_t mode, uint32_t pull, uint32_t speed, uint32_t af) +{ + if (mode == OMV_GPIO_MODE_ALT) { + gpio_set_function(pin, af); + } else { + gpio_init(pin); + gpio_set_dir(pin, mode); + } + if (pull == OMV_GPIO_PULL_UP) { + gpio_pull_up(pin); + } else if (pull == OMV_GPIO_PULL_DOWN) { + gpio_pull_down(pin); + } + gpio_set_slew_rate(pin, speed); +} + +void omv_gpio_deinit(omv_gpio_t pin) +{ + gpio_deinit(pin); +} + +bool omv_gpio_read(omv_gpio_t pin) +{ + return gpio_get(pin); +} + +void omv_gpio_write(omv_gpio_t pin, bool value) +{ + gpio_put(pin, value); +} diff --git a/src/omv/ports/rp2/omv_portconfig.cmake b/src/omv/ports/rp2/omv_portconfig.cmake index 6fd7f6397..a00c46a27 100644 --- a/src/omv/ports/rp2/omv_portconfig.cmake +++ b/src/omv/ports/rp2/omv_portconfig.cmake @@ -174,6 +174,7 @@ target_sources(${MICROPY_TARGET} PRIVATE ${TOP_DIR}/${OMV_DIR}/ports/${PORT}/main.c ${TOP_DIR}/${OMV_DIR}/ports/${PORT}/cambus.c ${TOP_DIR}/${OMV_DIR}/ports/${PORT}/sensor.c + ${TOP_DIR}/${OMV_DIR}/ports/${PORT}/omv_gpio.c ${OMV_USER_MODULES} ) diff --git a/src/omv/ports/rp2/omv_portconfig.h b/src/omv/ports/rp2/omv_portconfig.h index 5041c9a76..df28698fb 100644 --- a/src/omv/ports/rp2/omv_portconfig.h +++ b/src/omv/ports/rp2/omv_portconfig.h @@ -14,6 +14,20 @@ #include "pico/stdlib.h" #include "hardware/i2c.h" +// GPIO speeds. +#define OMV_GPIO_SPEED_LOW GPIO_SLEW_RATE_SLOW +#define OMV_GPIO_SPEED_HIGH GPIO_SLEW_RATE_FAST + +// GPIO pull. +#define OMV_GPIO_PULL_NONE 0 +#define OMV_GPIO_PULL_UP 1 +#define OMV_GPIO_PULL_DOWN 2 + +// GPIO modes. +#define OMV_GPIO_MODE_INPUT GPIO_IN +#define OMV_GPIO_MODE_OUTPUT GPIO_OUT +#define OMV_GPIO_MODE_ALT 3 + // omv_gpio_t definition typedef uint32_t omv_gpio_t; diff --git a/src/omv/ports/rp2/sensor.c b/src/omv/ports/rp2/sensor.c index 47ac48d29..d2bc25100 100644 --- a/src/omv/ports/rp2/sensor.c +++ b/src/omv/ports/rp2/sensor.c @@ -71,18 +71,18 @@ int sensor_init() gpio_init(DCMI_VSYNC_PIN); gpio_set_dir(DCMI_VSYNC_PIN, GPIO_IN); - #if defined(DCMI_PWDN_PIN) - gpio_init(DCMI_PWDN_PIN); - gpio_set_dir(DCMI_PWDN_PIN, GPIO_OUT); - gpio_pull_down(DCMI_PWDN_PIN); - DCMI_PWDN_HIGH(); + #if defined(DCMI_POWER_PIN) + gpio_init(DCMI_POWER_PIN); + gpio_set_dir(DCMI_POWER_PIN, GPIO_OUT); + gpio_pull_down(DCMI_POWER_PIN); + gpio_put(DCMI_POWER_PIN, 1); #endif #if defined(DCMI_RESET_PIN) gpio_init(DCMI_RESET_PIN); gpio_set_dir(DCMI_RESET_PIN, GPIO_OUT); gpio_pull_up(DCMI_RESET_PIN); - DCMI_RESET_HIGH(); + gpio_put(DCMI_RESET_PIN, 1); #endif // Reset the sesnor state diff --git a/src/omv/ports/stm32/cambus.c b/src/omv/ports/stm32/cambus.c index 90c8a82bd..c5dcb7608 100644 --- a/src/omv/ports/stm32/cambus.c +++ b/src/omv/ports/stm32/cambus.c @@ -80,8 +80,8 @@ int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed) bus->speed = speed; bus->i2c = NULL; bus->initialized = false; - bus->scl_pin = (omv_gpio_t) {0, 0}; - bus->sda_pin = (omv_gpio_t) {0, 0}; + bus->scl_pin = NULL; + bus->sda_pin = NULL; switch (bus_id) { #if defined(I2C1) @@ -121,22 +121,22 @@ int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed) } if (bus->i2c->Instance == ISC_I2C) { - bus->scl_pin = (omv_gpio_t) {ISC_I2C_SCL_PIN, ISC_I2C_SCL_PORT}; - bus->sda_pin = (omv_gpio_t) {ISC_I2C_SDA_PIN, ISC_I2C_SDA_PORT}; + bus->scl_pin = ISC_I2C_SCL_PIN; + bus->sda_pin = ISC_I2C_SDA_PIN; #if defined(TOF_I2C) } else if (bus->i2c->Instance == TOF_I2C) { - bus->scl_pin = (omv_gpio_t) {TOF_I2C_SCL_PIN, TOF_I2C_SCL_PORT}; - bus->sda_pin = (omv_gpio_t) {TOF_I2C_SDA_PIN, TOF_I2C_SDA_PORT}; + bus->scl_pin = TOF_I2C_SCL_PIN; + bus->sda_pin = TOF_I2C_SDA_PIN; #endif #if defined(FIR_I2C) } else if (bus->i2c->Instance == FIR_I2C) { - bus->scl_pin = (omv_gpio_t) {FIR_I2C_SCL_PIN, FIR_I2C_SCL_PORT}; - bus->sda_pin = (omv_gpio_t) {FIR_I2C_SDA_PIN, FIR_I2C_SDA_PORT}; + bus->scl_pin = FIR_I2C_SCL_PIN; + bus->sda_pin = FIR_I2C_SDA_PIN; #endif #if defined(ISC_I2C_ALT) } else if (bus->i2c->Instance == ISC_I2C_ALT) { - bus->scl_pin = (omv_gpio_t) {ISC_I2C_ALT_SCL_PIN, ISC_I2C_ALT_SCL_PORT}; - bus->sda_pin = (omv_gpio_t) {ISC_I2C_ALT_SDA_PIN, ISC_I2C_ALT_SDA_PORT}; + bus->scl_pin = ISC_I2C_ALT_SCL_PIN; + bus->sda_pin = ISC_I2C_ALT_SDA_PIN; #endif } @@ -160,8 +160,8 @@ int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed) HAL_I2C_DeInit(bus->i2c); if (HAL_I2C_Init(bus->i2c) != HAL_OK) { bus->i2c = NULL; - bus->scl_pin = (omv_gpio_t) {0, 0}; - bus->sda_pin = (omv_gpio_t) {0, 0}; + bus->scl_pin = NULL; + bus->sda_pin = NULL; return -1; } @@ -262,8 +262,8 @@ int cambus_deinit(cambus_t *bus) bus->i2c->Instance = NULL; } bus->i2c = NULL; - bus->scl_pin = (omv_gpio_t) {0, 0}; - bus->sda_pin = (omv_gpio_t) {0, 0}; + bus->scl_pin = NULL; + bus->sda_pin = NULL; bus->initialized = false; return 0; } @@ -448,20 +448,20 @@ int cambus_write_bytes(cambus_t *bus, uint8_t slv_addr, uint8_t *buf, int len, u int cambus_pulse_scl(cambus_t *bus) { - if (bus->initialized && bus->scl_pin.port) { + if (bus->initialized && bus->scl_pin) { // Configure SCL as GPIO GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Pin = bus->scl_pin.pin; - HAL_GPIO_Init(bus->scl_pin.port, &GPIO_InitStructure); + GPIO_InitStructure.Pin = bus->scl_pin->pin; + HAL_GPIO_Init(bus->scl_pin->port, &GPIO_InitStructure); // Pulse SCL to recover stuck device. for (int i=0; i<10000; i++) { - HAL_GPIO_WritePin(bus->scl_pin.port, bus->scl_pin.pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(bus->scl_pin->port, bus->scl_pin->pin, GPIO_PIN_SET); mp_hal_delay_us(10); - HAL_GPIO_WritePin(bus->scl_pin.port, bus->scl_pin.pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(bus->scl_pin->port, bus->scl_pin->pin, GPIO_PIN_RESET); mp_hal_delay_us(10); } diff --git a/src/omv/ports/stm32/main.c b/src/omv/ports/stm32/main.c index 9859fce55..fb14a72c1 100644 --- a/src/omv/ports/stm32/main.c +++ b/src/omv/ports/stm32/main.c @@ -79,6 +79,7 @@ #include "ini.h" #include "omv_boardconfig.h" +#include "omv_gpio.h" #if MICROPY_PY_LWIP #include "lwip/init.h" @@ -385,6 +386,7 @@ soft_reset: spi_init0(); uart_init0(); fb_alloc_init0(); + omv_gpio_init0(); framebuffer_init0(); sensor_init0(); dma_alloc_init0(); diff --git a/src/omv/ports/stm32/modules/py_buzzer.c b/src/omv/ports/stm32/modules/py_buzzer.c index eb57f97e5..9f0a1e50f 100644 --- a/src/omv/ports/stm32/modules/py_buzzer.c +++ b/src/omv/ports/stm32/modules/py_buzzer.c @@ -11,9 +11,10 @@ #include "py/obj.h" #include "omv_boardconfig.h" -#include STM32_HAL_H #if MICROPY_PY_BUZZER +#include STM32_HAL_H +#include "omv_gpio.h" static TIM_HandleTypeDef buzzer_tim_handle = {}; @@ -27,13 +28,7 @@ static void buzzer_setup(int freq, int duty) int pulse = (period * duty) / 510; if (((buzzer_duty <= 0) || (255 < buzzer_duty)) && (0 < duty) && (duty <= 255)) { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Alternate = OMV_BUZZER_ALT; - GPIO_InitStructure.Pin = OMV_BUZZER_PIN; - HAL_GPIO_Init(OMV_BUZZER_PORT, &GPIO_InitStructure); + omv_gpio_config(OMV_BUZZER_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); buzzer_tim_handle.Instance = OMV_BUZZER_TIM; buzzer_tim_handle.Init.Prescaler = 0; @@ -58,7 +53,7 @@ static void buzzer_setup(int freq, int duty) } else if ((0 < buzzer_duty) && (buzzer_duty <= 255) && ((duty <= 0) || (255 < duty))) { HAL_TIM_PWM_Stop(&buzzer_tim_handle, OMV_BUZZER_TIM_CHANNEL); HAL_TIM_PWM_DeInit(&buzzer_tim_handle); - HAL_GPIO_DeInit(OMV_BUZZER_PORT, OMV_BUZZER_PIN); + omv_gpio_deinit(OMV_BUZZER_PIN); } else if ((0 < buzzer_duty) && (buzzer_duty <= 255) && (0 < duty) && (duty <= 255)) { __HAL_TIM_SET_AUTORELOAD(&buzzer_tim_handle, period); __HAL_TIM_SET_COMPARE(&buzzer_tim_handle, OMV_BUZZER_TIM_CHANNEL, pulse); diff --git a/src/omv/ports/stm32/modules/py_fir_lepton.c b/src/omv/ports/stm32/modules/py_fir_lepton.c index ff1c2e628..ad7030954 100644 --- a/src/omv/ports/stm32/modules/py_fir_lepton.c +++ b/src/omv/ports/stm32/modules/py_fir_lepton.c @@ -8,19 +8,16 @@ * * FIR Python module. */ +#include "omv_boardconfig.h" +#if (OMV_ENABLE_FIR_LEPTON == 1) +#include STM32_HAL_H #include "py/nlr.h" #include "py/runtime.h" #include "py/obj.h" #include "py/mphal.h" - -#include "extint.h" #include "spi.h" #include "softtimer.h" -#include "py_helper.h" -#include "omv_boardconfig.h" -#include STM32_HAL_H - #include "crc16.h" #include "LEPTON_SDK.h" #include "LEPTON_AGC.h" @@ -30,7 +27,8 @@ #include "LEPTON_RAD.h" #include "LEPTON_I2C_Reg.h" -#if (OMV_ENABLE_FIR_LEPTON == 1) +#include "py_helper.h" +#include "omv_gpio.h" #define FRAMEBUFFER_COUNT 3 static volatile int framebuffer_tail = 0; @@ -73,10 +71,8 @@ STATIC mp_obj_t fir_lepton_spi_resync_callback(mp_obj_t unused) fir_lepton_spi_rx_cb_tail = (fir_lepton_spi_rx_cb_tail + 1) % FRAMEBUFFER_COUNT; } - OMV_FIR_LEPTON_CS_LOW(); - HAL_SPI_Receive_DMA(OMV_FIR_LEPTON_CONTROLLER->spi, - (uint8_t *) &_fir_lepton_buf, - VOSPI_BUFFER_SIZE); + omv_gpio_write(OMV_FIR_LEPTON_SSEL_PIN, 0); + HAL_SPI_Receive_DMA(OMV_FIR_LEPTON_CONTROLLER->spi, (uint8_t *) &_fir_lepton_buf, VOSPI_BUFFER_SIZE); return mp_const_none; } @@ -145,7 +141,7 @@ void fir_lepton_spi_callback(const uint16_t *base) fir_lepton_spi_rx_cb_expected_pid = 0; fir_lepton_spi_rx_cb_expected_seg = 0; HAL_SPI_Abort_IT(OMV_FIR_LEPTON_CONTROLLER->spi); - OMV_FIR_LEPTON_CS_HIGH(); + omv_gpio_write(OMV_FIR_LEPTON_SSEL_PIN, 1); fir_lepton_spi_resync(); return; } @@ -202,18 +198,15 @@ static void fir_lepton_spi_callback_full(SPI_HandleTypeDef *hspi) fir_lepton_spi_callback(((uint16_t *) &_fir_lepton_buf) + VOSPI_PACKET_SIZE); } -#if defined(OMV_FIR_LEPTON_VSYNC_PRESENT) +#if defined(OMV_FIR_LEPTON_VSYNC_PIN) static mp_obj_t fir_lepton_vsync_cb = NULL; -STATIC mp_obj_t fir_lepton_extint_callback(mp_obj_t line) +static void fir_lepton_extint_callback(omv_gpio_t pin, void *data) { if (fir_lepton_vsync_cb) { mp_call_function_0(fir_lepton_vsync_cb); } - - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(fir_lepton_extint_callback_obj, fir_lepton_extint_callback); #endif void fir_lepton_deinit() @@ -223,101 +216,68 @@ void fir_lepton_deinit() fir_lepton_spi_rx_cb_expected_seg = 0; fb_alloc_free_till_mark_past_mark_permanent(); - /////////////////////////////////////////////////////////////////////// - #if defined(OMV_FIR_LEPTON_MCLK) HAL_TIM_PWM_Stop(&fir_lepton_mclk_tim_handle, OMV_FIR_LEPTON_MCLK_TIM_CHANNEL); HAL_TIM_PWM_DeInit(&fir_lepton_mclk_tim_handle); OMV_FIR_LEPTON_MCLK_TIM_FORCE_RESET(); OMV_FIR_LEPTON_MCLK_TIM_RELEASE_RESET(); OMV_FIR_LEPTON_MCLK_TIM_CLK_DISABLE(); - HAL_GPIO_DeInit(OMV_FIR_LEPTON_MCLK_PORT, OMV_FIR_LEPTON_MCLK_PIN); + omv_gpio_deinit(OMV_FIR_LEPTON_MCLK_PIN); #endif spi_deinit(OMV_FIR_LEPTON_CONTROLLER); // Do not put in HAL_SPI_MspDeinit as other modules may share the SPI bus. - - HAL_GPIO_DeInit(OMV_FIR_LEPTON_MOSI_PORT, OMV_FIR_LEPTON_MOSI_PIN); - HAL_GPIO_DeInit(OMV_FIR_LEPTON_MISO_PORT, OMV_FIR_LEPTON_MISO_PIN); - HAL_GPIO_DeInit(OMV_FIR_LEPTON_SCLK_PORT, OMV_FIR_LEPTON_SCLK_PIN); - - HAL_GPIO_DeInit(OMV_FIR_LEPTON_CS_PORT, OMV_FIR_LEPTON_CS_PIN); -#if defined(OMV_FIR_LEPTON_RST_PIN_PRESENT) - HAL_GPIO_DeInit(OMV_FIR_LEPTON_RST_PORT, OMV_FIR_LEPTON_RST_PIN); -#endif -#if defined(OMV_FIR_LEPTON_PWDN_PIN_PRESENT) - HAL_GPIO_DeInit(OMV_FIR_LEPTON_PWDN_PORT, OMV_FIR_LEPTON_PWDN_PIN); -#endif + omv_gpio_deinit(OMV_FIR_LEPTON_MOSI_PIN); + omv_gpio_deinit(OMV_FIR_LEPTON_MISO_PIN); + omv_gpio_deinit(OMV_FIR_LEPTON_SCLK_PIN); + omv_gpio_deinit(OMV_FIR_LEPTON_SSEL_PIN); + #if defined(OMV_FIR_LEPTON_RESET_PIN) + omv_gpio_deinit(OMV_FIR_LEPTON_RESET_PIN); + #endif + #if defined(OMV_FIR_LEPTON_POWER_PIN) + omv_gpio_deinit(OMV_FIR_LEPTON_POWER_PIN); + #endif } int fir_lepton_init(cambus_t *bus, int *w, int *h, int *refresh, int *resolution) { - OMV_FIR_LEPTON_CONTROLLER->spi->Init.Mode = SPI_MODE_MASTER; - OMV_FIR_LEPTON_CONTROLLER->spi->Init.Direction = SPI_DIRECTION_2LINES_RXONLY; - OMV_FIR_LEPTON_CONTROLLER->spi->Init.NSS = SPI_NSS_SOFT; - OMV_FIR_LEPTON_CONTROLLER->spi->Init.TIMode = SPI_TIMODE_DISABLE; - OMV_FIR_LEPTON_CONTROLLER->spi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPI_HandleTypeDef *hspi = OMV_FIR_LEPTON_CONTROLLER->spi; + + hspi->Init.Mode = SPI_MODE_MASTER; + hspi->Init.Direction = SPI_DIRECTION_2LINES_RXONLY; + hspi->Init.NSS = SPI_NSS_SOFT; + hspi->Init.TIMode = SPI_TIMODE_DISABLE; + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; #if defined(MCU_SERIES_H7) - OMV_FIR_LEPTON_CONTROLLER->spi->Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA; - OMV_FIR_LEPTON_CONTROLLER->spi->Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; + hspi->Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA; + hspi->Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; #endif spi_set_params(OMV_FIR_LEPTON_CONTROLLER, 0xffffffff, VOSPI_CLOCK_SPEED, 1, 1, 16, 0); spi_init(OMV_FIR_LEPTON_CONTROLLER, true); - HAL_SPI_RegisterCallback(OMV_FIR_LEPTON_CONTROLLER->spi, HAL_SPI_RX_HALF_COMPLETE_CB_ID, - fir_lepton_spi_callback_half); - HAL_SPI_RegisterCallback(OMV_FIR_LEPTON_CONTROLLER->spi, HAL_SPI_RX_COMPLETE_CB_ID, - fir_lepton_spi_callback_full); + HAL_SPI_RegisterCallback(hspi, HAL_SPI_RX_COMPLETE_CB_ID, fir_lepton_spi_callback_full); + HAL_SPI_RegisterCallback(hspi, HAL_SPI_RX_HALF_COMPLETE_CB_ID, fir_lepton_spi_callback_half); // Do not put in HAL_SPI_MspInit as other modules share the SPI2/3 bus. - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; - - GPIO_InitStructure.Alternate = OMV_FIR_LEPTON_MOSI_ALT; - GPIO_InitStructure.Pin = OMV_FIR_LEPTON_MOSI_PIN; - HAL_GPIO_Init(OMV_FIR_LEPTON_MOSI_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Alternate = OMV_FIR_LEPTON_MISO_ALT; - GPIO_InitStructure.Pin = OMV_FIR_LEPTON_MISO_PIN; - HAL_GPIO_Init(OMV_FIR_LEPTON_MISO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Alternate = OMV_FIR_LEPTON_SCLK_ALT; - GPIO_InitStructure.Pin = OMV_FIR_LEPTON_SCLK_PIN; - HAL_GPIO_Init(OMV_FIR_LEPTON_SCLK_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_InitStructure.Pin = OMV_FIR_LEPTON_CS_PIN; - HAL_GPIO_Init(OMV_FIR_LEPTON_CS_PORT, &GPIO_InitStructure); - OMV_FIR_LEPTON_CS_HIGH(); - - #if defined(OMV_FIR_LEPTON_RST_PIN_PRESENT) - GPIO_InitStructure.Pin = OMV_FIR_LEPTON_RST_PIN; - HAL_GPIO_Init(OMV_FIR_LEPTON_RST_PORT, &GPIO_InitStructure); - OMV_FIR_LEPTON_RST_HIGH(); + omv_gpio_config(OMV_FIR_LEPTON_MOSI_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_FIR_LEPTON_MISO_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_FIR_LEPTON_SCLK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_FIR_LEPTON_SSEL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_FIR_LEPTON_SSEL_PIN, 1); + #if defined(OMV_FIR_LEPTON_RESET_PIN) + omv_gpio_config(OMV_FIR_LEPTON_RESET_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_FIR_LEPTON_RESET_PIN, 1); #endif - - #if defined(OMV_FIR_LEPTON_PWDN_PIN_PRESENT) - GPIO_InitStructure.Pin = OMV_FIR_LEPTON_PWDN_PIN; - HAL_GPIO_Init(OMV_FIR_LEPTON_PWDN_PORT, &GPIO_InitStructure); - OMV_FIR_LEPTON_PWDN_HIGH(); + #if defined(OMV_FIR_LEPTON_POWER_PIN) + omv_gpio_config(OMV_FIR_LEPTON_POWER_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_FIR_LEPTON_POWER_PIN, 1); #endif #if defined(OMV_FIR_LEPTON_MCLK_TIM) int tclk = OMV_FIR_LEPTON_MCLK_TIM_PCLK_FREQ() * 2; int period = (tclk / OMV_FIR_LEPTON_MCLK_FREQ) - 1; - // GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; - GPIO_InitStructure.Alternate = OMV_FIR_LEPTON_MCLK_ALT; - GPIO_InitStructure.Pin = OMV_FIR_LEPTON_MCLK_PIN; - HAL_GPIO_Init(OMV_FIR_LEPTON_MCLK_PORT, &GPIO_InitStructure); + omv_gpio_config(OMV_FIR_LEPTON_MCLK_PIN, OMV_GPIO_MODE_ALT, GPIO_PULLUP, OMV_GPIO_SPEED_MED, -1); fir_lepton_mclk_tim_handle.Instance = OMV_FIR_LEPTON_MCLK_TIM; fir_lepton_mclk_tim_handle.Init.Prescaler = 0; @@ -344,19 +304,19 @@ int fir_lepton_init(cambus_t *bus, int *w, int *h, int *refresh, int *resolution HAL_TIM_PWM_Start(&fir_lepton_mclk_tim_handle, OMV_FIR_LEPTON_MCLK_TIM_CHANNEL); #endif - #if defined(OMV_FIR_LEPTON_PWDN_PIN_PRESENT) - OMV_FIR_LEPTON_PWDN_LOW(); + #if defined(OMV_FIR_LEPTON_POWER_PIN) + omv_gpio_write(OMV_FIR_LEPTON_POWER_PIN, 0); mp_hal_delay_ms(10); - OMV_FIR_LEPTON_PWDN_HIGH(); + omv_gpio_write(OMV_FIR_LEPTON_POWER_PIN, 1); mp_hal_delay_ms(10); #endif - #if defined(OMV_FIR_LEPTON_RST_PIN_PRESENT) - OMV_FIR_LEPTON_RST_LOW(); + #if defined(OMV_FIR_LEPTON_RESET_PIN) + omv_gpio_write(OMV_FIR_LEPTON_RESET_PIN, 0); mp_hal_delay_ms(10); - OMV_FIR_LEPTON_RST_HIGH(); + omv_gpio_write(OMV_FIR_LEPTON_RESET_PIN, 1); mp_hal_delay_ms(1000); #endif @@ -373,7 +333,7 @@ int fir_lepton_init(cambus_t *bus, int *w, int *h, int *refresh, int *resolution } } - #if (!defined(OMV_FIR_LEPTON_PWDN_PIN_PRESENT)) && (!defined(OMV_FIR_LEPTON_RST_PIN_PRESENT)) + #if (!defined(OMV_FIR_LEPTON_POWER_PIN)) && (!defined(OMV_FIR_LEPTON_RESET_PIN)) if (LEP_RunOemReboot(&fir_lepton_handle) != LEP_OK) { return -2; } @@ -430,13 +390,12 @@ int fir_lepton_init(cambus_t *bus, int *w, int *h, int *refresh, int *resolution *refresh = fir_lepton_3 ? 27 : 9; *resolution = fir_lepton_rad_en ? 16 : 14; - #if defined(OMV_FIR_LEPTON_VSYNC_PRESENT) + #if defined(OMV_FIR_LEPTON_VSYNC_PIN) if (LEP_SetOemGpioMode(&fir_lepton_handle, LEP_OEM_GPIO_MODE_VSYNC) != LEP_OK) { return -9; } - - extint_register((mp_obj_t) OMV_FIR_LEPTON_VSYNC_PIN, GPIO_MODE_IT_FALLING, GPIO_PULLUP, - (mp_obj_t) &fir_lepton_extint_callback_obj, true); + omv_gpio_config(OMV_FIR_LEPTON_VSYNC_PIN, OMV_GPIO_MODE_IT_FALL, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_irq_register(OMV_FIR_LEPTON_VSYNC_PIN, fir_lepton_extint_callback, NULL); #endif /////////////////////////////////////////////////////////////////////// @@ -447,78 +406,55 @@ int fir_lepton_init(cambus_t *bus, int *w, int *h, int *refresh, int *resolution framebuffer_head = 0; for (int i = 0; i < FRAMEBUFFER_COUNT; i++) { - framebuffers[i] = (uint16_t *) fb_alloc0(flir_w * flir_h * sizeof(uint16_t), - FB_ALLOC_NO_HINT); + framebuffers[i] = (uint16_t *) fb_alloc0(flir_w * flir_h * sizeof(uint16_t), FB_ALLOC_NO_HINT); } - dma_init(&fir_lepton_spi_rx_dma, - OMV_FIR_LEPTON_CONTROLLER->rx_dma_descr, - DMA_PERIPH_TO_MEMORY, - OMV_FIR_LEPTON_CONTROLLER->spi); + dma_init(&fir_lepton_spi_rx_dma, OMV_FIR_LEPTON_CONTROLLER->rx_dma_descr, DMA_PERIPH_TO_MEMORY, hspi); - OMV_FIR_LEPTON_CONTROLLER->spi->hdmatx = NULL; - OMV_FIR_LEPTON_CONTROLLER->spi->hdmarx = &fir_lepton_spi_rx_dma; + hspi->hdmatx = NULL; + hspi->hdmarx = &fir_lepton_spi_rx_dma; #if defined(MCU_SERIES_H7) fir_lepton_spi_rx_dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; #else fir_lepton_spi_rx_dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; #endif - fir_lepton_spi_rx_dma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; - fir_lepton_spi_rx_dma.Init.Mode = DMA_CIRCULAR; fir_lepton_spi_rx_dma.Init.FIFOMode = DMA_FIFOMODE_ENABLE; fir_lepton_spi_rx_dma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_1QUARTERFULL; fir_lepton_spi_rx_dma.Init.MemBurst = DMA_MBURST_SINGLE; fir_lepton_spi_rx_dma.Init.PeriphBurst = DMA_PBURST_SINGLE; - ((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR & ~DMA_SxCR_PSIZE_Msk) | + DMA_Stream_TypeDef *dma_chan = (DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance; + dma_chan->CR = + (dma_chan->CR & ~DMA_SxCR_PSIZE_Msk) | #if defined(MCU_SERIES_H7) DMA_PDATAALIGN_WORD; #else DMA_PDATAALIGN_HALFWORD; #endif - - ((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR & ~DMA_SxCR_MSIZE_Msk) | - DMA_MDATAALIGN_WORD; - - ((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR & ~DMA_SxCR_CIRC_Msk) | - DMA_CIRCULAR; - - ((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->FCR = - (((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->FCR & ~DMA_SxFCR_DMDIS_Msk) | - DMA_FIFOMODE_ENABLE; - - ((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->FCR = - (((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->FCR & ~DMA_SxFCR_FTH_Msk) | - DMA_FIFO_THRESHOLD_1QUARTERFULL; - - ((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR & ~DMA_SxCR_MBURST_Msk) | - DMA_MBURST_SINGLE; - - ((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) fir_lepton_spi_rx_dma.Instance)->CR & ~DMA_SxCR_PBURST_Msk) | - DMA_PBURST_SINGLE; + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_MSIZE_Msk) | DMA_MDATAALIGN_WORD; + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_CIRC_Msk) | DMA_CIRCULAR; + dma_chan->FCR = (dma_chan->FCR & ~DMA_SxFCR_DMDIS_Msk) | DMA_FIFOMODE_ENABLE; + dma_chan->FCR = (dma_chan->FCR & ~DMA_SxFCR_FTH_Msk) | DMA_FIFO_THRESHOLD_1QUARTERFULL; + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_MBURST_Msk) | DMA_MBURST_SINGLE; + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_SINGLE; fb_alloc_mark_permanent(); fir_lepton_spi_resync(); return 0; } -#if defined(OMV_FIR_LEPTON_VSYNC_PRESENT) +#if defined(OMV_FIR_LEPTON_VSYNC_PIN) void fir_lepton_register_vsync_cb(mp_obj_t cb) { - extint_disable(OMV_FIR_LEPTON_VSYNC_PIN->pin); + omv_gpio_irq_enable(OMV_FIR_LEPTON_VSYNC_PIN, false); fir_lepton_vsync_cb = cb; if (cb != mp_const_none) { - extint_enable(OMV_FIR_LEPTON_VSYNC_PIN->pin); + omv_gpio_irq_enable(OMV_FIR_LEPTON_VSYNC_PIN, true); } } #endif @@ -732,4 +668,4 @@ void fir_lepton_trigger_ffc(uint n_args, const mp_obj_t *args, mp_map_t *kw_args } } -#endif // OMV_FIR_LEPTON_PRESENT +#endif // OMV_ENABLE_FIR_LEPTON diff --git a/src/omv/ports/stm32/modules/py_imu.c b/src/omv/ports/stm32/modules/py_imu.c index 3ac3df47c..e6c9fcf54 100644 --- a/src/omv/ports/stm32/modules/py_imu.c +++ b/src/omv/ports/stm32/modules/py_imu.c @@ -9,15 +9,17 @@ * IMU Python module. */ #include "omv_boardconfig.h" + #if MICROPY_PY_IMU +#include STM32_HAL_H #include "py/obj.h" #include "py/mphal.h" #include "py/runtime.h" + #include "py_helper.h" #include "py_imu.h" - -#include STM32_HAL_H +#include "omv_gpio.h" #if defined(IMU_CHIP_LSM6DS3) #include "lsm6ds3tr_c_reg.h" @@ -92,20 +94,20 @@ static void platform_deinit(void *imubus) { static int32_t platform_write(void *imubus, uint8_t Reg, uint8_t *Bufp, uint16_t len) { - HAL_GPIO_WritePin(IMU_SPI_SSEL_PORT, IMU_SPI_SSEL_PIN, GPIO_PIN_RESET); + omv_gpio_write(IMU_SPI_SSEL_PIN, 0); HAL_SPI_Transmit(imubus, &Reg, 1, HAL_MAX_DELAY); HAL_SPI_Transmit(imubus, Bufp, len, HAL_MAX_DELAY); - HAL_GPIO_WritePin(IMU_SPI_SSEL_PORT, IMU_SPI_SSEL_PIN, GPIO_PIN_SET); + omv_gpio_write(IMU_SPI_SSEL_PIN, 1); return 0; } static int32_t platform_read(void *imubus, uint8_t Reg, uint8_t *Bufp, uint16_t len) { Reg |= 0x80; - HAL_GPIO_WritePin(IMU_SPI_SSEL_PORT, IMU_SPI_SSEL_PIN, GPIO_PIN_RESET); + omv_gpio_write(IMU_SPI_SSEL_PIN, 0); HAL_SPI_Transmit(imubus, &Reg, 1, HAL_MAX_DELAY); HAL_SPI_Receive(imubus, Bufp, len, HAL_MAX_DELAY); - HAL_GPIO_WritePin(IMU_SPI_SSEL_PORT, IMU_SPI_SSEL_PIN, GPIO_PIN_SET); + omv_gpio_write(IMU_SPI_SSEL_PIN, 1); return 0; } #elif defined(IMU_I2C) diff --git a/src/omv/ports/stm32/modules/py_lcd.c b/src/omv/ports/stm32/modules/py_lcd.c index 7f8690d37..4bbcc5736 100644 --- a/src/omv/ports/stm32/modules/py_lcd.c +++ b/src/omv/ports/stm32/modules/py_lcd.c @@ -8,11 +8,14 @@ * * LCD Python module. */ +#include "omv_boardconfig.h" + +#if MICROPY_PY_LCD +#include STM32_HAL_H #include "py/obj.h" #include "py/nlr.h" #include "py/runtime.h" #include "pendsv.h" -#include "extint.h" #include "spi.h" #include "py_lcd_cec.h" @@ -20,10 +23,7 @@ #include "py_helper.h" #include "py_image.h" #include "extmod/machine_i2c.h" -#include "omv_boardconfig.h" -#include STM32_HAL_H - -#if MICROPY_PY_LCD +#include "omv_gpio.h" #define FRAMEBUFFER_COUNT 3 static int framebuffer_tail = 0; @@ -92,92 +92,67 @@ static void spi_config_deinit() spi_deinit(OMV_SPI_LCD_CONTROLLER); // Do not put in HAL_SPI_MspDeinit as other modules share the SPI2 bus. - - HAL_GPIO_DeInit(OMV_SPI_LCD_MOSI_PORT, OMV_SPI_LCD_MOSI_PIN); - HAL_GPIO_DeInit(OMV_SPI_LCD_SCLK_PORT, OMV_SPI_LCD_SCLK_PIN); - - HAL_GPIO_DeInit(OMV_SPI_LCD_RST_PORT, OMV_SPI_LCD_RST_PIN); - HAL_GPIO_DeInit(OMV_SPI_LCD_RS_PORT, OMV_SPI_LCD_RS_PIN); - HAL_GPIO_DeInit(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN); - - /////////////////////////////////////////////////////////////////////// + omv_gpio_deinit(OMV_SPI_LCD_MOSI_PIN); + omv_gpio_deinit(OMV_SPI_LCD_SCLK_PIN); + omv_gpio_deinit(OMV_SPI_LCD_RST_PIN); + omv_gpio_deinit(OMV_SPI_LCD_RS_PIN); + omv_gpio_deinit(OMV_SPI_LCD_SSEL_PIN); } static void spi_lcd_callback(SPI_HandleTypeDef *hspi); static void spi_config_init(int w, int h, int refresh_rate, bool triple_buffer, bool bgr) { - OMV_SPI_LCD_CONTROLLER->spi->Init.Mode = SPI_MODE_MASTER; - OMV_SPI_LCD_CONTROLLER->spi->Init.Direction = SPI_DIRECTION_1LINE; - OMV_SPI_LCD_CONTROLLER->spi->Init.NSS = SPI_NSS_SOFT; - OMV_SPI_LCD_CONTROLLER->spi->Init.TIMode = SPI_TIMODE_DISABLE; - OMV_SPI_LCD_CONTROLLER->spi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPI_HandleTypeDef *hspi = OMV_SPI_LCD_CONTROLLER->spi; + + hspi->Init.Mode = SPI_MODE_MASTER; + hspi->Init.Direction = SPI_DIRECTION_1LINE; + hspi->Init.NSS = SPI_NSS_SOFT; + hspi->Init.TIMode = SPI_TIMODE_DISABLE; + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; spi_set_params(OMV_SPI_LCD_CONTROLLER, 0xffffffff, w * h * refresh_rate * 16, 0, 0, 8, 0); spi_init(OMV_SPI_LCD_CONTROLLER, true); - HAL_SPI_RegisterCallback(OMV_SPI_LCD_CONTROLLER->spi, HAL_SPI_TX_COMPLETE_CB_ID, spi_lcd_callback); + HAL_SPI_RegisterCallback(hspi, HAL_SPI_TX_COMPLETE_CB_ID, spi_lcd_callback); // Do not put in HAL_SPI_MspInit as other modules share the SPI2 bus. + omv_gpio_config(OMV_SPI_LCD_MOSI_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_SPI_LCD_SCLK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_SPI_LCD_RST_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_SPI_LCD_RST_PIN, 1); + omv_gpio_config(OMV_SPI_LCD_RS_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); + omv_gpio_config(OMV_SPI_LCD_SSEL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; + omv_gpio_write(OMV_SPI_LCD_RST_PIN, 0); + mp_hal_delay_ms(100); + omv_gpio_write(OMV_SPI_LCD_RST_PIN, 1); + mp_hal_delay_ms(100); - GPIO_InitStructure.Alternate = OMV_SPI_LCD_MOSI_ALT; - GPIO_InitStructure.Pin = OMV_SPI_LCD_MOSI_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_MOSI_PORT, &GPIO_InitStructure); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit(hspi, (uint8_t []) {0x11}, 1, HAL_MAX_DELAY); // sleep out + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); + mp_hal_delay_ms(120); - GPIO_InitStructure.Alternate = OMV_SPI_LCD_SCLK_ALT; - GPIO_InitStructure.Pin = OMV_SPI_LCD_SCLK_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_SCLK_PORT, &GPIO_InitStructure); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit(hspi, (uint8_t []) {0x36}, 1, HAL_MAX_DELAY); // memory data access control + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit(hspi, (uint8_t []) {bgr ? 0xC8 : 0xC0}, 1, HAL_MAX_DELAY); // argument + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_InitStructure.Pin = OMV_SPI_LCD_RST_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_RST_PORT, &GPIO_InitStructure); - OMV_SPI_LCD_RST_OFF(); - - GPIO_InitStructure.Pin = OMV_SPI_LCD_RS_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_RS_PORT, &GPIO_InitStructure); - OMV_SPI_LCD_RS_OFF(); - - GPIO_InitStructure.Pin = OMV_SPI_LCD_CS_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_CS_PORT, &GPIO_InitStructure); - OMV_SPI_LCD_CS_HIGH(); - - ///////////////////////////////////////////////////////////////////// - - OMV_SPI_LCD_RST_ON(); - HAL_Delay(100); - - OMV_SPI_LCD_RST_OFF(); - HAL_Delay(100); - - OMV_SPI_LCD_RS_ON(); - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t []) {0x11}, 1, HAL_MAX_DELAY); // sleep out - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_OFF(); - HAL_Delay(120); - - OMV_SPI_LCD_RS_ON(); - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t []) {0x36}, 1, HAL_MAX_DELAY); // memory data access control - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_OFF(); - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t []) {bgr ? 0xC8 : 0xC0}, 1, HAL_MAX_DELAY); // argument - OMV_SPI_LCD_CS_HIGH(); - - OMV_SPI_LCD_RS_ON(); - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t []) {0x3A}, 1, HAL_MAX_DELAY); // interface pixel format - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_OFF(); - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t []) {0x05}, 1, HAL_MAX_DELAY); // argument - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit(hspi, (uint8_t []) {0x3A}, 1, HAL_MAX_DELAY); // interface pixel format + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit(hspi, (uint8_t []) {0x05}, 1, HAL_MAX_DELAY); // argument + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); if (triple_buffer) { fb_alloc_mark(); @@ -189,45 +164,38 @@ static void spi_config_init(int w, int h, int refresh_rate, bool triple_buffer, framebuffers[i] = (uint16_t *) fb_alloc0(w * h * sizeof(uint16_t), FB_ALLOC_CACHE_ALIGN); } - dma_init(&spi_tx_dma, OMV_SPI_LCD_CONTROLLER->tx_dma_descr, DMA_MEMORY_TO_PERIPH, OMV_SPI_LCD_CONTROLLER->spi); - OMV_SPI_LCD_CONTROLLER->spi->hdmatx = &spi_tx_dma; - OMV_SPI_LCD_CONTROLLER->spi->hdmarx = NULL; -#if defined(MCU_SERIES_H7) + dma_init(&spi_tx_dma, OMV_SPI_LCD_CONTROLLER->tx_dma_descr, DMA_MEMORY_TO_PERIPH, hspi); + hspi->hdmatx = &spi_tx_dma; + hspi->hdmarx = NULL; + #if defined(MCU_SERIES_H7) spi_tx_dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; -#else + #else spi_tx_dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; -#endif + #endif spi_tx_dma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; spi_tx_dma.Init.FIFOMode = DMA_FIFOMODE_ENABLE; spi_tx_dma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; spi_tx_dma.Init.MemBurst = DMA_MBURST_INC4; -#if defined(MCU_SERIES_H7) + #if defined(MCU_SERIES_H7) spi_tx_dma.Init.PeriphBurst = DMA_PBURST_INC4; -#else + #else spi_tx_dma.Init.PeriphBurst = DMA_PBURST_SINGLE; -#endif -#if defined(MCU_SERIES_H7) - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_WORD; -#else - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_HALFWORD; -#endif - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_MSIZE_Msk) | DMA_MDATAALIGN_WORD; - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR & ~DMA_SxFCR_DMDIS_Msk) | DMA_FIFOMODE_ENABLE; - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR & ~DMA_SxFCR_FTH_Msk) | DMA_FIFO_THRESHOLD_FULL; - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_MBURST_Msk) | DMA_MBURST_INC4; -#if defined(MCU_SERIES_H7) - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_INC4; -#else - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_SINGLE; -#endif + #endif + DMA_Stream_TypeDef *dma_chan = spi_tx_dma.Instance; + #if defined(MCU_SERIES_H7) + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_WORD; + #else + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_HALFWORD; + #endif + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_MSIZE_Msk) | DMA_MDATAALIGN_WORD; + dma_chan->FCR = (dma_chan->FCR & ~DMA_SxFCR_DMDIS_Msk) | DMA_FIFOMODE_ENABLE; + dma_chan->FCR = (dma_chan->FCR & ~DMA_SxFCR_FTH_Msk) | DMA_FIFO_THRESHOLD_FULL; + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_MBURST_Msk) | DMA_MBURST_INC4; + #if defined(MCU_SERIES_H7) + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_INC4; + #else + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_SINGLE; + #endif fb_alloc_mark_permanent(); } } @@ -248,27 +216,27 @@ static void spi_lcd_callback(SPI_HandleTypeDef *hspi) switch (spi_tx_cb_state) { case SPI_TX_CB_MEMORY_WRITE_CMD: { if (!spi_tx_cb_state_on[framebuffer_tail]) { - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_ON(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); spi_tx_cb_state = SPI_TX_CB_DISPLAY_OFF; framebuffer_head = framebuffer_tail; - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit_IT(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) display_off, sizeof(display_off)); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit_IT(hspi, (uint8_t *) display_off, sizeof(display_off)); } else { - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_ON(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); spi_tx_cb_state = SPI_TX_CB_MEMORY_WRITE; spi_tx_cb_state_memory_write_addr = framebuffers[framebuffer_tail]; spi_tx_cb_state_memory_write_count = lcd_width * lcd_height; spi_tx_cb_state_memory_write_first = true; framebuffer_head = framebuffer_tail; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); // When starting the interrupt chain the first HAL_SPI_Transmit_IT is not executed // in interrupt context. So, disable interrupts for the first HAL_SPI_Transmit_IT so // that it completes first and unlocks the SPI bus before allowing the interrupt // it causes to trigger starting the interrupt chain. uint32_t irq_state = disable_irq(); - HAL_SPI_Transmit_IT(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) memory_write, sizeof(memory_write)); + HAL_SPI_Transmit_IT(hspi, (uint8_t *) memory_write, sizeof(memory_write)); enable_irq(irq_state); } break; @@ -280,52 +248,44 @@ static void spi_lcd_callback(SPI_HandleTypeDef *hspi) spi_tx_cb_state_memory_write_addr += count; spi_tx_cb_state_memory_write_count -= count; if (spi_tx_cb_state_memory_write_first) { - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_OFF(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); spi_tx_cb_state_memory_write_first = false; if (!lcd_byte_reverse) { - OMV_SPI_LCD_CONTROLLER->spi->Init.DataSize = SPI_DATASIZE_16BIT; -#if defined(MCU_SERIES_H7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_16BIT; - OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_FTHLV_Msk) | SPI_FIFO_THRESHOLD_08DATA; -#elif defined(MCU_SERIES_F7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_16BIT; -#elif defined(MCU_SERIES_F4) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_16BIT; -#endif + hspi->Init.DataSize = SPI_DATASIZE_16BIT; + #if defined(MCU_SERIES_H7) + hspi->Instance->CFG1 = (hspi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_16BIT; + hspi->Instance->CFG1 = (hspi->Instance->CFG1 & ~SPI_CFG1_FTHLV_Msk) | SPI_FIFO_THRESHOLD_08DATA; + #elif defined(MCU_SERIES_F7) + hspi->Instance->CR2 = (hspi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_16BIT; + #elif defined(MCU_SERIES_F4) + hspi->Instance->CR1 = (hspi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_16BIT; + #endif } - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); } - HAL_SPI_Transmit_DMA(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) addr, count); + HAL_SPI_Transmit_DMA(hspi, (uint8_t *) addr, count); break; } case SPI_TX_CB_DISPLAY_ON: { - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_ON(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); spi_tx_cb_state = SPI_TX_CB_MEMORY_WRITE_CMD; - OMV_SPI_LCD_CONTROLLER->spi->Init.DataSize = SPI_DATASIZE_8BIT; -#if defined(MCU_SERIES_H7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_8BIT; - OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_FTHLV_Msk) | SPI_FIFO_THRESHOLD_01DATA; -#elif defined(MCU_SERIES_F7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_8BIT; -#elif defined(MCU_SERIES_F4) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 = - (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_8BIT; -#endif - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit_IT(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) display_on, sizeof(display_on)); + hspi->Init.DataSize = SPI_DATASIZE_8BIT; + #if defined(MCU_SERIES_H7) + hspi->Instance->CFG1 = (hspi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_8BIT; + hspi->Instance->CFG1 = (hspi->Instance->CFG1 & ~SPI_CFG1_FTHLV_Msk) | SPI_FIFO_THRESHOLD_01DATA; + #elif defined(MCU_SERIES_F7) + hspi->Instance->CR2 = (hspi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_8BIT; + #elif defined(MCU_SERIES_F4) + hspi->Instance->CR1 = (hspi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_8BIT; + #endif + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit_IT(hspi, (uint8_t *) display_on, sizeof(display_on)); break; } case SPI_TX_CB_DISPLAY_OFF: { - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); spi_tx_cb_state = SPI_TX_CB_IDLE; break; } @@ -342,11 +302,14 @@ static void spi_lcd_kick() { int spi_tx_cb_state_sampled = spi_tx_cb_state; // volatile - if ((spi_tx_cb_state_sampled == SPI_TX_CB_IDLE) || (spi_tx_cb_state_sampled == SPI_TX_CB_DISPLAY_OFF)) { - uint32_t tick = HAL_GetTick(); + if ((spi_tx_cb_state_sampled == SPI_TX_CB_IDLE) + || (spi_tx_cb_state_sampled == SPI_TX_CB_DISPLAY_OFF)) { + uint32_t tick = mp_hal_ticks_ms(); while (spi_tx_cb_state != SPI_TX_CB_IDLE) { // volatile - if ((HAL_GetTick() - tick) > 1000) return; // give up (should not happen) + if ((mp_hal_ticks_ms() - tick) > 1000) { + return; // give up (should not happen) + } } spi_tx_cb_state = SPI_TX_CB_MEMORY_WRITE_CMD; @@ -359,8 +322,9 @@ static void spi_lcd_draw_image_cb(int x_start, int x_end, int y_row, imlib_draw_ HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, data->dst_row_override, lcd_width, HAL_MAX_DELAY); } -static void spi_lcd_display(image_t *src_img, int dst_x_start, int dst_y_start, float x_scale, float y_scale, rectangle_t *roi, - int rgb_channel, int alpha, const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_t hint) +static void spi_lcd_display(image_t *src_img, int dst_x_start, int dst_y_start, + float x_scale, float y_scale, rectangle_t *roi, int rgb_channel, int alpha, + const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_t hint) { image_t dst_img; dst_img.w = lcd_width; @@ -368,64 +332,78 @@ static void spi_lcd_display(image_t *src_img, int dst_x_start, int dst_y_start, dst_img.pixfmt = PIXFORMAT_RGB565; int x0, x1, y0, y1; - bool black = !imlib_draw_image_rectangle(&dst_img, src_img, dst_x_start, dst_y_start, x_scale, y_scale, roi, alpha, alpha_palette, hint, &x0, &x1, &y0, &y1); + bool black = !imlib_draw_image_rectangle(&dst_img, src_img, dst_x_start, dst_y_start, + x_scale, y_scale, roi, alpha, alpha_palette, hint, &x0, &x1, &y0, &y1); if (!lcd_triple_buffer) { + SPI_HandleTypeDef *hspi = OMV_SPI_LCD_CONTROLLER->spi; dst_img.data = fb_alloc0(lcd_width * sizeof(uint16_t), FB_ALLOC_NO_HINT); - OMV_SPI_LCD_RS_ON(); - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) memory_write, sizeof(memory_write), HAL_MAX_DELAY); // memory write - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_OFF(); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + // memory write + HAL_SPI_Transmit(hspi, (uint8_t *) memory_write, sizeof(memory_write), HAL_MAX_DELAY); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); - OMV_SPI_LCD_CS_LOW(); - OMV_SPI_LCD_CONTROLLER->spi->Init.DataSize = SPI_DATASIZE_16BIT; -#if defined(MCU_SERIES_H7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_16BIT; -#elif defined(MCU_SERIES_F7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_16BIT; -#elif defined(MCU_SERIES_F4) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_16BIT; -#endif + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + hspi->Init.DataSize = SPI_DATASIZE_16BIT; + #if defined(MCU_SERIES_H7) + hspi->Instance->CFG1 = (hspi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_16BIT; + #elif defined(MCU_SERIES_F7) + hspi->Instance->CR2 = (hspi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_16BIT; + #elif defined(MCU_SERIES_F4) + hspi->Instance->CR1 = (hspi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_16BIT; + #endif if (black) { // zero the whole image - for (int i = 0; i < lcd_height; i++) HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, dst_img.data, lcd_width, HAL_MAX_DELAY); + for (int i = 0; i < lcd_height; i++) { + HAL_SPI_Transmit(hspi, dst_img.data, lcd_width, HAL_MAX_DELAY); + } } else { // Zero the top rows - for (int i = 0; i < y0; i++) HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, dst_img.data, lcd_width, HAL_MAX_DELAY); + for (int i = 0; i < y0; i++) { + HAL_SPI_Transmit(hspi, dst_img.data, lcd_width, HAL_MAX_DELAY); + } // Transmits left/right parts already zeroed... - imlib_draw_image(&dst_img, src_img, dst_x_start, dst_y_start, x_scale, y_scale, roi, - rgb_channel, alpha, color_palette, alpha_palette, hint | IMAGE_HINT_BLACK_BACKGROUND, spi_lcd_draw_image_cb, dst_img.data); + imlib_draw_image(&dst_img, src_img, dst_x_start, dst_y_start, + x_scale, y_scale, roi, rgb_channel, alpha, color_palette, + alpha_palette, hint | IMAGE_HINT_BLACK_BACKGROUND, spi_lcd_draw_image_cb, dst_img.data); // Zero the bottom rows - if (y1 < lcd_height) memset(dst_img.data, 0, lcd_width * sizeof(uint16_t)); - for (int i = y1; i < lcd_height; i++) HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, dst_img.data, lcd_width, HAL_MAX_DELAY); + if (y1 < lcd_height) { + memset(dst_img.data, 0, lcd_width * sizeof(uint16_t)); + } + for (int i = y1; i < lcd_height; i++) { + HAL_SPI_Transmit(hspi, dst_img.data, lcd_width, HAL_MAX_DELAY); + } } - OMV_SPI_LCD_CONTROLLER->spi->Init.DataSize = SPI_DATASIZE_8BIT; -#if defined(MCU_SERIES_H7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_8BIT; -#elif defined(MCU_SERIES_F7) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_8BIT; -#elif defined(MCU_SERIES_F4) - OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_8BIT; -#endif - OMV_SPI_LCD_CS_HIGH(); + hspi->Init.DataSize = SPI_DATASIZE_8BIT; + #if defined(MCU_SERIES_H7) + hspi->Instance->CFG1 = (hspi->Instance->CFG1 & ~SPI_CFG1_DSIZE_Msk) | SPI_DATASIZE_8BIT; + #elif defined(MCU_SERIES_F7) + hspi->Instance->CR2 = (hspi->Instance->CR2 & ~SPI_CR2_DS_Msk) | SPI_DATASIZE_8BIT; + #elif defined(MCU_SERIES_F4) + hspi->Instance->CR1 = (hspi->Instance->CR1 & ~SPI_CR1_DFF_Msk) | SPI_DATASIZE_8BIT; + #endif + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); - OMV_SPI_LCD_RS_ON(); - OMV_SPI_LCD_CS_LOW(); - HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) display_on, sizeof(display_on), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_OFF(); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); + HAL_SPI_Transmit(hspi, (uint8_t *) display_on, sizeof(display_on), HAL_MAX_DELAY); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); fb_free(); } else { // For triple buffering we are never drawing where tail or head (which may instantly update to // to be equal to tail) is. int new_framebuffer_tail = (framebuffer_tail + 1) % FRAMEBUFFER_COUNT; - if (new_framebuffer_tail == framebuffer_head) new_framebuffer_tail = (new_framebuffer_tail + 1) % FRAMEBUFFER_COUNT; + if (new_framebuffer_tail == framebuffer_head) { + new_framebuffer_tail = (new_framebuffer_tail + 1) % FRAMEBUFFER_COUNT; + } dst_img.data = (uint8_t *) framebuffers[new_framebuffer_tail]; if (black) { // zero the whole image @@ -438,15 +416,19 @@ static void spi_lcd_display(image_t *src_img, int dst_x_start, int dst_y_start, memset(IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(&dst_img, i), 0, x0 * sizeof(uint16_t)); } - imlib_draw_image(&dst_img, src_img, dst_x_start, dst_y_start, x_scale, y_scale, roi, - rgb_channel, alpha, color_palette, alpha_palette, hint | IMAGE_HINT_BLACK_BACKGROUND, NULL, NULL); + imlib_draw_image(&dst_img, src_img, dst_x_start, dst_y_start, + x_scale, y_scale, roi, rgb_channel, alpha, color_palette, + alpha_palette, hint | IMAGE_HINT_BLACK_BACKGROUND, NULL, NULL); if (lcd_width - x1) for (int i = y0; i < y1; i++) { // Zero right memset(IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(&dst_img, i) + x1, 0, (lcd_width - x1) * sizeof(uint16_t)); } // Zero the bottom rows - if (lcd_height - y1) memset(IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(&dst_img, y1), 0, lcd_width * (lcd_height - y1) * sizeof(uint16_t)); + if (lcd_height - y1) { + memset(IMAGE_COMPUTE_RGB565_PIXEL_ROW_PTR(&dst_img, y1), + 0, lcd_width * (lcd_height - y1) * sizeof(uint16_t)); + } } // Tell the call back FSM that we want to turn the display on. @@ -468,11 +450,11 @@ static void spi_lcd_display(image_t *src_img, int dst_x_start, int dst_y_start, static void spi_lcd_clear() { if (!lcd_triple_buffer) { - OMV_SPI_LCD_RS_ON(); - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 0); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) display_off, sizeof(display_off), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); - OMV_SPI_LCD_RS_OFF(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); + omv_gpio_write(OMV_SPI_LCD_RS_PIN, 1); } else { // For triple buffering we are never drawing where tail or head (which may instantly update to // to be equal to tail) is. @@ -497,42 +479,31 @@ static DAC_HandleTypeDef lcd_dac_handle = {}; #ifdef OMV_SPI_LCD_BL_PIN static void spi_lcd_set_backlight(int intensity) { -#ifdef OMV_SPI_LCD_BL_DAC + #ifdef OMV_SPI_LCD_BL_DAC if ((lcd_intensity < 255) && (255 <= intensity)) { -#else + #else if ((lcd_intensity < 1) && (1 <= intensity)) { -#endif - OMV_SPI_LCD_BL_ON(); - HAL_GPIO_DeInit(OMV_SPI_LCD_BL_PORT, OMV_SPI_LCD_BL_PIN); + #endif + omv_gpio_write(OMV_SPI_LCD_BL_PIN, 1); + omv_gpio_deinit(OMV_SPI_LCD_BL_PIN); } else if ((0 < lcd_intensity) && (intensity <= 0)) { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = OMV_SPI_LCD_BL_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_BL_PORT, &GPIO_InitStructure); - OMV_SPI_LCD_BL_OFF(); + omv_gpio_config(OMV_SPI_LCD_BL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_SPI_LCD_BL_PIN, 0); } -#ifdef OMV_SPI_LCD_BL_DAC + #ifdef OMV_SPI_LCD_BL_DAC if (((lcd_intensity <= 0) || (255 <= lcd_intensity)) && (0 < intensity) && (intensity < 255)) { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = OMV_SPI_LCD_BL_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_BL_PORT, &GPIO_InitStructure); - - lcd_dac_handle.Instance = OMV_SPI_LCD_BL_DAC; + omv_gpio_config(OMV_SPI_LCD_BL_PIN, OMV_GPIO_MODE_ANALOG, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); DAC_ChannelConfTypeDef lcd_dac_channel_handle; + lcd_dac_handle.Instance = OMV_SPI_LCD_BL_DAC; lcd_dac_channel_handle.DAC_Trigger = DAC_TRIGGER_NONE; lcd_dac_channel_handle.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; -#if defined(MCU_SERIES_H7) + #if defined(MCU_SERIES_H7) lcd_dac_channel_handle.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE; lcd_dac_channel_handle.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE; lcd_dac_channel_handle.DAC_UserTrimming = DAC_TRIMMING_FACTORY; -#endif + #endif HAL_DAC_Init(&lcd_dac_handle); HAL_DAC_ConfigChannel(&lcd_dac_handle, &lcd_dac_channel_handle, OMV_SPI_LCD_BL_DAC_CHANNEL); @@ -544,7 +515,7 @@ static void spi_lcd_set_backlight(int intensity) } else if ((0 < lcd_intensity) && (lcd_intensity < 255) && (0 < intensity) && (intensity < 255)) { HAL_DAC_SetValue(&lcd_dac_handle, OMV_SPI_LCD_BL_DAC_CHANNEL, DAC_ALIGN_8B_R, intensity); } -#endif + #endif lcd_intensity = intensity; } @@ -874,10 +845,12 @@ static void ltdc_pll_config_deinit() { __HAL_RCC_PLL3_DISABLE(); - uint32_t tickstart = HAL_GetTick(); + uint32_t tickstart = mp_hal_ticks_ms(); while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL3RDY)) { - if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) break; + if ((mp_hal_ticks_ms() - tickstart) > PLL_TIMEOUT_VALUE) { + break; + } } } @@ -891,21 +864,33 @@ static void ltdc_pll_config_init(int frame_size, int refresh_rate) uint32_t ref_clk = (HSE_VALUE / 1000) / divm; uint32_t vci = 0; - if (1000 <= ref_clk && ref_clk <= 2000) vci = RCC_PLL3VCIRANGE_0; - else if (2000 <= ref_clk && ref_clk <= 4000) vci = RCC_PLL3VCIRANGE_1; - else if (4000 <= ref_clk && ref_clk <= 8000) vci = RCC_PLL3VCIRANGE_2; - else if (8000 <= ref_clk && ref_clk <= 16000) vci = RCC_PLL3VCIRANGE_3; - else continue; + if (1000 <= ref_clk && ref_clk <= 2000) { + vci = RCC_PLL3VCIRANGE_0; + } else if (2000 <= ref_clk && ref_clk <= 4000) { + vci = RCC_PLL3VCIRANGE_1; + } else if (4000 <= ref_clk && ref_clk <= 8000) { + vci = RCC_PLL3VCIRANGE_2; + } else if (8000 <= ref_clk && ref_clk <= 16000) { + vci = RCC_PLL3VCIRANGE_3; + } else { + continue; + } uint32_t pll_clk = pixel_clock * divr; uint32_t vco = 0; - if (150000 <= pll_clk && pll_clk <= 420000) vco = RCC_PLL3VCOMEDIUM; - else if (192000 <= pll_clk && pll_clk <= 836000) vco = RCC_PLL3VCOWIDE; - else continue; + if (150000 <= pll_clk && pll_clk <= 420000) { + vco = RCC_PLL3VCOMEDIUM; + } else if (192000 <= pll_clk && pll_clk <= 836000) { + vco = RCC_PLL3VCOWIDE; + } else { + continue; + } uint32_t divn = pll_clk / ref_clk; - if (divn < 4 || 512 < divn) continue; + if (divn < 4 || 512 < divn) { + continue; + } uint32_t frac = ((pll_clk % ref_clk) * 8192) / ref_clk; @@ -920,7 +905,9 @@ static void ltdc_pll_config_init(int frame_size, int refresh_rate) init.PLL3.PLL3VCOSEL = vco; init.PLL3.PLL3FRACN = frac; - if (HAL_RCCEx_PeriphCLKConfig(&init) == HAL_OK) return; + if (HAL_RCCEx_PeriphCLKConfig(&init) == HAL_OK) { + return; + } } } @@ -992,7 +979,11 @@ void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc) HAL_LTDC_Reload(<dc_handle, LTDC_RELOAD_VERTICAL_BLANKING); #if defined(OMV_LCD_DISP_PIN) - if (((lcd_type == LCD_DISPLAY) || (lcd_type == LCD_DISPLAY_WITH_HDMI)) && (framebuffer_tail != framebuffer_head)) OMV_LCD_DISP_ON(); // Turn display on if there is a new command. + if (((lcd_type == LCD_DISPLAY) || (lcd_type == LCD_DISPLAY_WITH_HDMI)) + && (framebuffer_tail != framebuffer_head)) { + // Turn display on if there is a new command. + omv_gpio_write(OMV_LCD_DISP_PIN, 1); + } #endif framebuffer_head = framebuffer_tail; @@ -1000,8 +991,9 @@ void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc) HAL_LTDC_ProgramLineEvent(<dc_handle, 13); // AccumulatedVBP } -static void ltdc_display(image_t *src_img, int dst_x_start, int dst_y_start, float x_scale, float y_scale, rectangle_t *roi, - int rgb_channel, int alpha, const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_t hint) +static void ltdc_display(image_t *src_img, int dst_x_start, int dst_y_start, + float x_scale, float y_scale, rectangle_t *roi, int rgb_channel, int alpha, + const uint16_t *color_palette, const uint8_t *alpha_palette, image_hint_t hint) { image_t dst_img; dst_img.w = lcd_width; @@ -1009,12 +1001,15 @@ static void ltdc_display(image_t *src_img, int dst_x_start, int dst_y_start, flo dst_img.pixfmt = PIXFORMAT_RGB565; int x0, x1, y0, y1; - bool black = !imlib_draw_image_rectangle(&dst_img, src_img, dst_x_start, dst_y_start, x_scale, y_scale, roi, alpha, alpha_palette, hint, &x0, &x1, &y0, &y1); + bool black = !imlib_draw_image_rectangle(&dst_img, src_img, + dst_x_start, dst_y_start, x_scale, y_scale, roi, alpha, alpha_palette, hint, &x0, &x1, &y0, &y1); // For triple buffering we are never drawing where tail or head (which may instantly update to // to be equal to tail) is. int new_framebuffer_tail = (framebuffer_tail + 1) % FRAMEBUFFER_COUNT; - if (new_framebuffer_tail == framebuffer_head) new_framebuffer_tail = (new_framebuffer_tail + 1) % FRAMEBUFFER_COUNT; + if (new_framebuffer_tail == framebuffer_head) { + new_framebuffer_tail = (new_framebuffer_tail + 1) % FRAMEBUFFER_COUNT; + } dst_img.data = (uint8_t *) framebuffers[new_framebuffer_tail]; // Set default values for the layer to display the whole framebuffer. @@ -1028,12 +1023,17 @@ static void ltdc_display(image_t *src_img, int dst_x_start, int dst_y_start, flo ltdc_framebuffer_layers[new_framebuffer_tail].ImageHeight = black ? lcd_height : (y1 - y0); // Set alpha to 256 here as we will use the layer alpha to blend the image into the background color of black for free. - if (!black) imlib_draw_image(&dst_img, src_img, dst_x_start, dst_y_start, x_scale, y_scale, roi, - rgb_channel, 256, color_palette, alpha_palette, hint | IMAGE_HINT_BLACK_BACKGROUND, NULL, NULL); + if (!black) { + imlib_draw_image(&dst_img, src_img, dst_x_start, dst_y_start, + x_scale, y_scale, roi, rgb_channel, 256, color_palette, + alpha_palette, hint | IMAGE_HINT_BLACK_BACKGROUND, NULL, NULL); + } #ifdef __DCACHE_PRESENT // Flush data for DMA - if (!black) SCB_CleanDCache_by_Addr((uint32_t *) dst_img.data, image_size(&dst_img)); + if (!black) { + SCB_CleanDCache_by_Addr((uint32_t *) dst_img.data, image_size(&dst_img)); + } #endif // Update tail which means a new image is ready. @@ -1045,7 +1045,9 @@ static void ltdc_clear() // For triple buffering we are never drawing where tail or head (which may instantly update to // to be equal to tail) is. int new_framebuffer_tail = (framebuffer_tail + 1) % FRAMEBUFFER_COUNT; - if (new_framebuffer_tail == framebuffer_head) new_framebuffer_tail = (new_framebuffer_tail + 1) % FRAMEBUFFER_COUNT; + if (new_framebuffer_tail == framebuffer_head) { + new_framebuffer_tail = (new_framebuffer_tail + 1) % FRAMEBUFFER_COUNT; + } // Set default values for the layer to display the whole framebuffer. ltdc_framebuffer_layers[new_framebuffer_tail].WindowX0 = 0; @@ -1068,35 +1070,24 @@ static TIM_HandleTypeDef lcd_tim_handle = {}; #ifdef OMV_LCD_BL_PIN static void ltdc_set_backlight(int intensity) { -#ifdef OMV_LCD_BL_TIM + #ifdef OMV_LCD_BL_TIM if ((lcd_intensity < 255) && (255 <= intensity)) { -#else + #else if ((lcd_intensity < 1) && (1 <= intensity)) { -#endif - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = OMV_LCD_BL_PIN; - HAL_GPIO_Init(OMV_LCD_BL_PORT, &GPIO_InitStructure); - OMV_LCD_BL_ON(); + #endif + omv_gpio_config(OMV_LCD_BL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_LCD_BL_PIN, 1); } else if ((0 < lcd_intensity) && (intensity <= 0)) { - OMV_LCD_BL_OFF(); - HAL_GPIO_DeInit(OMV_LCD_BL_PORT, OMV_LCD_BL_PIN); + omv_gpio_write(OMV_LCD_BL_PIN, 0); + omv_gpio_deinit(OMV_LCD_BL_PIN); } -#ifdef OMV_LCD_BL_TIM + #ifdef OMV_LCD_BL_TIM int tclk = OMV_LCD_BL_TIM_PCLK_FREQ() * 2; int period = (tclk / OMV_LCD_BL_FREQ) - 1; if (((lcd_intensity <= 0) || (255 <= lcd_intensity)) && (0 < intensity) && (intensity < 255)) { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Alternate = OMV_LCD_BL_ALT; - GPIO_InitStructure.Pin = OMV_LCD_BL_PIN; - HAL_GPIO_Init(OMV_LCD_BL_PORT, &GPIO_InitStructure); + omv_gpio_config(OMV_LCD_BL_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); lcd_tim_handle.Instance = OMV_LCD_BL_TIM; lcd_tim_handle.Init.Prescaler = 0; @@ -1124,7 +1115,7 @@ static void ltdc_set_backlight(int intensity) } else if ((0 < lcd_intensity) && (lcd_intensity < 255) && (0 < intensity) && (intensity < 255)) { __HAL_TIM_SET_COMPARE(&lcd_tim_handle, OMV_LCD_BL_TIM_CHANNEL, (period * intensity) / 255); } -#endif + #endif lcd_intensity = intensity; } @@ -1207,7 +1198,9 @@ static mp_obj_t ltdc_dvi_get_display_id_data() && (mp_machine_soft_i2c_transfer(bus, EEPROM_I2C_ADDR, 1, &((mp_machine_i2c_buf_t) { .len = 1, .buf = (uint8_t []) {0x80} // addr }), MP_MACHINE_I2C_FLAG_STOP) == 1)) { - int extensions = data[126], extensions_byte_size = extensions * 128, total_data_byte_size = extensions_byte_size + 128; + int extensions = data[126]; + int extensions_byte_size = extensions * 128; + int total_data_byte_size = extensions_byte_size + 128; uint8_t *data2 = fb_alloc(total_data_byte_size, FB_ALLOC_NO_HINT), *data2_ext = data2 + 128; memcpy(data2, data, 128); @@ -1227,16 +1220,16 @@ static mp_obj_t ltdc_dvi_get_display_id_data() } #endif // OMV_DDC_PRESENT -STATIC mp_obj_t ltdc_dvi_extint_callback(mp_obj_t line) +static void ltdc_dvi_extint_callback(omv_gpio_t pin, void *data) { - if (ltdc_dvi_user_cb) mp_call_function_1(ltdc_dvi_user_cb, ltdc_dvi_get_display_connected()); - return mp_const_none; + if (ltdc_dvi_user_cb) { + mp_call_function_1(ltdc_dvi_user_cb, ltdc_dvi_get_display_connected()); + } } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(ltdc_dvi_extint_callback_obj, ltdc_dvi_extint_callback); static void ltdc_dvi_deinit() { - extint_disable(OMV_DVI_INT_PIN->pin); + omv_gpio_irq_enable(OMV_DVI_INT_PIN, false); ltdc_dvi_user_cb = NULL; #ifdef OMV_DDC_PRESENT @@ -1244,32 +1237,25 @@ static void ltdc_dvi_deinit() #endif // OMV_DDC_PRESENT ltdc_dvi_bus = NULL; - HAL_GPIO_WritePin(OMV_DVI_RESET_PIN->gpio, OMV_DVI_RESET_PIN->pin_mask, GPIO_PIN_RESET); - HAL_Delay(1); + omv_gpio_write(OMV_DVI_RESET_PIN, 0); + mp_hal_delay_ms(1); - HAL_GPIO_WritePin(OMV_DVI_RESET_PIN->gpio, OMV_DVI_RESET_PIN->pin_mask, GPIO_PIN_SET); - HAL_Delay(1); + omv_gpio_write(OMV_DVI_RESET_PIN, 1); + mp_hal_delay_ms(1); - HAL_GPIO_DeInit(OMV_DVI_INT_PIN->gpio, OMV_DVI_INT_PIN->pin_mask); - HAL_GPIO_DeInit(OMV_DVI_SDA_PIN->gpio, OMV_DVI_SDA_PIN->pin_mask); - HAL_GPIO_DeInit(OMV_DVI_SCL_PIN->gpio, OMV_DVI_SCL_PIN->pin_mask); - HAL_GPIO_DeInit(OMV_DVI_RESET_PIN->gpio, OMV_DVI_RESET_PIN->pin_mask); + omv_gpio_deinit(OMV_DVI_INT_PIN); + omv_gpio_deinit(OMV_DVI_RESET_PIN); + HAL_GPIO_DeInit(OMV_TOUCH_SDA_PIN->gpio, OMV_TOUCH_SDA_PIN->pin_mask); + HAL_GPIO_DeInit(OMV_TOUCH_SCL_PIN->gpio, OMV_TOUCH_SCL_PIN->pin_mask); } static void ltdc_dvi_init() { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = OMV_DVI_RESET_PIN->pin_mask; - HAL_GPIO_Init(OMV_DVI_RESET_PIN->gpio, &GPIO_InitStructure); - - HAL_GPIO_WritePin(OMV_DVI_RESET_PIN->gpio, OMV_DVI_RESET_PIN->pin_mask, GPIO_PIN_RESET); - HAL_Delay(1); - - HAL_GPIO_WritePin(OMV_DVI_RESET_PIN->gpio, OMV_DVI_RESET_PIN->pin_mask, GPIO_PIN_SET); - HAL_Delay(1); + omv_gpio_config(OMV_DVI_RESET_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_DVI_RESET_PIN, 0); + mp_hal_delay_ms(1); + omv_gpio_write(OMV_DVI_RESET_PIN, 1); + mp_hal_delay_ms(1); ltdc_dvi_bus = (mp_obj_base_t *) MP_OBJ_TYPE_GET_SLOT( &mp_machine_soft_i2c_type, make_new)(&mp_machine_soft_i2c_type, 2, 0, (const mp_obj_t []) { @@ -1288,7 +1274,8 @@ static void ltdc_dvi_init() if (mp_machine_soft_i2c_transfer(ltdc_dvi_bus, TFP410_I2C_ADDR, 1, &((mp_machine_i2c_buf_t) { .len = 4, .buf = (uint8_t []) {0x08, 0xB7, 0x19, 0x80} // addr, CTL_1, CTL_2, CTL_3 }), MP_MACHINE_I2C_FLAG_STOP) == 4) { - extint_register((mp_obj_t) OMV_DVI_INT_PIN, GPIO_MODE_IT_FALLING, GPIO_PULLUP, (mp_obj_t) <dc_dvi_extint_callback_obj, true); + omv_gpio_config(OMV_DVI_INT_PIN, OMV_GPIO_MODE_IT_FALL, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_irq_register(OMV_DVI_INT_PIN, ltdc_dvi_extint_callback, NULL); } else { mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Display init failed!")); } @@ -1296,9 +1283,11 @@ static void ltdc_dvi_init() static void ltdc_dvi_register_hotplug_cb(mp_obj_t cb) { - extint_disable(OMV_DVI_INT_PIN->pin); + omv_gpio_irq_enable(OMV_DVI_INT_PIN, false); ltdc_dvi_user_cb = cb; - if (cb != mp_const_none) extint_enable(OMV_DVI_INT_PIN->pin); + if (cb != mp_const_none) { + omv_gpio_irq_enable(OMV_DVI_INT_PIN, true); + } } #endif // OMV_DVI_PRESENT @@ -1309,7 +1298,8 @@ STATIC mp_obj_t py_lcd_deinit() case LCD_SHIELD: { spi_config_deinit(); #ifdef OMV_SPI_LCD_BL_PIN - spi_lcd_set_backlight(255); // back to default state + // back to default state + spi_lcd_set_backlight(255); #endif break; } @@ -1318,7 +1308,10 @@ STATIC mp_obj_t py_lcd_deinit() case LCD_DISPLAY: case LCD_DISPLAY_WITH_HDMI: case LCD_DISPLAY_ONLY_HDMI: { ltdc_config_deinit(); #ifdef OMV_LCD_BL_PIN - if ((lcd_type == LCD_DISPLAY) || (lcd_type == LCD_DISPLAY_WITH_HDMI)) ltdc_set_backlight(0); // back to default state + if ((lcd_type == LCD_DISPLAY) || (lcd_type == LCD_DISPLAY_WITH_HDMI)) { + // back to default state + ltdc_set_backlight(0); + } #endif // OMV_LCD_BL_PIN #ifdef OMV_DVI_PRESENT if ((lcd_type == LCD_DISPLAY_WITH_HDMI) || (lcd_type == LCD_DISPLAY_ONLY_HDMI)) { @@ -1329,7 +1322,9 @@ STATIC mp_obj_t py_lcd_deinit() } #endif // OMV_DVI_PRESENT #ifdef OMV_TOUCH_PRESENT - if ((lcd_type == LCD_DISPLAY) || (lcd_type == LCD_DISPLAY_WITH_HDMI)) lcd_touch_deinit(); + if ((lcd_type == LCD_DISPLAY) || (lcd_type == LCD_DISPLAY_WITH_HDMI)) { + lcd_touch_deinit(); + } #endif // OMV_TOUCH_PRESENT break; } @@ -1361,11 +1356,17 @@ STATIC mp_obj_t py_lcd_init(uint n_args, const mp_obj_t *args, mp_map_t *kw_args #ifdef OMV_SPI_LCD_CONTROLLER case LCD_SHIELD: { int w = py_helper_keyword_int(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_width), 128); - if ((w <= 0) || (32767 < w)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Width!")); + if ((w <= 0) || (32767 < w)){ + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Width!")); + } int h = py_helper_keyword_int(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_height), 160); - if ((h <= 0) || (32767 < h)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Height!")); + if ((h <= 0) || (32767 < h)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Height!")); + } int refresh_rate = py_helper_keyword_int(n_args, args, 3, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_refresh), 60); - if ((refresh_rate < 30) || (120 < refresh_rate)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Refresh Rate!")); + if ((refresh_rate < 30) || (120 < refresh_rate)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Refresh Rate!")); + } bool triple_buffer = py_helper_keyword_int(n_args, args, 4, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_triple_buffer), false); bool bgr = py_helper_keyword_int(n_args, args, 5, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_bgr), false); bool byte_reverse = py_helper_keyword_int(n_args, args, 6, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_byte_reverse), false); @@ -1387,12 +1388,18 @@ STATIC mp_obj_t py_lcd_init(uint n_args, const mp_obj_t *args, mp_map_t *kw_args #ifdef OMV_LCD_CONTROLLER case LCD_DISPLAY: case LCD_DISPLAY_WITH_HDMI: case LCD_DISPLAY_ONLY_HDMI: { int frame_size = py_helper_keyword_int(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_framesize), LCD_DISPLAY_FWVGA); - if ((frame_size < 0) || (LCD_DISPLAY_MAX <= frame_size)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Frame Size!")); + if ((frame_size < 0) || (LCD_DISPLAY_MAX <= frame_size)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Frame Size!")); + } int refresh_rate = py_helper_keyword_int(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_refresh), 60); - if ((refresh_rate < 30) || (120 < refresh_rate)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Refresh Rate!")); + if ((refresh_rate < 30) || (120 < refresh_rate)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid Refresh Rate!")); + } ltdc_config_init(frame_size, refresh_rate); #ifdef OMV_LCD_BL_PIN - if ((type == LCD_DISPLAY) || (type == LCD_DISPLAY_WITH_HDMI)) ltdc_set_backlight(255); // to on state + if ((type == LCD_DISPLAY) || (type == LCD_DISPLAY_WITH_HDMI)) { + ltdc_set_backlight(255); // to on state + } #endif // OMV_LCD_BL_PIN #ifdef OMV_DVI_PRESENT if ((type == LCD_DISPLAY_WITH_HDMI) || (type == LCD_DISPLAY_ONLY_HDMI)) { @@ -1403,7 +1410,9 @@ STATIC mp_obj_t py_lcd_init(uint n_args, const mp_obj_t *args, mp_map_t *kw_args } #endif // OMV_DVI_PRESENT #ifdef OMV_TOUCH_PRESENT - if ((type == LCD_DISPLAY) || (type == LCD_DISPLAY_WITH_HDMI)) lcd_touch_init(); + if ((type == LCD_DISPLAY) || (type == LCD_DISPLAY_WITH_HDMI)) { + lcd_touch_init(); + } #endif // OMV_TOUCH_PRESENT lcd_width = resolution_w_h[frame_size][0]; lcd_height = resolution_w_h[frame_size][1]; @@ -1483,7 +1492,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_lcd_refresh_obj, py_lcd_refresh); STATIC mp_obj_t py_lcd_set_backlight(mp_obj_t intensity_obj) { int intensity = mp_obj_get_int(intensity_obj); - if ((intensity < 0) || (255 < intensity)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("0 <= intensity <= 255!")); + if ((intensity < 0) || (255 < intensity)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("0 <= intensity <= 255!")); + } switch (lcd_type) { #if defined(OMV_SPI_LCD_CONTROLLER) && defined(OMV_SPI_LCD_BL_PIN) @@ -1655,10 +1666,14 @@ STATIC mp_obj_t py_lcd_display(uint n_args, const mp_obj_t *args, mp_map_t *kw_a py_helper_keyword_rectangle_roi(arg_img, n_args, args, offset + 2, kw_args, &arg_roi); int arg_rgb_channel = py_helper_keyword_int(n_args, args, offset + 3, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_rgb_channel), -1); - if ((arg_rgb_channel < -1) || (2 < arg_rgb_channel)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("-1 <= rgb_channel <= 2!")); + if ((arg_rgb_channel < -1) || (2 < arg_rgb_channel)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("-1 <= rgb_channel <= 2!")); + } int arg_alpha = py_helper_keyword_int(n_args, args, offset + 4, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_alpha), 256); - if ((arg_alpha < 0) || (256 < arg_alpha)) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("0 <= alpha <= 256!")); + if ((arg_alpha < 0) || (256 < arg_alpha)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("0 <= alpha <= 256!")); + } const uint16_t *color_palette = py_helper_keyword_color_palette(n_args, args, offset + 5, kw_args, NULL); const uint8_t *alpha_palette = py_helper_keyword_alpha_palette(n_args, args, offset + 6, kw_args, NULL); @@ -1671,14 +1686,26 @@ STATIC mp_obj_t py_lcd_display(uint n_args, const mp_obj_t *args, mp_map_t *kw_a int arg_y_size; bool got_y_size = py_helper_keyword_int_maybe(n_args, args, offset + 9, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_y_size), &arg_y_size); - if (got_x_scale && got_x_size) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Choose either x_scale or x_size not both!")); - if (got_y_scale && got_y_size) mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Choose either y_scale or y_size not both!")); + if (got_x_scale && got_x_size) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Choose either x_scale or x_size not both!")); + } + if (got_y_scale && got_y_size) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Choose either y_scale or y_size not both!")); + } - if (got_x_size) arg_x_scale = arg_x_size / ((float) arg_roi.w); - if (got_y_size) arg_y_scale = arg_y_size / ((float) arg_roi.h); + if (got_x_size) { + arg_x_scale = arg_x_size / ((float) arg_roi.w); + } + if (got_y_size) { + arg_y_scale = arg_y_size / ((float) arg_roi.h); + } - if ((!got_x_scale) && (!got_x_size) && got_y_size) arg_x_scale = arg_y_scale; - if ((!got_y_scale) && (!got_y_size) && got_x_size) arg_y_scale = arg_x_scale; + if ((!got_x_scale) && (!got_x_size) && got_y_size) { + arg_x_scale = arg_y_scale; + } + if ((!got_y_scale) && (!got_y_size) && got_x_size) { + arg_y_scale = arg_x_scale; + } if ((!lcd_triple_buffer) && (arg_y_scale < 0)) { mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Vertical flip requires triple buffering!")); @@ -1731,8 +1758,9 @@ STATIC mp_obj_t py_lcd_clear(uint n_args, const mp_obj_t *args) #ifdef OMV_LCD_CONTROLLER case LCD_DISPLAY: case LCD_DISPLAY_WITH_HDMI: case LCD_DISPLAY_ONLY_HDMI: { #if defined(OMV_LCD_DISP_PIN) - if ((lcd_type == LCD_DISPLAY) && n_args && mp_obj_get_int(*args)) { // turns the display off (may not be black) - OMV_LCD_DISP_OFF(); + if ((lcd_type == LCD_DISPLAY) && n_args && mp_obj_get_int(*args)) { + // turns the display off (may not be black) + omv_gpio_write(OMV_LCD_DISP_PIN, 0); } else { // sets the display to black (not off) #else { @@ -1755,7 +1783,7 @@ STATIC const mp_rom_map_elem_t globals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_lcd) }, { MP_ROM_QSTR(MP_QSTR_LCD_NONE), MP_ROM_INT(LCD_NONE) }, { MP_ROM_QSTR(MP_QSTR_LCD_SHIELD), MP_ROM_INT(LCD_SHIELD) }, -#ifdef OMV_DVI_PRESENT + #ifdef OMV_DVI_PRESENT { MP_ROM_QSTR(MP_QSTR_LCD_DISPLAY), MP_ROM_INT(LCD_DISPLAY) }, { MP_ROM_QSTR(MP_QSTR_LCD_DISPLAY_WITH_HDMI), MP_ROM_INT(LCD_DISPLAY_WITH_HDMI) }, { MP_ROM_QSTR(MP_QSTR_LCD_DISPLAY_ONLY_HDMI), MP_ROM_INT(LCD_DISPLAY_ONLY_HDMI) }, @@ -1777,8 +1805,8 @@ STATIC const mp_rom_map_elem_t globals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_UXGA), MP_ROM_INT(LCD_DISPLAY_UXGA) }, { MP_ROM_QSTR(MP_QSTR_HD), MP_ROM_INT(LCD_DISPLAY_HD) }, { MP_ROM_QSTR(MP_QSTR_FHD), MP_ROM_INT(LCD_DISPLAY_FHD) }, -#endif -#ifdef OMV_TOUCH_PRESENT + #endif + #ifdef OMV_TOUCH_PRESENT { MP_ROM_QSTR(MP_QSTR_LCD_GESTURE_MOVE_UP), MP_ROM_INT(PY_LCD_TOUCH_GESTURE_MOVE_UP) }, { MP_ROM_QSTR(MP_QSTR_LCD_GESTURE_MOVE_LEFT), MP_ROM_INT(PY_LCD_TOUCH_GESTURE_MOVE_LEFT) }, { MP_ROM_QSTR(MP_QSTR_LCD_GESTURE_MOVE_DOWN), MP_ROM_INT(PY_LCD_TOUCH_GESTURE_MOVE_DOWN) }, @@ -1789,7 +1817,7 @@ STATIC const mp_rom_map_elem_t globals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_LCD_FLAG_PRESSED), MP_ROM_INT(PY_LCD_TOUCH_EVENT_PUT_DOWN) }, { MP_ROM_QSTR(MP_QSTR_LCD_FLAG_RELEASED), MP_ROM_INT(PY_LCD_TOUCH_EVENT_PUT_UP) }, { MP_ROM_QSTR(MP_QSTR_LCD_FLAG_MOVED), MP_ROM_INT(PY_LCD_TOUCH_EVENT_CONTACT) }, -#endif + #endif { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&py_lcd_init_obj) }, { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&py_lcd_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&py_lcd_width_obj) }, @@ -1802,32 +1830,32 @@ STATIC const mp_rom_map_elem_t globals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_refresh), MP_ROM_PTR(&py_lcd_refresh_obj) }, { MP_ROM_QSTR(MP_QSTR_get_backlight), MP_ROM_PTR(&py_lcd_get_backlight_obj) }, { MP_ROM_QSTR(MP_QSTR_set_backlight), MP_ROM_PTR(&py_lcd_set_backlight_obj) }, -#ifdef OMV_DVI_PRESENT + #ifdef OMV_DVI_PRESENT { MP_ROM_QSTR(MP_QSTR_get_display_connected), MP_ROM_PTR(&py_lcd_get_display_connected_obj) }, { MP_ROM_QSTR(MP_QSTR_register_hotplug_cb), MP_ROM_PTR(&py_lcd_register_hotplug_cb_obj) }, -#else + #else { MP_ROM_QSTR(MP_QSTR_get_display_connected), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_register_hotplug_cb), MP_ROM_PTR(&py_func_unavailable_obj) }, -#endif -#if defined(OMV_DVI_PRESENT) && defined(OMV_DDC_PRESENT) + #endif + #if defined(OMV_DVI_PRESENT) && defined(OMV_DDC_PRESENT) { MP_ROM_QSTR(MP_QSTR_get_display_id_data), MP_ROM_PTR(&py_lcd_get_display_id_data_obj) }, -#else + #else { MP_ROM_QSTR(MP_QSTR_get_display_id_data), MP_ROM_PTR(&py_func_unavailable_obj) }, -#endif -#if defined(OMV_DVI_PRESENT) && defined(OMV_CEC_PRESENT) + #endif + #if defined(OMV_DVI_PRESENT) && defined(OMV_CEC_PRESENT) { MP_ROM_QSTR(MP_QSTR_send_frame), MP_ROM_PTR(&py_lcd_send_frame_obj) }, { MP_ROM_QSTR(MP_QSTR_receive_frame), MP_ROM_PTR(&py_lcd_receive_frame_obj) }, { MP_ROM_QSTR(MP_QSTR_register_receive_cb), MP_ROM_PTR(&py_lcd_register_cec_receive_cb_obj) }, { MP_ROM_QSTR(MP_QSTR_received_frame_src_addr), MP_ROM_PTR(&py_lcd_received_frame_src_addr_obj) }, { MP_ROM_QSTR(MP_QSTR_received_frame_bytes), MP_ROM_PTR(&py_lcd_received_frame_bytes_obj) }, -#else + #else { MP_ROM_QSTR(MP_QSTR_send_frame), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_receive_frame), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_register_receive_cb), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_received_frame_src_addr), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_received_frame_bytes), MP_ROM_PTR(&py_func_unavailable_obj) }, -#endif -#ifdef OMV_TOUCH_PRESENT + #endif + #ifdef OMV_TOUCH_PRESENT { MP_ROM_QSTR(MP_QSTR_update_touch_points), MP_ROM_PTR(&py_lcd_update_touch_points_obj) }, { MP_ROM_QSTR(MP_QSTR_register_touch_cb), MP_ROM_PTR(&py_lcd_register_touch_cb_obj) }, { MP_ROM_QSTR(MP_QSTR_get_gesture), MP_ROM_PTR(&py_lcd_get_gesture_obj) }, @@ -1836,7 +1864,7 @@ STATIC const mp_rom_map_elem_t globals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_get_point_id), MP_ROM_PTR(&py_lcd_get_point_id_obj) }, { MP_ROM_QSTR(MP_QSTR_get_point_x_position), MP_ROM_PTR(&py_lcd_get_point_x_position_obj) }, { MP_ROM_QSTR(MP_QSTR_get_point_y_position), MP_ROM_PTR(&py_lcd_get_point_y_position_obj) }, -#else + #else { MP_ROM_QSTR(MP_QSTR_update_touch_points), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_register_touch_cb), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_get_gesture), MP_ROM_PTR(&py_func_unavailable_obj) }, @@ -1845,7 +1873,7 @@ STATIC const mp_rom_map_elem_t globals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_get_point_id), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_get_point_x_position), MP_ROM_PTR(&py_func_unavailable_obj) }, { MP_ROM_QSTR(MP_QSTR_get_point_y_position), MP_ROM_PTR(&py_func_unavailable_obj) }, -#endif + #endif { MP_ROM_QSTR(MP_QSTR_display), MP_ROM_PTR(&py_lcd_display_obj) }, { MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&py_lcd_clear_obj) }, }; diff --git a/src/omv/ports/stm32/modules/py_lcd_touch.c b/src/omv/ports/stm32/modules/py_lcd_touch.c index d48d13c7d..9c111b5ed 100644 --- a/src/omv/ports/stm32/modules/py_lcd_touch.c +++ b/src/omv/ports/stm32/modules/py_lcd_touch.c @@ -8,18 +8,19 @@ * * LCD Python module. */ +#include "omv_boardconfig.h" + +#if MICROPY_PY_LCD +#include STM32_HAL_H + #include "py/obj.h" #include "py/nlr.h" #include "py/runtime.h" -#include "extint.h" #include "extmod/machine_i2c.h" #include "py_helper.h" #include "py_lcd_touch.h" -#include "omv_boardconfig.h" -#include STM32_HAL_H - -#if MICROPY_PY_LCD +#include "omv_gpio.h" #ifdef OMV_TOUCH_PRESENT #define FT5X06_I2C_ADDR 0x38 @@ -131,16 +132,16 @@ mp_obj_t lcd_touch_update_touch_points() mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Failed to update the number of touch points!")); } -STATIC mp_obj_t lcd_touch_extint_callback(mp_obj_t line) +static void lcd_touch_extint_callback(omv_gpio_t pin, void *data) { - if (lcd_touch_user_cb) mp_call_function_1(lcd_touch_user_cb, lcd_touch_update_touch_points()); - return mp_const_none; + if (lcd_touch_user_cb) { + mp_call_function_1(lcd_touch_user_cb, lcd_touch_update_touch_points()); + } } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(lcd_touch_extint_callback_obj, lcd_touch_extint_callback); void lcd_touch_deinit() { - extint_disable(OMV_TOUCH_INT_PIN->pin); + omv_gpio_irq_enable(OMV_TOUCH_INT_PIN, false); lcd_touch_user_cb = NULL; lcd_touch_bus = NULL; @@ -151,32 +152,25 @@ void lcd_touch_deinit() memset((void *) lcd_touch_x_position, 0, sizeof(lcd_touch_x_position)); memset((void *) lcd_touch_y_position, 0, sizeof(lcd_touch_y_position)); - HAL_GPIO_WritePin(OMV_TOUCH_RESET_PIN->gpio, OMV_TOUCH_RESET_PIN->pin_mask, GPIO_PIN_RESET); - HAL_Delay(1); + omv_gpio_write(OMV_TOUCH_RESET_PIN, 0); + mp_hal_delay_ms(1); - HAL_GPIO_WritePin(OMV_TOUCH_RESET_PIN->gpio, OMV_TOUCH_RESET_PIN->pin_mask, GPIO_PIN_SET); - HAL_Delay(39); + omv_gpio_write(OMV_TOUCH_RESET_PIN, 1); + mp_hal_delay_ms(39); - HAL_GPIO_DeInit(OMV_TOUCH_INT_PIN->gpio, OMV_TOUCH_INT_PIN->pin_mask); + omv_gpio_deinit(OMV_TOUCH_INT_PIN); + omv_gpio_deinit(OMV_TOUCH_RESET_PIN); HAL_GPIO_DeInit(OMV_TOUCH_SDA_PIN->gpio, OMV_TOUCH_SDA_PIN->pin_mask); HAL_GPIO_DeInit(OMV_TOUCH_SCL_PIN->gpio, OMV_TOUCH_SCL_PIN->pin_mask); - HAL_GPIO_DeInit(OMV_TOUCH_RESET_PIN->gpio, OMV_TOUCH_RESET_PIN->pin_mask); } void lcd_touch_init() { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = OMV_TOUCH_RESET_PIN->pin_mask; - HAL_GPIO_Init(OMV_TOUCH_RESET_PIN->gpio, &GPIO_InitStructure); - - HAL_GPIO_WritePin(OMV_TOUCH_RESET_PIN->gpio, OMV_TOUCH_RESET_PIN->pin_mask, GPIO_PIN_RESET); - HAL_Delay(1); - - HAL_GPIO_WritePin(OMV_TOUCH_RESET_PIN->gpio, OMV_TOUCH_RESET_PIN->pin_mask, GPIO_PIN_SET); - HAL_Delay(39); + omv_gpio_config(OMV_TOUCH_RESET_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_TOUCH_RESET_PIN, 0); + mp_hal_delay_ms(1); + omv_gpio_write(OMV_TOUCH_RESET_PIN, 1); + mp_hal_delay_ms(39); lcd_touch_bus = (mp_obj_base_t *) MP_OBJ_TYPE_GET_SLOT( &mp_machine_soft_i2c_type, make_new)(&mp_machine_soft_i2c_type, 2, 0, (const mp_obj_t []) { @@ -186,7 +180,8 @@ void lcd_touch_init() if (mp_machine_soft_i2c_transfer(lcd_touch_bus, FT5X06_I2C_ADDR, 1, &((mp_machine_i2c_buf_t) { .len = 2, .buf = (uint8_t []) {0x00, 0x00} // addr, DEVICE_MODE }), MP_MACHINE_I2C_FLAG_STOP) == 2) { - extint_register((mp_obj_t) OMV_TOUCH_INT_PIN, GPIO_MODE_IT_FALLING, GPIO_PULLUP, (mp_obj_t) &lcd_touch_extint_callback_obj, true); + omv_gpio_config(OMV_TOUCH_INT_PIN, OMV_GPIO_MODE_IT_FALL, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_irq_register(OMV_TOUCH_INT_PIN, lcd_touch_extint_callback, NULL); } else { mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("Touch init failed!")); } @@ -194,9 +189,11 @@ void lcd_touch_init() void lcd_touch_register_touch_cb(mp_obj_t cb) { - extint_disable(OMV_TOUCH_INT_PIN->pin); + omv_gpio_irq_enable(OMV_TOUCH_INT_PIN, false); lcd_touch_user_cb = cb; - if (cb != mp_const_none) extint_enable(OMV_TOUCH_INT_PIN->pin); + if (cb != mp_const_none) { + omv_gpio_irq_enable(OMV_TOUCH_INT_PIN, true); + } } #endif // OMV_TOUCH_PRESENT diff --git a/src/omv/ports/stm32/modules/py_tv.c b/src/omv/ports/stm32/modules/py_tv.c index 00680a782..d3cac28a9 100644 --- a/src/omv/ports/stm32/modules/py_tv.c +++ b/src/omv/ports/stm32/modules/py_tv.c @@ -9,6 +9,11 @@ * * TV Python module. */ +#include "omv_boardconfig.h" + +#if MICROPY_PY_TV +#include STM32_HAL_H + #include "py/obj.h" #include "py/nlr.h" #include "py/runtime.h" @@ -16,10 +21,7 @@ #include "py_helper.h" #include "py_image.h" -#include "omv_boardconfig.h" -#include STM32_HAL_H - -#if MICROPY_PY_TV +#include "omv_gpio.h" #define TV_WIDTH 352 #define TV_HEIGHT 240 @@ -209,18 +211,18 @@ static void SpiRamWriteByteRegister(int opcode, int data) { uint8_t packet[2] = {opcode, data}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } static int SpiRamReadByteRegister(int opcode) { uint8_t packet[2] = {opcode, 0}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_TransmitReceive(OMV_SPI_LCD_CONTROLLER->spi, packet, packet, sizeof(packet), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); return packet[1]; } @@ -229,16 +231,16 @@ static void SpiRamWriteWordRegister(int opcode, int data) { uint8_t packet[3] = {opcode, data >> 8, data}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } static void SpiClearRam() { uint8_t packet[4] = {WRITE_SRAM, 0, 0, 0}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); packet[0] = 0; @@ -247,25 +249,25 @@ static void SpiClearRam() HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); } - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } static void SpiRamWriteProgram(int data0, int data1, int data2, int data3) { uint8_t packet[5] = {PROGRAM, data3, data2, data1, data0}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } static void SpiRamWriteLowPassFilter(int data) { uint8_t packet[6] = {WRITE_BLOCKMVC1, 0, 0, 0, 0, data}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } static void SpiRamWriteWord(int w_address, int data) @@ -273,9 +275,9 @@ static void SpiRamWriteWord(int w_address, int data) int address = w_address * sizeof(uint16_t); uint8_t packet[6] = {WRITE_SRAM, address >> 16, address >> 8, address, data >> 8, data}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } static void SpiRamWriteVSyncProtoLine(int line, int length_1, int length_2) @@ -302,9 +304,9 @@ static void SpiRamWriteLine(int line, int index) int data = index << 7; uint8_t packet[7] = {WRITE_SRAM, address >> 16, address >> 8, address, data, data >> 8, data >> 16}; - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, packet, sizeof(packet), HAL_MAX_DELAY); - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } static void SpiRamVideoInit() @@ -388,10 +390,6 @@ static void SpiRamVideoInit() // Enable the low-pass Y filter. SpiRamWriteLowPassFilter(BLOCKMVC1_PYF); } - -///////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////// #endif // TV lines are converted from 16-bit RGB565 to 12-bit YUV. @@ -433,14 +431,10 @@ static void spi_config_deinit() spi_deinit(OMV_SPI_LCD_CONTROLLER); // Do not put in HAL_SPI_MspDeinit as other modules share the SPI2 bus. - - HAL_GPIO_DeInit(OMV_SPI_LCD_MOSI_PORT, OMV_SPI_LCD_MOSI_PIN); - HAL_GPIO_DeInit(OMV_SPI_LCD_MISO_PORT, OMV_SPI_LCD_MISO_PIN); - HAL_GPIO_DeInit(OMV_SPI_LCD_SCLK_PORT, OMV_SPI_LCD_SCLK_PIN); - - HAL_GPIO_DeInit(OMV_SPI_LCD_CS_PORT, OMV_SPI_LCD_CS_PIN); - - /////////////////////////////////////////////////////////////////////// + omv_gpio_deinit(OMV_SPI_LCD_MOSI_PIN); + omv_gpio_deinit(OMV_SPI_LCD_MISO_PIN); + omv_gpio_deinit(OMV_SPI_LCD_SCLK_PIN); + omv_gpio_deinit(OMV_SPI_LCD_SSEL_PIN); } static void spi_tv_callback(SPI_HandleTypeDef *hspi); @@ -459,32 +453,11 @@ static void spi_config_init(bool triple_buffer) HAL_SPI_RegisterCallback(OMV_SPI_LCD_CONTROLLER->spi, HAL_SPI_TX_COMPLETE_CB_ID, spi_tv_callback); // Do not put in HAL_SPI_MspInit as other modules share the SPI2 bus. - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; - - GPIO_InitStructure.Alternate = OMV_SPI_LCD_MOSI_ALT; - GPIO_InitStructure.Pin = OMV_SPI_LCD_MOSI_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_MOSI_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Alternate = OMV_SPI_LCD_MISO_ALT; - GPIO_InitStructure.Pin = OMV_SPI_LCD_MISO_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_MISO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Alternate = OMV_SPI_LCD_SCLK_ALT; - GPIO_InitStructure.Pin = OMV_SPI_LCD_SCLK_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_SCLK_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_InitStructure.Pin = OMV_SPI_LCD_CS_PIN; - HAL_GPIO_Init(OMV_SPI_LCD_CS_PORT, &GPIO_InitStructure); - OMV_SPI_LCD_CS_HIGH(); - - ///////////////////////////////////////////////////////////////////// + omv_gpio_config(OMV_SPI_LCD_MOSI_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_SPI_LCD_MISO_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_SPI_LCD_SCLK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_MED, -1); + omv_gpio_config(OMV_SPI_LCD_SSEL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); SpiRamVideoInit(); @@ -504,42 +477,35 @@ static void spi_config_init(bool triple_buffer) dma_init(&spi_tx_dma, OMV_SPI_LCD_CONTROLLER->tx_dma_descr, DMA_MEMORY_TO_PERIPH, OMV_SPI_LCD_CONTROLLER->spi); OMV_SPI_LCD_CONTROLLER->spi->hdmatx = &spi_tx_dma; OMV_SPI_LCD_CONTROLLER->spi->hdmarx = NULL; -#if defined(MCU_SERIES_H7) + #if defined(MCU_SERIES_H7) spi_tx_dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; -#else + #else spi_tx_dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; -#endif + #endif spi_tx_dma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; spi_tx_dma.Init.FIFOMode = DMA_FIFOMODE_ENABLE; spi_tx_dma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; spi_tx_dma.Init.MemBurst = DMA_MBURST_INC4; -#if defined(MCU_SERIES_H7) + #if defined(MCU_SERIES_H7) spi_tx_dma.Init.PeriphBurst = DMA_PBURST_INC4; -#else + #else spi_tx_dma.Init.PeriphBurst = DMA_PBURST_SINGLE; -#endif -#if defined(MCU_SERIES_H7) - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_WORD; -#else - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_BYTE; -#endif - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_MSIZE_Msk) | DMA_MDATAALIGN_WORD; - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR & ~DMA_SxFCR_DMDIS_Msk) | DMA_FIFOMODE_ENABLE; - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->FCR & ~DMA_SxFCR_FTH_Msk) | DMA_FIFO_THRESHOLD_FULL; - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_MBURST_Msk) | DMA_MBURST_INC4; -#if defined(MCU_SERIES_H7) - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_INC4; -#else - ((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR = - (((DMA_Stream_TypeDef *) spi_tx_dma.Instance)->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_SINGLE; -#endif + #endif + DMA_Stream_TypeDef *dma_chan = spi_tx_dma.Instance; + #if defined(MCU_SERIES_H7) + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_WORD; + #else + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PSIZE_Msk) | DMA_PDATAALIGN_BYTE; + #endif + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_MSIZE_Msk) | DMA_MDATAALIGN_WORD; + dma_chan->FCR = (dma_chan->FCR & ~DMA_SxFCR_DMDIS_Msk) | DMA_FIFOMODE_ENABLE; + dma_chan->FCR = (dma_chan->FCR & ~DMA_SxFCR_FTH_Msk) | DMA_FIFO_THRESHOLD_FULL; + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_MBURST_Msk) | DMA_MBURST_INC4; + #if defined(MCU_SERIES_H7) + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_INC4; + #else + dma_chan->CR = (dma_chan->CR & ~DMA_SxCR_PBURST_Msk) | DMA_PBURST_SINGLE; + #endif fb_alloc_mark_permanent(); } } @@ -559,16 +525,16 @@ static void spi_tv_callback(SPI_HandleTypeDef *hspi) switch (spi_tx_cb_state) { case SPI_TX_CB_MEMORY_WRITE_CMD: { - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); spi_tx_cb_state = SPI_TX_CB_MEMORY_WRITE; spi_tx_cb_state_memory_write_addr = (uint8_t *) framebuffers[framebuffer_head]; spi_tx_cb_state_memory_write_count = PICLINE_LENGTH_BYTES * TV_HEIGHT; framebuffer_tail = framebuffer_head; -#if defined(MCU_SERIES_H7) + #if defined(MCU_SERIES_H7) OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_FTHLV_Msk) | SPI_FIFO_THRESHOLD_01DATA; -#endif - OMV_SPI_LCD_CS_LOW(); + #endif + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); // When starting the interrupt chain the first HAL_SPI_Transmit_IT is not executed // in interrupt context. So, disable interrupts for the first HAL_SPI_Transmit_IT so // that it completes first and unlocks the SPI bus before allowing the interrupt @@ -586,10 +552,10 @@ static void spi_tv_callback(SPI_HandleTypeDef *hspi) : SPI_TX_CB_MEMORY_WRITE_CMD; spi_tx_cb_state_memory_write_addr += count; spi_tx_cb_state_memory_write_count -= count; -#if defined(MCU_SERIES_H7) + #if defined(MCU_SERIES_H7) OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 = (OMV_SPI_LCD_CONTROLLER->spi->Instance->CFG1 & ~SPI_CFG1_FTHLV_Msk) | SPI_FIFO_THRESHOLD_16DATA; -#endif + #endif HAL_SPI_Transmit_DMA(OMV_SPI_LCD_CONTROLLER->spi, addr, count); break; } @@ -694,7 +660,7 @@ static void spi_tv_display(image_t *src_img, int dst_x_start, int dst_y_start, f if (!tv_triple_buffer) { dst_img.data = fb_alloc0(TV_WIDTH_RGB565, FB_ALLOC_NO_HINT); - OMV_SPI_LCD_CS_LOW(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 0); HAL_SPI_Transmit(OMV_SPI_LCD_CONTROLLER->spi, (uint8_t *) write_sram, sizeof(write_sram), HAL_MAX_DELAY); @@ -723,7 +689,7 @@ static void spi_tv_display(image_t *src_img, int dst_x_start, int dst_y_start, f } } - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); fb_free(); } else { // For triple buffering we are never drawing where head or tail (which may instantly update to @@ -935,7 +901,7 @@ STATIC mp_obj_t py_tv_channel(uint n_args, const mp_obj_t *args) if (tv_triple_buffer) { HAL_SPI_Abort(OMV_SPI_LCD_CONTROLLER->spi); spi_tx_cb_state = SPI_TX_CB_IDLE; - OMV_SPI_LCD_CS_HIGH(); + omv_gpio_write(OMV_SPI_LCD_SSEL_PIN, 1); } if (n_args) { @@ -1082,19 +1048,19 @@ STATIC mp_obj_t py_tv_clear() STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_tv_clear_obj, py_tv_clear); STATIC const mp_rom_map_elem_t globals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_tv) }, - { MP_ROM_QSTR(MP_QSTR_TV_NONE), MP_ROM_INT(TV_NONE) }, - { MP_ROM_QSTR(MP_QSTR_TV_SHIELD), MP_ROM_INT(TV_SHIELD) }, - { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&py_tv_init_obj) }, - { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&py_tv_deinit_obj) }, - { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&py_tv_width_obj) }, - { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&py_tv_height_obj) }, - { MP_ROM_QSTR(MP_QSTR_type), MP_ROM_PTR(&py_tv_type_obj) }, - { MP_ROM_QSTR(MP_QSTR_triple_buffer), MP_ROM_PTR(&py_tv_triple_buffer_obj) }, - { MP_ROM_QSTR(MP_QSTR_refresh), MP_ROM_PTR(&py_tv_refresh_obj) }, - { MP_ROM_QSTR(MP_QSTR_channel), MP_ROM_PTR(&py_tv_channel_obj) }, - { MP_ROM_QSTR(MP_QSTR_display), MP_ROM_PTR(&py_tv_display_obj) }, - { MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&py_tv_clear_obj) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_tv) }, + { MP_ROM_QSTR(MP_QSTR_TV_NONE), MP_ROM_INT(TV_NONE) }, + { MP_ROM_QSTR(MP_QSTR_TV_SHIELD), MP_ROM_INT(TV_SHIELD) }, + { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&py_tv_init_obj) }, + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&py_tv_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&py_tv_width_obj) }, + { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&py_tv_height_obj) }, + { MP_ROM_QSTR(MP_QSTR_type), MP_ROM_PTR(&py_tv_type_obj) }, + { MP_ROM_QSTR(MP_QSTR_triple_buffer), MP_ROM_PTR(&py_tv_triple_buffer_obj) }, + { MP_ROM_QSTR(MP_QSTR_refresh), MP_ROM_PTR(&py_tv_refresh_obj) }, + { MP_ROM_QSTR(MP_QSTR_channel), MP_ROM_PTR(&py_tv_channel_obj) }, + { MP_ROM_QSTR(MP_QSTR_display), MP_ROM_PTR(&py_tv_display_obj) }, + { MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&py_tv_clear_obj) }, }; STATIC MP_DEFINE_CONST_DICT(globals_dict, globals_dict_table); diff --git a/src/omv/ports/stm32/modules/py_winc.c b/src/omv/ports/stm32/modules/py_winc.c index a4802fb97..853e7b381 100644 --- a/src/omv/ports/stm32/modules/py_winc.c +++ b/src/omv/ports/stm32/modules/py_winc.c @@ -22,7 +22,6 @@ #include "extmod/modnetwork.h" #include "pin.h" #include "genhdr/pins.h" -#include "spi.h" #include "common.h" #include "py_helper.h" #include "ff_wrapper.h" diff --git a/src/omv/ports/stm32/omv_gpio.c b/src/omv/ports/stm32/omv_gpio.c new file mode 100644 index 000000000..6c075e7ec --- /dev/null +++ b/src/omv/ports/stm32/omv_gpio.c @@ -0,0 +1,243 @@ +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2023 Ibrahim Abdelkader + * Copyright (c) 2023 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * GPIO port for stm32. + */ +#include STM32_HAL_H +#include +#include +#include + +#include "py/mphal.h" +#include "irq.h" + +#include "omv_boardconfig.h" +#include "omv_gpio.h" + +typedef struct _omv_exti_descr { + bool enabled; + uint32_t gpio; + uint32_t irqn; + omv_gpio_t pin; + void *data; + omv_gpio_callback_t callback; +} omv_exti_descr_t; + +static omv_exti_descr_t exti_descr_table[16] = {{0}}; + +// Returns the port number configured in EXTI_CR for this line. +static uint32_t omv_exti_get_gpio(uint32_t line) +{ + return (SYSCFG->EXTICR[line >> 2] >> (4 * (line & 3))) & 0x0F; +} + +// Returns pin number. +static uint32_t omv_exti_get_line(omv_gpio_t pin) +{ + return 31 - __CLZ(pin->pin); +} + +// Returns the IRQ number of a an EXTI line. +static uint32_t omv_exti_get_irqn(omv_gpio_t pin) +{ + uint32_t exti_irqn = 0; + uint32_t exti_line = omv_exti_get_line(pin); + + switch (exti_line) { + case 0: + exti_irqn = EXTI0_IRQn; + break; + case 1: + exti_irqn = EXTI1_IRQn; + break; + case 2: + exti_irqn = EXTI2_IRQn; + break; + case 3: + exti_irqn = EXTI3_IRQn; + break; + case 4: + exti_irqn = EXTI4_IRQn; + break; + case 5 ... 9: + exti_irqn = EXTI9_5_IRQn; + break; + case 10 ... 15: + exti_irqn = EXTI15_10_IRQn; + break; + default: + break; + } + return exti_irqn; +} + +static inline bool omv_exti_enabled(omv_exti_descr_t *exti_descr, uint32_t line) +{ + return (exti_descr->enabled && + exti_descr->callback && + exti_descr->gpio == omv_exti_get_gpio(line)); + +} + +void omv_exti_handler(uint32_t line) +{ + if (line < 5) { + // EXTI lines 0 to 4 have single IRQs. + omv_exti_descr_t *exti_descr = &exti_descr_table[line]; + if (omv_exti_enabled(exti_descr, line)) { + __HAL_GPIO_EXTI_CLEAR_FLAG(1 << line); + exti_descr->callback(exti_descr->pin, exti_descr->data); + } + } else { + size_t line_max = (line == 5) ? 10 : 16; + // EXTI lines 5 to 9 and 10 to 15 are multiplexed. + for (size_t i = line; i < line_max; i++) { + omv_exti_descr_t *exti_descr = &exti_descr_table[i]; + if (__HAL_GPIO_EXTI_GET_FLAG(1 << i) + && omv_exti_enabled(exti_descr, i)) { + __HAL_GPIO_EXTI_CLEAR_FLAG(1 << i); + exti_descr->callback(exti_descr->pin, exti_descr->data); + } + } + } +} + +void omv_gpio_init0(void) +{ + memset(exti_descr_table, 0, sizeof(exti_descr_table)); +} + +void omv_gpio_config(omv_gpio_t pin, uint32_t mode, uint32_t pull, uint32_t speed, uint32_t af) +{ + GPIO_InitTypeDef gpio_config = { + .Pin = pin->pin, + .Mode = mode, + .Pull = pull, + .Speed = speed, + .Alternate = ((af == -1) ? pin->af : af), + }; + HAL_GPIO_Init(pin->port, &gpio_config); +} + +void omv_gpio_deinit(omv_gpio_t pin) +{ + HAL_GPIO_DeInit(pin->port, pin->pin); +} + +bool omv_gpio_read(omv_gpio_t pin) +{ + return HAL_GPIO_ReadPin(pin->port, pin->pin); +} + +void omv_gpio_write(omv_gpio_t pin, bool value) +{ + HAL_GPIO_WritePin(pin->port, pin->pin, value); +} + +void omv_gpio_irq_register(omv_gpio_t pin, omv_gpio_callback_t callback, void *data) +{ + omv_exti_descr_t *exti_descr = NULL; + uint32_t exti_line = omv_exti_get_line(pin); + if (exti_line != 0) { + exti_descr = &exti_descr_table[exti_line]; + exti_descr->enabled = true; + exti_descr->data = data; + exti_descr->gpio = omv_exti_get_gpio(exti_line); + exti_descr->pin = pin; + exti_descr->callback = callback; + } +} + +void omv_gpio_irq_enable(omv_gpio_t pin, bool enable) +{ + uint32_t exti_line = omv_exti_get_line(pin); + uint32_t exti_irqn = omv_exti_get_irqn(pin); + exti_descr_table[exti_line].enabled = enable; + if (!enable) { + HAL_NVIC_DisableIRQ(exti_irqn); + } else { + NVIC_SetPriority(exti_irqn, IRQ_PRI_EXTINT); + HAL_NVIC_EnableIRQ(exti_irqn); + } +} + +void omv_gpio_clock_enable(omv_gpio_t pin, bool enable) +{ + if (pin->port == GPIOA) { + if (enable) { + __HAL_RCC_GPIOA_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOA_CLK_DISABLE(); + } + } else if (pin->port == GPIOB) { + if (enable) { + __HAL_RCC_GPIOB_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOB_CLK_DISABLE(); + } + } else if (pin->port == GPIOC) { + if (enable) { + __HAL_RCC_GPIOC_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOC_CLK_DISABLE(); + } + } else if (pin->port == GPIOD) { + if (enable) { + __HAL_RCC_GPIOD_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOD_CLK_DISABLE(); + } + } else if (pin->port == GPIOE) { + if (enable) { + __HAL_RCC_GPIOE_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOE_CLK_DISABLE(); + } + } else if (pin->port == GPIOF) { + if (enable) { + __HAL_RCC_GPIOF_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOF_CLK_DISABLE(); + } + } else if (pin->port == GPIOG) { + if (enable) { + __HAL_RCC_GPIOG_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOG_CLK_DISABLE(); + } + #if defined(__HAL_RCC_GPIOH_CLK_ENABLE) + } else if (pin->port == GPIOH) { + if (enable) { + __HAL_RCC_GPIOH_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOH_CLK_DISABLE(); + } + #elif defined(__HAL_RCC_GPIOI_CLK_ENABLE) + } else if (pin->port == GPIOI) { + if (enable) { + __HAL_RCC_GPIOI_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOI_CLK_DISABLE(); + } + #elif defined(__HAL_RCC_GPIOJ_CLK_ENABLE) + } else if (pin->port == GPIOJ) { + if (enable) { + __HAL_RCC_GPIOJ_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOJ_CLK_DISABLE(); + } + #elif defined(__HAL_RCC_GPIOK_CLK_ENABLE) + } else if (pin->port == GPIOK) { + if (enable) { + __HAL_RCC_GPIOK_CLK_ENABLE(); + } else { + __HAL_RCC_GPIOK_CLK_DISABLE(); + } + #endif + } +} diff --git a/src/omv/ports/stm32/omv_portconfig.h b/src/omv/ports/stm32/omv_portconfig.h index 96756bd29..98e19e4f1 100644 --- a/src/omv/ports/stm32/omv_portconfig.h +++ b/src/omv/ports/stm32/omv_portconfig.h @@ -12,14 +12,57 @@ #define __OMV_PORTCONFIG_H__ #include STM32_HAL_H +// GPIO speeds. +#define OMV_GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW +#define OMV_GPIO_SPEED_MED GPIO_SPEED_FREQ_MEDIUM +#define OMV_GPIO_SPEED_HIGH GPIO_SPEED_FREQ_HIGH +#define OMV_GPIO_SPEED_MAX GPIO_SPEED_FREQ_VERY_HIGH + +// GPIO pull. +#define OMV_GPIO_PULL_NONE GPIO_NOPULL +#define OMV_GPIO_PULL_UP GPIO_PULLUP +#define OMV_GPIO_PULL_DOWN GPIO_PULLDOWN + +// GPIO modes. +#define OMV_GPIO_MODE_INPUT GPIO_MODE_INPUT +#define OMV_GPIO_MODE_OUTPUT GPIO_MODE_OUTPUT_PP +#define OMV_GPIO_MODE_OUTPUT_OD GPIO_MODE_OUTPUT_OD +#define OMV_GPIO_MODE_ALT GPIO_MODE_AF_PP +#define OMV_GPIO_MODE_ALT_OD GPIO_MODE_AF_OD +#define OMV_GPIO_MODE_ANALOG GPIO_MODE_ANALOG + +// GPIO IT modes. +#define OMV_GPIO_MODE_IT_FALL GPIO_MODE_IT_FALLING +#define OMV_GPIO_MODE_IT_RISE GPIO_MODE_IT_RISING +#define OMV_GPIO_MODE_IT_BOTH GPIO_MODE_IT_RISING_FALLING + // omv_gpio_t definition -typedef struct _omv_gpio { - uint32_t pin; +typedef struct { GPIO_TypeDef *port; -} omv_gpio_t; + uint16_t pin; + uint16_t af; +} stm32_gpio_t; + +typedef const stm32_gpio_t *omv_gpio_t; // cambus/i2c definition // This pointer will be set to its respective I2C handle which is defined in MicroPython along with // IRQ handlers, if this I2C is enabled in Micropython, or defined and handled in stm32fxxx_hal_msp.c. typedef I2C_HandleTypeDef *omv_cambus_t; + +// For board config files. + +// Dummy AF for pins defined as I/O +#define GPIO_NONE_GPIO (0) + +#if OMV_GPIO_DEFINE_PINS +#define OMV_GPIO_DEFINE(port, pin, af, inst) \ + const stm32_gpio_t omv_pin_##port##pin##_##inst = {GPIO##port, GPIO_PIN_##pin, GPIO_##af##_##inst}; +#else +#define OMV_GPIO_DEFINE(port, pin, af, inst) \ + extern stm32_gpio_t omv_pin_##port##pin##_##inst; +#endif + +#include "omv_pins.h" + #endif // __OMV_PORTCONFIG_H__ diff --git a/src/omv/ports/stm32/omv_portconfig.mk b/src/omv/ports/stm32/omv_portconfig.mk index f73696823..61ad30201 100644 --- a/src/omv/ports/stm32/omv_portconfig.mk +++ b/src/omv/ports/stm32/omv_portconfig.mk @@ -567,6 +567,7 @@ UVC_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/ports/stm32/,\ soft_i2c.o \ cambus.o \ ulpi.o \ + omv_gpio.o \ ) UVC_OBJ += $(wildcard $(BUILD)/$(LEPTON_DIR)/src/*.o) diff --git a/src/omv/ports/stm32/sensor.c b/src/omv/ports/stm32/sensor.c index d41976316..39f543e69 100644 --- a/src/omv/ports/stm32/sensor.c +++ b/src/omv/ports/stm32/sensor.c @@ -18,6 +18,7 @@ #include "framebuffer.h" #include "omv_boardconfig.h" #include "unaligned_memcpy.h" +#include "omv_gpio.h" #define MDMA_BUFFER_SIZE (64) #define DMA_MAX_XFER_SIZE (0xFFFF*4) @@ -319,19 +320,23 @@ int sensor_shutdown(int enable) sensor_abort(); if (enable) { + #if defined(DCMI_POWER_PIN) if (sensor.pwdn_pol == ACTIVE_HIGH) { - DCMI_PWDN_HIGH(); + omv_gpio_write(DCMI_POWER_PIN, 1); } else { - DCMI_PWDN_LOW(); + omv_gpio_write(DCMI_POWER_PIN, 0); } + #endif HAL_NVIC_DisableIRQ(DCMI_IRQn); HAL_DCMI_DeInit(&DCMIHandle); } else { + #if defined(DCMI_POWER_PIN) if (sensor.pwdn_pol == ACTIVE_HIGH) { - DCMI_PWDN_LOW(); + omv_gpio_write(DCMI_POWER_PIN, 0); } else { - DCMI_PWDN_HIGH(); + omv_gpio_write(DCMI_POWER_PIN, 1); } + #endif ret = sensor_dcmi_config(sensor.pixformat); } @@ -339,34 +344,29 @@ int sensor_shutdown(int enable) return ret; } +static void sensor_vsync_callback(omv_gpio_t pin, void *data) +{ + if (sensor.vsync_callback != NULL) { + sensor.vsync_callback(omv_gpio_read(DCMI_VSYNC_PIN)); + } +} + int sensor_set_vsync_callback(vsync_cb_t vsync_cb) { sensor.vsync_callback = vsync_cb; if (sensor.vsync_callback == NULL) { #if (DCMI_VSYNC_EXTI_SHARED == 0) // Disable VSYNC EXTI IRQ - HAL_NVIC_DisableIRQ(DCMI_VSYNC_EXTI_IRQN); + omv_gpio_irq_enable(DCMI_VSYNC_PIN, false); #endif } else { // Enable VSYNC EXTI IRQ - NVIC_SetPriority(DCMI_VSYNC_EXTI_IRQN, IRQ_PRI_EXTINT); - HAL_NVIC_EnableIRQ(DCMI_VSYNC_EXTI_IRQN); + omv_gpio_irq_register(DCMI_VSYNC_PIN, sensor_vsync_callback, NULL); + omv_gpio_irq_enable(DCMI_VSYNC_PIN, true); } return 0; } -void DCMI_VsyncExtiCallback() -{ - if (__HAL_GPIO_EXTI_GET_FLAG(1 << DCMI_VSYNC_EXTI_LINE)) { - if (hal_get_exti_gpio(DCMI_VSYNC_EXTI_LINE) == DCMI_VSYNC_EXTI_GPIO) { - __HAL_GPIO_EXTI_CLEAR_FLAG(1 << DCMI_VSYNC_EXTI_LINE); - if (sensor.vsync_callback != NULL) { - sensor.vsync_callback(HAL_GPIO_ReadPin(DCMI_VSYNC_PORT, DCMI_VSYNC_PIN)); - } - } - } -} - // If we are cropping the image by more than 1 word in width we can align the line start to // a word address to improve copy performance. Do not crop by more than 1 word as this will // result in less time between DMA transfers complete interrupts on 16-byte boundaries. @@ -900,7 +900,7 @@ int sensor_snapshot(sensor_t *sensor, image_t *image, uint32_t flags) // Let the camera know we want to trigger it now. #if defined(DCMI_FSYNC_PIN) if (sensor->hw_flags.fsync) { - DCMI_FSYNC_HIGH(); + omv_gpio_write(DCMI_FSYNC_PIN, 1); } #endif @@ -926,7 +926,7 @@ int sensor_snapshot(sensor_t *sensor, image_t *image, uint32_t flags) #if defined(DCMI_FSYNC_PIN) if (sensor->hw_flags.fsync) { - DCMI_FSYNC_LOW(); + omv_gpio_write(DCMI_FSYNC_PIN, 0); } #endif @@ -944,7 +944,7 @@ int sensor_snapshot(sensor_t *sensor, image_t *image, uint32_t flags) // We're done receiving data. #if defined(DCMI_FSYNC_PIN) if (sensor->hw_flags.fsync) { - DCMI_FSYNC_LOW(); + omv_gpio_write(DCMI_FSYNC_PIN, 0); } #endif diff --git a/src/omv/ports/stm32/soft_i2c.c b/src/omv/ports/stm32/soft_i2c.c index 02513a63d..254e5ec0b 100644 --- a/src/omv/ports/stm32/soft_i2c.c +++ b/src/omv/ports/stm32/soft_i2c.c @@ -15,8 +15,9 @@ #include "soft_i2c.h" #include "omv_boardconfig.h" +#include "omv_gpio.h" -#if defined(SOFT_I2C_PORT) +#if defined(SOFT_I2C_SIOC_PIN) #define ACK 0 #define NACK 1 @@ -29,9 +30,9 @@ static void i2c_start(void) { /* The start of data transmission occurs when SIO_D is driven low while SIO_C is high */ - SOFT_I2C_SIOD_L(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 0); delay(); - SOFT_I2C_SIOC_L(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 0); delay(); } @@ -39,9 +40,9 @@ static void i2c_stop(void) { /* The stop of data transmission occurs when SIO_D is driven high while SIO_C is high */ - SOFT_I2C_SIOC_H(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); delay(); - SOFT_I2C_SIOD_H(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 1); delay(); } @@ -49,29 +50,29 @@ static uint8_t i2c_read_byte(char ack) { uint8_t data = 0; - SOFT_I2C_SIOD_H(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 1); delay(); for(char i=0; i<8; i++) { - SOFT_I2C_SIOC_H(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); delay(); - data += data + SOFT_I2C_SIOD_READ(); + data += data + omv_gpio_read(SOFT_I2C_SIOD_PIN); delay(); - SOFT_I2C_SIOC_L(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 0); delay(); } /* Write ACK */ - SOFT_I2C_SIOD_WRITE(ack); + omv_gpio_write(SOFT_I2C_SIOD_PIN, ack); delay(); - SOFT_I2C_SIOC_H(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); delay(); - SOFT_I2C_SIOC_L(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 0); delay(); - SOFT_I2C_SIOD_L(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 0); delay(); return data; } @@ -81,28 +82,28 @@ static char i2c_write_byte(uint8_t data) char i; for(i=0; i<8; i++) { - SOFT_I2C_SIOD_WRITE((data >> (7 - i)) & 1); + omv_gpio_write(SOFT_I2C_SIOD_PIN, (data >> (7 - i)) & 1); delay(); - SOFT_I2C_SIOC_H(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); delay(); - SOFT_I2C_SIOC_L(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 0); delay(); } - SOFT_I2C_SIOD_H(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 1); delay(); - SOFT_I2C_SIOC_H(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); delay(); /* Read ACK */ - i = SOFT_I2C_SIOD_READ(); + i = omv_gpio_read(SOFT_I2C_SIOD_PIN); delay(); - SOFT_I2C_SIOC_L(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 0); delay(); - SOFT_I2C_SIOD_L(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 0); delay(); return i; } @@ -119,9 +120,9 @@ int soft_i2c_read_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop) if (stop) { i2c_stop(); } else { - SOFT_I2C_SIOD_H(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 1); delay(); - SOFT_I2C_SIOC_H(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); delay(); } MICROPY_END_ATOMIC_SECTION(atomic_state); @@ -140,9 +141,9 @@ int soft_i2c_write_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop) if (stop) { i2c_stop(); } else { - SOFT_I2C_SIOD_H(); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 1); delay(); - SOFT_I2C_SIOC_H(); + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); delay(); } MICROPY_END_ATOMIC_SECTION(atomic_state); @@ -151,18 +152,11 @@ int soft_i2c_write_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop) void soft_i2c_init() { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = GPIO_SPEED_LOW; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; + omv_gpio_write(SOFT_I2C_SIOC_PIN, 1); // Set first to prevent glitches. + omv_gpio_config(SOFT_I2C_SIOC_PIN, OMV_GPIO_MODE_OUTPUT_OD, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); - GPIO_InitStructure.Pin = SOFT_I2C_SIOC_PIN; - SOFT_I2C_SIOC_H(); // Set first to prevent glitches. - HAL_GPIO_Init(SOFT_I2C_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = SOFT_I2C_SIOD_PIN; - SOFT_I2C_SIOD_H(); // Set first to prevent glitches. - HAL_GPIO_Init(SOFT_I2C_PORT, &GPIO_InitStructure); + omv_gpio_write(SOFT_I2C_SIOD_PIN, 1); // Set first to prevent glitches. + omv_gpio_config(SOFT_I2C_SIOD_PIN, OMV_GPIO_MODE_OUTPUT_OD, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); for(volatile int i=0; i<1000; i++); @@ -174,7 +168,7 @@ void soft_i2c_init() void soft_i2c_deinit() { for(volatile int i=0; i<1000; i++); - HAL_GPIO_DeInit(SOFT_I2C_PORT, SOFT_I2C_SIOC_PIN); - HAL_GPIO_DeInit(SOFT_I2C_PORT, SOFT_I2C_SIOD_PIN); + omv_gpio_deinit(SOFT_I2C_SIOC_PIN); + omv_gpio_deinit(SOFT_I2C_SIOD_PIN); } -#endif // defined(SOFT_I2C_PORT) +#endif // defined(SOFT_I2C_SIOC_PIN) diff --git a/src/omv/ports/stm32/stm32fxxx_hal_msp.c b/src/omv/ports/stm32/stm32fxxx_hal_msp.c index 6fc92998a..56d5f580a 100644 --- a/src/omv/ports/stm32/stm32fxxx_hal_msp.c +++ b/src/omv/ports/stm32/stm32fxxx_hal_msp.c @@ -10,38 +10,16 @@ */ #include STM32_HAL_H #include "axiqos.h" -#include "omv_boardconfig.h" #include "imlib.h" #include "irq.h" - -/* GPIO struct */ -typedef struct { - GPIO_TypeDef *port; - uint16_t pin; -} gpio_t; - -/* DCMI GPIOs */ -static const gpio_t dcmi_pins[] = { - {DCMI_D0_PORT, DCMI_D0_PIN}, - {DCMI_D1_PORT, DCMI_D1_PIN}, - {DCMI_D2_PORT, DCMI_D2_PIN}, - {DCMI_D3_PORT, DCMI_D3_PIN}, - {DCMI_D4_PORT, DCMI_D4_PIN}, - {DCMI_D5_PORT, DCMI_D5_PIN}, - {DCMI_D6_PORT, DCMI_D6_PIN}, - {DCMI_D7_PORT, DCMI_D7_PIN}, - {DCMI_HSYNC_PORT, DCMI_HSYNC_PIN}, - {DCMI_VSYNC_PORT, DCMI_VSYNC_PIN}, - {DCMI_PXCLK_PORT, DCMI_PXCLK_PIN}, -}; - -#define NUM_DCMI_PINS (sizeof(dcmi_pins)/sizeof(dcmi_pins[0])) +#include "omv_boardconfig.h" +#include "common.h" +// Define pin objects in this file. +#define OMV_GPIO_DEFINE_PINS (1) +#include "omv_gpio.h" extern void SystemClock_Config(void); - -uint32_t hal_get_exti_gpio(uint32_t line) { - return (SYSCFG->EXTICR[line >> 2] >> (4 * (line & 3))) & 0x0F; -} +extern uint32_t omv_exti_get_gpio(uint32_t line); void HAL_MspInit(void) { @@ -54,7 +32,7 @@ void HAL_MspInit(void) __DSB(); __ISB(); HAL_MPU_Disable(); - /* Configure the MPU attributes to disable caching DMA buffers */ + // Configure the MPU attributes to disable caching DMA buffers. MPU_Region_InitTypeDef MPU_InitStruct; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; @@ -93,12 +71,12 @@ void HAL_MspInit(void) HAL_MPU_ConfigRegion(&MPU_InitStruct); #endif // defined(OMV_DMA_REGION_D3_BASE) - /* Enable the MPU */ + // Enable the MPU. HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); __DSB(); __ISB(); #endif // defined(OMV_DMA_REGION_D1_BASE || OMV_DMA_REGION_D2_BASE || OMV_DMA_REGION_D3_BASE) - /* Enable I/D cache */ + // Enable I/D cache. #if defined(MCU_SERIES_F7) || defined(MCU_SERIES_H7) #ifdef OMV_DISABLE_CACHE // Disable caches for testing. @@ -122,46 +100,46 @@ void HAL_MspInit(void) #endif #endif - /* Config Systick */ + // Config Systick. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); - /* Enable GPIO clocks */ + // Enable GPIO clocks. __GPIOA_CLK_ENABLE(); __GPIOB_CLK_ENABLE(); __GPIOC_CLK_ENABLE(); __GPIOD_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); - #ifdef OMV_ENABLE_GPIO_BANK_F + #if OMV_ENABLE_GPIO_BANK_F __GPIOF_CLK_ENABLE(); #endif - #ifdef OMV_ENABLE_GPIO_BANK_G + #if OMV_ENABLE_GPIO_BANK_G __GPIOG_CLK_ENABLE(); #endif - #ifdef OMV_ENABLE_GPIO_BANK_H + #if OMV_ENABLE_GPIO_BANK_H __GPIOH_CLK_ENABLE(); #endif - #ifdef OMV_ENABLE_GPIO_BANK_I + #if OMV_ENABLE_GPIO_BANK_I __GPIOI_CLK_ENABLE(); #endif - #ifdef OMV_ENABLE_GPIO_BANK_J + #if OMV_ENABLE_GPIO_BANK_J __GPIOJ_CLK_ENABLE(); #endif - #ifdef OMV_ENABLE_GPIO_BANK_K + #if OMV_ENABLE_GPIO_BANK_K __GPIOK_CLK_ENABLE(); #endif - /* Enable DMA clocks */ + // Enable DMA clocks. __DMA1_CLK_ENABLE(); __DMA2_CLK_ENABLE(); #if defined(MCU_SERIES_H7) - // MDMA clock + // MDMA clock. __HAL_RCC_MDMA_CLK_ENABLE(); NVIC_SetPriority(MDMA_IRQn, IRQ_PRI_MDMA); HAL_NVIC_EnableIRQ(MDMA_IRQn); #endif - /* Setup AXI QoS */ + // Setup AXI QoS #if defined(OMV_AXI_QOS_D2_AHB_R_PRI) OMV_AXI_QOS_D2_AHB_R_SET(OMV_AXI_QOS_D2_AHB_R_PRI); #endif @@ -199,50 +177,24 @@ void HAL_MspInit(void) OMV_AXI_QOS_LTDC_W_SET(OMV_AXI_QOS_LTDC_W_PRI); #endif - #if defined(DCMI_RESET_PIN) || defined(DCMI_PWDN_PIN) || defined(DCMI_FSYNC_PIN) - /* Configure DCMI GPIO */ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Speed = GPIO_SPEED_LOW; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - #if defined(DCMI_RESET_PIN) - GPIO_InitStructure.Pin = DCMI_RESET_PIN; - GPIO_InitStructure.Pull = GPIO_PULLDOWN; - HAL_GPIO_Init(DCMI_RESET_PORT, &GPIO_InitStructure); + omv_gpio_config(DCMI_RESET_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_DOWN, OMV_GPIO_SPEED_LOW, -1); #endif - #if defined(DCMI_FSYNC_PIN) - GPIO_InitStructure.Pin = DCMI_FSYNC_PIN; - GPIO_InitStructure.Pull = GPIO_PULLDOWN; - HAL_GPIO_Init(DCMI_FSYNC_PORT, &GPIO_InitStructure); + omv_gpio_config(DCMI_FSYNC_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_DOWN, OMV_GPIO_SPEED_LOW, -1); + #endif + #if defined(DCMI_POWER_PIN) + omv_gpio_config(DCMI_POWER_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_LOW, -1); #endif - #if defined(DCMI_PWDN_PIN) - GPIO_InitStructure.Pin = DCMI_PWDN_PIN; - GPIO_InitStructure.Pull = GPIO_PULLUP; - HAL_GPIO_Init(DCMI_PWDN_PORT, &GPIO_InitStructure); + #if defined(OMV_FIR_LEPTON_RESET_PIN) + omv_gpio_config(OMV_FIR_LEPTON_RESET_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_FIR_LEPTON_RESET_PIN, 0); #endif - #endif // DCMI_RESET_PIN || DCMI_PWDN_PIN || DCMI_FSYNC_PIN - - #if defined(OMV_FIR_LEPTON_RST_PIN_PRESENT) - GPIO_InitTypeDef fir_lepton_rst_pin; - fir_lepton_rst_pin.Speed = GPIO_SPEED_LOW; - fir_lepton_rst_pin.Mode = GPIO_MODE_OUTPUT_PP; - fir_lepton_rst_pin.Pin = OMV_FIR_LEPTON_RST_PIN; - fir_lepton_rst_pin.Pull = GPIO_NOPULL; - HAL_GPIO_Init(OMV_FIR_LEPTON_RST_PORT, &fir_lepton_rst_pin); - OMV_FIR_LEPTON_RST_LOW(); - #endif - - #if defined(OMV_FIR_LEPTON_PWDN_PIN_PRESENT) - GPIO_InitTypeDef fir_lepton_pwdn_pin; - fir_lepton_pwdn_pin.Speed = GPIO_SPEED_LOW; - fir_lepton_pwdn_pin.Mode = GPIO_MODE_OUTPUT_PP; - fir_lepton_pwdn_pin.Pin = OMV_FIR_LEPTON_PWDN_PIN; - fir_lepton_pwdn_pin.Pull = GPIO_NOPULL; - HAL_GPIO_Init(OMV_FIR_LEPTON_PWDN_PORT, &fir_lepton_pwdn_pin); - OMV_FIR_LEPTON_PWDN_LOW(); + #if defined(OMV_FIR_LEPTON_POWER_PIN) + omv_gpio_config(OMV_FIR_LEPTON_POWER_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_write(OMV_FIR_LEPTON_POWER_PIN, 0); #endif #if defined(MCU_SERIES_H7) @@ -261,79 +213,47 @@ void HAL_MspInit(void) void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_AF_OD; + omv_gpio_t scl_pin = NULL; + omv_gpio_t sda_pin = NULL; if (hi2c->Instance == ISC_I2C) { - /* Enable I2C clock */ + // Enable I2C clock. ISC_I2C_CLK_ENABLE(); - - GPIO_InitStructure.Speed = GPIO_SPEED_LOW; - GPIO_InitStructure.Alternate = ISC_I2C_AF; - - GPIO_InitStructure.Pin = ISC_I2C_SCL_PIN; - HAL_GPIO_Init(ISC_I2C_SCL_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = ISC_I2C_SDA_PIN; - HAL_GPIO_Init(ISC_I2C_SDA_PORT, &GPIO_InitStructure); + scl_pin = ISC_I2C_SCL_PIN; + sda_pin = ISC_I2C_SDA_PIN; #if defined(FIR_I2C) } else if (hi2c->Instance == FIR_I2C) { - /* Enable I2C clock */ + // Enable I2C clock. FIR_I2C_CLK_ENABLE(); - - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStructure.Alternate = FIR_I2C_AF; - - GPIO_InitStructure.Pin = FIR_I2C_SCL_PIN; - HAL_GPIO_Init(FIR_I2C_SCL_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = FIR_I2C_SDA_PIN; - HAL_GPIO_Init(FIR_I2C_SDA_PORT, &GPIO_InitStructure); + scl_pin = FIR_I2C_SCL_PIN; + sda_pin = FIR_I2C_SDA_PIN; #endif #if defined(TOF_I2C) } else if (hi2c->Instance == TOF_I2C) { - /* Enable I2C clock */ + // Enable I2C clock. TOF_I2C_CLK_ENABLE(); - - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStructure.Alternate = TOF_I2C_AF; - - GPIO_InitStructure.Pin = TOF_I2C_SCL_PIN; - HAL_GPIO_Init(TOF_I2C_SCL_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = TOF_I2C_SDA_PIN; - HAL_GPIO_Init(TOF_I2C_SDA_PORT, &GPIO_InitStructure); + scl_pin = TOF_I2C_SCL_PIN; + sda_pin = TOF_I2C_SDA_PIN; #endif #if defined(IMU_I2C) } else if (hi2c->Instance == IMU_I2C) { - /* Enable I2C clock */ + // Enable I2C clock. IMU_I2C_CLK_ENABLE(); - - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStructure.Alternate = IMU_I2C_AF; - - GPIO_InitStructure.Pin = IMU_I2C_SCL_PIN; - HAL_GPIO_Init(IMU_I2C_SCL_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = IMU_I2C_SDA_PIN; - HAL_GPIO_Init(IMU_I2C_SDA_PORT, &GPIO_InitStructure); + scl_pin = IMU_I2C_SCL_PIN; + sda_pin = IMU_I2C_SDA_PIN; #endif #if defined(ISC_I2C_ALT) } else if (hi2c->Instance == ISC_I2C_ALT) { - /* Enable I2C clock */ + // Enable I2C clock. ISC_I2C_ALT_CLK_ENABLE(); - - GPIO_InitStructure.Speed = GPIO_SPEED_LOW; - GPIO_InitStructure.Alternate = ISC_I2C_ALT_AF; - - GPIO_InitStructure.Pin = ISC_I2C_ALT_SCL_PIN; - HAL_GPIO_Init(ISC_I2C_ALT_SCL_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = ISC_I2C_ALT_SDA_PIN; - HAL_GPIO_Init(ISC_I2C_ALT_SDA_PORT, &GPIO_InitStructure); + scl_pin = ISC_I2C_ALT_SCL_PIN; + sda_pin = ISC_I2C_ALT_SDA_PIN; #endif } + if (scl_pin && sda_pin) { + omv_gpio_config(scl_pin, OMV_GPIO_MODE_ALT_OD, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_config(sda_pin, OMV_GPIO_MODE_ALT_OD, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + } } void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) @@ -373,22 +293,12 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { #if (OMV_XCLK_SOURCE == OMV_XCLK_TIM) if (htim->Instance == DCMI_TIM) { - /* Enable DCMI timer clock */ + // Enable DCMI timer clock. DCMI_TIM_CLK_ENABLE(); - - /* Timer GPIO configuration */ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Alternate = DCMI_TIM_AF; - - GPIO_InitStructure.Pin = DCMI_TIM_PIN; - HAL_GPIO_Init(DCMI_TIM_PORT, &GPIO_InitStructure); - + // Timer GPIO configuration. + omv_gpio_config(DCMI_TIM_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); #if defined(DCMI_TIM_EXT_PIN) - GPIO_InitStructure.Pin = DCMI_TIM_EXT_PIN; - HAL_GPIO_Init(DCMI_TIM_EXT_PORT, &GPIO_InitStructure); + omv_gpio_config(DCMI_TIM_EXT_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); #endif } #endif // (OMV_XCLK_SOURCE == OMV_XCLK_TIM) @@ -427,96 +337,82 @@ void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { - /* DCMI clock enable */ + const omv_gpio_t dcmi_pins[] = { + DCMI_D0_PIN, + DCMI_D1_PIN, + DCMI_D2_PIN, + DCMI_D3_PIN, + DCMI_D4_PIN, + DCMI_D5_PIN, + DCMI_D6_PIN, + DCMI_D7_PIN, + DCMI_HSYNC_PIN, + DCMI_VSYNC_PIN, + DCMI_PXCLK_PIN, + }; + + // DCMI clock enable __DCMI_CLK_ENABLE(); - /* DCMI GPIOs configuration */ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; - GPIO_InitStructure.Alternate = GPIO_AF13_DCMI; - + // Configure VSYNC EXTI. #if (DCMI_VSYNC_EXTI_SHARED == 1) - uint32_t exti_gpio = hal_get_exti_gpio(DCMI_VSYNC_EXTI_LINE); - if (exti_gpio == 0 || exti_gpio == DCMI_VSYNC_EXTI_GPIO) + if (exti_gpio == 0) #endif { - /* Enable VSYNC EXTI */ - GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING_FALLING; - GPIO_InitStructure.Pin = DCMI_VSYNC_PIN; - HAL_GPIO_Init(DCMI_VSYNC_PORT, &GPIO_InitStructure); + omv_gpio_config(DCMI_VSYNC_PIN, OMV_GPIO_MODE_IT_BOTH, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_MAX, -1); } - /* Configure DCMI pins */ - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - for (int i=0; iInstance == IMU_SPI) { IMU_SPI_CLK_ENABLE(); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Alternate = IMU_SPI_AF; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_InitStructure.Pin = IMU_SPI_SCLK_PIN; - HAL_GPIO_Init(IMU_SPI_SCLK_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = IMU_SPI_MISO_PIN; - HAL_GPIO_Init(IMU_SPI_MISO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Pin = IMU_SPI_MOSI_PIN; - HAL_GPIO_Init(IMU_SPI_MOSI_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - - GPIO_InitStructure.Pin = IMU_SPI_SSEL_PIN; - HAL_GPIO_Init(IMU_SPI_SSEL_PORT, &GPIO_InitStructure); + omv_gpio_config(IMU_SPI_SCLK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(IMU_SPI_MISO_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(IMU_SPI_MOSI_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(IMU_SPI_SSEL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_write(IMU_SPI_SSEL_PIN, 1); } #endif #if defined(ISC_SPI) if (hspi->Instance == ISC_SPI) { ISC_SPI_CLK_ENABLE(); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_PULLUP; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_InitStructure.Alternate = ISC_SPI_SCLK_AF; - GPIO_InitStructure.Pin = ISC_SPI_SCLK_PIN; - HAL_GPIO_Init(ISC_SPI_SCLK_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Alternate = ISC_SPI_MISO_AF; - GPIO_InitStructure.Pin = ISC_SPI_MISO_PIN; - HAL_GPIO_Init(ISC_SPI_MISO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Alternate = ISC_SPI_MOSI_AF; - GPIO_InitStructure.Pin = ISC_SPI_MOSI_PIN; - HAL_GPIO_Init(ISC_SPI_MOSI_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.Alternate = ISC_SPI_SSEL_AF; - GPIO_InitStructure.Pin = ISC_SPI_SSEL_PIN; - HAL_GPIO_Init(ISC_SPI_SSEL_PORT, &GPIO_InitStructure); + omv_gpio_config(ISC_SPI_SCLK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(ISC_SPI_MISO_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(ISC_SPI_MOSI_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); + omv_gpio_config(ISC_SPI_SSEL_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_UP, OMV_GPIO_SPEED_HIGH, -1); } #endif } @@ -529,23 +425,10 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) #if defined(AUDIO_SAI) void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai) { - GPIO_InitTypeDef GPIO_InitStruct; if (hsai->Instance == AUDIO_SAI) { AUDIO_SAI_CLK_ENABLE(); - - GPIO_InitStruct.Pin = AUDIO_SAI_CK_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = AUDIO_SAI_CK_AF; - HAL_GPIO_Init(AUDIO_SAI_CK_PORT, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = AUDIO_SAI_D1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = AUDIO_SAI_D1_AF; - HAL_GPIO_Init(AUDIO_SAI_D1_PORT, &GPIO_InitStruct); + omv_gpio_config(AUDIO_SAI_CK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_config(AUDIO_SAI_D1_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); } } @@ -553,30 +436,17 @@ void HAL_SAI_MspDeInit(SAI_HandleTypeDef* hsai) { if (hsai->Instance == SAI4_Block_A) { AUDIO_SAI_CLK_DISABLE(); - HAL_GPIO_DeInit(AUDIO_SAI_CK_PORT, AUDIO_SAI_CK_PIN); - HAL_GPIO_DeInit(AUDIO_SAI_D1_PORT, AUDIO_SAI_D1_PIN); + omv_gpio_deinit(AUDIO_SAI_CK_PIN); + omv_gpio_deinit(AUDIO_SAI_D1_PIN); } } #elif defined(AUDIO_DFSDM) void HAL_DFSDM_ChannelMspInit(DFSDM_Channel_HandleTypeDef *hdfsdm) { - GPIO_InitTypeDef GPIO_InitStruct; if (hdfsdm->Instance == AUDIO_DFSDM) { AUDIO_DFSDM_CLK_ENABLE(); - - GPIO_InitStruct.Pin = AUDIO_DFSDM_CK_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = AUDIO_DFSDM_CK_AF; - HAL_GPIO_Init(AUDIO_DFSDM_CK_PORT, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = AUDIO_DFSDM_D1_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = AUDIO_DFSDM_D1_AF; - HAL_GPIO_Init(AUDIO_DFSDM_D1_PORT, &GPIO_InitStruct); + omv_gpio_config(AUDIO_DFSDM_CK_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_config(AUDIO_DFSDM_D1_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); } } @@ -584,9 +454,8 @@ void HAL_DFSDM_ChannelMspDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm) { if (hdfsdm->Instance == AUDIO_DFSDM) { AUDIO_DFSDM_CLK_DISABLE(); - - HAL_GPIO_DeInit(AUDIO_DFSDM_CK_PORT, AUDIO_DFSDM_CK_PIN); - HAL_GPIO_DeInit(AUDIO_DFSDM_D1_PORT, AUDIO_DFSDM_D1_PIN); + omv_gpio_deinit(AUDIO_DFSDM_CK_PIN); + omv_gpio_deinit(AUDIO_DFSDM_D1_PIN); } } #endif @@ -628,40 +497,35 @@ void HAL_JPEG_MspDeInit(JPEG_HandleTypeDef *hjpeg) #endif #if defined(OMV_LCD_CONTROLLER) && (!defined(OMV_DSI_CONTROLLER)) -typedef struct { - GPIO_TypeDef *port; - uint16_t af, pin; -} ltdc_gpio_t; - -static const ltdc_gpio_t ltdc_pins[] = { - {OMV_LCD_R0_PORT, OMV_LCD_R0_ALT, OMV_LCD_R0_PIN}, - {OMV_LCD_R1_PORT, OMV_LCD_R1_ALT, OMV_LCD_R1_PIN}, - {OMV_LCD_R2_PORT, OMV_LCD_R2_ALT, OMV_LCD_R2_PIN}, - {OMV_LCD_R3_PORT, OMV_LCD_R3_ALT, OMV_LCD_R3_PIN}, - {OMV_LCD_R4_PORT, OMV_LCD_R4_ALT, OMV_LCD_R4_PIN}, - {OMV_LCD_R5_PORT, OMV_LCD_R5_ALT, OMV_LCD_R5_PIN}, - {OMV_LCD_R6_PORT, OMV_LCD_R6_ALT, OMV_LCD_R6_PIN}, - {OMV_LCD_R7_PORT, OMV_LCD_R7_ALT, OMV_LCD_R7_PIN}, - {OMV_LCD_G0_PORT, OMV_LCD_G0_ALT, OMV_LCD_G0_PIN}, - {OMV_LCD_G1_PORT, OMV_LCD_G1_ALT, OMV_LCD_G1_PIN}, - {OMV_LCD_G2_PORT, OMV_LCD_G2_ALT, OMV_LCD_G2_PIN}, - {OMV_LCD_G3_PORT, OMV_LCD_G3_ALT, OMV_LCD_G3_PIN}, - {OMV_LCD_G4_PORT, OMV_LCD_G4_ALT, OMV_LCD_G4_PIN}, - {OMV_LCD_G5_PORT, OMV_LCD_G5_ALT, OMV_LCD_G5_PIN}, - {OMV_LCD_G6_PORT, OMV_LCD_G6_ALT, OMV_LCD_G6_PIN}, - {OMV_LCD_G7_PORT, OMV_LCD_G7_ALT, OMV_LCD_G7_PIN}, - {OMV_LCD_B0_PORT, OMV_LCD_B0_ALT, OMV_LCD_B0_PIN}, - {OMV_LCD_B1_PORT, OMV_LCD_B1_ALT, OMV_LCD_B1_PIN}, - {OMV_LCD_B2_PORT, OMV_LCD_B2_ALT, OMV_LCD_B2_PIN}, - {OMV_LCD_B3_PORT, OMV_LCD_B3_ALT, OMV_LCD_B3_PIN}, - {OMV_LCD_B4_PORT, OMV_LCD_B4_ALT, OMV_LCD_B4_PIN}, - {OMV_LCD_B5_PORT, OMV_LCD_B5_ALT, OMV_LCD_B5_PIN}, - {OMV_LCD_B6_PORT, OMV_LCD_B6_ALT, OMV_LCD_B6_PIN}, - {OMV_LCD_B7_PORT, OMV_LCD_B7_ALT, OMV_LCD_B7_PIN}, - {OMV_LCD_CLK_PORT, OMV_LCD_CLK_ALT, OMV_LCD_CLK_PIN}, - {OMV_LCD_DE_PORT, OMV_LCD_DE_ALT, OMV_LCD_DE_PIN}, - {OMV_LCD_HSYNC_PORT, OMV_LCD_HSYNC_ALT, OMV_LCD_HSYNC_PIN}, - {OMV_LCD_VSYNC_PORT, OMV_LCD_VSYNC_ALT, OMV_LCD_VSYNC_PIN}, +static const omv_gpio_t ltdc_pins[] = { + OMV_LCD_R0_PIN, + OMV_LCD_R1_PIN, + OMV_LCD_R2_PIN, + OMV_LCD_R3_PIN, + OMV_LCD_R4_PIN, + OMV_LCD_R5_PIN, + OMV_LCD_R6_PIN, + OMV_LCD_R7_PIN, + OMV_LCD_G0_PIN, + OMV_LCD_G1_PIN, + OMV_LCD_G2_PIN, + OMV_LCD_G3_PIN, + OMV_LCD_G4_PIN, + OMV_LCD_G5_PIN, + OMV_LCD_G6_PIN, + OMV_LCD_G7_PIN, + OMV_LCD_B0_PIN, + OMV_LCD_B1_PIN, + OMV_LCD_B2_PIN, + OMV_LCD_B3_PIN, + OMV_LCD_B4_PIN, + OMV_LCD_B5_PIN, + OMV_LCD_B6_PIN, + OMV_LCD_B7_PIN, + OMV_LCD_CLK_PIN, + OMV_LCD_DE_PIN, + OMV_LCD_HSYNC_PIN, + OMV_LCD_VSYNC_PIN, }; #endif @@ -676,30 +540,18 @@ void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc) if (hltdc->Instance == OMV_LCD_CONTROLLER) { OMV_LCD_CLK_ENABLE(); - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - - for (int i = 0, ii = sizeof(ltdc_pins) / sizeof(ltdc_gpio_t); i < ii; i++) { - GPIO_InitStructure.Alternate = ltdc_pins[i].af; - GPIO_InitStructure.Pin = ltdc_pins[i].pin; - HAL_GPIO_Init(ltdc_pins[i].port, &GPIO_InitStructure); + for (int i=0; i -#include "ulpi.h" #include "omv_boardconfig.h" #if (OMV_USB_ULPI == 1) #include STM32_HAL_H +#include +#include "ulpi.h" +#include "omv_gpio.h" #define USBULPI_PHYCR ((uint32_t)(0x40040000 + 0x034)) #define USBULPI_D07 ((uint32_t)0x000000FF) @@ -158,44 +159,26 @@ void ulpi_enter_low_power(void) */ void ulpi_leave_low_power(void) { - GPIO_InitTypeDef GPIO_InitStruct; - /* Enable GPIO clock for OTG USB STP pin */ - __HAL_RCC_GPIOC_CLK_ENABLE(); - OMV_USB_ULPI_DIR_CLK_ENABLE(); + omv_gpio_clock_enable(OMV_USB_ULPI_STP_PIN, true); + omv_gpio_clock_enable(OMV_USB_ULPI_DIR_PIN, true); - /* Set OTG STP pin as GP Output */ - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = OMV_USB_ULPI_DIR_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - HAL_GPIO_Init(OMV_USB_ULPI_DIR_PORT, &GPIO_InitStruct); + /* Configure OTG STP and DIR pin as GP Output */ + omv_gpio_config(OMV_USB_ULPI_STP_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); + omv_gpio_config(OMV_USB_ULPI_DIR_PIN, OMV_GPIO_MODE_INPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1); /* Set OTG STP pin to High */ - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); + omv_gpio_write(OMV_USB_ULPI_STP_PIN, 1); /* Wait for DIR to go low */ for (uint32_t ticks = HAL_GetTick(); ((HAL_GetTick() - ticks) < 500) - && HAL_GPIO_ReadPin(OMV_USB_ULPI_DIR_PORT, OMV_USB_ULPI_DIR_PIN);) { + && omv_gpio_read(OMV_USB_ULPI_DIR_PIN);) { __WFI(); } - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = OMV_USB_ULPI_DIR_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS; - HAL_GPIO_Init(OMV_USB_ULPI_DIR_PORT, &GPIO_InitStruct); - + /* Configure OTG STP and DIR pin as USB AF */ + omv_gpio_config(OMV_USB_ULPI_STP_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_MAX, -1); + omv_gpio_config(OMV_USB_ULPI_DIR_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_MAX, -1); } #endif // (OMV_USB_ULPI == 1) diff --git a/src/omv/sensors/lepton.c b/src/omv/sensors/lepton.c index ce568165e..bae6fcfe1 100644 --- a/src/omv/sensors/lepton.c +++ b/src/omv/sensors/lepton.c @@ -10,16 +10,18 @@ */ #include "omv_boardconfig.h" #if (OMV_ENABLE_LEPTON == 1) - -#include #include STM32_HAL_H +#include +#include "py/mphal.h" #include "irq.h" + #include "cambus.h" #include "sensor.h" -#include "py/mphal.h" + #include "framebuffer.h" #include "common.h" #include "dma_alloc.h" +#include "omv_gpio.h" #include "crc16.h" #include "LEPTON_SDK.h" @@ -103,10 +105,10 @@ static uint16_t lepton_calc_crc(uint8_t *buf) static int sleep(sensor_t *sensor, int enable) { if (enable) { - DCMI_PWDN_LOW(); + omv_gpio_write(DCMI_POWER_PIN, 0); mp_hal_delay_ms(100); } else { - DCMI_PWDN_HIGH(); + omv_gpio_write(DCMI_POWER_PIN, 1); mp_hal_delay_ms(100); } @@ -330,16 +332,16 @@ static int ioctl(sensor_t *sensor, int request, va_list ap) static int lepton_reset(sensor_t *sensor, bool measurement_mode, bool high_temp_mode) { - DCMI_PWDN_LOW(); + omv_gpio_write(DCMI_POWER_PIN, 0); mp_hal_delay_ms(10); - DCMI_PWDN_HIGH(); + omv_gpio_write(DCMI_POWER_PIN, 1); mp_hal_delay_ms(10); - DCMI_RESET_LOW(); + omv_gpio_write(DCMI_RESET_PIN, 0); mp_hal_delay_ms(10); - DCMI_RESET_HIGH(); + omv_gpio_write(DCMI_RESET_PIN, 1); mp_hal_delay_ms(1000); LEP_RAD_ENABLE_E rad; diff --git a/src/omv/sensors/paj6100.c b/src/omv/sensors/paj6100.c index 126fafc5c..d9fe5ea2f 100644 --- a/src/omv/sensors/paj6100.c +++ b/src/omv/sensors/paj6100.c @@ -36,14 +36,15 @@ #if (OMV_ENABLE_PAJ6100 == 1) #include #include +#include "py/mphal.h" #include "sensor.h" #include "framebuffer.h" +#include "omv_gpio.h" #include "paj6100.h" #include "paj6100_reg.h" #include "pixspi.h" -#include "py/mphal.h" #define CACHE_BANK @@ -90,13 +91,13 @@ static int get_gain_db(sensor_t *sensor, float *gain_db); static int bank_switch(uint8_t bank) { -#ifdef CACHE_BANK - if (bank_cache == bank) + #ifdef CACHE_BANK + if (bank_cache == bank) { return 0; -#endif + } + #endif - if (pixspi_regs_write(REG_BANK_SWITCH, &bank, 1)) - { + if (pixspi_regs_write(REG_BANK_SWITCH, &bank, 1)) { printf("Bank switch failed.\n"); return -1; } @@ -121,14 +122,12 @@ static int init_sensor(sensor_t * sensor) #define ta_seq low_active_R_ABC_Avg_UBx50_T_BLACINV_EnHx1_T_SIG_REFx1 int arr_size = sizeof(ta_seq)/sizeof(ta_seq[0]); - for (int i=0; i= EXPOSURE_BASE) - { + if (exp_us >= EXPOSURE_BASE) { int param; - if (sensor->framesize == FRAMESIZE_QVGA) + if (sensor->framesize == FRAMESIZE_QVGA) { param = 88803; - else if (sensor->framesize == FRAMESIZE_QQVGA) + } else if (sensor->framesize == FRAMESIZE_QQVGA) { param = 29139; // QQVGA - else + } else { param = 88803; + } int max_cmd_expo = R_FrameTime - param; cmd_expo = (exp_us - EXPOSURE_BASE) * ((float)PAJ6100_XCLK_FREQ/1000000) + 0.5f; - if (protected) - { - if (cmd_expo > max_cmd_expo) - { + if (protected) { + if (cmd_expo > max_cmd_expo) { cmd_expo = max_cmd_expo; exp_us = (cmd_expo + 3642) / ((float)PAJ6100_XCLK_FREQ/1000000) + 0.5f; printf("Exposure time overflow, reset to %dus.\n", exp_us); } } exp_offset = 0; - } - else - { + } else { cmd_expo = 0; exp_offset = (EXPOSURE_BASE - exp_us) * ((float)PAJ6100_XCLK_FREQ/1000000) + 0.5; } -#ifdef DEBUG_AE + #ifdef DEBUG_AE printf("target - cmd_exp: %ld, exp_offset: %d\n", cmd_expo, exp_offset); -#endif + #endif uint8_t buff[3] = { (uint8_t)(cmd_expo & 0xff), (uint8_t)((cmd_expo >> 8) & 0xff), @@ -196,8 +192,7 @@ static int set_exposure(sensor_t *sensor, int exp_us, bool protected) buff[0] = 1; ret |= write_regs_w_bank(BANK_1, REG_ISP_UPDATE, buff, 1); - if (ret) - { + if (ret) { printf("Failed to write cmd_expo or exp_offset.\n"); return -1; } @@ -212,35 +207,31 @@ static int get_exposure(sensor_t *sensor) uint32_t cmd_expo /* 24-bit available */; uint16_t exp_offset; - if (exp_us_cache >= 0) + if (exp_us_cache >= 0) { return exp_us_cache; + } ret = read_regs_w_bank(BANK_0, REG_CMD_EXPO_L, buff, 3); - if (ret) - { + if (ret) { printf("Read cmd_expo failed.\n"); return -1; } cmd_expo = buff[0] + (((uint32_t)buff[1]) << 8) + (((uint32_t)buff[2]) << 16); ret = read_regs_w_bank(BANK_0, REG_EXP_OFFSET_L, buff, 2); - if (ret) - { + if (ret) { printf("Read exp_offset failed.\n"); return -1; } exp_offset = buff[0] + (((uint16_t)buff[1]) << 8); -#ifdef DEBUG_AE + #ifdef DEBUG_AE printf("cmd_exp: %ld, exp_offset: %d\n", cmd_expo, exp_offset); -#endif + #endif - if (exp_offset == 0) - { + if (exp_offset == 0) { exp_us_cache = (cmd_expo + 3642) / (PAJ6100_XCLK_FREQ/1000000); - } - else - { + } else { exp_us_cache = (3642 - exp_offset) / (PAJ6100_XCLK_FREQ/1000000); } @@ -258,30 +249,25 @@ static void blc_freeze(bool enable) static void auto_exposure(sensor_t *sensor) { - if (!is_ae_enabled) + if (!is_ae_enabled) { return; + } - if (skip_frame) - { + if (skip_frame) { --skip_frame; return; } - if ((lt_lockrange_in_lbound <= l_total) && (l_total <= lt_lockrange_in_ubound)) - { + if ((lt_lockrange_in_lbound <= l_total) && (l_total <= lt_lockrange_in_ubound)) { ae_converged_flag = true; - } - else if ((l_total > lt_lockrange_out_ubound) || (l_total < lt_lockrange_out_lbound)) - { + } else if ((l_total > lt_lockrange_out_ubound) || (l_total < lt_lockrange_out_lbound)) { ae_converged_flag = false; } blc_freeze(ae_converged_flag); - if (ae_converged_flag == false) - { + if (ae_converged_flag == false) { float gain_db = 0; - if (get_gain_db(sensor, &gain_db)) - { + if (get_gain_db(sensor, &gain_db)) { printf("Get Gain DB failed.\n"); return; } @@ -301,26 +287,25 @@ static void auto_exposure(sensor_t *sensor) } int expo = get_exposure(sensor); - if (expo < 0) - { + if (expo < 0) { printf("Get exposure failed.\n"); return; } -#ifdef DEBUG_AE + #ifdef DEBUG_AE printf("Current Gain: %ldx, Expo: %d\n", gain, expo); -#endif + #endif uint32_t GEP = gain * expo; float l_ratio = ((float)l_target_total) / l_total; float GEP_target = GEP * l_ratio; uint32_t expo_target = IM_MIN(IM_MAX(fast_roundf(GEP_target / R_AE_MinGain), R_AE_MinExpoTime), R_AE_MaxExpoTime); -#ifdef DEBUG_AE + #ifdef DEBUG_AE printf("GEP: %ld ", GEP); printf("GEP_target: %d (x1000), L_Ratio: %d (x1000)\n", (int)(GEP_target*1000), (int)(l_ratio*1000)); printf("1st Expo Target: %ld (max: %ld) ", expo_target, R_AE_MaxExpoTime); -#endif + #endif uint32_t gain_target; float tmp_gain = GEP_target/expo_target; if (tmp_gain <= 1) gain_target = 1; @@ -330,10 +315,10 @@ static void auto_exposure(sensor_t *sensor) //gain_target = IM_MIN(IM_MAX(fast_ceilf(GEP_target/expo_target), R_AE_MinGain), R_AE_MaxGain); gain_db = 20 * (fast_log((float)gain_target)/fast_log(10.0)); expo_target = IM_MIN(IM_MAX(fast_roundf(GEP_target / gain_target), R_AE_MinExpoTime), R_AE_MaxExpoTime); -#ifdef DEBUG_AE + #ifdef DEBUG_AE printf("Gain Target: %ld (%d DB (x1000))\n", gain_target, (int)(gain_db*1000)); printf("Final Expo Target: %ld (max: %ld) \n", expo_target, R_AE_MaxExpoTime); -#endif + #endif set_exposure(sensor, expo_target, false); set_auto_gain(sensor, false, gain_db, 0); skip_frame = 0; @@ -395,8 +380,9 @@ static int read_reg(sensor_t *sensor, uint16_t reg_addr) { uint8_t data; - if (pixspi_regs_read((uint8_t)reg_addr, &data, 1)) + if (pixspi_regs_read((uint8_t)reg_addr, &data, 1)) { return -1; + } return data; } @@ -412,8 +398,9 @@ static int write_reg(sensor_t *sensor, uint16_t reg_addr, uint16_t reg_data) static int set_pixformat(sensor_t *sensor, pixformat_t pixformat) { - if (pixformat != PIXFORMAT_GRAYSCALE) + if (pixformat != PIXFORMAT_GRAYSCALE) { return -1; + } return 0; } @@ -429,14 +416,12 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize) ret |= read_regs_w_bank(BANK_0, REG_ABC_START_LINE, &abc_start_line, 1); ret |= read_regs_w_bank(BANK_1, REG_ABC_SAMPLE_SIZE, &abc_sample_size, 1); - if (ret) - { + if (ret) { printf("Failed to read Average mode registers.\n"); return -1; } - switch (framesize) - { + switch (framesize) { case FRAMESIZE_QVGA: aavg_VnH &= ~((1 << 3) | (1 << 2)); abc_start_line = (abc_start_line & ~(0x07 << 1)) | (2 << 1); @@ -463,8 +448,7 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize) ret |= write_regs_w_bank(BANK_1, REG_CP_WOI_VOFFSET, &voffset, 1); ret |= write_regs_w_bank(BANK_1, REG_ABC_SAMPLE_SIZE, &abc_sample_size, 1); - if (ret) - { + if (ret) { printf("Failed to write Average mode registers.\n"); return -1; } @@ -506,8 +490,9 @@ static int set_special_effect(sensor_t *sensor, sde_t sde) static int set_auto_gain(sensor_t *sensor, int enable, float gain_db, float gain_db_ceiling) { - if (enable) + if (enable) { return 0; + } int ret = 0; uint8_t val, fgh, ggh; @@ -564,8 +549,7 @@ static int get_gain_db(sensor_t *sensor, float *gain_db) if (ggh == 0 && fgh == 0) { *gain_db = 0; } else if (ggh == 1) { - switch (fgh) - { + switch (fgh) { case 0: *gain_db = 6; break; @@ -575,8 +559,7 @@ static int get_gain_db(sensor_t *sensor, float *gain_db) case 3: *gain_db = 18; break; - default: - { + default: { printf("Read a undefined FGH value (%d).\n", fgh); return -1; } @@ -599,8 +582,7 @@ static int set_auto_exposure(sensor_t *sensor, int enable, int exposure_us) static int get_exposure_us(sensor_t *sensor, int *exposure_us) { int ret = get_exposure(sensor); - if (ret >= 0) - { + if (ret >= 0) { *exposure_us = ret; return 0; } @@ -665,13 +647,13 @@ static int reset(sensor_t *sensor) bank_cache = -1; exp_us_cache = -1; -#ifdef DEBUG + #ifdef DEBUG uint8_t part_id_l = 0, part_id_h = 0; read_regs_w_bank(0, 0x00, &part_id_l, 1); read_regs_w_bank(0, 0x01, &part_id_h, 1); printf("Part ID 0x%x 0x%x\n", part_id_l, part_id_h); printf("init_res: %d\n", init_res); -#endif + #endif // Re-init sensor every time. init_sensor(sensor); @@ -705,12 +687,12 @@ static int reset(sensor_t *sensor) static int paj6100_snapshot(sensor_t *sensor, image_t *image, uint32_t flags) { int res = sensor_snapshot(sensor, image, flags); - if (res == 0) - { + if (res == 0) { l_total = 0; int iml = image->h * image->w; - for (int i=0; idata[i]; + } // PAJ6100 doesn't support HW auto-exposure, // we provide a software implementation. auto_exposure(sensor); @@ -764,23 +746,22 @@ bool paj6100_detect(sensor_t *sensor) int ret = 0; uint8_t part_id_l, part_id_h; - DCMI_RESET_HIGH(); + omv_gpio_write(DCMI_RESET_PIN, 1); mp_hal_delay_ms(10); - if (!pixspi_init()) - { + if (!pixspi_init()) { printf("Initial pixspi failed.\n"); return false; } ret |= pixspi_regs_read(0x00, &part_id_l, 1); ret |= pixspi_regs_read(0x01, &part_id_h, 1); -#ifdef DEBUG + #ifdef DEBUG printf("Part ID 0x%x 0x%x\n", part_id_l, part_id_h); -#endif - if (ret == 0 && - (part_id_l == 0x00 && part_id_h == 0x61)) + #endif + if (ret == 0 && (part_id_l == 0x00 && part_id_h == 0x61)) { return true; // Got you. + } pixspi_release(); return false;