From db5dbb25b3f6643659cabc747f6df0d79c9194e1 Mon Sep 17 00:00:00 2001 From: Daniel Agar <daniel@agar.ca> Date: Mon, 15 Apr 2019 12:22:49 -0400 Subject: [PATCH] av/x-v1 board support cleanup and sync with fmu-v5 --- boards/av/x-v1/default.cmake | 11 +- boards/av/x-v1/init/rc.board_sensors | 12 +- boards/av/x-v1/src/CMakeLists.txt | 2 +- boards/av/x-v1/src/board_config.h | 70 +---- boards/av/x-v1/src/init.c | 37 +-- boards/av/x-v1/src/manifest.c | 5 +- boards/av/x-v1/src/sdio.c | 8 +- boards/av/x-v1/src/spi.c | 428 --------------------------- boards/av/x-v1/src/spi.cpp | 336 +++++++++++++++++++++ boards/av/x-v1/src/timer_config.c | 76 +++-- 10 files changed, 426 insertions(+), 559 deletions(-) delete mode 100644 boards/av/x-v1/src/spi.c create mode 100644 boards/av/x-v1/src/spi.cpp diff --git a/boards/av/x-v1/default.cmake b/boards/av/x-v1/default.cmake index a62cc1bac7..6016c56e89 100644 --- a/boards/av/x-v1/default.cmake +++ b/boards/av/x-v1/default.cmake @@ -3,6 +3,7 @@ px4_add_board( PLATFORM nuttx VENDOR av MODEL x-v1 + LABEL default TOOLCHAIN arm-none-eabi ARCHITECTURE cortex-m7 ROMFSROOT px4fmu_common @@ -19,8 +20,8 @@ px4_add_board( DRIVERS barometer # all available barometer drivers batt_smbus - camera_trigger camera_capture + camera_trigger differential_pressure # all available differential pressure drivers distance_sensor # all available distance sensor drivers gps @@ -31,21 +32,22 @@ px4_add_board( irlock lights/blinkm #lights/oreoled + #lights/pca8574 #lights/rgbled + #lights/rgbled_ncp5623c #lights/rgbled_pwm magnetometer # all available magnetometer drivers #md25 mkblctrl - #lights/pca8574 pca9685 #pmw3901 - protocol_splitter + #protocol_splitter #pwm_input pwm_out_sim px4flow px4fmu rc_input - roboclaw + #roboclaw stm32 stm32/adc stm32/armv7-m_dcache @@ -104,7 +106,6 @@ px4_add_board( top topic_listener tune_control - #usb_connected ver EXAMPLES diff --git a/boards/av/x-v1/init/rc.board_sensors b/boards/av/x-v1/init/rc.board_sensors index 8309f659de..5b3ceeddc6 100644 --- a/boards/av/x-v1/init/rc.board_sensors +++ b/boards/av/x-v1/init/rc.board_sensors @@ -6,10 +6,18 @@ adis16477 -R 8 start -#adis16497 start - lps22hb -S start lsm303agr -R 4 start ms4525_airspeed -T 4515 -b 3 start + +# TODO: try to autostart pmw3901 +# TODO: try to autostart adis16497 start + +# Possible external compasses +ist8310 -C -b 1 start +ist8310 -C -b 2 start +hmc5883 -C -T -X start +qmc5883 -X start + diff --git a/boards/av/x-v1/src/CMakeLists.txt b/boards/av/x-v1/src/CMakeLists.txt index 4a80e72d5b..c72373d5b3 100644 --- a/boards/av/x-v1/src/CMakeLists.txt +++ b/boards/av/x-v1/src/CMakeLists.txt @@ -35,7 +35,7 @@ px4_add_library(drivers_board init.c manifest.c sdio.c - spi.c + spi.cpp timer_config.c ) target_link_libraries(drivers_board diff --git a/boards/av/x-v1/src/board_config.h b/boards/av/x-v1/src/board_config.h index 90324a6a06..c363a3330a 100644 --- a/boards/av/x-v1/src/board_config.h +++ b/boards/av/x-v1/src/board_config.h @@ -54,11 +54,6 @@ #define BOARD_HAS_NBAT_V 1 // Only one Vbat to ADC #define BOARD_HAS_NBAT_I 0 // No Ibat ADC -/* SENSORS are on SPI1, 5, 6 - * MEMORY is on bus SPI2 - * MS5611 is on bus SPI4 - */ - #define PX4_SPI_BUS_SENSOR1 1 #define PX4_SPI_BUS_SENSOR2 2 #define PX4_SPI_BUS_SENSOR4 4 @@ -130,27 +125,19 @@ /* SPI1 */ #define PX4_SPIDEV_ADIS16477 PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSOR1,0) #define PX4_SENSOR1_BUS_CS_GPIO {GPIO_SPI1_CS1_ADIS16477} -#define PX4_SENSOR1_BUS_FIRST_CS PX4_SPIDEV_ADIS16477 -#define PX4_SENSOR1_BUS_LAST_CS PX4_SPIDEV_ADIS16477 /* SPI2 */ #define PX4_SPIDEV_ADIS16497 PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSOR2,0) #define PX4_SENSOR2_BUS_CS_GPIO {GPIO_SPI2_CS1_ADIS16497} -#define PX4_SENSOR2_BUS_FIRST_CS PX4_SPIDEV_ADIS16497 -#define PX4_SENSOR2_BUS_LAST_CS PX4_SPIDEV_ADIS16497 /* SPI4 */ #define PX4_SPIDEV_LPS22HB PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSOR4,0) #define PX4_SENSOR4_BUS_CS_GPIO {GPIO_SPI4_CS1_LPS22HB} -#define PX4_SENSOR4_BUS_FIRST_CS PX4_SPIDEV_LPS22HB -#define PX4_SENSOR4_BUS_LAST_CS PX4_SPIDEV_LPS22HB /* SPI5 */ #define PX4_SPIDEV_LSM303A_M PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSOR5,0) #define PX4_SPIDEV_LSM303A_X PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSOR5,1) #define PX4_SENSOR5_BUS_CS_GPIO {GPIO_SPI5_CS1_LSM303A_M, GPIO_SPI5_CS1_LSM303A_X} -#define PX4_SENSOR5_BUS_FIRST_CS PX4_SPIDEV_LSM303A_M -#define PX4_SENSOR5_BUS_LAST_CS PX4_SPIDEV_LSM303A_X /* I2C busses */ #define PX4_I2C_BUS_EXPANSION 2 @@ -190,50 +177,9 @@ /* Define Channel numbers must match above GPIO pin IN(n)*/ #define ADC_BATTERY1_VOLTAGE_CHANNEL /* PA0 */ ADC1_CH(0) -#define ADC_BATTERY1_CURRENT_CHANNEL /* PA1 */ ADC1_CH(1) -#define ADC1_SPARE_2_CHANNEL /* PA4 */ ADC1_CH(4) -#define ADC_RSSI_IN_CHANNEL /* PB0 */ ADC1_CH(8) -#define ADC_SCALED_V5_CHANNEL /* PC0 */ ADC1_CH(10) -#define ADC_SCALED_VDD_3V3_SENSORS_CHANNEL /* PC1 */ ADC1_CH(11) -#define ADC_HW_VER_SENSE_CHANNEL /* PC2 */ ADC1_CH(12) -#define ADC_HW_REV_SENSE_CHANNEL /* PC3 */ ADC1_CH(13) -#define ADC1_SPARE_1_CHANNEL /* PC4 */ ADC1_CH(14) - -#if BOARD_HAS_NBAT_V == 2 && BOARD_HAS_NBAT_I == 2 -#define ADC_CHANNELS \ - ((1 << ADC_BATTERY1_VOLTAGE_CHANNEL) | \ - (1 << ADC_BATTERY1_CURRENT_CHANNEL) | \ - (1 << ADC_BATTERY2_VOLTAGE_CHANNEL) | \ - (1 << ADC_BATTERY2_CURRENT_CHANNEL) | \ - (1 << ADC1_SPARE_2_CHANNEL) | \ - (1 << ADC_RSSI_IN_CHANNEL) | \ - (1 << ADC_SCALED_V5_CHANNEL) | \ - (1 << ADC_SCALED_VDD_3V3_SENSORS_CHANNEL) | \ - (1 << ADC_HW_VER_SENSE_CHANNEL) | \ - (1 << ADC_HW_REV_SENSE_CHANNEL) | \ - (1 << ADC1_SPARE_1_CHANNEL)) -#elif BOARD_HAS_NBAT_V == 1 && BOARD_HAS_NBAT_I == 1 -#define ADC_CHANNELS \ - ((1 << ADC_BATTERY1_VOLTAGE_CHANNEL) | \ - (1 << ADC_BATTERY1_CURRENT_CHANNEL) | \ - (1 << ADC1_SPARE_2_CHANNEL) | \ - (1 << ADC_RSSI_IN_CHANNEL) | \ - (1 << ADC_SCALED_V5_CHANNEL) | \ - (1 << ADC_SCALED_VDD_3V3_SENSORS_CHANNEL) | \ - (1 << ADC_HW_VER_SENSE_CHANNEL) | \ - (1 << ADC_HW_REV_SENSE_CHANNEL) | \ - (1 << ADC1_SPARE_1_CHANNEL)) -#elif BOARD_HAS_NBAT_V == 1 && BOARD_HAS_NBAT_I == 0 + #define ADC_CHANNELS \ - ((1 << ADC_BATTERY1_VOLTAGE_CHANNEL) | \ - (1 << ADC1_SPARE_2_CHANNEL) | \ - (1 << ADC_RSSI_IN_CHANNEL) | \ - (1 << ADC_SCALED_V5_CHANNEL) | \ - (1 << ADC_SCALED_VDD_3V3_SENSORS_CHANNEL) | \ - (1 << ADC_HW_VER_SENSE_CHANNEL) | \ - (1 << ADC_HW_REV_SENSE_CHANNEL) | \ - (1 << ADC1_SPARE_1_CHANNEL)) -#endif + ((1 << ADC_BATTERY1_VOLTAGE_CHANNEL)) /* Define Battery 1 Voltage Divider and A per V */ @@ -247,7 +193,7 @@ /* PWM * - * 8 PWM outputs are configured. + * 9 PWM outputs are configured. * * Pins: * @@ -259,6 +205,7 @@ * FMU_CH6 : PI6 : TIM8_CH2 * FMU_CH7 : PF7 : TIM11_CH1 * FMU_CH8 : PF6 : TIM10_CH1 + * FMU_CH9 : PF6 : TIM4_CH3 * */ #define GPIO_TIM1_CH1OUT /* PA8 T1C1 FMU1 */ GPIO_TIM1_CH1OUT_1 @@ -269,6 +216,7 @@ #define GPIO_TIM8_CH2OUT /* PI6 T8C2 FMU6 */ GPIO_TIM8_CH2IN_2 #define GPIO_TIM11_CH1OUT /* PF7 T11C1 FMU7 */ GPIO_TIM11_CH1OUT_2 #define GPIO_TIM10_CH1OUT /* PF6 T10C1 FMU8 */ GPIO_TIM10_CH1OUT_2 +#define GPIO_TIM4_CH3OUT /* PD14 T4C3 FMU9 */ GPIO_TIM4_CH3OUT_1 #define DIRECT_PWM_OUTPUT_CHANNELS 8 @@ -278,8 +226,9 @@ #define GPIO_TIM1_CH4IN /* PA11 T1C4 FMU4 */ GPIO_TIM1_CH4IN_1 #define GPIO_TIM2_CH4IN /* PA3 T2C4 FMU5 */ GPIO_TIM2_CH4IN_1 #define GPIO_TIM8_CH2IN /* PI6 T8C2 FMU6 */ GPIO_TIM8_CH2IN_2 -//#define GPIO_TIM11_CH1IN /* PF7 T11C1 FMU7 */ GPIO_TIM11_CH1IN_2 -//#define GPIO_TIM10_CH1IN /* PF6 T10C1 FMU8 */ GPIO_TIM10_CH1IN_2 +#define GPIO_TIM11_CH1IN /* PF7 T11C1 FMU7 */ GPIO_TIM11_CH1IN_2 +#define GPIO_TIM10_CH1IN /* PF6 T10C1 FMU8 */ GPIO_TIM10_CH1IN_2 +#define GPIO_TIM4_CH3IN /* PD14 T4C3 FMU9 */ GPIO_TIM4_CH3IN_1 #define DIRECT_INPUT_TIMER_CHANNELS 8 @@ -298,6 +247,7 @@ #define GPIO_GPIO5_INPUT /* PI6 T8C2 FMU6 */ _MK_GPIO_INPUT(GPIO_TIM8_CH2IN_2) #define GPIO_GPIO6_INPUT /* PF7 T11C1 FMU7 */ _MK_GPIO_INPUT(GPIO_TIM11_CH1IN_2) #define GPIO_GPIO7_INPUT /* PF6 T10C1 FMU8 */ _MK_GPIO_INPUT(GPIO_TIM10_CH1IN_2) +#define GPIO_GPIO8_INPUT /* PD14 T4C3 FMU9 */ _MK_GPIO_INPUT(GPIO_TIM4_CH3IN_2) #define _MK_GPIO_OUTPUT(def) (((def) & (GPIO_PORT_MASK | GPIO_PIN_MASK)) | (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR)) @@ -309,6 +259,7 @@ #define GPIO_GPIO5_OUTPUT /* PI6 T8C2 FMU6 */ _MK_GPIO_OUTPUT(GPIO_TIM8_CH2OUT_2) #define GPIO_GPIO6_OUTPUT /* PF7 T11C1 FMU7 */ _MK_GPIO_OUTPUT(GPIO_TIM11_CH1OUT_2) #define GPIO_GPIO7_OUTPUT /* PF6 T10C1 FMU8 */ _MK_GPIO_OUTPUT(GPIO_TIM10_CH1OUT_2) +#define GPIO_GPIO8_OUTPUT /* PF6 T10C1 FMU9 */ _MK_GPIO_OUTPUT(GPIO_TIM4_CH3OUT_2) /* High-resolution timer */ #define HRT_TIMER 5 /* use timer5 for the HRT */ @@ -360,6 +311,7 @@ /* The list of GPIO that will be initialized */ #define PX4_GPIO_PWM_INIT_LIST { \ + GPIO_GPIO8_INPUT, \ GPIO_GPIO7_INPUT, \ GPIO_GPIO6_INPUT, \ GPIO_GPIO5_INPUT, \ diff --git a/boards/av/x-v1/src/init.c b/boards/av/x-v1/src/init.c index 36feaa6c9d..89b64561ec 100644 --- a/boards/av/x-v1/src/init.c +++ b/boards/av/x-v1/src/init.c @@ -45,9 +45,7 @@ * Included Files ****************************************************************************/ -#include <px4_config.h> -#include <px4_tasks.h> -#include <px4_log.h> +#include "board_config.h" #include <stdbool.h> #include <stdio.h> @@ -55,6 +53,7 @@ #include <debug.h> #include <errno.h> +#include <nuttx/config.h> #include <nuttx/board.h> #include <nuttx/spi/spi.h> #include <nuttx/i2c/i2c_master.h> @@ -62,24 +61,17 @@ #include <nuttx/mmcsd.h> #include <nuttx/analog/adc.h> #include <nuttx/mm/gran.h> - #include <chip.h> -#include "board_config.h" - #include <stm32_uart.h> - #include <arch/board/board.h> +#include "up_internal.h" #include <drivers/drv_hrt.h> #include <drivers/drv_board_led.h> - #include <systemlib/px4_macros.h> - #include <px4_init.h> #include <px4_i2c.h> -#include "up_internal.h" - static int configure_switch(void); /************************************************************************************ @@ -238,7 +230,7 @@ __EXPORT int board_app_initialize(uintptr_t arg) /* configure the DMA allocator */ if (board_dma_alloc_init() < 0) { - PX4_ERR("DMA alloc FAILED"); + syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); } /* set up the serial DMA polling */ @@ -260,27 +252,16 @@ __EXPORT int board_app_initialize(uintptr_t arg) (void) board_hardfault_init(2, true); - -#ifdef CONFIG_SPI - int ret = stm32_spi_bus_initialize(); - - if (ret != OK) { - PX4_ERR("SPI init failed"); - return ret; - } - -#endif - #ifdef CONFIG_MMCSD - ret = stm32_sdio_initialize(); + int ret = stm32_sdio_initialize(); if (ret != OK) { - PX4_ERR("SDIO init failed"); + syslog(LOG_ERR, "[boot] SDIO init failed\n"); return ret; } -#endif +#endif /* CONFIG_MMCSD */ configure_switch(); @@ -302,7 +283,7 @@ static int configure_switch(void) struct i2c_master_s *i2c = px4_i2cbus_initialize(PX4_I2C_BUS_ONBOARD); if (i2c == NULL) { - PX4_ERR("I2C device not opened"); + syslog(LOG_ERR, "[boot] I2C device not opened\n"); } // ethernet switch enable @@ -327,7 +308,7 @@ static int configure_switch(void) break; } else { - PX4_ERR("ETH switch I2C fail: %d, retrying", ret); + syslog(LOG_ERR, "[boot] ETH switch I2C fail: %d, retrying\n", ret); } /* if we have already retried once, or we are going to give up, then reset the bus */ diff --git a/boards/av/x-v1/src/manifest.c b/boards/av/x-v1/src/manifest.c index ff3d87b94d..a9e5898d8d 100644 --- a/boards/av/x-v1/src/manifest.c +++ b/boards/av/x-v1/src/manifest.c @@ -46,10 +46,11 @@ * Included Files ****************************************************************************/ -#include <px4_config.h> +#include <nuttx/config.h> +#include <board_config.h> + #include <stdbool.h> #include "systemlib/px4_macros.h" -#include "px4_log.h" /************************************************************************************ * Name: board_rc_input diff --git a/boards/av/x-v1/src/sdio.c b/boards/av/x-v1/src/sdio.c index f7335c66bc..93e25a8f8a 100644 --- a/boards/av/x-v1/src/sdio.c +++ b/boards/av/x-v1/src/sdio.c @@ -36,8 +36,8 @@ * Included Files ****************************************************************************/ -#include <px4_config.h> -#include <px4_log.h> +#include <nuttx/config.h> +#include <board_config.h> #include <stdbool.h> #include <stdio.h> @@ -137,7 +137,7 @@ int stm32_sdio_initialize(void) sdio_dev = sdio_initialize(SDIO_SLOTNO); if (!sdio_dev) { - PX4_ERR("[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); + syslog(LOG_ERR, "[boot] Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); return -ENODEV; } @@ -148,7 +148,7 @@ int stm32_sdio_initialize(void) ret = mmcsd_slotinitialize(SDIO_MINOR, sdio_dev); if (ret != OK) { - PX4_ERR("[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); + syslog(LOG_ERR, "[boot] Failed to bind SDIO to the MMC/SD driver: %d\n", ret); return ret; } diff --git a/boards/av/x-v1/src/spi.c b/boards/av/x-v1/src/spi.c deleted file mode 100644 index d1fe890255..0000000000 --- a/boards/av/x-v1/src/spi.c +++ /dev/null @@ -1,428 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2018 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file px4fmu_spi.c - * - * Board-specific SPI functions. - */ - -/************************************************************************************ - * Included Files - ************************************************************************************/ - -#include <px4_config.h> -#include <px4_log.h> - -#include <stdint.h> -#include <stdbool.h> -#include <debug.h> -#include <unistd.h> - -#include <nuttx/spi/spi.h> -#include <arch/board/board.h> -#include <systemlib/px4_macros.h> - -#include <up_arch.h> -#include <chip.h> -#include <stm32_gpio.h> -#include "board_config.h" - -/**************************************************************************** - * Pre-Processor Definitions - ****************************************************************************/ - -/* Configuration ************************************************************/ - -/* Debug ********************************************************************/ - -/* Define CS GPIO array */ -static const uint32_t spi1selects_gpio[] = PX4_SENSOR1_BUS_CS_GPIO; -static const uint32_t spi2selects_gpio[] = PX4_SENSOR2_BUS_CS_GPIO; -static const uint32_t spi4selects_gpio[] = PX4_SENSOR4_BUS_CS_GPIO; -static const uint32_t spi5selects_gpio[] = PX4_SENSOR5_BUS_CS_GPIO; - - -/************************************************************************************ - * Public Functions - ************************************************************************************/ - -/************************************************************************************ - * Name: stm32_spiinitialize - * - * Description: - * Called to configure SPI chip select GPIO pins for the PX4FMU board. - * - ************************************************************************************/ - -__EXPORT void stm32_spiinitialize(void) -{ - board_gpio_init(spi1selects_gpio, arraySize(spi1selects_gpio)); - board_gpio_init(spi2selects_gpio, arraySize(spi2selects_gpio)); - board_gpio_init(spi4selects_gpio, arraySize(spi4selects_gpio)); - board_gpio_init(spi5selects_gpio, arraySize(spi5selects_gpio)); -} - -/************************************************************************************ - * Name: stm32_spi_bus_initialize - * - * Description: - * Called to configure SPI buses on PX4FMU board. - * - ************************************************************************************/ -static struct spi_dev_s *spi_sensor1; -static struct spi_dev_s *spi_sensor2; -static struct spi_dev_s *spi_sensor4; -static struct spi_dev_s *spi_sensor5; - -__EXPORT int stm32_spi_bus_initialize(void) -{ - /* Configure SPI-based devices */ - - - /* Get the SPI port for the Sensors */ - spi_sensor1 = stm32_spibus_initialize(PX4_SPI_BUS_SENSOR1); - - if (!spi_sensor1) { - PX4_ERR("[boot] FAILED to initialize SPI port %d\n", PX4_SPI_BUS_SENSOR1); - return -ENODEV; - } - - /* Default PX4_SPI_BUS_SENSORS to 1MHz and de-assert the known chip selects. */ - SPI_SETFREQUENCY(spi_sensor1, 1000000); - SPI_SETBITS(spi_sensor1, 16); - SPI_SETMODE(spi_sensor1, SPIDEV_MODE3); - - for (int cs = PX4_SENSOR1_BUS_FIRST_CS; cs <= PX4_SENSOR1_BUS_LAST_CS; cs++) { - SPI_SELECT(spi_sensor1, cs, false); - } - - - /* Get the SPI port for the Memory */ - spi_sensor2 = stm32_spibus_initialize(PX4_SPI_BUS_SENSOR2); - - if (!spi_sensor2) { - PX4_ERR("[boot] FAILED to initialize SPI port %d\n", PX4_SPI_BUS_SENSOR2); - return -ENODEV; - } - - /* Default PX4_SPI_BUS_SENSOR2 to 1MHz and de-assert the known chip selects. */ - SPI_SETFREQUENCY(spi_sensor2, 1000000); - SPI_SETBITS(spi_sensor2, 8); - SPI_SETMODE(spi_sensor2, SPIDEV_MODE3); - - for (int cs = PX4_SENSOR2_BUS_FIRST_CS; cs <= PX4_SENSOR2_BUS_LAST_CS; cs++) { - SPI_SELECT(spi_sensor2, cs, false); - } - - - /* Get the SPI port for the BARO */ - spi_sensor4 = stm32_spibus_initialize(PX4_SPI_BUS_SENSOR4); - - if (!spi_sensor4) { - PX4_ERR("[boot] FAILED to initialize SPI port %d\n", PX4_SPI_BUS_SENSOR4); - return -ENODEV; - } - - SPI_SETFREQUENCY(spi_sensor4, 1 * 1000 * 1000); - SPI_SETBITS(spi_sensor4, 8); - SPI_SETMODE(spi_sensor4, SPIDEV_MODE3); - - for (int cs = PX4_SENSOR4_BUS_FIRST_CS; cs <= PX4_SENSOR4_BUS_LAST_CS; cs++) { - SPI_SELECT(spi_sensor4, cs, false); - } - - - /* Get the SPI port for the PX4_SPI_EXTERNAL1 */ - spi_sensor5 = stm32_spibus_initialize(PX4_SPI_BUS_SENSOR5); - - if (!spi_sensor5) { - PX4_ERR("[boot] FAILED to initialize SPI port %d\n", PX4_SPI_BUS_SENSOR5); - return -ENODEV; - } - - SPI_SETFREQUENCY(spi_sensor5, 1 * 1000 * 1000); - SPI_SETBITS(spi_sensor5, 8); - SPI_SETMODE(spi_sensor5, SPIDEV_MODE3); - - for (int cs = PX4_SENSOR5_BUS_FIRST_CS; cs <= PX4_SENSOR5_BUS_LAST_CS; cs++) { - SPI_SELECT(spi_sensor5, cs, false); - } - - return OK; -} - -/************************************************************************************ - * Name: stm32_spi1select and stm32_spi1status - * - * Description: - * Called by stm32 spi driver on bus 1. - * - ************************************************************************************/ - -__EXPORT void stm32_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) -{ - /* SPI select is active low, so write !selected to select the device */ - int sel = (int) devid; - ASSERT(PX4_SPI_BUS_ID(sel) == PX4_SPI_BUS_SENSOR1); - - /* Making sure the other peripherals are not selected */ - for (size_t cs = 0; arraySize(spi1selects_gpio) > 1 && cs < arraySize(spi1selects_gpio); cs++) { - if (spi1selects_gpio[cs] != 0) { - stm32_gpiowrite(spi1selects_gpio[cs], 1); - } - } - - uint32_t gpio = spi1selects_gpio[PX4_SPI_DEV_ID(sel)]; - - if (gpio) { - stm32_gpiowrite(gpio, !selected); - } -} - -__EXPORT uint8_t stm32_spi1status(FAR struct spi_dev_s *dev, uint32_t devid) -{ - return SPI_STATUS_PRESENT; -} - - -/************************************************************************************ - * Name: stm32_spi2select and stm32_spi2status - * - * Description: - * Called by stm32 spi driver on bus 2. - * - ************************************************************************************/ - -__EXPORT void stm32_spi2select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) -{ - /* SPI select is active low, so write !selected to select the device */ - int sel = (int) devid; - ASSERT(PX4_SPI_BUS_ID(sel) == PX4_SPI_BUS_SENSOR2); - - /* Making sure the other peripherals are not selected */ - - for (int cs = 0; arraySize(spi2selects_gpio) > 1 && cs < arraySize(spi2selects_gpio); cs++) { - if (spi2selects_gpio[cs] != 0) { - stm32_gpiowrite(spi2selects_gpio[cs], 1); - } - } - - uint32_t gpio = spi2selects_gpio[PX4_SPI_DEV_ID(sel)]; - - if (gpio) { - stm32_gpiowrite(gpio, !selected); - } -} - -__EXPORT uint8_t stm32_spi2status(FAR struct spi_dev_s *dev, uint32_t devid) -{ - return SPI_STATUS_PRESENT; -} - - -/************************************************************************************ - * Name: stm32_spi4select and stm32_spi4status - * - * Description: - * Called by stm32 spi driver on bus 4. - * - ************************************************************************************/ - -__EXPORT void stm32_spi4select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) -{ - int sel = (int) devid; - ASSERT(PX4_SPI_BUS_ID(sel) == PX4_SPI_BUS_SENSOR4); - - /* Making sure the other peripherals are not selected */ - for (size_t cs = 0; arraySize(spi4selects_gpio) > 1 && cs < arraySize(spi4selects_gpio); cs++) { - stm32_gpiowrite(spi4selects_gpio[cs], 1); - } - - uint32_t gpio = spi4selects_gpio[PX4_SPI_DEV_ID(sel)]; - - if (gpio) { - stm32_gpiowrite(gpio, !selected); - } -} - -__EXPORT uint8_t stm32_spi4status(FAR struct spi_dev_s *dev, uint32_t devid) -{ - return SPI_STATUS_PRESENT; -} - -/************************************************************************************ - * Name: stm32_spi5select and stm32_spi5status - * - * Description: - * Called by stm32 spi driver on bus 5. - * - ************************************************************************************/ - -__EXPORT void stm32_spi5select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) -{ - /* SPI select is active low, so write !selected to select the device */ - int sel = (int) devid; - ASSERT(PX4_SPI_BUS_ID(sel) == PX4_SPI_BUS_SENSOR5); - - /* Making sure the other peripherals are not selected */ - for (size_t cs = 0; arraySize(spi5selects_gpio) > 1 && cs < arraySize(spi5selects_gpio); cs++) { - stm32_gpiowrite(spi5selects_gpio[cs], 1); - } - - uint32_t gpio = spi5selects_gpio[PX4_SPI_DEV_ID(sel)]; - - if (gpio) { - stm32_gpiowrite(gpio, !selected); - } -} - -__EXPORT uint8_t stm32_spi5status(FAR struct spi_dev_s *dev, uint32_t devid) -{ - return SPI_STATUS_PRESENT; -} - - -/************************************************************************************ - * Name: board_spi_reset - * - * Description: - * - * - ************************************************************************************/ - -__EXPORT void board_spi_reset(int ms) -{ - /* disable SPI bus */ - - // SPI1 - for (size_t cs = 0; arraySize(spi1selects_gpio) > 1 && cs < arraySize(spi1selects_gpio); cs++) { - if (spi1selects_gpio[cs] != 0) { - stm32_configgpio(_PIN_OFF(spi1selects_gpio[cs])); - } - } - - stm32_configgpio(GPIO_SPI1_SCK_OFF); - stm32_configgpio(GPIO_SPI1_MISO_OFF); - stm32_configgpio(GPIO_SPI1_MOSI_OFF); - - // SPI2 - for (size_t cs = 0; arraySize(spi2selects_gpio) > 1 && cs < arraySize(spi2selects_gpio); cs++) { - if (spi2selects_gpio[cs] != 0) { - stm32_configgpio(_PIN_OFF(spi2selects_gpio[cs])); - } - } - - stm32_configgpio(GPIO_SPI2_SCK_OFF); - stm32_configgpio(GPIO_SPI2_MISO_OFF); - stm32_configgpio(GPIO_SPI2_MOSI_OFF); - - // SPI4 - for (size_t cs = 0; arraySize(spi4selects_gpio) > 1 && cs < arraySize(spi4selects_gpio); cs++) { - if (spi4selects_gpio[cs] != 0) { - stm32_configgpio(_PIN_OFF(spi4selects_gpio[cs])); - } - } - - stm32_configgpio(GPIO_SPI4_SCK_OFF); - stm32_configgpio(GPIO_SPI4_MISO_OFF); - stm32_configgpio(GPIO_SPI4_MOSI_OFF); - - // SPI5 - for (size_t cs = 0; arraySize(spi5selects_gpio) > 1 && cs < arraySize(spi5selects_gpio); cs++) { - if (spi5selects_gpio[cs] != 0) { - stm32_configgpio(_PIN_OFF(spi5selects_gpio[cs])); - } - } - - stm32_configgpio(GPIO_SPI5_SCK_OFF); - stm32_configgpio(GPIO_SPI5_MISO_OFF); - stm32_configgpio(GPIO_SPI5_MOSI_OFF); - - - /* wait for the sensor rail to reach GND */ - usleep(ms * 1000); - PX4_INFO("reset done, %d ms", ms); - - /* re-enable power */ - - /* wait a bit before starting SPI, different times didn't influence results */ - usleep(100); - - /* reconfigure the SPI pins */ - - // SPI1 - for (size_t cs = 0; arraySize(spi1selects_gpio) > 1 && cs < arraySize(spi1selects_gpio); cs++) { - if (spi1selects_gpio[cs] != 0) { - stm32_configgpio(spi1selects_gpio[cs]); - } - } - - stm32_configgpio(GPIO_SPI1_SCK); - stm32_configgpio(GPIO_SPI1_MISO); - stm32_configgpio(GPIO_SPI1_MOSI); - - // SPI2 - for (size_t cs = 0; arraySize(spi2selects_gpio) > 1 && cs < arraySize(spi2selects_gpio); cs++) { - if (spi2selects_gpio[cs] != 0) { - stm32_configgpio(spi2selects_gpio[cs]); - } - } - - stm32_configgpio(GPIO_SPI2_SCK); - stm32_configgpio(GPIO_SPI2_MISO); - stm32_configgpio(GPIO_SPI2_MOSI); - - // SPI4 - for (size_t cs = 0; arraySize(spi4selects_gpio) > 1 && cs < arraySize(spi4selects_gpio); cs++) { - if (spi4selects_gpio[cs] != 0) { - stm32_configgpio(spi4selects_gpio[cs]); - } - } - - stm32_configgpio(GPIO_SPI4_SCK); - stm32_configgpio(GPIO_SPI4_MISO); - stm32_configgpio(GPIO_SPI4_MOSI); - - // SPI5 - for (size_t cs = 0; arraySize(spi5selects_gpio) > 1 && cs < arraySize(spi5selects_gpio); cs++) { - if (spi5selects_gpio[cs] != 0) { - stm32_configgpio(spi5selects_gpio[cs]); - } - } - - stm32_configgpio(GPIO_SPI5_SCK); - stm32_configgpio(GPIO_SPI5_MISO); - stm32_configgpio(GPIO_SPI5_MOSI); - -} diff --git a/boards/av/x-v1/src/spi.cpp b/boards/av/x-v1/src/spi.cpp new file mode 100644 index 0000000000..23ca949222 --- /dev/null +++ b/boards/av/x-v1/src/spi.cpp @@ -0,0 +1,336 @@ +/**************************************************************************** + * + * Copyright (C) 2018 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file px4fmu_spi.c + * + * Board-specific SPI functions. + */ + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include <board_config.h> + +#include <stdint.h> +#include <stdbool.h> +#include <debug.h> +#include <unistd.h> + +#include <nuttx/spi/spi.h> +#include <arch/board/board.h> +#include <systemlib/px4_macros.h> + +#include <up_arch.h> +#include <chip.h> +#include <stm32_gpio.h> + +/* Define CS GPIO array */ +static constexpr uint32_t spi1selects_gpio[] = PX4_SENSOR1_BUS_CS_GPIO; +static constexpr uint32_t spi2selects_gpio[] = PX4_SENSOR2_BUS_CS_GPIO; +static constexpr uint32_t spi4selects_gpio[] = PX4_SENSOR4_BUS_CS_GPIO; +static constexpr uint32_t spi5selects_gpio[] = PX4_SENSOR5_BUS_CS_GPIO; + +/************************************************************************************ + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the PX4FMU board. + * + ************************************************************************************/ + +__EXPORT void stm32_spiinitialize() +{ +#ifdef CONFIG_STM32F7_SPI1 + + for (auto gpio : spi1selects_gpio) { + px4_arch_configgpio(gpio); + } + +#endif // CONFIG_STM32F7_SPI1 + + +#if defined(CONFIG_STM32F7_SPI2) + + for (auto gpio : spi2selects_gpio) { + px4_arch_configgpio(gpio); + } + +#endif // CONFIG_STM32F7_SPI2 + + +#ifdef CONFIG_STM32F7_SPI4 + + for (auto gpio : spi4selects_gpio) { + px4_arch_configgpio(gpio); + } + +#endif // CONFIG_STM32F7_SPI4 + + +#ifdef CONFIG_STM32F7_SPI5 + + for (auto gpio : spi5selects_gpio) { + px4_arch_configgpio(gpio); + } + +#endif // CONFIG_STM32F7_SPI5 +} + +/************************************************************************************ + * Name: stm32_spi1select and stm32_spi1status + * + * Description: + * Called by stm32 spi driver on bus 1. + * + ************************************************************************************/ +#ifdef CONFIG_STM32F7_SPI1 +__EXPORT void stm32_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) +{ + ASSERT(PX4_SPI_BUS_ID(devid) == PX4_SPI_BUS_SENSOR1); + + // Making sure the other peripherals are not selected + for (auto cs : spi1selects_gpio) { + stm32_gpiowrite(cs, 1); + } + + // SPI select is active low, so write !selected to select the device + stm32_gpiowrite(spi1selects_gpio[PX4_SPI_DEV_ID(devid)], !selected); +} + +__EXPORT uint8_t stm32_spi1status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return SPI_STATUS_PRESENT; +} +#endif // CONFIG_STM32F7_SPI1 + +/************************************************************************************ + * Name: stm32_spi2select and stm32_spi2status + * + * Description: + * Called by stm32 spi driver on bus 2. + * + ************************************************************************************/ +#if defined(CONFIG_STM32F7_SPI2) +__EXPORT void stm32_spi2select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) +{ + ASSERT(PX4_SPI_BUS_ID(devid) == PX4_SPI_BUS_SENSOR2); + + // Making sure the other peripherals are not selected + for (auto cs : spi2selects_gpio) { + stm32_gpiowrite(cs, 1); + } + + // SPI select is active low, so write !selected to select the device + stm32_gpiowrite(spi2selects_gpio[PX4_SPI_DEV_ID(devid)], !selected); +} + +__EXPORT uint8_t stm32_spi2status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return SPI_STATUS_PRESENT; +} +#endif // CONFIG_STM32F7_SPI2 + +/************************************************************************************ + * Name: stm32_spi4select and stm32_spi4status + * + * Description: + * Called by stm32 spi driver on bus 4. + * + ************************************************************************************/ +#ifdef CONFIG_STM32F7_SPI4 +__EXPORT void stm32_spi4select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) +{ + ASSERT(PX4_SPI_BUS_ID(devid) == PX4_SPI_BUS_SENSOR4); + + // Making sure the other peripherals are not selected + for (auto cs : spi4selects_gpio) { + stm32_gpiowrite(cs, 1); + } + + // SPI select is active low, so write !selected to select the device + stm32_gpiowrite(spi4selects_gpio[PX4_SPI_DEV_ID(devid)], !selected); +} + +__EXPORT uint8_t stm32_spi4status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return SPI_STATUS_PRESENT; +} +#endif // CONFIG_STM32F7_SPI4 + +/************************************************************************************ + * Name: stm32_spi5select and stm32_spi5status + * + * Description: + * Called by stm32 spi driver on bus 5. + * + ************************************************************************************/ +#ifdef CONFIG_STM32F7_SPI5 +__EXPORT void stm32_spi5select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) +{ + ASSERT(PX4_SPI_BUS_ID(devid) == PX4_SPI_BUS_SENSOR5); + + // Making sure the other peripherals are not selected + for (auto cs : spi5selects_gpio) { + stm32_gpiowrite(cs, 1); + } + + // SPI select is active low, so write !selected to select the device + stm32_gpiowrite(spi5selects_gpio[PX4_SPI_DEV_ID(devid)], !selected); +} + +__EXPORT uint8_t stm32_spi5status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return SPI_STATUS_PRESENT; +} +#endif // CONFIG_STM32F7_SPI5 + +/************************************************************************************ + * Name: board_spi_reset + * + * Description: + * + * + ************************************************************************************/ + +__EXPORT void board_spi_reset(int ms) +{ +#ifdef CONFIG_STM32F7_SPI1 + + // disable SPI1 + for (auto cs : spi1selects_gpio) { + stm32_configgpio(_PIN_OFF(cs)); + } + + stm32_configgpio(GPIO_SPI1_SCK_OFF); + stm32_configgpio(GPIO_SPI1_MISO_OFF); + stm32_configgpio(GPIO_SPI1_MOSI_OFF); +#endif // CONFIG_STM32F7_SPI1 + +#ifdef CONFIG_STM32F7_SPI2 + + // disable SPI2 + for (auto cs : spi2selects_gpio) { + stm32_configgpio(_PIN_OFF(cs)); + } + + stm32_configgpio(GPIO_SPI2_SCK_OFF); + stm32_configgpio(GPIO_SPI2_MISO_OFF); + stm32_configgpio(GPIO_SPI2_MOSI_OFF); +#endif // CONFIG_STM32F7_SPI2 + +#ifdef CONFIG_STM32F7_SPI4 + + // disable SPI4 + for (auto cs : spi4selects_gpio) { + stm32_configgpio(_PIN_OFF(cs)); + } + + stm32_configgpio(GPIO_SPI4_SCK_OFF); + stm32_configgpio(GPIO_SPI4_MISO_OFF); + stm32_configgpio(GPIO_SPI4_MOSI_OFF); +#endif // CONFIG_STM32F7_SPI4 + +#ifdef CONFIG_STM32F7_SPI5 + + // disable SPI5 + for (auto cs : spi5selects_gpio) { + stm32_configgpio(_PIN_OFF(cs)); + } + + stm32_configgpio(GPIO_SPI5_SCK_OFF); + stm32_configgpio(GPIO_SPI5_MISO_OFF); + stm32_configgpio(GPIO_SPI5_MOSI_OFF); +#endif // CONFIG_STM32F7_SPI5 + + + /* wait for the sensor rail to reach GND */ + usleep(ms * 1000); + syslog(LOG_DEBUG, "reset done, %d ms\n", ms); + + /* re-enable power */ + + /* wait a bit before starting SPI, different times didn't influence results */ + usleep(100); + + /* reconfigure the SPI pins */ + +#ifdef CONFIG_STM32F7_SPI1 + + // re-enable SPI1 + for (auto cs : spi1selects_gpio) { + stm32_configgpio(cs); + } + + stm32_configgpio(GPIO_SPI1_SCK); + stm32_configgpio(GPIO_SPI1_MISO); + stm32_configgpio(GPIO_SPI1_MOSI); +#endif // CONFIG_STM32F7_SPI1 + +#ifdef CONFIG_STM32F7_SPI2 + + // re-enable SPI2 + for (auto cs : spi2selects_gpio) { + stm32_configgpio(cs); + } + + stm32_configgpio(GPIO_SPI2_SCK); + stm32_configgpio(GPIO_SPI2_MISO); + stm32_configgpio(GPIO_SPI2_MOSI); +#endif // CONFIG_STM32F7_SPI2 + +#ifdef CONFIG_STM32F7_SPI4 + + // re-enable SPI4 + for (auto cs : spi4selects_gpio) { + stm32_configgpio(cs); + } + + stm32_configgpio(GPIO_SPI4_SCK); + stm32_configgpio(GPIO_SPI4_MISO); + stm32_configgpio(GPIO_SPI4_MOSI); +#endif // CONFIG_STM32F7_SPI4 + +#ifdef CONFIG_STM32F7_SPI5 + + // re-enable SPI5 + for (auto cs : spi5selects_gpio) { + stm32_configgpio(cs); + } + + stm32_configgpio(GPIO_SPI5_SCK); + stm32_configgpio(GPIO_SPI5_MISO); + stm32_configgpio(GPIO_SPI5_MOSI); +#endif // CONFIG_STM32F7_SPI5 +} diff --git a/boards/av/x-v1/src/timer_config.c b/boards/av/x-v1/src/timer_config.c index bb76bd303f..e13e4924b7 100644 --- a/boards/av/x-v1/src/timer_config.c +++ b/boards/av/x-v1/src/timer_config.c @@ -60,35 +60,34 @@ __EXPORT const io_timers_t io_timers[MAX_IO_TIMERS] = { .last_channel_index = 3, .handler = io_timer_handler0, .vectorno = STM32_IRQ_TIM1CC, - }, { .base = STM32_TIM2_BASE, .clock_register = STM32_RCC_APB1ENR, .clock_bit = RCC_APB1ENR_TIM2EN, .clock_freq = STM32_APB1_TIM2_CLKIN, - .first_channel_index = 3, - .last_channel_index = 3, + .first_channel_index = 4, + .last_channel_index = 4, .handler = io_timer_handler1, .vectorno = STM32_IRQ_TIM2, }, { .base = STM32_TIM8_BASE, - .clock_register = STM32_RCC_APB1ENR, + .clock_register = STM32_RCC_APB2ENR, .clock_bit = RCC_APB2ENR_TIM10EN, .clock_freq = STM32_APB2_TIM8_CLKIN, - .first_channel_index = 3, - .last_channel_index = 3, + .first_channel_index = 5, + .last_channel_index = 5, .handler = io_timer_handler2, - .vectorno = STM32_IRQ_TIM8CC, // REVIEW + .vectorno = STM32_IRQ_TIM8CC, }, { .base = STM32_TIM11_BASE, - .clock_register = STM32_RCC_APB1ENR, + .clock_register = STM32_RCC_APB2ENR, .clock_bit = RCC_APB2ENR_TIM11EN, .clock_freq = STM32_APB2_TIM11_CLKIN, - .first_channel_index = 2, - .last_channel_index = 2, + .first_channel_index = 6, + .last_channel_index = 6, .handler = io_timer_handler3, .vectorno = STM32_IRQ_TIM11, }, @@ -97,12 +96,21 @@ __EXPORT const io_timers_t io_timers[MAX_IO_TIMERS] = { .clock_register = STM32_RCC_APB2ENR, .clock_bit = RCC_APB2ENR_TIM10EN, .clock_freq = STM32_APB2_TIM10_CLKIN, - .first_channel_index = 0, - .last_channel_index = 0, + .first_channel_index = 7, + .last_channel_index = 7, .handler = io_timer_handler4, .vectorno = STM32_IRQ_TIM10, - - } + }, + // { + // .base = STM32_TIM4_BASE, + // .clock_register = STM32_RCC_APB1ENR, + // .clock_bit = RCC_APB1ENR_TIM4EN, + // .clock_freq = STM32_APB1_TIM4_CLKIN, + // .first_channel_index = 8, + // .last_channel_index = 8, + // .handler = io_timer_handler5, + // .vectorno = STM32_IRQ_TIM4, + // } }; __EXPORT const timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { @@ -154,20 +162,28 @@ __EXPORT const timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { .ccr_offset = STM32_GTIM_CCR2_OFFSET, .masks = GTIM_SR_CC2IF | GTIM_SR_CC2OF }, -// { -// .gpio_out = GPIO_TIM11_CH1OUT, -// .gpio_in = GPIO_TIM11_CH1IN, -// .timer_index = 3, -// .timer_channel = 1, -// .ccr_offset = STM32_GTIM_CCR1_OFFSET, -// .masks = GTIM_SR_CC1IF | GTIM_SR_CC1F -// }, -// { -// .gpio_out = GPIO_TIM10_CH1OUT, -// .gpio_in = GPIO_TIM10_CH1IN, -// .timer_index = 4, -// .timer_channel = 1, -// .ccr_offset = STM32_GTIM_CCR1_OFFSET, -// .masks = GTIM_SR_CC1IF | GTIM_SR_CC1OF -// } + { + .gpio_out = GPIO_TIM11_CH1OUT, + .gpio_in = GPIO_TIM11_CH1IN, + .timer_index = 3, + .timer_channel = 1, + .ccr_offset = STM32_GTIM_CCR1_OFFSET, + .masks = GTIM_SR_CC1IF | GTIM_SR_CC1OF + }, + { + .gpio_out = GPIO_TIM10_CH1OUT, + .gpio_in = GPIO_TIM10_CH1IN, + .timer_index = 4, + .timer_channel = 1, + .ccr_offset = STM32_GTIM_CCR1_OFFSET, + .masks = GTIM_SR_CC1IF | GTIM_SR_CC1OF + }, + // { + // .gpio_out = GPIO_TIM4_CH3OUT, + // .gpio_in = GPIO_TIM4_CH3IN, + // .timer_index = 5, + // .timer_channel = 3, + // .ccr_offset = STM32_GTIM_CCR3_OFFSET, + // .masks = GTIM_SR_CC3IF | GTIM_SR_CC3OF + // } }; -- GitLab