px4_fmu-v4: add runtime external SPI4 detection to support pmw3901 (#11301)

* The build is built with SPI4. At run time the signal GPIO_8266_GPIO2 it tested. If it is low the SPI4 is configured. If it is high SPI4 is not configured.
 * board_common: Add Notion of Board has bus manifest
This commit is contained in:
David Sidrane
2019-01-29 10:44:15 -08:00
committed by Daniel Agar
parent 53a127beb9
commit 6f9a9b3d2c
11 changed files with 248 additions and 52 deletions

View File

@@ -32,6 +32,7 @@ px4_add_board(
magnetometer # all available magnetometer drivers magnetometer # all available magnetometer drivers
mkblctrl mkblctrl
pca9685 pca9685
pmw3901
pwm_input pwm_input
pwm_out_sim pwm_out_sim
px4flow px4flow

View File

@@ -64,3 +64,5 @@ then
# BMI160 internal SPI bus # BMI160 internal SPI bus
bmi160 start bmi160 start
fi fi
pmw3901 start

View File

@@ -269,11 +269,16 @@
#define GPIO_SPI1_MOSI (GPIO_SPI1_MOSI_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_SCK (GPIO_SPI1_SCK_1|GPIO_SPEED_50MHz)
#define GPIO_SPI2_MISO (GPIO_SPI2_MISO_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_MOSI (GPIO_SPI2_MOSI_1|GPIO_SPEED_50MHz)
#define GPIO_SPI2_SCK (GPIO_SPI2_SCK_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 */ /* Board provides GPIO or other Hardware for signaling to timing analyzer */
#if defined(CONFIG_BOARD_USE_PROBES) #if defined(CONFIG_BOARD_USE_PROBES)

View File

@@ -78,7 +78,7 @@ CONFIG_ARCH="arm"
# ARM Options # ARM Options
# #
# CONFIG_ARCH_CHIP_A1X is not set # 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_C5471 is not set
# CONFIG_ARCH_CHIP_DM320 is not set # CONFIG_ARCH_CHIP_DM320 is not set
# CONFIG_ARCH_CHIP_EFM32 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_COMP6 is not set
# CONFIG_STM32_HAVE_COMP7 is not set # CONFIG_STM32_HAVE_COMP7 is not set
CONFIG_STM32_HAVE_DAC1=y 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_RNG=y
CONFIG_STM32_HAVE_ETHMAC=y CONFIG_STM32_HAVE_ETHMAC=y
CONFIG_STM32_HAVE_I2C2=y CONFIG_STM32_HAVE_I2C2=y
@@ -482,7 +482,6 @@ CONFIG_STM32_CCMDATARAM=y
CONFIG_STM32_DMA1=y CONFIG_STM32_DMA1=y
CONFIG_STM32_DMA2=y CONFIG_STM32_DMA2=y
# CONFIG_STM32_DAC1 is not set # CONFIG_STM32_DAC1 is not set
# CONFIG_STM32_DAC2 is not set
# CONFIG_STM32_DCMI is not set # CONFIG_STM32_DCMI is not set
# CONFIG_STM32_ETHMAC is not set # CONFIG_STM32_ETHMAC is not set
# CONFIG_STM32_FSMC is not set # CONFIG_STM32_FSMC is not set
@@ -501,7 +500,7 @@ CONFIG_STM32_SPI1=y
CONFIG_STM32_SPI2=y CONFIG_STM32_SPI2=y
# CONFIG_STM32_SPI3 is not set # CONFIG_STM32_SPI3 is not set
# CONFIG_STM32_I2S3 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_SPI5 is not set
# CONFIG_STM32_SPI6 is not set # CONFIG_STM32_SPI6 is not set
CONFIG_STM32_SYSCFG=y CONFIG_STM32_SYSCFG=y
@@ -1028,8 +1027,17 @@ CONFIG_WATCHDOG_DEVPATH="/dev/watchdog0"
# LCD Driver Support # LCD Driver Support
# #
# CONFIG_LCD is not set # CONFIG_LCD is not set
#
# Character/Segment LCD Devices
#
# CONFIG_SLCD is not set # CONFIG_SLCD is not set
#
# Other LCD-related Devices
#
# CONFIG_LCD_OTHER is not set
# #
# LED Support # LED Support
# #
@@ -1608,6 +1616,7 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024
# #
# CONFIG_EXAMPLES_ADXL372_TEST is not set # CONFIG_EXAMPLES_ADXL372_TEST is not set
# CONFIG_EXAMPLES_APA102 is not set # CONFIG_EXAMPLES_APA102 is not set
# CONFIG_EXAMPLES_BATTERY is not set
# CONFIG_EXAMPLES_CALIB_UDELAY is not set # CONFIG_EXAMPLES_CALIB_UDELAY is not set
# CONFIG_EXAMPLES_CCTYPE is not set # CONFIG_EXAMPLES_CCTYPE is not set
# CONFIG_EXAMPLES_CHAT 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_SLCD is not set
# CONFIG_EXAMPLES_SMART is not set # CONFIG_EXAMPLES_SMART is not set
# CONFIG_EXAMPLES_SMART_TEST is not set # CONFIG_EXAMPLES_SMART_TEST is not set
# CONFIG_EXAMPLES_SMP is not set
# CONFIG_EXAMPLES_SMPS is not set # CONFIG_EXAMPLES_SMPS is not set
# CONFIG_EXAMPLES_STAT is not set # CONFIG_EXAMPLES_STAT is not set
# CONFIG_EXAMPLES_TCPECHO 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_SUDOKU is not set
# CONFIG_SYSTEM_SYSTEM is not set # CONFIG_SYSTEM_SYSTEM is not set
# CONFIG_SYSTEM_TEE is not set # CONFIG_SYSTEM_TEE is not set
# CONFIG_SYSTEM_TERMCURSES is not set
# CONFIG_SYSTEM_UBLOXMODEM is not set # CONFIG_SYSTEM_UBLOXMODEM is not set
# CONFIG_SYSTEM_VI is not set # CONFIG_SYSTEM_VI is not set
# CONFIG_SYSTEM_ZMODEM is not set # CONFIG_SYSTEM_ZMODEM is not set

View File

@@ -78,7 +78,7 @@ CONFIG_ARCH="arm"
# ARM Options # ARM Options
# #
# CONFIG_ARCH_CHIP_A1X is not set # 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_C5471 is not set
# CONFIG_ARCH_CHIP_DM320 is not set # CONFIG_ARCH_CHIP_DM320 is not set
# CONFIG_ARCH_CHIP_EFM32 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_SAMV7 is not set
CONFIG_ARCH_CHIP_STM32=y CONFIG_ARCH_CHIP_STM32=y
# CONFIG_ARCH_CHIP_STM32F0 is not set # CONFIG_ARCH_CHIP_STM32F0 is not set
# CONFIG_ARCH_CHIP_STM32L0 is not set
# CONFIG_ARCH_CHIP_STM32F7 is not set # CONFIG_ARCH_CHIP_STM32F7 is not set
# CONFIG_ARCH_CHIP_STM32H7 is not set # CONFIG_ARCH_CHIP_STM32H7 is not set
# CONFIG_ARCH_CHIP_STM32L4 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_6 is not set
# CONFIG_STM32_FLASH_CONFIG_8 is not set # CONFIG_STM32_FLASH_CONFIG_8 is not set
# CONFIG_STM32_FLASH_CONFIG_B 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_C is not set
# CONFIG_STM32_FLASH_CONFIG_D is not set # CONFIG_STM32_FLASH_CONFIG_D is not set
# CONFIG_STM32_FLASH_CONFIG_E 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_COMP6 is not set
# CONFIG_STM32_HAVE_COMP7 is not set # CONFIG_STM32_HAVE_COMP7 is not set
CONFIG_STM32_HAVE_DAC1=y 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_RNG=y
CONFIG_STM32_HAVE_ETHMAC=y CONFIG_STM32_HAVE_ETHMAC=y
CONFIG_STM32_HAVE_I2C2=y CONFIG_STM32_HAVE_I2C2=y
@@ -480,7 +482,6 @@ CONFIG_STM32_CCMDATARAM=y
CONFIG_STM32_DMA1=y CONFIG_STM32_DMA1=y
CONFIG_STM32_DMA2=y CONFIG_STM32_DMA2=y
# CONFIG_STM32_DAC1 is not set # CONFIG_STM32_DAC1 is not set
# CONFIG_STM32_DAC2 is not set
# CONFIG_STM32_DCMI is not set # CONFIG_STM32_DCMI is not set
# CONFIG_STM32_ETHMAC is not set # CONFIG_STM32_ETHMAC is not set
# CONFIG_STM32_FSMC 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_I2C2 is not set
# CONFIG_STM32_I2C3 is not set # CONFIG_STM32_I2C3 is not set
CONFIG_STM32_RTC=y CONFIG_STM32_RTC=y
# CONFIG_STM32_USBHOST is not sety
CONFIG_STM32_OTGFS=y CONFIG_STM32_OTGFS=y
# CONFIG_STM32_OTGHS is not set # CONFIG_STM32_OTGHS is not set
CONFIG_STM32_PWR=y CONFIG_STM32_PWR=y
@@ -500,7 +500,7 @@ CONFIG_STM32_SPI1=y
CONFIG_STM32_SPI2=y CONFIG_STM32_SPI2=y
# CONFIG_STM32_SPI3 is not set # CONFIG_STM32_SPI3 is not set
# CONFIG_STM32_I2S3 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_SPI5 is not set
# CONFIG_STM32_SPI6 is not set # CONFIG_STM32_SPI6 is not set
CONFIG_STM32_SYSCFG=y 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_LSECLOCK is not set
# CONFIG_STM32_RTC_LSICLOCK is not set # CONFIG_STM32_RTC_LSICLOCK is not set
CONFIG_STM32_RTC_HSECLOCK=y CONFIG_STM32_RTC_HSECLOCK=y
# CONFIG_STM32_USBHOST is not set
#
# 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
#
# #
# USB Device Configuration # USB Device Configuration
@@ -838,6 +825,7 @@ CONFIG_PREALLOC_TIMERS=50
CONFIG_INIT_ENTRYPOINT=y CONFIG_INIT_ENTRYPOINT=y
# CONFIG_INIT_FILEPATH is not set # CONFIG_INIT_FILEPATH is not set
CONFIG_USER_ENTRYPOINT="nsh_main" CONFIG_USER_ENTRYPOINT="nsh_main"
CONFIG_USERMAIN_PRIORITY=100
CONFIG_RR_INTERVAL=0 CONFIG_RR_INTERVAL=0
# CONFIG_SCHED_SPORADIC is not set # CONFIG_SCHED_SPORADIC is not set
CONFIG_TASK_NAME_SIZE=24 CONFIG_TASK_NAME_SIZE=24
@@ -1039,8 +1027,17 @@ CONFIG_WATCHDOG_DEVPATH="/dev/watchdog0"
# LCD Driver Support # LCD Driver Support
# #
# CONFIG_LCD is not set # CONFIG_LCD is not set
#
# Character/Segment LCD Devices
#
# CONFIG_SLCD is not set # CONFIG_SLCD is not set
#
# Other LCD-related Devices
#
# CONFIG_LCD_OTHER is not set
# #
# LED Support # LED Support
# #
@@ -1619,6 +1616,7 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024
# #
# CONFIG_EXAMPLES_ADXL372_TEST is not set # CONFIG_EXAMPLES_ADXL372_TEST is not set
# CONFIG_EXAMPLES_APA102 is not set # CONFIG_EXAMPLES_APA102 is not set
# CONFIG_EXAMPLES_BATTERY is not set
# CONFIG_EXAMPLES_CALIB_UDELAY is not set # CONFIG_EXAMPLES_CALIB_UDELAY is not set
# CONFIG_EXAMPLES_CCTYPE is not set # CONFIG_EXAMPLES_CCTYPE is not set
# CONFIG_EXAMPLES_CHAT 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_NXDEMO is not set
# CONFIG_EXAMPLES_NXFFS is not set # CONFIG_EXAMPLES_NXFFS is not set
# CONFIG_EXAMPLES_OBD2 is not set # CONFIG_EXAMPLES_OBD2 is not set
# CONFIG_EXAMPLES_OSTEST is not set
# CONFIG_EXAMPLES_PCA9635 is not set # CONFIG_EXAMPLES_PCA9635 is not set
# CONFIG_EXAMPLES_PDCURSES is not set # CONFIG_EXAMPLES_PDCURSES is not set
# CONFIG_EXAMPLES_PIPE is not set # CONFIG_EXAMPLES_PIPE is not set
# CONFIG_EXAMPLES_POPEN is not set
# CONFIG_EXAMPLES_POSIXSPAWN is not set # CONFIG_EXAMPLES_POSIXSPAWN is not set
# CONFIG_EXAMPLES_POWERLED is not set # CONFIG_EXAMPLES_POWERLED is not set
# CONFIG_EXAMPLES_POWERMONITOR 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_SLCD is not set
# CONFIG_EXAMPLES_SMART is not set # CONFIG_EXAMPLES_SMART is not set
# CONFIG_EXAMPLES_SMART_TEST is not set # CONFIG_EXAMPLES_SMART_TEST is not set
# CONFIG_EXAMPLES_SMP is not set
# CONFIG_EXAMPLES_SMPS is not set # CONFIG_EXAMPLES_SMPS is not set
# CONFIG_EXAMPLES_STAT is not set # CONFIG_EXAMPLES_STAT is not set
# CONFIG_EXAMPLES_TCPECHO is not set # CONFIG_EXAMPLES_TCPECHO is not set
@@ -1834,9 +1829,7 @@ CONFIG_NSH_MMCSDSLOTNO=0
# Configure Command Options # Configure Command Options
# #
CONFIG_NSH_VARS=y CONFIG_NSH_VARS=y
# CONFIG_NSH_CMDOPT_DD_STATS is not set
CONFIG_NSH_CODECS_BUFSIZE=128 CONFIG_NSH_CODECS_BUFSIZE=128
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_NSH_PROC_MOUNTPOINT="/proc" CONFIG_NSH_PROC_MOUNTPOINT="/proc"
CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_STRERROR=y CONFIG_NSH_STRERROR=y
@@ -1907,6 +1900,7 @@ CONFIG_READLINE_ECHO=y
# CONFIG_SYSTEM_SUDOKU is not set # CONFIG_SYSTEM_SUDOKU is not set
# CONFIG_SYSTEM_SYSTEM is not set # CONFIG_SYSTEM_SYSTEM is not set
# CONFIG_SYSTEM_TEE is not set # CONFIG_SYSTEM_TEE is not set
# CONFIG_SYSTEM_TERMCURSES is not set
# CONFIG_SYSTEM_UBLOXMODEM is not set # CONFIG_SYSTEM_UBLOXMODEM is not set
# CONFIG_SYSTEM_VI is not set # CONFIG_SYSTEM_VI is not set
# CONFIG_SYSTEM_ZMODEM is not set # CONFIG_SYSTEM_ZMODEM is not set
@@ -1914,6 +1908,7 @@ CONFIG_READLINE_ECHO=y
# #
# Testing # Testing
# #
# CONFIG_TESTING_OSTEST is not set
# CONFIG_TESTING_UNITY is not set # CONFIG_TESTING_UNITY is not set
# #

View File

@@ -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_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) #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 * Define the ability to shut off off the sensor signals
* by changing the signals to inputs. * 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_PORTC_PIN14 _PIN_OFF(GPIO_DRDY_PORTC_PIN14)
#define GPIO_DRDY_OFF_PORTE_PIN12 _PIN_OFF(GPIO_DRDY_PORTE_PIN12) #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 * N.B we do not have control over the SPI 2 buss powered devices
* so the the ms5611 is not resetable. * so the the ms5611 is not resetable.
*
*/ */
#define PX4_SPI_BUS_SENSORS 1 #define PX4_SPI_BUS_SENSORS 1
#define PX4_SPI_BUS_RAMTRON 2 #define PX4_SPI_BUS_RAMTRON 2
#define PX4_SPI_BUS_BARO PX4_SPI_BUS_RAMTRON #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 */ /* 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_GYRO PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 1)
#define PX4_SPIDEV_ACCEL_MAG PX4_MK_SPI_SEL(PX4_SPI_BUS_SENSORS, 2) #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) #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. */ /* I2C busses. */
#define PX4_I2C_BUS_EXPANSION 1 #define PX4_I2C_BUS_EXPANSION 1
#define PX4_I2C_BUS_LED PX4_I2C_BUS_EXPANSION #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_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_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_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) #define GPIO_8266_RST (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN6)

View File

@@ -201,17 +201,35 @@ stm32_boardinitialize(void)
stm32_configgpio(GPIO_SBUS_INV); stm32_configgpio(GPIO_SBUS_INV);
stm32_configgpio(GPIO_SPEKTRUM_PWR_EN); stm32_configgpio(GPIO_SPEKTRUM_PWR_EN);
stm32_configgpio(GPIO_8266_GPIO2);
stm32_configgpio(GPIO_8266_GPIO0); stm32_configgpio(GPIO_8266_GPIO0);
stm32_configgpio(GPIO_8266_PD);
stm32_configgpio(GPIO_8266_RST);
// Safety - led on in led driver. // Safety - led on in led driver.
stm32_configgpio(GPIO_BTN_SAFETY); stm32_configgpio(GPIO_BTN_SAFETY);
stm32_configgpio(GPIO_RSSI_IN); stm32_configgpio(GPIO_RSSI_IN);
stm32_configgpio(GPIO_PPM_IN); stm32_configgpio(GPIO_PPM_IN);
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. // Configure SPI all interfaces GPIO.
stm32_spiinitialize(PX4_SPI_BUS_RAMTRON | PX4_SPI_BUS_SENSORS); stm32_spiinitialize(spi_init_mask);
// Configure heater GPIO. // Configure heater GPIO.
stm32_configgpio(GPIO_HEATER_INPUT); stm32_configgpio(GPIO_HEATER_INPUT);
@@ -246,6 +264,9 @@ stm32_boardinitialize(void)
static struct spi_dev_s *spi1; static struct spi_dev_s *spi1;
static struct spi_dev_s *spi2; static struct spi_dev_s *spi2;
static struct sdio_dev_s *sdio; 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) __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, SPIDEV_FLASH(0), false);
SPI_SELECT(spi2, PX4_SPIDEV_BARO, 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 #ifdef CONFIG_MMCSD
// First, get an instance of the SDIO interface. // First, get an instance of the SDIO interface.

View File

@@ -60,6 +60,24 @@
* Public Functions * 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 * Name: stm32_spiinitialize
* *
@@ -96,6 +114,13 @@ __EXPORT void stm32_spiinitialize(int mask)
#endif #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) __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 #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) __EXPORT void board_spi_reset(int ms)
{ {
/* disable SPI bus 1 DRDY */ /* 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_MISO_OFF, 0);
stm32_gpiowrite(GPIO_SPI1_MOSI_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 /* N.B we do not have control over the SPI 2 buss powered devices
* so the the ms5611 is not resetable. * so the the ms5611 is not resetable.
*/ */
/* set the sensor rail off (default) */ /* set the sensor rail off (default) */
stm32_configgpio(GPIO_VDD_3V3_SENSORS_EN); 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 */ /* wait for the sensor rail to reach GND */
usleep(ms * 1000); usleep(ms * 1000);
syslog(LOG_DEBUG, "reset done, %d ms\n", ms); syslog(LOG_DEBUG, "reset done, %d ms\n", ms);
/* re-enable power */ /* 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 */ /* switch the sensor rail back on */
stm32_gpiowrite(GPIO_VDD_3V3_SENSORS_EN, 1); 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_SCK);
stm32_configgpio(GPIO_SPI1_MISO); stm32_configgpio(GPIO_SPI1_MISO);
stm32_configgpio(GPIO_SPI1_MOSI); 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 */
} }

View File

@@ -1075,6 +1075,24 @@ __EXPORT bool px4_spi_bus_external(int bus);
#endif /* BOARD_HAS_SIMPLE_HW_VERSIONING */ #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 * Name: board_hardfault_init
* *

View File

@@ -79,10 +79,13 @@
#include <board_config.h> #include <board_config.h>
/* Configuration Constants */ /* Configuration Constants */
#if defined PX4_SPI_BUS_EXPANSION // crazyflie #if defined PX4_SPI_BUS_EXPANSION // crazyflie
# define PMW3901_BUS PX4_SPI_BUS_EXPANSION # define PMW3901_BUS PX4_SPI_BUS_EXPANSION
#elif defined PX4_SPI_BUS_EXTERNAL1 // fmu-v5 #elif defined PX4_SPI_BUS_EXTERNAL1 // fmu-v5
# define PMW3901_BUS PX4_SPI_BUS_EXTERNAL1 # define PMW3901_BUS PX4_SPI_BUS_EXTERNAL1
#elif defined PX4_SPI_BUS_EXTERNAL // fmu-v4 extspi
# define PMW3901_BUS PX4_SPI_BUS_EXTERNAL
#else #else
# error "add the required spi bus from board_config.h here" # error "add the required spi bus from board_config.h here"
#endif #endif
@@ -91,6 +94,8 @@
# define PMW3901_SPIDEV PX4_SPIDEV_EXPANSION_2 # define PMW3901_SPIDEV PX4_SPIDEV_EXPANSION_2
#elif defined PX4_SPIDEV_EXTERNAL1_1 // fmu-v5 ext CS1 #elif defined PX4_SPIDEV_EXTERNAL1_1 // fmu-v5 ext CS1
# define PMW3901_SPIDEV PX4_SPIDEV_EXTERNAL1_1 # define PMW3901_SPIDEV PX4_SPIDEV_EXTERNAL1_1
#elif defined PX4_SPIDEV_EXTERNAL // fmu-v4 extspi
# define PMW3901_SPIDEV PX4_SPIDEV_EXTERNAL
#else #else
# error "add the required spi dev from board_config.h here" # error "add the required spi dev from board_config.h here"
#endif #endif

View File

@@ -94,7 +94,14 @@ SPI::init()
/* attach to the spi bus */ /* attach to the spi bus */
if (_dev == nullptr) { 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) { if (_dev == nullptr) {