diff --git a/boards/px4/fmu-v4/default.cmake b/boards/px4/fmu-v4/default.cmake index 385542f064..b300f71124 100644 --- a/boards/px4/fmu-v4/default.cmake +++ b/boards/px4/fmu-v4/default.cmake @@ -32,6 +32,7 @@ px4_add_board( magnetometer # all available magnetometer drivers mkblctrl pca9685 + pmw3901 pwm_input pwm_out_sim px4flow diff --git a/boards/px4/fmu-v4/init/rc.board_sensors b/boards/px4/fmu-v4/init/rc.board_sensors index 8bb9a2a275..6b59c41169 100644 --- a/boards/px4/fmu-v4/init/rc.board_sensors +++ b/boards/px4/fmu-v4/init/rc.board_sensors @@ -64,3 +64,5 @@ then # BMI160 internal SPI bus bmi160 start fi + +pmw3901 start diff --git a/boards/px4/fmu-v4/nuttx-config/include/board.h b/boards/px4/fmu-v4/nuttx-config/include/board.h index bbcd2fde25..98d0ba6274 100644 --- a/boards/px4/fmu-v4/nuttx-config/include/board.h +++ b/boards/px4/fmu-v4/nuttx-config/include/board.h @@ -265,14 +265,19 @@ * * There are sensors on SPI1, and SPI2 is connected to the FRAM. */ -#define GPIO_SPI1_MISO (GPIO_SPI1_MISO_1|GPIO_SPEED_50MHz) -#define GPIO_SPI1_MOSI (GPIO_SPI1_MOSI_1|GPIO_SPEED_50MHz) -#define GPIO_SPI1_SCK (GPIO_SPI1_SCK_1|GPIO_SPEED_50MHz) +#define GPIO_SPI1_MISO (GPIO_SPI1_MISO_1|GPIO_SPEED_50MHz) +#define GPIO_SPI1_MOSI (GPIO_SPI1_MOSI_1|GPIO_SPEED_50MHz) +#define GPIO_SPI1_SCK (GPIO_SPI1_SCK_1|GPIO_SPEED_50MHz) +#define GPIO_SPI2_MISO (GPIO_SPI2_MISO_1|GPIO_SPEED_50MHz) +#define GPIO_SPI2_MOSI (GPIO_SPI2_MOSI_1|GPIO_SPEED_50MHz) +#define GPIO_SPI2_SCK (GPIO_SPI2_SCK_1|GPIO_SPEED_50MHz) -#define GPIO_SPI2_MISO (GPIO_SPI2_MISO_1|GPIO_SPEED_50MHz) -#define GPIO_SPI2_MOSI (GPIO_SPI2_MOSI_1|GPIO_SPEED_50MHz) -#define GPIO_SPI2_SCK (GPIO_SPI2_SCK_1|GPIO_SPEED_50MHz) +#if defined(CONFIG_STM32_SPI4) +# define GPIO_SPI4_MISO (GPIO_SPI4_MISO_1|GPIO_SPEED_50MHz) +# define GPIO_SPI4_MOSI (GPIO_SPI4_MOSI_1|GPIO_SPEED_50MHz) +# define GPIO_SPI4_SCK (GPIO_SPI4_SCK_1|GPIO_SPEED_50MHz) +#endif /* Board provides GPIO or other Hardware for signaling to timing analyzer */ diff --git a/boards/px4/fmu-v4/nuttx-config/nsh/defconfig b/boards/px4/fmu-v4/nuttx-config/nsh/defconfig index f7e88381c3..b647871dae 100755 --- a/boards/px4/fmu-v4/nuttx-config/nsh/defconfig +++ b/boards/px4/fmu-v4/nuttx-config/nsh/defconfig @@ -78,7 +78,7 @@ CONFIG_ARCH="arm" # ARM Options # # CONFIG_ARCH_CHIP_A1X is not set -# CONFIG_ARCH_CHIP_BCM2708 is not set +# CONFIG_ARCH_CHIP_AM335X is not set # CONFIG_ARCH_CHIP_C5471 is not set # CONFIG_ARCH_CHIP_DM320 is not set # CONFIG_ARCH_CHIP_EFM32 is not set @@ -445,7 +445,7 @@ CONFIG_STM32_HAVE_CAN2=y # CONFIG_STM32_HAVE_COMP6 is not set # CONFIG_STM32_HAVE_COMP7 is not set CONFIG_STM32_HAVE_DAC1=y -CONFIG_STM32_HAVE_DAC2=y +# CONFIG_STM32_HAVE_DAC2 is not set CONFIG_STM32_HAVE_RNG=y CONFIG_STM32_HAVE_ETHMAC=y CONFIG_STM32_HAVE_I2C2=y @@ -482,7 +482,6 @@ CONFIG_STM32_CCMDATARAM=y CONFIG_STM32_DMA1=y CONFIG_STM32_DMA2=y # CONFIG_STM32_DAC1 is not set -# CONFIG_STM32_DAC2 is not set # CONFIG_STM32_DCMI is not set # CONFIG_STM32_ETHMAC is not set # CONFIG_STM32_FSMC is not set @@ -501,7 +500,7 @@ CONFIG_STM32_SPI1=y CONFIG_STM32_SPI2=y # CONFIG_STM32_SPI3 is not set # CONFIG_STM32_I2S3 is not set -# CONFIG_STM32_SPI4 is not set +CONFIG_STM32_SPI4=y # CONFIG_STM32_SPI5 is not set # CONFIG_STM32_SPI6 is not set CONFIG_STM32_SYSCFG=y @@ -1028,8 +1027,17 @@ CONFIG_WATCHDOG_DEVPATH="/dev/watchdog0" # LCD Driver Support # # CONFIG_LCD is not set + +# +# Character/Segment LCD Devices +# # CONFIG_SLCD is not set +# +# Other LCD-related Devices +# +# CONFIG_LCD_OTHER is not set + # # LED Support # @@ -1608,6 +1616,7 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024 # # CONFIG_EXAMPLES_ADXL372_TEST is not set # CONFIG_EXAMPLES_APA102 is not set +# CONFIG_EXAMPLES_BATTERY is not set # CONFIG_EXAMPLES_CALIB_UDELAY is not set # CONFIG_EXAMPLES_CCTYPE is not set # CONFIG_EXAMPLES_CHAT is not set @@ -1660,7 +1669,6 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024 # CONFIG_EXAMPLES_SLCD is not set # CONFIG_EXAMPLES_SMART is not set # CONFIG_EXAMPLES_SMART_TEST is not set -# CONFIG_EXAMPLES_SMP is not set # CONFIG_EXAMPLES_SMPS is not set # CONFIG_EXAMPLES_STAT is not set # CONFIG_EXAMPLES_TCPECHO is not set @@ -1892,6 +1900,7 @@ CONFIG_READLINE_ECHO=y # CONFIG_SYSTEM_SUDOKU is not set # CONFIG_SYSTEM_SYSTEM is not set # CONFIG_SYSTEM_TEE is not set +# CONFIG_SYSTEM_TERMCURSES is not set # CONFIG_SYSTEM_UBLOXMODEM is not set # CONFIG_SYSTEM_VI is not set # CONFIG_SYSTEM_ZMODEM is not set diff --git a/boards/px4/fmu-v4/nuttx-config/stackcheck/defconfig b/boards/px4/fmu-v4/nuttx-config/stackcheck/defconfig index 22c71fa00b..cefb4635fd 100644 --- a/boards/px4/fmu-v4/nuttx-config/stackcheck/defconfig +++ b/boards/px4/fmu-v4/nuttx-config/stackcheck/defconfig @@ -78,7 +78,7 @@ CONFIG_ARCH="arm" # ARM Options # # CONFIG_ARCH_CHIP_A1X is not set -# CONFIG_ARCH_CHIP_BCM2708 is not set +# CONFIG_ARCH_CHIP_AM335X is not set # CONFIG_ARCH_CHIP_C5471 is not set # CONFIG_ARCH_CHIP_DM320 is not set # CONFIG_ARCH_CHIP_EFM32 is not set @@ -109,6 +109,7 @@ CONFIG_ARCH="arm" # CONFIG_ARCH_CHIP_SAMV7 is not set CONFIG_ARCH_CHIP_STM32=y # CONFIG_ARCH_CHIP_STM32F0 is not set +# CONFIG_ARCH_CHIP_STM32L0 is not set # CONFIG_ARCH_CHIP_STM32F7 is not set # CONFIG_ARCH_CHIP_STM32H7 is not set # CONFIG_ARCH_CHIP_STM32L4 is not set @@ -349,6 +350,7 @@ CONFIG_ARCH_CHIP_STM32F427V=y # CONFIG_STM32_FLASH_CONFIG_6 is not set # CONFIG_STM32_FLASH_CONFIG_8 is not set # CONFIG_STM32_FLASH_CONFIG_B is not set +# CONFIG_STM32_FLASH_CONFIG_Z is not set # CONFIG_STM32_FLASH_CONFIG_C is not set # CONFIG_STM32_FLASH_CONFIG_D is not set # CONFIG_STM32_FLASH_CONFIG_E is not set @@ -443,7 +445,7 @@ CONFIG_STM32_HAVE_CAN2=y # CONFIG_STM32_HAVE_COMP6 is not set # CONFIG_STM32_HAVE_COMP7 is not set CONFIG_STM32_HAVE_DAC1=y -CONFIG_STM32_HAVE_DAC2=y +# CONFIG_STM32_HAVE_DAC2 is not set CONFIG_STM32_HAVE_RNG=y CONFIG_STM32_HAVE_ETHMAC=y CONFIG_STM32_HAVE_I2C2=y @@ -480,7 +482,6 @@ CONFIG_STM32_CCMDATARAM=y CONFIG_STM32_DMA1=y CONFIG_STM32_DMA2=y # CONFIG_STM32_DAC1 is not set -# CONFIG_STM32_DAC2 is not set # CONFIG_STM32_DCMI is not set # CONFIG_STM32_ETHMAC is not set # CONFIG_STM32_FSMC is not set @@ -490,7 +491,6 @@ CONFIG_STM32_I2C1=y # CONFIG_STM32_I2C2 is not set # CONFIG_STM32_I2C3 is not set CONFIG_STM32_RTC=y -# CONFIG_STM32_USBHOST is not sety CONFIG_STM32_OTGFS=y # CONFIG_STM32_OTGHS is not set CONFIG_STM32_PWR=y @@ -500,7 +500,7 @@ CONFIG_STM32_SPI1=y CONFIG_STM32_SPI2=y # CONFIG_STM32_SPI3 is not set # CONFIG_STM32_I2S3 is not set -# CONFIG_STM32_SPI4 is not set +CONFIG_STM32_SPI4=y # CONFIG_STM32_SPI5 is not set # CONFIG_STM32_SPI6 is not set CONFIG_STM32_SYSCFG=y @@ -687,20 +687,7 @@ CONFIG_STM32_RTC_MAGIC_TIME_SET=0xfacefeef # CONFIG_STM32_RTC_LSECLOCK is not set # CONFIG_STM32_RTC_LSICLOCK is not set CONFIG_STM32_RTC_HSECLOCK=y - -# -# USB FS Host Configuration -# -CONFIG_STM32_OTGFS_RXFIFO_SIZE=128 -CONFIG_STM32_OTGFS_NPTXFIFO_SIZE=96 -CONFIG_STM32_OTGFS_PTXFIFO_SIZE=128 -CONFIG_STM32_OTGFS_DESCSIZE=128 -# CONFIG_STM32_OTGFS_SOFINTR is not set -CONFIG_STM32_OTGFS_VBUS_CONTROL=y - -# -# USB Host Debug Configuration -# +# CONFIG_STM32_USBHOST is not set # # USB Device Configuration @@ -838,6 +825,7 @@ CONFIG_PREALLOC_TIMERS=50 CONFIG_INIT_ENTRYPOINT=y # CONFIG_INIT_FILEPATH is not set CONFIG_USER_ENTRYPOINT="nsh_main" +CONFIG_USERMAIN_PRIORITY=100 CONFIG_RR_INTERVAL=0 # CONFIG_SCHED_SPORADIC is not set CONFIG_TASK_NAME_SIZE=24 @@ -1039,8 +1027,17 @@ CONFIG_WATCHDOG_DEVPATH="/dev/watchdog0" # LCD Driver Support # # CONFIG_LCD is not set + +# +# Character/Segment LCD Devices +# # CONFIG_SLCD is not set +# +# Other LCD-related Devices +# +# CONFIG_LCD_OTHER is not set + # # LED Support # @@ -1619,6 +1616,7 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024 # # CONFIG_EXAMPLES_ADXL372_TEST is not set # CONFIG_EXAMPLES_APA102 is not set +# CONFIG_EXAMPLES_BATTERY is not set # CONFIG_EXAMPLES_CALIB_UDELAY is not set # CONFIG_EXAMPLES_CCTYPE is not set # CONFIG_EXAMPLES_CHAT is not set @@ -1654,11 +1652,9 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024 # CONFIG_EXAMPLES_NXDEMO is not set # CONFIG_EXAMPLES_NXFFS is not set # CONFIG_EXAMPLES_OBD2 is not set -# CONFIG_EXAMPLES_OSTEST is not set # CONFIG_EXAMPLES_PCA9635 is not set # CONFIG_EXAMPLES_PDCURSES is not set # CONFIG_EXAMPLES_PIPE is not set -# CONFIG_EXAMPLES_POPEN is not set # CONFIG_EXAMPLES_POSIXSPAWN is not set # CONFIG_EXAMPLES_POWERLED is not set # CONFIG_EXAMPLES_POWERMONITOR is not set @@ -1673,7 +1669,6 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024 # CONFIG_EXAMPLES_SLCD is not set # CONFIG_EXAMPLES_SMART is not set # CONFIG_EXAMPLES_SMART_TEST is not set -# CONFIG_EXAMPLES_SMP is not set # CONFIG_EXAMPLES_SMPS is not set # CONFIG_EXAMPLES_STAT is not set # CONFIG_EXAMPLES_TCPECHO is not set @@ -1834,9 +1829,7 @@ CONFIG_NSH_MMCSDSLOTNO=0 # Configure Command Options # CONFIG_NSH_VARS=y -# CONFIG_NSH_CMDOPT_DD_STATS is not set CONFIG_NSH_CODECS_BUFSIZE=128 -# CONFIG_NSH_CMDOPT_HEXDUMP is not set CONFIG_NSH_PROC_MOUNTPOINT="/proc" CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_STRERROR=y @@ -1907,6 +1900,7 @@ CONFIG_READLINE_ECHO=y # CONFIG_SYSTEM_SUDOKU is not set # CONFIG_SYSTEM_SYSTEM is not set # CONFIG_SYSTEM_TEE is not set +# CONFIG_SYSTEM_TERMCURSES is not set # CONFIG_SYSTEM_UBLOXMODEM is not set # CONFIG_SYSTEM_VI is not set # CONFIG_SYSTEM_ZMODEM is not set @@ -1914,6 +1908,7 @@ CONFIG_READLINE_ECHO=y # # Testing # +# CONFIG_TESTING_OSTEST is not set # CONFIG_TESTING_UNITY is not set # diff --git a/boards/px4/fmu-v4/src/board_config.h b/boards/px4/fmu-v4/src/board_config.h index 902d4880d5..957ea15685 100644 --- a/boards/px4/fmu-v4/src/board_config.h +++ b/boards/px4/fmu-v4/src/board_config.h @@ -105,8 +105,12 @@ #define GPIO_SPI2_CS_MS5611 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN7) #define GPIO_SPI2_CS_FRAM (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN10) -/* There are no DRDY on SPI 2. */ +/* Define the Chip Selects for SPI4. */ +#ifdef CONFIG_STM32_SPI4 +# define BOARD_HAS_BUS_MANIFEST 1 // We support a bus manifest because spi 4 is optional +# define GPIO_SPI4_CS_1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN8) //ESP_RTS_PIN +#endif /* CONFIG_STM32_SPI4 */ /** * Define the ability to shut off off the sensor signals * by changing the signals to inputs. @@ -128,14 +132,34 @@ #define GPIO_DRDY_OFF_PORTC_PIN14 _PIN_OFF(GPIO_DRDY_PORTC_PIN14) #define GPIO_DRDY_OFF_PORTE_PIN12 _PIN_OFF(GPIO_DRDY_PORTE_PIN12) +/* SPI 4 bus off. */ +#ifdef CONFIG_STM32_SPI4 +# define GPIO_SPI4_SCK_OFF _PIN_OFF(GPIO_SPI4_SCK) +# define GPIO_SPI4_MISO_OFF _PIN_OFF(GPIO_SPI4_MISO) +# define GPIO_SPI4_MOSI_OFF _PIN_OFF(GPIO_SPI4_MOSI) +#endif /* CONFIG_STM32_SPI4 */ + /** * N.B we do not have control over the SPI 2 buss powered devices * so the the ms5611 is not resetable. + * */ + #define PX4_SPI_BUS_SENSORS 1 #define PX4_SPI_BUS_RAMTRON 2 #define PX4_SPI_BUS_BARO PX4_SPI_BUS_RAMTRON +#ifdef CONFIG_STM32_SPI4 +# define PX4_SPI_BUS_EXTERNAL 4 +/* The mask passes to init the SPI bus pins + * N.B This works ONLY with buss numbers that are powers of 2 + * Adding SPI3 would break this! + */ +# define SPI_BUS_INIT_MASK_EXT PX4_SPI_BUS_EXTERNAL +#endif /* CONFIG_STM32_SPI4 */ + +#define SPI_BUS_INIT_MASK (PX4_SPI_BUS_RAMTRON | PX4_SPI_BUS_SENSORS) + /* Use these in place of the uint32_t enumeration to select a specific SPI device on SPI1 */ #define PX4_SPIDEV_GYRO PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 1) #define PX4_SPIDEV_ACCEL_MAG PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 2) @@ -158,6 +182,10 @@ */ #define PX4_SPIDEV_BARO PX4_MK_SPI_SEL(PX4_SPI_BUS_BARO, 3) +#ifdef CONFIG_STM32_SPI4 +# define PX4_SPIDEV_EXTERNAL PX4_MK_SPI_SEL(PX4_SPI_BUS_EXTERNAL, 1) +#endif /* CONFIG_STM32_SPI4 */ + /* I2C busses. */ #define PX4_I2C_BUS_EXPANSION 1 #define PX4_I2C_BUS_LED PX4_I2C_BUS_EXPANSION @@ -281,6 +309,7 @@ #define GPIO_SPEKTRUM_PWR_EN (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN4) #define GPIO_8266_GPIO0 (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN2) +#define GPIO_8266_GPIO2 (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN4) #define GPIO_8266_PD (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5) #define GPIO_8266_RST (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN6) diff --git a/boards/px4/fmu-v4/src/init.c b/boards/px4/fmu-v4/src/init.c index c57cd29466..13d8545276 100644 --- a/boards/px4/fmu-v4/src/init.c +++ b/boards/px4/fmu-v4/src/init.c @@ -201,17 +201,35 @@ stm32_boardinitialize(void) stm32_configgpio(GPIO_SBUS_INV); stm32_configgpio(GPIO_SPEKTRUM_PWR_EN); + stm32_configgpio(GPIO_8266_GPIO2); stm32_configgpio(GPIO_8266_GPIO0); - stm32_configgpio(GPIO_8266_PD); - stm32_configgpio(GPIO_8266_RST); // Safety - led on in led driver. stm32_configgpio(GPIO_BTN_SAFETY); stm32_configgpio(GPIO_RSSI_IN); stm32_configgpio(GPIO_PPM_IN); - // Configure SPI all interfaces GPIO. - stm32_spiinitialize(PX4_SPI_BUS_RAMTRON | PX4_SPI_BUS_SENSORS); + int spi_init_mask = SPI_BUS_INIT_MASK; + +#if defined(CONFIG_STM32_SPI4) + + /* We have SPI4 is GPIO_8266_GPIO2 PB4 pin 3 Low */ + if (stm32_gpioread(GPIO_8266_GPIO2) == 0) { + spi_init_mask |= SPI_BUS_INIT_MASK_EXT; + + } else { +#endif /* CONFIG_STM32_SPI4 */ + + stm32_configgpio(GPIO_8266_PD); + stm32_configgpio(GPIO_8266_RST); + +#if defined(CONFIG_STM32_SPI4) + } + +#endif /* CONFIG_STM32_SPI4 */ + +// Configure SPI all interfaces GPIO. + stm32_spiinitialize(spi_init_mask); // Configure heater GPIO. stm32_configgpio(GPIO_HEATER_INPUT); @@ -246,6 +264,9 @@ stm32_boardinitialize(void) static struct spi_dev_s *spi1; static struct spi_dev_s *spi2; static struct sdio_dev_s *sdio; +#if defined(CONFIG_STM32_SPI4) +static struct spi_dev_s *spi4; +#endif __EXPORT int board_app_initialize(uintptr_t arg) { @@ -329,6 +350,29 @@ __EXPORT int board_app_initialize(uintptr_t arg) SPI_SELECT(spi2, SPIDEV_FLASH(0), false); SPI_SELECT(spi2, PX4_SPIDEV_BARO, false); +#if defined(CONFIG_STM32_SPI4) + + if (stm32_gpioread(GPIO_8266_GPIO2) == 0) { + syslog(LOG_INFO, "[boot] 8266_GPIO2 - Low Initialize SPI port 4 \n"); + + // Configure SPI-based devices. + spi4 = stm32_spibus_initialize(4); + + if (!spi4) { + syslog(LOG_ERR, "[boot] FAILED to initialize SPI port 4\n"); + + } else { + // Default SPI4 to 20 MHz and de-assert the known chip selects. + SPI_SETFREQUENCY(spi4, 20 * 1000 * 1000); + SPI_SETBITS(spi4, 8); + SPI_SETMODE(spi4, SPIDEV_MODE3); + SPI_SELECT(spi4, PX4_SPIDEV_EXTERNAL, false); + } + } + +#endif /* defined(CONFIG_STM32_SPI4) */ + + #ifdef CONFIG_MMCSD // First, get an instance of the SDIO interface. diff --git a/boards/px4/fmu-v4/src/spi.c b/boards/px4/fmu-v4/src/spi.c index f376f09231..6817bd2dba 100644 --- a/boards/px4/fmu-v4/src/spi.c +++ b/boards/px4/fmu-v4/src/spi.c @@ -60,6 +60,24 @@ * Public Functions ************************************************************************************/ +__EXPORT bool board_has_bus(enum board_bus_types type, uint32_t bus) +{ + bool rv = true; + + switch (type) { + case BOARD_SPI_BUS: +#ifdef CONFIG_STM32_SPI4 + rv = bus != PX4_SPI_BUS_EXTERNAL || (stm32_gpioread(GPIO_8266_GPIO2) == 0); +#endif /* CONFIG_STM32_SPI4 */ + break; + + case BOARD_I2C_BUS: + break; + } + + return rv; +} + /************************************************************************************ * Name: stm32_spiinitialize * @@ -96,6 +114,13 @@ __EXPORT void stm32_spiinitialize(int mask) #endif +#ifdef CONFIG_STM32_SPI4 + + if (mask & PX4_SPI_BUS_EXTERNAL) { + stm32_configgpio(GPIO_SPI4_CS_1); //add cs + } + +#endif /* CONFIG_STM32_SPI4 */ } __EXPORT void stm32_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) @@ -179,6 +204,20 @@ __EXPORT uint8_t stm32_spi2status(FAR struct spi_dev_s *dev, uint32_t devid) } #endif +#ifdef CONFIG_STM32_SPI4 +__EXPORT void stm32_spi4select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) +{ + if (devid == PX4_SPIDEV_EXTERNAL && stm32_gpioread(GPIO_8266_GPIO2) == 0) { + stm32_gpiowrite(GPIO_SPI4_CS_1, !selected); // add cs + } +} + +__EXPORT uint8_t stm32_spi4status(FAR struct spi_dev_s *dev, uint32_t devid) +{ + return SPI_STATUS_PRESENT; +} +#endif /* CONFIG_STM32_SPI4 */ + __EXPORT void board_spi_reset(int ms) { /* disable SPI bus 1 DRDY */ @@ -211,21 +250,52 @@ __EXPORT void board_spi_reset(int ms) stm32_gpiowrite(GPIO_SPI1_MISO_OFF, 0); stm32_gpiowrite(GPIO_SPI1_MOSI_OFF, 0); +#ifdef CONFIG_STM32_SPI4 + + /* disable SPI bus 4*/ + if (stm32_gpioread(GPIO_8266_GPIO2) == 0) { + stm32_configgpio(GPIO_SPI4_SCK_OFF); + stm32_configgpio(GPIO_SPI4_MISO_OFF); + stm32_configgpio(GPIO_SPI4_MOSI_OFF); + + stm32_gpiowrite(GPIO_SPI4_SCK_OFF, 0); + stm32_gpiowrite(GPIO_SPI4_MISO_OFF, 0); + stm32_gpiowrite(GPIO_SPI4_MOSI_OFF, 0); + } + +#endif /* CONFIG_STM32_SPI4 */ /* N.B we do not have control over the SPI 2 buss powered devices * so the the ms5611 is not resetable. */ - /* set the sensor rail off (default) */ stm32_configgpio(GPIO_VDD_3V3_SENSORS_EN); +#ifdef CONFIG_STM32_SPI4 + + if (stm32_gpioread(GPIO_8266_GPIO2) == 0) { + /* set the periph rail off (default) for SPI4 */ + stm32_configgpio(GPIO_PERIPH_3V3_EN); + } + +#endif /* CONFIG_STM32_SPI4 */ + /* wait for the sensor rail to reach GND */ usleep(ms * 1000); syslog(LOG_DEBUG, "reset done, %d ms\n", ms); /* re-enable power */ +#ifdef CONFIG_STM32_SPI4 + + if (stm32_gpioread(GPIO_8266_GPIO2) == 0) { + /* switch the periph rail back on */ + stm32_gpiowrite(GPIO_PERIPH_3V3_EN, 1); + } + +#endif /* CONFIG_STM32_SPI4 */ + /* switch the sensor rail back on */ stm32_gpiowrite(GPIO_VDD_3V3_SENSORS_EN, 1); @@ -236,4 +306,15 @@ __EXPORT void board_spi_reset(int ms) stm32_configgpio(GPIO_SPI1_SCK); stm32_configgpio(GPIO_SPI1_MISO); stm32_configgpio(GPIO_SPI1_MOSI); + +#ifdef CONFIG_STM32_SPI4 + + if (stm32_gpioread(GPIO_8266_GPIO2) == 0) { + stm32_spiinitialize(PX4_SPI_BUS_EXTERNAL); + stm32_configgpio(GPIO_SPI4_SCK); + stm32_configgpio(GPIO_SPI4_MISO); + stm32_configgpio(GPIO_SPI4_MOSI); + } + +#endif /* CONFIG_STM32_SPI4 */ } diff --git a/src/drivers/boards/common/board_common.h b/src/drivers/boards/common/board_common.h index 6c12d2bcf1..249bccf619 100644 --- a/src/drivers/boards/common/board_common.h +++ b/src/drivers/boards/common/board_common.h @@ -1075,6 +1075,24 @@ __EXPORT bool px4_spi_bus_external(int bus); #endif /* BOARD_HAS_SIMPLE_HW_VERSIONING */ +/************************************************************************************ + * Name: board_has_bus + * + ************************************************************************************/ + +enum board_bus_types { + BOARD_SPI_BUS = 1, + BOARD_I2C_BUS = 2 +}; + +#if defined(BOARD_HAS_BUS_MANIFEST) + +__EXPORT bool board_has_bus(enum board_bus_types type, uint32_t bus); + +#else +# define board_has_bus(t, b) true +#endif /* BOARD_HAS_BUS_MANIFEST */ + /************************************************************************************ * Name: board_hardfault_init * diff --git a/src/drivers/pmw3901/pmw3901.cpp b/src/drivers/pmw3901/pmw3901.cpp index 5b68b57ec0..e16b553707 100644 --- a/src/drivers/pmw3901/pmw3901.cpp +++ b/src/drivers/pmw3901/pmw3901.cpp @@ -79,20 +79,25 @@ #include /* Configuration Constants */ -#if defined PX4_SPI_BUS_EXPANSION // crazyflie -#define PMW3901_BUS PX4_SPI_BUS_EXPANSION -#elif defined PX4_SPI_BUS_EXTERNAL1 // fmu-v5 -#define PMW3901_BUS PX4_SPI_BUS_EXTERNAL1 + +#if defined PX4_SPI_BUS_EXPANSION // crazyflie +# define PMW3901_BUS PX4_SPI_BUS_EXPANSION +#elif defined PX4_SPI_BUS_EXTERNAL1 // fmu-v5 +# define PMW3901_BUS PX4_SPI_BUS_EXTERNAL1 +#elif defined PX4_SPI_BUS_EXTERNAL // fmu-v4 extspi +# define PMW3901_BUS PX4_SPI_BUS_EXTERNAL #else -#error "add the required spi bus from board_config.h here" +# error "add the required spi bus from board_config.h here" #endif -#if defined PX4_SPIDEV_EXPANSION_2 // crazyflie flow deck -#define PMW3901_SPIDEV PX4_SPIDEV_EXPANSION_2 -#elif defined PX4_SPIDEV_EXTERNAL1_1 // fmu-v5 ext CS1 -#define PMW3901_SPIDEV PX4_SPIDEV_EXTERNAL1_1 +#if defined PX4_SPIDEV_EXPANSION_2 // crazyflie flow deck +# define PMW3901_SPIDEV PX4_SPIDEV_EXPANSION_2 +#elif defined PX4_SPIDEV_EXTERNAL1_1 // fmu-v5 ext CS1 +# define PMW3901_SPIDEV PX4_SPIDEV_EXTERNAL1_1 +#elif defined PX4_SPIDEV_EXTERNAL // fmu-v4 extspi +# define PMW3901_SPIDEV PX4_SPIDEV_EXTERNAL #else -#error "add the required spi dev from board_config.h here" +# error "add the required spi dev from board_config.h here" #endif #define PMW3901_SPI_BUS_SPEED (2000000L) // 2MHz diff --git a/src/lib/drivers/device/nuttx/SPI.cpp b/src/lib/drivers/device/nuttx/SPI.cpp index 554ca8088a..2036716631 100644 --- a/src/lib/drivers/device/nuttx/SPI.cpp +++ b/src/lib/drivers/device/nuttx/SPI.cpp @@ -94,7 +94,14 @@ SPI::init() /* attach to the spi bus */ if (_dev == nullptr) { - _dev = px4_spibus_initialize(get_device_bus()); + int bus = get_device_bus(); + + if (!board_has_bus(BOARD_SPI_BUS, bus)) { + ret = -ENOENT; + goto out; + } + + _dev = px4_spibus_initialize(bus); } if (_dev == nullptr) {