diff --git a/boards/cubepilot/cubeorange/nuttx-config/nsh/defconfig b/boards/cubepilot/cubeorange/nuttx-config/nsh/defconfig index 4e0386b66f..de9ac663c7 100644 --- a/boards/cubepilot/cubeorange/nuttx-config/nsh/defconfig +++ b/boards/cubepilot/cubeorange/nuttx-config/nsh/defconfig @@ -223,7 +223,9 @@ CONFIG_USART3_RXBUFSIZE=600 CONFIG_USART3_TXBUFSIZE=3000 CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/cubepilot/cubeorange/nuttx-config/test/defconfig b/boards/cubepilot/cubeorange/nuttx-config/test/defconfig index 6470c318c1..b6ceb3fc5f 100644 --- a/boards/cubepilot/cubeorange/nuttx-config/test/defconfig +++ b/boards/cubepilot/cubeorange/nuttx-config/test/defconfig @@ -221,7 +221,9 @@ CONFIG_USART3_RXBUFSIZE=600 CONFIG_USART3_TXBUFSIZE=3000 CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/cubepilot/cubeorange/src/board_config.h b/boards/cubepilot/cubeorange/src/board_config.h index 15e60d4400..83681ba736 100644 --- a/boards/cubepilot/cubeorange/src/board_config.h +++ b/boards/cubepilot/cubeorange/src/board_config.h @@ -47,16 +47,6 @@ /* PX4IO connection configuration */ #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS3" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* LEDs */ #define GPIO_nLED_AMBER /* PE12 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN12) diff --git a/boards/cubepilot/cubeyellow/nuttx-config/nsh/defconfig b/boards/cubepilot/cubeyellow/nuttx-config/nsh/defconfig index 8609d06f24..13fbc25afb 100644 --- a/boards/cubepilot/cubeyellow/nuttx-config/nsh/defconfig +++ b/boards/cubepilot/cubeyellow/nuttx-config/nsh/defconfig @@ -230,6 +230,7 @@ CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=600 CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/cubepilot/cubeyellow/src/board_config.h b/boards/cubepilot/cubeyellow/src/board_config.h index dfa27265c0..e5bdb03a7b 100644 --- a/boards/cubepilot/cubeyellow/src/board_config.h +++ b/boards/cubepilot/cubeyellow/src/board_config.h @@ -47,16 +47,6 @@ /* PX4IO connection configuration */ #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS3" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* LEDs */ #define GPIO_nLED_AMBER /* PE12 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN12) diff --git a/boards/holybro/durandal-v1/nuttx-config/nsh/defconfig b/boards/holybro/durandal-v1/nuttx-config/nsh/defconfig index a934d55097..8e6bf69715 100644 --- a/boards/holybro/durandal-v1/nuttx-config/nsh/defconfig +++ b/boards/holybro/durandal-v1/nuttx-config/nsh/defconfig @@ -216,7 +216,9 @@ CONFIG_UART7_SERIAL_CONSOLE=y CONFIG_UART7_TXBUFSIZE=1500 CONFIG_UART8_BAUD=57600 CONFIG_UART8_RXBUFSIZE=600 +CONFIG_UART8_RXDMA=y CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_TXDMA=y CONFIG_USART1_BAUD=57600 CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 diff --git a/boards/holybro/durandal-v1/src/board_config.h b/boards/holybro/durandal-v1/src/board_config.h index f18a2591e1..430830d987 100644 --- a/boards/holybro/durandal-v1/src/board_config.h +++ b/boards/holybro/durandal-v1/src/board_config.h @@ -54,19 +54,8 @@ ****************************************************************************************************/ /* PX4IO connection configuration */ - #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS6" -#define PX4IO_SERIAL_TX_GPIO GPIO_UART8_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_UART8_RX -#define PX4IO_SERIAL_BASE STM32_UART8_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_UART8 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_UART8_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_UART8_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB1LENR -#define PX4IO_SERIAL_RCC_EN RCC_APB1LENR_UART8EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK1_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* Configuration ************************************************************************************/ diff --git a/boards/holybro/pix32v5/nuttx-config/nsh/defconfig b/boards/holybro/pix32v5/nuttx-config/nsh/defconfig index cbf89393bf..9e00b32da0 100644 --- a/boards/holybro/pix32v5/nuttx-config/nsh/defconfig +++ b/boards/holybro/pix32v5/nuttx-config/nsh/defconfig @@ -216,6 +216,7 @@ CONFIG_UART8_BAUD=57600 CONFIG_UART8_RXBUFSIZE=600 CONFIG_UART8_RXDMA=y CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_TXDMA=y CONFIG_USART1_BAUD=57600 CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 diff --git a/boards/holybro/pix32v5/src/board_config.h b/boards/holybro/pix32v5/src/board_config.h index 879a7ad168..8caddb6330 100644 --- a/boards/holybro/pix32v5/src/board_config.h +++ b/boards/holybro/pix32v5/src/board_config.h @@ -54,19 +54,8 @@ ****************************************************************************************************/ /* PX4IO connection configuration */ - #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS6" -#define PX4IO_SERIAL_TX_GPIO GPIO_UART8_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_UART8_RX -#define PX4IO_SERIAL_BASE STM32_UART8_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_UART8 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_UART8_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_UART8_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB1ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB1ENR_UART8EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK1_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* Configuration ************************************************************************************/ diff --git a/boards/modalai/fc-v2/src/board_config.h b/boards/modalai/fc-v2/src/board_config.h index caadee90b7..71f6ce97fc 100644 --- a/boards/modalai/fc-v2/src/board_config.h +++ b/boards/modalai/fc-v2/src/board_config.h @@ -53,26 +53,6 @@ * Definitions ****************************************************************************************************/ -/* PX4IO connection configuration */ - -#define BOARD_USES_PX4IO_VERSION 2 -#define PX4IO_SERIAL_DEVICE "/dev/ttyS5" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ - -/* Configuration ************************************************************************************/ - - -/* PX4FMU GPIOs ***********************************************************************************/ - /* Trace Clock and D0-D3 are available on the trace connector * * TRACECLK PE2 - Dedicated - Trace Connector Pin 1 diff --git a/boards/mro/x21-777/src/board_config.h b/boards/mro/x21-777/src/board_config.h index 30abf1e467..a18bf23b3e 100644 --- a/boards/mro/x21-777/src/board_config.h +++ b/boards/mro/x21-777/src/board_config.h @@ -47,19 +47,8 @@ /* PX4IO connection configuration */ #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS4" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* LEDs */ - #define GPIO_LED1 (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN12) #define BOARD_OVERLOAD_LED LED_RED diff --git a/boards/mro/x21/nuttx-config/nsh/defconfig b/boards/mro/x21/nuttx-config/nsh/defconfig index e09d3dbb50..1fe4f46a77 100644 --- a/boards/mro/x21/nuttx-config/nsh/defconfig +++ b/boards/mro/x21/nuttx-config/nsh/defconfig @@ -223,6 +223,7 @@ CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=300 CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=300 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/mro/x21/src/board_config.h b/boards/mro/x21/src/board_config.h index be6da1a332..e6f4077bac 100644 --- a/boards/mro/x21/src/board_config.h +++ b/boards/mro/x21/src/board_config.h @@ -55,17 +55,6 @@ /* PX4IO connection configuration */ #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS4" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE /* hardwired on the board */ -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ - /* PX4FMU GPIOs ***********************************************************************************/ /* LEDs */ diff --git a/boards/nxp/fmurt1062-v1/src/board_config.h b/boards/nxp/fmurt1062-v1/src/board_config.h index 418c3f33d4..22a5d011b0 100644 --- a/boards/nxp/fmurt1062-v1/src/board_config.h +++ b/boards/nxp/fmurt1062-v1/src/board_config.h @@ -57,26 +57,6 @@ * Definitions ****************************************************************************************************/ -/* PX4IO connection configuration */ - -#if 0 // There is no PX4IO Support on first out -// This requires serial DMA driver -#define BOARD_USES_PX4IO_VERSION 2 -#define PX4IO_SERIAL_DEVICE "/dev/ttyS6" -#define PX4IO_SERIAL_TX_GPIO GPIO_LPUART8_TX_2 -#define PX4IO_SERIAL_RX_GPIO GPIO_LPUART8_RX_2 -#define PX4IO_SERIAL_BASE IMXRT_LPUART8_BASE -#define PX4IO_SERIAL_VECTOR IMXRT_IRQ_LPUART8 -#define PX4IO_SERIAL_TX_DMAMAP -#define PX4IO_SERIAL_RX_DMAMAP -#define PX4IO_SERIAL_RCC_REG -#define PX4IO_SERIAL_RCC_EN -#define PX4IO_SERIAL_CLOCK -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ -#endif - -/* Configuration ************************************************************************************/ - /* FMURT1062 GPIOs ***********************************************************************************/ /* LEDs */ /* An RGB LED is connected through GPIO as shown below: diff --git a/boards/px4/fmu-v2/nuttx-config/nsh/defconfig b/boards/px4/fmu-v2/nuttx-config/nsh/defconfig index b3144a3820..559349df9c 100644 --- a/boards/px4/fmu-v2/nuttx-config/nsh/defconfig +++ b/boards/px4/fmu-v2/nuttx-config/nsh/defconfig @@ -229,6 +229,7 @@ CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=300 CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=300 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/px4/fmu-v2/src/board_config.h b/boards/px4/fmu-v2/src/board_config.h index f3b462e42c..930d82e674 100644 --- a/boards/px4/fmu-v2/src/board_config.h +++ b/boards/px4/fmu-v2/src/board_config.h @@ -70,17 +70,6 @@ /* PX4IO connection configuration */ #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS4" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE /* hardwired on the board */ -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ - /* PX4FMU GPIOs ***********************************************************************************/ /* LEDs */ @@ -160,6 +149,7 @@ #define BOARD_DSHOT_MOTOR_ASSIGNMENT {3, 2, 1, 0, 4, 5}; + __BEGIN_DECLS /**************************************************************************************************** diff --git a/boards/px4/fmu-v2/src/init.c b/boards/px4/fmu-v2/src/init.c index 61cc923fd6..2973184961 100644 --- a/boards/px4/fmu-v2/src/init.c +++ b/boards/px4/fmu-v2/src/init.c @@ -514,7 +514,6 @@ __EXPORT int board_app_initialize(uintptr_t arg) #endif /* Configure the HW based on the manifest */ - px4_platform_configure(); return OK; diff --git a/boards/px4/fmu-v3/nuttx-config/nsh/defconfig b/boards/px4/fmu-v3/nuttx-config/nsh/defconfig index fb85646a8d..4e4cfe92c2 100644 --- a/boards/px4/fmu-v3/nuttx-config/nsh/defconfig +++ b/boards/px4/fmu-v3/nuttx-config/nsh/defconfig @@ -226,6 +226,7 @@ CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=300 CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=300 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/px4/fmu-v3/src/board_config.h b/boards/px4/fmu-v3/src/board_config.h index c986ecb714..361ceb6cf0 100644 --- a/boards/px4/fmu-v3/src/board_config.h +++ b/boards/px4/fmu-v3/src/board_config.h @@ -70,17 +70,6 @@ /* PX4IO connection configuration */ #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS4" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE /* hardwired on the board */ -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ - /* PX4FMU GPIOs ***********************************************************************************/ /* LEDs */ diff --git a/boards/px4/fmu-v4pro/nuttx-config/nsh/defconfig b/boards/px4/fmu-v4pro/nuttx-config/nsh/defconfig index 05ee2ec9bb..18f3091d97 100644 --- a/boards/px4/fmu-v4pro/nuttx-config/nsh/defconfig +++ b/boards/px4/fmu-v4pro/nuttx-config/nsh/defconfig @@ -232,6 +232,7 @@ CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=300 CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=300 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/px4/fmu-v4pro/src/board_config.h b/boards/px4/fmu-v4pro/src/board_config.h index e45c81f116..547de58d78 100644 --- a/boards/px4/fmu-v4pro/src/board_config.h +++ b/boards/px4/fmu-v4pro/src/board_config.h @@ -54,16 +54,6 @@ /* PX4IO connection configuration */ #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS4" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE /* hardwired on the board */ -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* Configuration ************************************************************************************/ //{GPIO_RSSI_IN, 0, 0}, - pio Analog used as PWM diff --git a/boards/px4/fmu-v5/nuttx-config/cryptotest/defconfig b/boards/px4/fmu-v5/nuttx-config/cryptotest/defconfig index e245364b99..ee9a5101a6 100644 --- a/boards/px4/fmu-v5/nuttx-config/cryptotest/defconfig +++ b/boards/px4/fmu-v5/nuttx-config/cryptotest/defconfig @@ -54,7 +54,6 @@ CONFIG_CDCACM_RXBUFSIZE=600 CONFIG_CDCACM_TXBUFSIZE=12000 CONFIG_CDCACM_VENDORID=0x26ac CONFIG_CDCACM_VENDORSTR="3D Robotics" -CONFIG_CLOCK_MONOTONIC=y CONFIG_CRYPTO=y CONFIG_CRYPTO_RANDOM_POOL=y CONFIG_DEBUG_FULLOPT=y @@ -65,6 +64,7 @@ CONFIG_DEV_FIFO_SIZE=0 CONFIG_DEV_PIPE_MAXSIZE=1024 CONFIG_DEV_PIPE_SIZE=70 CONFIG_DISABLE_MQUEUE=y +CONFIG_EXAMPLES_CALIB_UDELAY=y CONFIG_FAT_DMAMEMORY=y CONFIG_FAT_LCNAMES=y CONFIG_FAT_LFN=y @@ -86,7 +86,6 @@ CONFIG_HAVE_CXXINITIALIZE=y CONFIG_I2C=y CONFIG_I2C_RESET=y CONFIG_IDLETHREAD_STACKSIZE=750 -CONFIG_LIBC_FLOATINGPOINT=y CONFIG_LIBC_LONG_LONG=y CONFIG_LIBC_STRERROR=y CONFIG_MEMSET_64BIT=y @@ -218,6 +217,7 @@ CONFIG_UART8_BAUD=57600 CONFIG_UART8_RXBUFSIZE=600 CONFIG_UART8_RXDMA=y CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_TXDMA=y CONFIG_USART1_BAUD=57600 CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 diff --git a/boards/px4/fmu-v5/nuttx-config/debug/defconfig b/boards/px4/fmu-v5/nuttx-config/debug/defconfig index ec4e61d5e3..3acaa1783b 100644 --- a/boards/px4/fmu-v5/nuttx-config/debug/defconfig +++ b/boards/px4/fmu-v5/nuttx-config/debug/defconfig @@ -31,7 +31,7 @@ CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" CONFIG_ARCH_CHIP="stm32f7" CONFIG_ARCH_CHIP_STM32F765II=y CONFIG_ARCH_CHIP_STM32F7=y -CONFIG_ARCH_INTERRUPTSTACK=1024 +CONFIG_ARCH_INTERRUPTSTACK=512 CONFIG_ARCH_STACKDUMP=y CONFIG_ARMV7M_BASEPRI_WAR=y CONFIG_ARMV7M_DCACHE=y @@ -54,7 +54,6 @@ CONFIG_CDCACM_RXBUFSIZE=600 CONFIG_CDCACM_TXBUFSIZE=12000 CONFIG_CDCACM_VENDORID=0x26ac CONFIG_CDCACM_VENDORSTR="3D Robotics" -CONFIG_CLOCK_MONOTONIC=y CONFIG_DEBUG_ASSERTIONS=y CONFIG_DEBUG_BINFMT=y CONFIG_DEBUG_BINFMT_ERROR=y @@ -111,6 +110,7 @@ CONFIG_DEV_FIFO_SIZE=0 CONFIG_DEV_PIPE_MAXSIZE=1024 CONFIG_DEV_PIPE_SIZE=70 CONFIG_DISABLE_MQUEUE=y +CONFIG_EXAMPLES_CALIB_UDELAY=y CONFIG_FAT_DMAMEMORY=y CONFIG_FAT_LCNAMES=y CONFIG_FAT_LFN=y @@ -131,8 +131,7 @@ CONFIG_HAVE_CXX=y CONFIG_HAVE_CXXINITIALIZE=y CONFIG_I2C=y CONFIG_I2C_RESET=y -CONFIG_IDLETHREAD_STACKSIZE=1064 -CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_IDLETHREAD_STACKSIZE=750 CONFIG_LIBC_LONG_LONG=y CONFIG_LIBC_STRERROR=y CONFIG_MEMSET_64BIT=y @@ -178,12 +177,12 @@ CONFIG_RTC_DATETIME=y CONFIG_SCHED_ATEXIT=y CONFIG_SCHED_HPWORK=y CONFIG_SCHED_HPWORKPRIORITY=249 -CONFIG_SCHED_HPWORKSTACKSIZE=1300 +CONFIG_SCHED_HPWORKSTACKSIZE=1280 CONFIG_SCHED_INSTRUMENTATION=y CONFIG_SCHED_INSTRUMENTATION_EXTERNAL=y CONFIG_SCHED_LPWORK=y CONFIG_SCHED_LPWORKPRIORITY=50 -CONFIG_SCHED_LPWORKSTACKSIZE=1728 +CONFIG_SCHED_LPWORKSTACKSIZE=1632 CONFIG_SCHED_WAITPID=y CONFIG_SDCLONE_DISABLE=y CONFIG_SDMMC1_SDIO_MODE=y @@ -207,6 +206,7 @@ CONFIG_STM32F7_BBSRAM_FILES=5 CONFIG_STM32F7_BKPSRAM=y CONFIG_STM32F7_DMA1=y CONFIG_STM32F7_DMA2=y +CONFIG_STM32F7_DMACAPABLE=y CONFIG_STM32F7_FLOWCONTROL_BROKEN=y CONFIG_STM32F7_I2C1=y CONFIG_STM32F7_I2C2=y @@ -218,7 +218,7 @@ CONFIG_STM32F7_OTGFS=y CONFIG_STM32F7_PROGMEM=y CONFIG_STM32F7_PWR=y CONFIG_STM32F7_RTC=y -CONFIG_STM32F7_RTC_HSECLOCK=y +CONFIG_STM32F7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y CONFIG_STM32F7_RTC_MAGIC_REG=1 CONFIG_STM32F7_SAVE_CRASHDUMP=y CONFIG_STM32F7_SDMMC1=y @@ -263,6 +263,7 @@ CONFIG_UART8_BAUD=57600 CONFIG_UART8_RXBUFSIZE=600 CONFIG_UART8_RXDMA=y CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_TXDMA=y CONFIG_USART1_BAUD=57600 CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 diff --git a/boards/px4/fmu-v5/nuttx-config/nsh/defconfig b/boards/px4/fmu-v5/nuttx-config/nsh/defconfig index 937cd5ab8b..c7c315f266 100644 --- a/boards/px4/fmu-v5/nuttx-config/nsh/defconfig +++ b/boards/px4/fmu-v5/nuttx-config/nsh/defconfig @@ -215,6 +215,7 @@ CONFIG_UART8_BAUD=57600 CONFIG_UART8_RXBUFSIZE=600 CONFIG_UART8_RXDMA=y CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_TXDMA=y CONFIG_USART1_BAUD=57600 CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 diff --git a/boards/px4/fmu-v5/nuttx-config/stackcheck/defconfig b/boards/px4/fmu-v5/nuttx-config/stackcheck/defconfig index 94f4eca1bd..950d5d5c0c 100644 --- a/boards/px4/fmu-v5/nuttx-config/stackcheck/defconfig +++ b/boards/px4/fmu-v5/nuttx-config/stackcheck/defconfig @@ -55,7 +55,6 @@ CONFIG_CDCACM_RXBUFSIZE=600 CONFIG_CDCACM_TXBUFSIZE=12000 CONFIG_CDCACM_VENDORID=0x26ac CONFIG_CDCACM_VENDORSTR="3D Robotics" -CONFIG_CLOCK_MONOTONIC=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_HARDFAULT_ALERT=y CONFIG_DEBUG_SYMBOLS=y @@ -64,6 +63,7 @@ CONFIG_DEV_FIFO_SIZE=0 CONFIG_DEV_PIPE_MAXSIZE=1024 CONFIG_DEV_PIPE_SIZE=70 CONFIG_DISABLE_MQUEUE=y +CONFIG_EXAMPLES_CALIB_UDELAY=y CONFIG_FAT_DMAMEMORY=y CONFIG_FAT_LCNAMES=y CONFIG_FAT_LFN=y @@ -84,8 +84,7 @@ CONFIG_HAVE_CXX=y CONFIG_HAVE_CXXINITIALIZE=y CONFIG_I2C=y CONFIG_I2C_RESET=y -CONFIG_IDLETHREAD_STACKSIZE=864 -CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_IDLETHREAD_STACKSIZE=750 CONFIG_LIBC_LONG_LONG=y CONFIG_LIBC_STRERROR=y CONFIG_MEMSET_64BIT=y @@ -172,7 +171,7 @@ CONFIG_STM32F7_OTGFS=y CONFIG_STM32F7_PROGMEM=y CONFIG_STM32F7_PWR=y CONFIG_STM32F7_RTC=y -CONFIG_STM32F7_RTC_HSECLOCK=y +CONFIG_STM32F7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y CONFIG_STM32F7_RTC_MAGIC_REG=1 CONFIG_STM32F7_SAVE_CRASHDUMP=y CONFIG_STM32F7_SDMMC1=y @@ -217,6 +216,7 @@ CONFIG_UART8_BAUD=57600 CONFIG_UART8_RXBUFSIZE=600 CONFIG_UART8_RXDMA=y CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_TXDMA=y CONFIG_USART1_BAUD=57600 CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 diff --git a/boards/px4/fmu-v5/nuttx-config/uavcanv1/defconfig b/boards/px4/fmu-v5/nuttx-config/uavcanv1/defconfig index 5b27f12ead..1c4b038e5a 100644 --- a/boards/px4/fmu-v5/nuttx-config/uavcanv1/defconfig +++ b/boards/px4/fmu-v5/nuttx-config/uavcanv1/defconfig @@ -56,7 +56,6 @@ CONFIG_CDCACM_RXBUFSIZE=600 CONFIG_CDCACM_TXBUFSIZE=12000 CONFIG_CDCACM_VENDORID=0x26ac CONFIG_CDCACM_VENDORSTR="3D Robotics" -CONFIG_CLOCK_MONOTONIC=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_HARDFAULT_ALERT=y CONFIG_DEBUG_SYMBOLS=y @@ -65,6 +64,7 @@ CONFIG_DEV_FIFO_SIZE=0 CONFIG_DEV_PIPE_MAXSIZE=1024 CONFIG_DEV_PIPE_SIZE=70 CONFIG_DISABLE_MQUEUE=y +CONFIG_EXAMPLES_CALIB_UDELAY=y CONFIG_FAT_DMAMEMORY=y CONFIG_FAT_LCNAMES=y CONFIG_FAT_LFN=y @@ -86,7 +86,6 @@ CONFIG_HAVE_CXXINITIALIZE=y CONFIG_I2C=y CONFIG_I2C_RESET=y CONFIG_IDLETHREAD_STACKSIZE=750 -CONFIG_LIBC_FLOATINGPOINT=y CONFIG_LIBC_LONG_LONG=y CONFIG_LIBC_STRERROR=y CONFIG_MEMSET_64BIT=y @@ -177,7 +176,7 @@ CONFIG_STM32F7_OTGFS=y CONFIG_STM32F7_PROGMEM=y CONFIG_STM32F7_PWR=y CONFIG_STM32F7_RTC=y -CONFIG_STM32F7_RTC_HSECLOCK=y +CONFIG_STM32F7_RTC_AUTO_LSECLOCK_START_DRV_CAPABILITY=y CONFIG_STM32F7_RTC_MAGIC_REG=1 CONFIG_STM32F7_SAVE_CRASHDUMP=y CONFIG_STM32F7_SDMMC1=y @@ -222,6 +221,7 @@ CONFIG_UART8_BAUD=57600 CONFIG_UART8_RXBUFSIZE=600 CONFIG_UART8_RXDMA=y CONFIG_UART8_TXBUFSIZE=1500 +CONFIG_UART8_TXDMA=y CONFIG_USART1_BAUD=57600 CONFIG_USART1_RXBUFSIZE=600 CONFIG_USART1_TXBUFSIZE=1500 diff --git a/boards/px4/fmu-v5/src/board_config.h b/boards/px4/fmu-v5/src/board_config.h index c6eedce45a..6b93916dd6 100644 --- a/boards/px4/fmu-v5/src/board_config.h +++ b/boards/px4/fmu-v5/src/board_config.h @@ -54,19 +54,8 @@ ****************************************************************************************************/ /* PX4IO connection configuration */ - #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS6" -#define PX4IO_SERIAL_TX_GPIO GPIO_UART8_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_UART8_RX -#define PX4IO_SERIAL_BASE STM32_UART8_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_UART8 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_UART8_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_UART8_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB1ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB1ENR_UART8EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK1_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* Configuration ************************************************************************************/ diff --git a/boards/px4/fmu-v5x/nuttx-config/nsh/defconfig b/boards/px4/fmu-v5x/nuttx-config/nsh/defconfig index 21b259b835..a3d21506b6 100644 --- a/boards/px4/fmu-v5x/nuttx-config/nsh/defconfig +++ b/boards/px4/fmu-v5x/nuttx-config/nsh/defconfig @@ -286,6 +286,7 @@ CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=600 CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/px4/fmu-v5x/src/board_config.h b/boards/px4/fmu-v5x/src/board_config.h index b5fba07d0d..d1b1002a18 100644 --- a/boards/px4/fmu-v5x/src/board_config.h +++ b/boards/px4/fmu-v5x/src/board_config.h @@ -54,19 +54,8 @@ ****************************************************************************************************/ /* PX4IO connection configuration */ - #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS5" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* Configuration ************************************************************************************/ diff --git a/boards/px4/fmu-v6x/nuttx-config/nsh/defconfig b/boards/px4/fmu-v6x/nuttx-config/nsh/defconfig index e7460884bd..f1d586c5d4 100644 --- a/boards/px4/fmu-v6x/nuttx-config/nsh/defconfig +++ b/boards/px4/fmu-v6x/nuttx-config/nsh/defconfig @@ -279,7 +279,9 @@ CONFIG_USART3_SERIAL_CONSOLE=y CONFIG_USART3_TXBUFSIZE=1500 CONFIG_USART6_BAUD=57600 CONFIG_USART6_RXBUFSIZE=600 +CONFIG_USART6_RXDMA=y CONFIG_USART6_TXBUFSIZE=1500 +CONFIG_USART6_TXDMA=y CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/px4/fmu-v6x/src/board_config.h b/boards/px4/fmu-v6x/src/board_config.h index f2966995bf..dd731a3f53 100644 --- a/boards/px4/fmu-v6x/src/board_config.h +++ b/boards/px4/fmu-v6x/src/board_config.h @@ -57,19 +57,8 @@ #undef TRACE_PINS /* PX4IO connection configuration */ - #define BOARD_USES_PX4IO_VERSION 2 #define PX4IO_SERIAL_DEVICE "/dev/ttyS5" -#define PX4IO_SERIAL_TX_GPIO GPIO_USART6_TX -#define PX4IO_SERIAL_RX_GPIO GPIO_USART6_RX -#define PX4IO_SERIAL_BASE STM32_USART6_BASE -#define PX4IO_SERIAL_VECTOR STM32_IRQ_USART6 -#define PX4IO_SERIAL_TX_DMAMAP DMAMAP_USART6_TX -#define PX4IO_SERIAL_RX_DMAMAP DMAMAP_USART6_RX -#define PX4IO_SERIAL_RCC_REG STM32_RCC_APB2ENR -#define PX4IO_SERIAL_RCC_EN RCC_APB2ENR_USART6EN -#define PX4IO_SERIAL_CLOCK STM32_PCLK2_FREQUENCY -#define PX4IO_SERIAL_BITRATE 1500000 /* 1.5Mbps -> max rate for IO */ /* Configuration ************************************************************************************/ diff --git a/platforms/nuttx/src/px4/stm/stm32f4/CMakeLists.txt b/platforms/nuttx/src/px4/stm/stm32f4/CMakeLists.txt index 9b49f31f84..9e7085a4aa 100644 --- a/platforms/nuttx/src/px4/stm/stm32f4/CMakeLists.txt +++ b/platforms/nuttx/src/px4/stm/stm32f4/CMakeLists.txt @@ -45,6 +45,4 @@ add_subdirectory(../stm32_common/spi spi) add_subdirectory(../stm32_common/tone_alarm tone_alarm) add_subdirectory(../stm32_common/version version) -add_subdirectory(px4io_serial) add_subdirectory(watchdog) - diff --git a/platforms/nuttx/src/px4/stm/stm32f4/include/px4_arch/px4io_serial.h b/platforms/nuttx/src/px4/stm/stm32f4/include/px4_arch/px4io_serial.h deleted file mode 100644 index 5898838ee4..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32f4/include/px4_arch/px4io_serial.h +++ /dev/null @@ -1,37 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2019 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. - * - ****************************************************************************/ - -#pragma once - -#include "../../../stm32_common/include/px4_arch/px4io_serial.h" - diff --git a/platforms/nuttx/src/px4/stm/stm32f4/px4io_serial/CMakeLists.txt b/platforms/nuttx/src/px4/stm/stm32f4/px4io_serial/CMakeLists.txt deleted file mode 100644 index df450593b1..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32f4/px4io_serial/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -############################################################################ -# -# Copyright (c) 2015-2019 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. -# -############################################################################ - -px4_add_library(arch_px4io_serial - px4io_serial.cpp -) diff --git a/platforms/nuttx/src/px4/stm/stm32f4/px4io_serial/px4io_serial.cpp b/platforms/nuttx/src/px4/stm/stm32f4/px4io_serial/px4io_serial.cpp deleted file mode 100644 index bb0c6a8d16..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32f4/px4io_serial/px4io_serial.cpp +++ /dev/null @@ -1,464 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2013-2015 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 px4io_serial.cpp - * - * Serial interface for PX4IO on STM32F4 - */ -#include - -#include - -/* serial register accessors */ -#define REG(_x) (*(volatile uint32_t *)(PX4IO_SERIAL_BASE + _x)) -#define rSR REG(STM32_USART_SR_OFFSET) -#define rDR REG(STM32_USART_DR_OFFSET) -#define rBRR REG(STM32_USART_BRR_OFFSET) -#define rCR1 REG(STM32_USART_CR1_OFFSET) -#define rCR2 REG(STM32_USART_CR2_OFFSET) -#define rCR3 REG(STM32_USART_CR3_OFFSET) -#define rGTPR REG(STM32_USART_GTPR_OFFSET) - -uint8_t ArchPX4IOSerial::_io_buffer_storage[sizeof(IOPacket)]; - -ArchPX4IOSerial::ArchPX4IOSerial() : - _tx_dma(nullptr), - _rx_dma(nullptr), - _current_packet(nullptr), - _rx_dma_status(_dma_status_inactive), - _completion_semaphore(SEM_INITIALIZER(0)), - _pc_dmaerrs(perf_alloc(PC_COUNT, MODULE_NAME": DMA errors")) -{ -} - -ArchPX4IOSerial::~ArchPX4IOSerial() -{ - if (_tx_dma != nullptr) { - stm32_dmastop(_tx_dma); - stm32_dmafree(_tx_dma); - } - - if (_rx_dma != nullptr) { - stm32_dmastop(_rx_dma); - stm32_dmafree(_rx_dma); - } - - /* reset the UART */ - rCR1 = 0; - rCR2 = 0; - rCR3 = 0; - - /* detach our interrupt handler */ - up_disable_irq(PX4IO_SERIAL_VECTOR); - irq_detach(PX4IO_SERIAL_VECTOR); - - /* restore the GPIOs */ - px4_arch_unconfiggpio(PX4IO_SERIAL_TX_GPIO); - px4_arch_unconfiggpio(PX4IO_SERIAL_RX_GPIO); - - /* Disable APB clock for the USART peripheral */ - modifyreg32(PX4IO_SERIAL_RCC_REG, PX4IO_SERIAL_RCC_EN, 0); - - /* and kill our semaphores */ - px4_sem_destroy(&_completion_semaphore); - - perf_free(_pc_dmaerrs); -} - -int -ArchPX4IOSerial::init() -{ - /* initialize base implementation */ - int r; - - if ((r = PX4IO_serial::init((IOPacket *)&_io_buffer_storage[0])) != 0) { - return r; - } - - /* allocate DMA */ - _tx_dma = stm32_dmachannel(PX4IO_SERIAL_TX_DMAMAP); - _rx_dma = stm32_dmachannel(PX4IO_SERIAL_RX_DMAMAP); - - if ((_tx_dma == nullptr) || (_rx_dma == nullptr)) { - return -1; - } - - /* Enable the APB clock for the USART peripheral */ - modifyreg32(PX4IO_SERIAL_RCC_REG, 0, PX4IO_SERIAL_RCC_EN); - - /* configure pins for serial use */ - px4_arch_configgpio(PX4IO_SERIAL_TX_GPIO); - px4_arch_configgpio(PX4IO_SERIAL_RX_GPIO); - - /* reset & configure the UART */ - rCR1 = 0; - rCR2 = 0; - rCR3 = 0; - - /* eat any existing interrupt status */ - (void)rSR; - (void)rDR; - - - /* configure line speed */ - uint32_t usartdiv32 = PX4IO_SERIAL_CLOCK / (PX4IO_SERIAL_BITRATE / 2); - uint32_t mantissa = usartdiv32 >> 5; - uint32_t fraction = (usartdiv32 - (mantissa << 5) + 1) >> 1; - rBRR = (mantissa << USART_BRR_MANT_SHIFT) | (fraction << USART_BRR_FRAC_SHIFT); - - /* attach serial interrupt handler */ - irq_attach(PX4IO_SERIAL_VECTOR, _interrupt, this); - up_enable_irq(PX4IO_SERIAL_VECTOR); - - /* enable UART in DMA mode, enable error and line idle interrupts */ - rCR3 = USART_CR3_EIE; - - rCR1 = USART_CR1_RE | USART_CR1_TE | USART_CR1_UE | USART_CR1_IDLEIE; - - /* create semaphores */ - px4_sem_init(&_completion_semaphore, 0, 0); - - /* _completion_semaphore use case is a signal */ - - px4_sem_setprotocol(&_completion_semaphore, SEM_PRIO_NONE); - - /* XXX this could try talking to IO */ - - return 0; -} - -int -ArchPX4IOSerial::ioctl(unsigned operation, unsigned &arg) -{ - switch (operation) { - - case 1: /* XXX magic number - test operation */ - switch (arg) { - case 0: - syslog(LOG_INFO, "test 0\n"); - - /* kill DMA, this is a PIO test */ - stm32_dmastop(_tx_dma); - stm32_dmastop(_rx_dma); - rCR3 &= ~(USART_CR3_DMAR | USART_CR3_DMAT); - - for (;;) { - while (!(rSR & USART_SR_TXE)) - ; - - rDR = 0x55; - } - - return 0; - - case 1: { - unsigned fails = 0; - - for (unsigned count = 0;; count++) { - uint16_t value = count & 0xffff; - - if (write((PX4IO_PAGE_TEST << 8) | PX4IO_P_TEST_LED, &value, 1) != 0) { - fails++; - } - - if (count >= 5000) { - syslog(LOG_INFO, "==== test 1 : %u failures ====\n", fails); - perf_print_counter(_pc_txns); - perf_print_counter(_pc_retries); - perf_print_counter(_pc_timeouts); - perf_print_counter(_pc_crcerrs); - perf_print_counter(_pc_dmaerrs); - perf_print_counter(_pc_protoerrs); - perf_print_counter(_pc_uerrs); - perf_print_counter(_pc_idle); - perf_print_counter(_pc_badidle); - count = 0; - } - } - - return 0; - } - - case 2: - syslog(LOG_INFO, "test 2\n"); - return 0; - } - - default: - break; - } - - return -1; -} - -int -ArchPX4IOSerial::_bus_exchange(IOPacket *_packet) -{ - _current_packet = _packet; - - /* clear any lingering error status */ - (void)rSR; - (void)rDR; - - /* start RX DMA */ - perf_begin(_pc_txns); - - /* DMA setup time ~3µs */ - _rx_dma_status = _dma_status_waiting; - - /* - * Note that we enable circular buffer mode as a workaround for - * there being no API to disable the DMA FIFO. We need direct mode - * because otherwise when the line idle interrupt fires there - * will be packet bytes still in the DMA FIFO, and we will assume - * that the idle was spurious. - * - * XXX this should be fixed with a NuttX change. - */ - stm32_dmasetup( - _rx_dma, - PX4IO_SERIAL_BASE + STM32_USART_DR_OFFSET, - reinterpret_cast(_current_packet), - sizeof(*_current_packet), - DMA_SCR_CIRC | /* XXX see note above */ - DMA_SCR_DIR_P2M | - DMA_SCR_MINC | - DMA_SCR_PSIZE_8BITS | - DMA_SCR_MSIZE_8BITS | - DMA_SCR_PBURST_SINGLE | - DMA_SCR_MBURST_SINGLE); - stm32_dmastart(_rx_dma, _dma_callback, this, false); - rCR3 |= USART_CR3_DMAR; - - /* start TX DMA - no callback if we also expect a reply */ - /* DMA setup time ~3µs */ - stm32_dmasetup( - _tx_dma, - PX4IO_SERIAL_BASE + STM32_USART_DR_OFFSET, - reinterpret_cast(_current_packet), - PKT_SIZE(*_current_packet), - DMA_SCR_DIR_M2P | - DMA_SCR_MINC | - DMA_SCR_PSIZE_8BITS | - DMA_SCR_MSIZE_8BITS | - DMA_SCR_PBURST_SINGLE | - DMA_SCR_MBURST_SINGLE); - stm32_dmastart(_tx_dma, nullptr, nullptr, false); - //rCR1 &= ~USART_CR1_TE; - //rCR1 |= USART_CR1_TE; - rCR3 |= USART_CR3_DMAT; - - /* compute the deadline for a 10ms timeout */ - struct timespec abstime; - clock_gettime(CLOCK_REALTIME, &abstime); - abstime.tv_nsec += 10 * 1000 * 1000; - - if (abstime.tv_nsec >= 1000 * 1000 * 1000) { - abstime.tv_sec++; - abstime.tv_nsec -= 1000 * 1000 * 1000; - } - - /* wait for the transaction to complete - 64 bytes @ 1.5Mbps ~426µs */ - int ret; - - for (;;) { - ret = sem_timedwait(&_completion_semaphore, &abstime); - - if (ret == OK) { - /* check for DMA errors */ - if (_rx_dma_status & DMA_STATUS_TEIF) { - // stream transfer error, ensure all DMA is also stopped before exiting early - _abort_dma(); - perf_count(_pc_dmaerrs); - ret = -EIO; - break; - } - - /* check packet CRC - corrupt packet errors mean IO receive CRC error */ - uint8_t crc = _current_packet->crc; - _current_packet->crc = 0; - - if ((crc != crc_packet(_current_packet)) || (PKT_CODE(*_current_packet) == PKT_CODE_CORRUPT)) { - _abort_dma(); - perf_count(_pc_crcerrs); - ret = -EIO; - break; - } - - /* successful txn (may still be reporting an error) */ - break; - } - - if (errno == ETIMEDOUT) { - /* something has broken - clear out any partial DMA state and reconfigure */ - _abort_dma(); - perf_count(_pc_timeouts); - perf_cancel(_pc_txns); /* don't count this as a transaction */ - break; - } - - /* we might? see this for EINTR */ - syslog(LOG_ERR, "unexpected ret %d/%d\n", ret, errno); - } - - /* reset DMA status */ - _rx_dma_status = _dma_status_inactive; - - /* update counters */ - perf_end(_pc_txns); - - return ret; -} - -void -ArchPX4IOSerial::_dma_callback(DMA_HANDLE handle, uint8_t status, void *arg) -{ - if (arg != nullptr) { - ArchPX4IOSerial *ps = static_cast(arg); - - ps->_do_rx_dma_callback(status); - } -} - -void -ArchPX4IOSerial::_do_rx_dma_callback(unsigned status) -{ - /* on completion of a reply, wake the waiter */ - if (_rx_dma_status == _dma_status_waiting) { - - /* check for packet overrun - this will occur after DMA completes */ - uint32_t sr = rSR; - - if (sr & (USART_SR_ORE | USART_SR_RXNE)) { - (void)rDR; - status = DMA_STATUS_TEIF; - } - - /* save RX status */ - _rx_dma_status = status; - - /* disable UART DMA */ - rCR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR); - - /* complete now */ - px4_sem_post(&_completion_semaphore); - } -} - -int -ArchPX4IOSerial::_interrupt(int irq, void *context, void *arg) -{ - if (arg != nullptr) { - ArchPX4IOSerial *instance = static_cast(arg); - - instance->_do_interrupt(); - } - - return 0; -} - -void -ArchPX4IOSerial::_do_interrupt() -{ - uint32_t sr = rSR; /* get UART status register */ - (void)rDR; /* read DR to clear status */ - - if (sr & (USART_SR_ORE | /* overrun error - packet was too big for DMA or DMA was too slow */ - USART_SR_NE | /* noise error - we have lost a byte due to noise */ - USART_SR_FE)) { /* framing error - start/stop bit lost or line break */ - - /* - * If we are in the process of listening for something, these are all fatal; - * abort the DMA with an error. - */ - if (_rx_dma_status == _dma_status_waiting) { - _abort_dma(); - - perf_count(_pc_uerrs); - /* complete DMA as though in error */ - _do_rx_dma_callback(DMA_STATUS_TEIF); - - return; - } - - /* XXX we might want to use FE / line break as an out-of-band handshake ... handle it here */ - - /* don't attempt to handle IDLE if it's set - things went bad */ - return; - } - - if (sr & USART_SR_IDLE) { - - /* if there is DMA reception going on, this is a short packet */ - if (_rx_dma_status == _dma_status_waiting) { - - /* verify that the received packet is complete */ - size_t length = sizeof(*_current_packet) - stm32_dmaresidual(_rx_dma); - - if ((length < 1) || (length < PKT_SIZE(*_current_packet))) { - perf_count(_pc_badidle); - - /* stop the receive DMA */ - stm32_dmastop(_rx_dma); - - /* complete the short reception */ - _do_rx_dma_callback(DMA_STATUS_TEIF); - return; - } - - perf_count(_pc_idle); - - /* stop the receive DMA */ - stm32_dmastop(_rx_dma); - - /* complete the short reception */ - _do_rx_dma_callback(DMA_STATUS_TCIF); - } - } -} - -void -ArchPX4IOSerial::_abort_dma() -{ - /* disable UART DMA */ - rCR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR); - (void)rSR; - (void)rDR; - (void)rDR; - - /* stop DMA */ - stm32_dmastop(_tx_dma); - stm32_dmastop(_rx_dma); -} - diff --git a/platforms/nuttx/src/px4/stm/stm32f7/CMakeLists.txt b/platforms/nuttx/src/px4/stm/stm32f7/CMakeLists.txt index b55e895db7..17e9c0f2ba 100644 --- a/platforms/nuttx/src/px4/stm/stm32f7/CMakeLists.txt +++ b/platforms/nuttx/src/px4/stm/stm32f7/CMakeLists.txt @@ -44,5 +44,4 @@ add_subdirectory(../stm32_common/spi spi) add_subdirectory(../stm32_common/tone_alarm tone_alarm) add_subdirectory(../stm32_common/version version) -add_subdirectory(px4io_serial) add_subdirectory(watchdog) diff --git a/platforms/nuttx/src/px4/stm/stm32f7/include/px4_arch/px4io_serial.h b/platforms/nuttx/src/px4/stm/stm32f7/include/px4_arch/px4io_serial.h deleted file mode 100644 index 5898838ee4..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32f7/include/px4_arch/px4io_serial.h +++ /dev/null @@ -1,37 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2019 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. - * - ****************************************************************************/ - -#pragma once - -#include "../../../stm32_common/include/px4_arch/px4io_serial.h" - diff --git a/platforms/nuttx/src/px4/stm/stm32f7/px4io_serial/CMakeLists.txt b/platforms/nuttx/src/px4/stm/stm32f7/px4io_serial/CMakeLists.txt deleted file mode 100644 index df450593b1..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32f7/px4io_serial/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -############################################################################ -# -# Copyright (c) 2015-2019 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. -# -############################################################################ - -px4_add_library(arch_px4io_serial - px4io_serial.cpp -) diff --git a/platforms/nuttx/src/px4/stm/stm32f7/px4io_serial/px4io_serial.cpp b/platforms/nuttx/src/px4/stm/stm32f7/px4io_serial/px4io_serial.cpp deleted file mode 100644 index fab13855c3..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32f7/px4io_serial/px4io_serial.cpp +++ /dev/null @@ -1,496 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2013-2015 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 px4io_serial.cpp - * - * Serial interface for PX4IO on STM32F7 - */ - -#include - -#include - -#include "stm32_uart.h" -#include - -/* serial register accessors */ -#define REG(_x) (*(volatile uint32_t *)(PX4IO_SERIAL_BASE + (_x))) -#define rISR REG(STM32_USART_ISR_OFFSET) -#define rISR_ERR_FLAGS_MASK (0x1f) -#define rICR REG(STM32_USART_ICR_OFFSET) -#define rRDR REG(STM32_USART_RDR_OFFSET) -#define rTDR REG(STM32_USART_TDR_OFFSET) -#define rBRR REG(STM32_USART_BRR_OFFSET) -#define rCR1 REG(STM32_USART_CR1_OFFSET) -#define rCR2 REG(STM32_USART_CR2_OFFSET) -#define rCR3 REG(STM32_USART_CR3_OFFSET) -#define rGTPR REG(STM32_USART_GTPR_OFFSET) - -#define DMA_BUFFER_MASK (ARMV7M_DCACHE_LINESIZE - 1) -#define DMA_ALIGN_UP(n) (((n) + DMA_BUFFER_MASK) & ~DMA_BUFFER_MASK) - -uint8_t ArchPX4IOSerial::_io_buffer_storage[DMA_ALIGN_UP(sizeof(IOPacket))]; - -ArchPX4IOSerial::ArchPX4IOSerial() : - _tx_dma(nullptr), - _rx_dma(nullptr), - _current_packet(nullptr), - _rx_dma_status(_dma_status_inactive), - _completion_semaphore(SEM_INITIALIZER(0)), - _pc_dmaerrs(perf_alloc(PC_COUNT, MODULE_NAME": DMA errors")) -{ -} - -ArchPX4IOSerial::~ArchPX4IOSerial() -{ - if (_tx_dma != nullptr) { - stm32_dmastop(_tx_dma); - stm32_dmafree(_tx_dma); - } - - if (_rx_dma != nullptr) { - stm32_dmastop(_rx_dma); - stm32_dmafree(_rx_dma); - } - - /* reset the UART */ - rCR1 = 0; - rCR2 = 0; - rCR3 = 0; - - /* detach our interrupt handler */ - up_disable_irq(PX4IO_SERIAL_VECTOR); - irq_detach(PX4IO_SERIAL_VECTOR); - - /* restore the GPIOs */ - px4_arch_unconfiggpio(PX4IO_SERIAL_TX_GPIO); - px4_arch_unconfiggpio(PX4IO_SERIAL_RX_GPIO); - - /* Disable APB clock for the USART peripheral */ - modifyreg32(PX4IO_SERIAL_RCC_REG, PX4IO_SERIAL_RCC_EN, 0); - - /* and kill our semaphores */ - px4_sem_destroy(&_completion_semaphore); - - perf_free(_pc_dmaerrs); -} - -int -ArchPX4IOSerial::init() -{ - /* initialize base implementation */ - int r = PX4IO_serial::init((IOPacket *)&_io_buffer_storage[0]); - - if (r != 0) { - return r; - } - - /* allocate DMA */ - _tx_dma = stm32_dmachannel(PX4IO_SERIAL_TX_DMAMAP); - _rx_dma = stm32_dmachannel(PX4IO_SERIAL_RX_DMAMAP); - - if ((_tx_dma == nullptr) || (_rx_dma == nullptr)) { - return -1; - } - - /* Enable the APB clock for the USART peripheral */ - modifyreg32(PX4IO_SERIAL_RCC_REG, 0, PX4IO_SERIAL_RCC_EN); - - /* configure pins for serial use */ - px4_arch_configgpio(PX4IO_SERIAL_TX_GPIO); - px4_arch_configgpio(PX4IO_SERIAL_RX_GPIO); - - /* reset & configure the UART */ - rCR1 = 0; - rCR2 = 0; - rCR3 = 0; - - /* clear data that may be in the RDR and clear overrun error: */ - if (rISR & USART_ISR_RXNE) { - (void)rRDR; - } - - rICR = rISR & rISR_ERR_FLAGS_MASK; /* clear the flags */ - - /* configure line speed */ - uint32_t usartdiv32 = (PX4IO_SERIAL_CLOCK + (PX4IO_SERIAL_BITRATE) / 2) / (PX4IO_SERIAL_BITRATE); - rBRR = usartdiv32; - - /* attach serial interrupt handler */ - irq_attach(PX4IO_SERIAL_VECTOR, _interrupt, this); - up_enable_irq(PX4IO_SERIAL_VECTOR); - - /* enable UART in DMA mode, enable error and line idle interrupts */ - rCR3 = USART_CR3_EIE; - /* TODO: maybe use DDRE */ - - rCR1 = USART_CR1_RE | USART_CR1_TE | USART_CR1_UE | USART_CR1_IDLEIE; - /* TODO: maybe we need to adhere to the procedure as described in the reference manual page 1251 (34.5.2) */ - - /* create semaphores */ - px4_sem_init(&_completion_semaphore, 0, 0); - - /* _completion_semaphore use case is a signal */ - - px4_sem_setprotocol(&_completion_semaphore, SEM_PRIO_NONE); - - /* XXX this could try talking to IO */ - - return 0; -} - -int -ArchPX4IOSerial::ioctl(unsigned operation, unsigned &arg) -{ - switch (operation) { - - case 1: /* XXX magic number - test operation */ - switch (arg) { - case 0: - syslog(LOG_INFO, "test 0\n"); - - /* kill DMA, this is a PIO test */ - stm32_dmastop(_tx_dma); - stm32_dmastop(_rx_dma); - rCR3 &= ~(USART_CR3_DMAR | USART_CR3_DMAT); - - for (;;) { - while (!(rISR & USART_ISR_TXE)) - ; - - rTDR = 0x55; - } - - return 0; - - case 1: { - unsigned fails = 0; - - for (unsigned count = 0;; count++) { - uint16_t value = count & 0xffff; - - if (write((PX4IO_PAGE_TEST << 8) | PX4IO_P_TEST_LED, &value, 1) != 0) { - fails++; - } - - if (count >= 5000) { - syslog(LOG_INFO, "==== test 1 : %u failures ====\n", fails); - perf_print_counter(_pc_txns); - perf_print_counter(_pc_retries); - perf_print_counter(_pc_timeouts); - perf_print_counter(_pc_crcerrs); - perf_print_counter(_pc_dmaerrs); - perf_print_counter(_pc_protoerrs); - perf_print_counter(_pc_uerrs); - perf_print_counter(_pc_idle); - perf_print_counter(_pc_badidle); - count = 0; - } - } - - return 0; - } - - case 2: - syslog(LOG_INFO, "test 2\n"); - return 0; - } - - default: - break; - } - - return -1; -} - -int -ArchPX4IOSerial::_bus_exchange(IOPacket *_packet) -{ - _current_packet = _packet; - - /* clear data that may be in the RDR and clear overrun error: */ - if (rISR & USART_ISR_RXNE) { - (void)rRDR; - } - - rICR = rISR & rISR_ERR_FLAGS_MASK; /* clear the flags */ - - /* start RX DMA */ - perf_begin(_pc_txns); - - /* DMA setup time ~3µs */ - _rx_dma_status = _dma_status_waiting; - - /* - * Note that we enable circular buffer mode as a workaround for - * there being no API to disable the DMA FIFO. We need direct mode - * because otherwise when the line idle interrupt fires there - * will be packet bytes still in the DMA FIFO, and we will assume - * that the idle was spurious. - * - * XXX this should be fixed with a NuttX change. - */ - stm32_dmasetup( - _rx_dma, - PX4IO_SERIAL_BASE + STM32_USART_RDR_OFFSET, - reinterpret_cast(_current_packet), - sizeof(*_current_packet), - DMA_SCR_CIRC | /* XXX see note above */ - DMA_SCR_DIR_P2M | - DMA_SCR_MINC | - DMA_SCR_PSIZE_8BITS | - DMA_SCR_MSIZE_8BITS | - DMA_SCR_PBURST_SINGLE | - DMA_SCR_MBURST_SINGLE); - rCR3 |= USART_CR3_DMAR; - stm32_dmastart(_rx_dma, _dma_callback, this, false); - - /* Clean _current_packet, so DMA can see the data */ - up_clean_dcache((uintptr_t)_current_packet, - (uintptr_t)_current_packet + DMA_ALIGN_UP(sizeof(IOPacket))); - - /* start TX DMA - no callback if we also expect a reply */ - /* DMA setup time ~3µs */ - stm32_dmasetup( - _tx_dma, - PX4IO_SERIAL_BASE + STM32_USART_TDR_OFFSET, - reinterpret_cast(_current_packet), - PKT_SIZE(*_current_packet), - DMA_SCR_DIR_M2P | - DMA_SCR_MINC | - DMA_SCR_PSIZE_8BITS | - DMA_SCR_MSIZE_8BITS | - DMA_SCR_PBURST_SINGLE | - DMA_SCR_MBURST_SINGLE); - rCR3 |= USART_CR3_DMAT; - stm32_dmastart(_tx_dma, nullptr, nullptr, false); - //rCR1 &= ~USART_CR1_TE; - //rCR1 |= USART_CR1_TE; - - /* compute the deadline for a 10ms timeout */ - struct timespec abstime; - clock_gettime(CLOCK_REALTIME, &abstime); - abstime.tv_nsec += 10 * 1000 * 1000; - - if (abstime.tv_nsec >= 1000 * 1000 * 1000) { - abstime.tv_sec++; - abstime.tv_nsec -= 1000 * 1000 * 1000; - } - - /* wait for the transaction to complete - 64 bytes @ 1.5Mbps ~426µs */ - int ret; - - for (;;) { - ret = sem_timedwait(&_completion_semaphore, &abstime); - - if (ret == OK) { - /* check for DMA errors */ - if (_rx_dma_status & DMA_STATUS_TEIF) { - // stream transfer error, ensure all DMA is also stopped before exiting early - _abort_dma(); - perf_count(_pc_dmaerrs); - ret = -EIO; - break; - } - - /* check packet CRC - corrupt packet errors mean IO receive CRC error */ - uint8_t crc = _current_packet->crc; - _current_packet->crc = 0; - - if ((crc != crc_packet(_current_packet)) || (PKT_CODE(*_current_packet) == PKT_CODE_CORRUPT)) { - _abort_dma(); - perf_count(_pc_crcerrs); - ret = -EIO; - break; - } - - /* successful txn (may still be reporting an error) */ - break; - } - - if (errno == ETIMEDOUT) { - /* something has broken - clear out any partial DMA state and reconfigure */ - _abort_dma(); - perf_count(_pc_timeouts); - perf_cancel(_pc_txns); /* don't count this as a transaction */ - break; - } - - /* we might? see this for EINTR */ - syslog(LOG_ERR, "unexpected ret %d/%d\n", ret, errno); - } - - /* reset DMA status */ - _rx_dma_status = _dma_status_inactive; - - /* update counters */ - perf_end(_pc_txns); - - return ret; -} - -void -ArchPX4IOSerial::_dma_callback(DMA_HANDLE handle, uint8_t status, void *arg) -{ - if (arg != nullptr) { - ArchPX4IOSerial *ps = reinterpret_cast(arg); - - ps->_do_rx_dma_callback(status); - } -} - -void -ArchPX4IOSerial::_do_rx_dma_callback(unsigned status) -{ - /* on completion of a reply, wake the waiter */ - if (_rx_dma_status == _dma_status_waiting) { - - /* check for packet overrun - this will occur after DMA completes */ - uint32_t sr = rISR; - - if (sr & (USART_ISR_ORE | USART_ISR_RXNE)) { - (void)rRDR; - rICR = sr & (USART_ISR_ORE | USART_ISR_RXNE); - status = DMA_STATUS_TEIF; - } - - /* save RX status */ - _rx_dma_status = status; - - /* disable UART DMA */ - rCR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR); - - /* complete now */ - px4_sem_post(&_completion_semaphore); - } -} - -int -ArchPX4IOSerial::_interrupt(int irq, void *context, void *arg) -{ - if (arg != nullptr) { - ArchPX4IOSerial *instance = reinterpret_cast(arg); - - instance->_do_interrupt(); - } - - return 0; -} - -void -ArchPX4IOSerial::_do_interrupt() -{ - uint32_t sr = rISR; /* get UART status register */ - - if (sr & USART_ISR_RXNE) { - (void)rRDR; /* read DR to clear RXNE */ - } - - rICR = sr & rISR_ERR_FLAGS_MASK; /* clear flags */ - - if (sr & (USART_ISR_ORE | /* overrun error - packet was too big for DMA or DMA was too slow */ - USART_ISR_NF | /* noise error - we have lost a byte due to noise */ - USART_ISR_FE)) { /* framing error - start/stop bit lost or line break */ - - /* - * If we are in the process of listening for something, these are all fatal; - * abort the DMA with an error. - */ - if (_rx_dma_status == _dma_status_waiting) { - _abort_dma(); - - perf_count(_pc_uerrs); - /* complete DMA as though in error */ - _do_rx_dma_callback(DMA_STATUS_TEIF); - - return; - } - - /* XXX we might want to use FE / line break as an out-of-band handshake ... handle it here */ - - /* don't attempt to handle IDLE if it's set - things went bad */ - return; - } - - if (sr & USART_ISR_IDLE) { - - /* if there is DMA reception going on, this is a short packet */ - if (_rx_dma_status == _dma_status_waiting) { - /* Invalidate _current_packet, so we get fresh data from RAM */ - up_invalidate_dcache((uintptr_t)_current_packet, - (uintptr_t)_current_packet + DMA_ALIGN_UP(sizeof(IOPacket))); - - /* verify that the received packet is complete */ - size_t length = sizeof(*_current_packet) - stm32_dmaresidual(_rx_dma); - - if ((length < 1) || (length < PKT_SIZE(*_current_packet))) { - perf_count(_pc_badidle); - - /* stop the receive DMA */ - stm32_dmastop(_rx_dma); - - /* complete the short reception */ - _do_rx_dma_callback(DMA_STATUS_TEIF); - return; - } - - perf_count(_pc_idle); - - /* stop the receive DMA */ - stm32_dmastop(_rx_dma); - - /* complete the short reception */ - _do_rx_dma_callback(DMA_STATUS_TCIF); - } - } -} - -void -ArchPX4IOSerial::_abort_dma() -{ - /* stop DMA */ - stm32_dmastop(_tx_dma); - stm32_dmastop(_rx_dma); - - /* disable UART DMA */ - rCR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR); - - /* clear data that may be in the RDR and clear overrun error: */ - if (rISR & USART_ISR_RXNE) { - (void)rRDR; - } - - rICR = rISR & rISR_ERR_FLAGS_MASK; /* clear the flags */ -} - diff --git a/platforms/nuttx/src/px4/stm/stm32h7/CMakeLists.txt b/platforms/nuttx/src/px4/stm/stm32h7/CMakeLists.txt index 1205a6eda2..0f9a105ff6 100644 --- a/platforms/nuttx/src/px4/stm/stm32h7/CMakeLists.txt +++ b/platforms/nuttx/src/px4/stm/stm32h7/CMakeLists.txt @@ -43,5 +43,3 @@ add_subdirectory(../stm32_common/io_pins io_pins) add_subdirectory(../stm32_common/spi spi) add_subdirectory(../stm32_common/tone_alarm tone_alarm) add_subdirectory(../stm32_common/version version) - -add_subdirectory(px4io_serial) diff --git a/platforms/nuttx/src/px4/stm/stm32h7/include/px4_arch/px4io_serial.h b/platforms/nuttx/src/px4/stm/stm32h7/include/px4_arch/px4io_serial.h deleted file mode 100644 index 85e3c55469..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32h7/include/px4_arch/px4io_serial.h +++ /dev/null @@ -1,37 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2019 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. - * - ****************************************************************************/ - -#pragma once - -#define PX4IO_SERIAL_BUF_ALIGN ARMV7M_DCACHE_LINESIZE -#include "../../../stm32_common/include/px4_arch/px4io_serial.h" diff --git a/platforms/nuttx/src/px4/stm/stm32h7/px4io_serial/CMakeLists.txt b/platforms/nuttx/src/px4/stm/stm32h7/px4io_serial/CMakeLists.txt deleted file mode 100644 index df450593b1..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32h7/px4io_serial/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -############################################################################ -# -# Copyright (c) 2015-2019 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. -# -############################################################################ - -px4_add_library(arch_px4io_serial - px4io_serial.cpp -) diff --git a/platforms/nuttx/src/px4/stm/stm32h7/px4io_serial/px4io_serial.cpp b/platforms/nuttx/src/px4/stm/stm32h7/px4io_serial/px4io_serial.cpp deleted file mode 100644 index b6bd7e6414..0000000000 --- a/platforms/nuttx/src/px4/stm/stm32h7/px4io_serial/px4io_serial.cpp +++ /dev/null @@ -1,542 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2013-2015 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 px4io_serial.cpp - * - * Serial interface for PX4IO on STM32F7 - */ - -#include - -#include -#include "stm32_uart.h" -#include - -/* serial register accessors */ -#define REG(_x) (*(volatile uint32_t *)(PX4IO_SERIAL_BASE + (_x))) -#define rISR REG(STM32_USART_ISR_OFFSET) -#define rISR_ERR_FLAGS_MASK (0x1f) -#define rICR REG(STM32_USART_ICR_OFFSET) -#define rRDR REG(STM32_USART_RDR_OFFSET) -#define rTDR REG(STM32_USART_TDR_OFFSET) -#define rBRR REG(STM32_USART_BRR_OFFSET) -#define rCR1 REG(STM32_USART_CR1_OFFSET) -#define rCR2 REG(STM32_USART_CR2_OFFSET) -#define rCR3 REG(STM32_USART_CR3_OFFSET) -#define rGTPR REG(STM32_USART_GTPR_OFFSET) - -/* - * - * #define USART_CR1_FIFOEN (1 << 29) Bit 29: FIFO mode enable - * #define USART_CR1_TXFEIE (1 << 30) Bit 30: TXFIFO empty interrupt enable - * #define USART_CR1_RXFFIE (1 << 31) Bit 31: RXFIFO Full interrupt enable - * - * - * #define USART_CR2_SLVEN (1 << 0) Bit 0: Synchronous Slave mode enable - * #define USART_CR2_DISNSS (1 << 3) Bit 3: Ignore NSS pin input - * #define USART_CR3_RXFTCFG_SHIFT (25) Bit 25-27: Receive FIFO threshold configuration - * #define USART_CR3_RXFTCFG_MASK (7 << USART_CR3_RXFTCFG_SHIFT) - * # define USART_CR3_RXFTCFG(n) ((uint32_t)(n) << USART_CR3_RXFTCFG_SHIFT) - * # define USART_CR3_RXFTCFG_12PCT (0 << USART_CR3_RXFTCFG_SHIFT) RXFIFO 1/8 full - * # define USART_CR3_RXFTCFG_25PCT (1 << USART_CR3_RXFTCFG_SHIFT) RXFIFO 1/4 full - *# define USART_CR3_RXFTCFG_50PCT (2 << USART_CR3_RXFTCFG_SHIFT) RXFIFO 1/2 full - *# define USART_CR3_RXFTCFG_75PCT (3 << USART_CR3_RXFTCFG_SHIFT) RXFIFO 3/4 full - * # define USART_CR3_RXFTCFG_88PCT (4 << USART_CR3_RXFTCFG_SHIFT) RXFIFO 7/8 full - * # define USART_CR3_RXFTCFG_FULL (5 << USART_CR3_RXFTCFG_SHIFT) RXIFO full - * #define USART_CR3_RXFTIE (1 << 28) Bit 28: RXFIFO threshold interrupt enable - *#define USART_CR3_TXFTCFG_SHIFT (29) Bits 29-31: TXFIFO threshold configuration - * #define USART_CR3_TXFTCFG_MASK (7 << USART_CR3_TXFTCFG_SHIFT) - * # define USART_CR3_TXFTCFG(n) ((uint32_t)(n) << USART_CR3_TXFTCFG_SHIFT) - * # define USART_CR3_TXFTCFG_12PCT (0 << USART_CR3_TXFTCFG_SHIFT) TXFIFO 1/8 full - *# define USART_CR3_TXFTCFG_24PCT (1 << USART_CR3_TXFTCFG_SHIFT) TXFIFO 1/4 full - *# define USART_CR3_TXFTCFG_50PCT (2 << USART_CR3_TXFTCFG_SHIFT) TXFIFO 1/2 full - * # define USART_CR3_TXFTCFG_75PCT (3 << USART_CR3_TXFTCFG_SHIFT) TXFIFO 3/4 full - * # define USART_CR3_TXFTCFG_88PCT (4 << USART_CR3_TXFTCFG_SHIFT) TXFIFO 7/8 full - * # define USART_CR3_TXFTCFG_EMPY (5 << USART_CR3_TXFTCFG_SHIFT) TXFIFO empty -#define USART_ISR_RWU (1 << 19) Bit 19: Receiver wakeup from Mute mode -#define USART_ISR_WUF (1 << 20) Bit 20: Wakeup from low-power mode flag -#define USART_ISR_TEACK (1 << 21) Bit 21: Transmit enable acknowledge flag -#define USART_ISR_REACK (1 << 22) Bit 22: Receive enable acknowledge flag -#define USART_ISR_TXFE (1 << 23) Bit 23: TXFIFO Empty -#define USART_ISR_RXFF (1 << 24) Bit 24: RXFIFO Full * -#define USART_ISR_TCBGT (1 << 25) Bit 25: Transmission complete before guard time flag -#define USART_ISR_RXFT (1 << 26) Bit 26: RXFIFO threshold flag uint8_t -#define USART_ISR_TXFT (1 << 27) Bit 27: TXFIFO threshold flag -*/ - -#define DMA_BUFFER_MASK (ARMV7M_DCACHE_LINESIZE - 1) -#define DMA_ALIGN_UP(n) (((n) + DMA_BUFFER_MASK) & ~DMA_BUFFER_MASK) - -uint8_t ArchPX4IOSerial::_io_buffer_storage[DMA_ALIGN_UP(sizeof(IOPacket))]; - -ArchPX4IOSerial::ArchPX4IOSerial() : - _tx_dma(nullptr), - _rx_dma(nullptr), - _current_packet(nullptr), - _rx_dma_status(_dma_status_inactive), - _completion_semaphore(SEM_INITIALIZER(0)), - _pc_dmaerrs(perf_alloc(PC_COUNT, MODULE_NAME": DMA errors")) -{ -} - -ArchPX4IOSerial::~ArchPX4IOSerial() -{ - if (_tx_dma != nullptr) { - stm32_dmastop(_tx_dma); - stm32_dmafree(_tx_dma); - } - - if (_rx_dma != nullptr) { - stm32_dmastop(_rx_dma); - stm32_dmafree(_rx_dma); - } - - /* reset the UART */ - rCR1 = 0; - rCR2 = 0; - rCR3 = 0; - - /* detach our interrupt handler */ - up_disable_irq(PX4IO_SERIAL_VECTOR); - irq_detach(PX4IO_SERIAL_VECTOR); - - /* restore the GPIOs */ - px4_arch_unconfiggpio(PX4IO_SERIAL_TX_GPIO); - px4_arch_unconfiggpio(PX4IO_SERIAL_RX_GPIO); - - /* Disable APB clock for the USART peripheral */ - modifyreg32(PX4IO_SERIAL_RCC_REG, PX4IO_SERIAL_RCC_EN, 0); - - /* and kill our semaphores */ - px4_sem_destroy(&_completion_semaphore); - - perf_free(_pc_dmaerrs); -} - -int -ArchPX4IOSerial::init() -{ - /* initialize base implementation */ - int r = PX4IO_serial::init((IOPacket *)&_io_buffer_storage[0]); - - if (r != 0) { - return r; - } - - /* allocate DMA */ - _tx_dma = stm32_dmachannel(PX4IO_SERIAL_TX_DMAMAP); - _rx_dma = stm32_dmachannel(PX4IO_SERIAL_RX_DMAMAP); - - if ((_tx_dma == nullptr) || (_rx_dma == nullptr)) { - return -1; - } - - /* Enable the APB clock for the USART peripheral */ - modifyreg32(PX4IO_SERIAL_RCC_REG, 0, PX4IO_SERIAL_RCC_EN); - - /* configure pins for serial use */ - px4_arch_configgpio(PX4IO_SERIAL_TX_GPIO); - px4_arch_configgpio(PX4IO_SERIAL_RX_GPIO); - - /* reset & configure the UART */ - rCR1 = 0; - rCR2 = 0; - rCR3 = 0; - - /* clear data that may be in the RDR and clear overrun error: */ - if (rISR & USART_ISR_RXNE) { - (void)rRDR; - } - - rICR = rISR & rISR_ERR_FLAGS_MASK; /* clear the flags */ - - /* configure line speed */ - uint32_t usartdiv32 = (PX4IO_SERIAL_CLOCK + (PX4IO_SERIAL_BITRATE) / 2) / (PX4IO_SERIAL_BITRATE); - rBRR = usartdiv32; - - /* attach serial interrupt handler */ - irq_attach(PX4IO_SERIAL_VECTOR, _interrupt, this); - up_enable_irq(PX4IO_SERIAL_VECTOR); - - /* enable UART in DMA mode, enable error and line idle interrupts */ - rCR3 = USART_CR3_EIE; - /* TODO: maybe use DDRE */ - - rCR1 = USART_CR1_RE | USART_CR1_TE | USART_CR1_UE | USART_CR1_IDLEIE; - /* TODO: maybe we need to adhere to the procedure as described in the reference manual page 1251 (34.5.2) */ - - /* create semaphores */ - px4_sem_init(&_completion_semaphore, 0, 0); - - /* _completion_semaphore use case is a signal */ - - px4_sem_setprotocol(&_completion_semaphore, SEM_PRIO_NONE); - - /* XXX this could try talking to IO */ - - return 0; -} - -int -ArchPX4IOSerial::ioctl(unsigned operation, unsigned &arg) -{ - switch (operation) { - - case 1: /* XXX magic number - test operation */ - switch (arg) { - case 0: - syslog(LOG_INFO, "test 0\n"); - - /* kill DMA, this is a PIO test */ - stm32_dmastop(_tx_dma); - stm32_dmastop(_rx_dma); - rCR3 &= ~(USART_CR3_DMAR | USART_CR3_DMAT); - - for (;;) { - while (!(rISR & USART_ISR_TXE)) - ; - - rTDR = 0x55; - } - - return 0; - - case 1: { - unsigned fails = 0; - - for (unsigned count = 0;; count++) { - uint16_t value = count & 0xffff; - - if (write((PX4IO_PAGE_TEST << 8) | PX4IO_P_TEST_LED, &value, 1) != 0) { - fails++; - } - - if (count >= 5000) { - syslog(LOG_INFO, "==== test 1 : %u failures ====\n", fails); - perf_print_counter(_pc_txns); - perf_print_counter(_pc_retries); - perf_print_counter(_pc_timeouts); - perf_print_counter(_pc_crcerrs); - perf_print_counter(_pc_dmaerrs); - perf_print_counter(_pc_protoerrs); - perf_print_counter(_pc_uerrs); - perf_print_counter(_pc_idle); - perf_print_counter(_pc_badidle); - count = 0; - } - } - - return 0; - } - - case 2: - syslog(LOG_INFO, "test 2\n"); - return 0; - } - - default: - break; - } - - return -1; -} - -int -ArchPX4IOSerial::_bus_exchange(IOPacket *_packet) -{ - _current_packet = _packet; - - /* clear data that may be in the RDR and clear overrun error: */ - if (rISR & USART_ISR_RXNE) { - (void)rRDR; - } - - rICR = rISR & rISR_ERR_FLAGS_MASK; /* clear the flags */ - - /* start RX DMA */ - perf_begin(_pc_txns); - - /* DMA setup time ~3µs */ - _rx_dma_status = _dma_status_waiting; - - /* - * Note that we enable circular buffer mode as a workaround for - * there being no API to disable the DMA FIFO. We need direct mode - * because otherwise when the line idle interrupt fires there - * will be packet bytes still in the DMA FIFO, and we will assume - * that the idle was spurious. - * - * XXX this should be fixed with a NuttX change. - */ - stm32_dmacfg_t rxdmacfg; - rxdmacfg.paddr = PX4IO_SERIAL_BASE + STM32_USART_RDR_OFFSET; - rxdmacfg.maddr = reinterpret_cast(_current_packet); - rxdmacfg.ndata = sizeof(*_current_packet); - rxdmacfg.cfg1 = (DMA_SCR_CIRC | - DMA_SCR_DIR_P2M | - DMA_SCR_MINC | - DMA_SCR_PSIZE_8BITS | - DMA_SCR_MSIZE_8BITS | - DMA_SCR_PBURST_SINGLE | - DMA_SCR_MBURST_SINGLE | - DMA_SCR_TRBUFF); - rxdmacfg.cfg2 = 0; - - - stm32_dmasetup(_rx_dma, &rxdmacfg); - - rCR3 |= USART_CR3_DMAR; - stm32_dmastart(_rx_dma, _dma_callback, this, false); - - /* Clean _current_packet, so DMA can see the data */ - up_clean_dcache((uintptr_t)_current_packet, - (uintptr_t)_current_packet + DMA_ALIGN_UP(sizeof(IOPacket))); - - /* start TX DMA - no callback if we also expect a reply */ - /* DMA setup time ~3µs */ - - stm32_dmacfg_t txdmacfg; - txdmacfg.paddr = PX4IO_SERIAL_BASE + STM32_USART_TDR_OFFSET; - txdmacfg.maddr = reinterpret_cast(_current_packet); - txdmacfg.ndata = PKT_SIZE(*_current_packet); - txdmacfg.cfg1 = (DMA_SCR_DIR_M2P | - DMA_SCR_MINC | - DMA_SCR_PSIZE_8BITS | - DMA_SCR_MSIZE_8BITS | - DMA_SCR_PBURST_SINGLE | - DMA_SCR_MBURST_SINGLE | - DMA_SCR_TRBUFF); - txdmacfg.cfg2 = 0; - - stm32_dmasetup(_tx_dma, &txdmacfg); - rCR3 |= USART_CR3_DMAT; - stm32_dmastart(_tx_dma, nullptr, nullptr, false); - //rCR1 &= ~USART_CR1_TE; - //rCR1 |= USART_CR1_TE; - - /* compute the deadline for a 10ms timeout */ - struct timespec abstime; - clock_gettime(CLOCK_REALTIME, &abstime); - abstime.tv_nsec += 10 * 1000 * 1000; - - if (abstime.tv_nsec >= 1000 * 1000 * 1000) { - abstime.tv_sec++; - abstime.tv_nsec -= 1000 * 1000 * 1000; - } - - /* wait for the transaction to complete - 64 bytes @ 1.5Mbps ~426µs */ - int ret; - - for (;;) { - ret = sem_timedwait(&_completion_semaphore, &abstime); - - if (ret == OK) { - /* check for DMA errors */ - if (_rx_dma_status & DMA_STATUS_TEIF) { - // stream transfer error, ensure all DMA is also stopped before exiting early - _abort_dma(); - perf_count(_pc_dmaerrs); - ret = -EIO; - break; - } - - /* check packet CRC - corrupt packet errors mean IO receive CRC error */ - uint8_t crc = _current_packet->crc; - _current_packet->crc = 0; - - if ((crc != crc_packet(_current_packet)) || (PKT_CODE(*_current_packet) == PKT_CODE_CORRUPT)) { - _abort_dma(); - perf_count(_pc_crcerrs); - ret = -EIO; - break; - } - - /* successful txn (may still be reporting an error) */ - break; - } - - if (errno == ETIMEDOUT) { - /* something has broken - clear out any partial DMA state and reconfigure */ - _abort_dma(); - perf_count(_pc_timeouts); - perf_cancel(_pc_txns); /* don't count this as a transaction */ - break; - } - - /* we might? see this for EINTR */ - syslog(LOG_ERR, "unexpected ret %d/%d\n", ret, errno); - } - - /* reset DMA status */ - _rx_dma_status = _dma_status_inactive; - - /* update counters */ - perf_end(_pc_txns); - - return ret; -} - -void -ArchPX4IOSerial::_dma_callback(DMA_HANDLE handle, uint8_t status, void *arg) -{ - if (arg != nullptr) { - ArchPX4IOSerial *ps = reinterpret_cast(arg); - - ps->_do_rx_dma_callback(status); - } -} - -void -ArchPX4IOSerial::_do_rx_dma_callback(unsigned status) -{ - /* on completion of a reply, wake the waiter */ - if (_rx_dma_status == _dma_status_waiting) { - - /* check for packet overrun - this will occur after DMA completes */ - uint32_t sr = rISR; - - if (sr & (USART_ISR_ORE | USART_ISR_RXNE)) { - (void)rRDR; - rICR = sr & (USART_ISR_ORE | USART_ISR_RXNE); - status = DMA_STATUS_TEIF; - } - - /* save RX status */ - _rx_dma_status = status; - - /* disable UART DMA */ - rCR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR); - - /* complete now */ - px4_sem_post(&_completion_semaphore); - } -} - -int -ArchPX4IOSerial::_interrupt(int irq, void *context, void *arg) -{ - if (arg != nullptr) { - ArchPX4IOSerial *instance = reinterpret_cast(arg); - - instance->_do_interrupt(); - } - - return 0; -} - -void -ArchPX4IOSerial::_do_interrupt() -{ - uint32_t sr = rISR; /* get UART status register */ - - if (sr & USART_ISR_RXNE) { - (void)rRDR; /* read DR to clear RXNE */ - } - - rICR = sr & rISR_ERR_FLAGS_MASK; /* clear flags */ - - if (sr & (USART_ISR_ORE | /* overrun error - packet was too big for DMA or DMA was too slow */ - USART_ISR_NE | /* noise error - we have lost a byte due to noise */ - USART_ISR_FE)) { /* framing error - start/stop bit lost or line break */ - - /* - * If we are in the process of listening for something, these are all fatal; - * abort the DMA with an error. - */ - if (_rx_dma_status == _dma_status_waiting) { - _abort_dma(); - - perf_count(_pc_uerrs); - /* complete DMA as though in error */ - _do_rx_dma_callback(DMA_STATUS_TEIF); - - return; - } - - /* XXX we might want to use FE / line break as an out-of-band handshake ... handle it here */ - - /* don't attempt to handle IDLE if it's set - things went bad */ - return; - } - - if (sr & USART_ISR_IDLE) { - - /* if there is DMA reception going on, this is a short packet */ - if (_rx_dma_status == _dma_status_waiting) { - /* Invalidate _current_packet, so we get fresh data from RAM */ - up_invalidate_dcache((uintptr_t)_current_packet, - (uintptr_t)_current_packet + DMA_ALIGN_UP(sizeof(IOPacket))); - - /* verify that the received packet is complete */ - size_t length = sizeof(*_current_packet) - stm32_dmaresidual(_rx_dma); - - if ((length < 1) || (length < PKT_SIZE(*_current_packet))) { - perf_count(_pc_badidle); - - /* stop the receive DMA */ - stm32_dmastop(_rx_dma); - - /* complete the short reception */ - _do_rx_dma_callback(DMA_STATUS_TEIF); - return; - } - - perf_count(_pc_idle); - - /* stop the receive DMA */ - stm32_dmastop(_rx_dma); - - /* complete the short reception */ - _do_rx_dma_callback(DMA_STATUS_TCIF); - } - } -} - -void -ArchPX4IOSerial::_abort_dma() -{ - /* stop DMA */ - stm32_dmastop(_tx_dma); - stm32_dmastop(_rx_dma); - - /* disable UART DMA */ - rCR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR); - - /* clear data that may be in the RDR and clear overrun error: */ - if (rISR & USART_ISR_RXNE) { - (void)rRDR; - } - - rICR = rISR & rISR_ERR_FLAGS_MASK; /* clear the flags */ -} diff --git a/src/drivers/px4io/CMakeLists.txt b/src/drivers/px4io/CMakeLists.txt index afb5d189fb..1ed18a9bdf 100644 --- a/src/drivers/px4io/CMakeLists.txt +++ b/src/drivers/px4io/CMakeLists.txt @@ -42,7 +42,6 @@ px4_add_module( MODULE_CONFIG module.yaml DEPENDS - arch_px4io_serial circuit_breaker mixer_module ) diff --git a/src/drivers/px4io/px4io.cpp b/src/drivers/px4io/px4io.cpp index a9085266fe..56ad9fbb2b 100644 --- a/src/drivers/px4io/px4io.cpp +++ b/src/drivers/px4io/px4io.cpp @@ -85,7 +85,7 @@ #include "modules/dataman/dataman.h" -#include "px4io_driver.h" +#include "px4io_serial.h" #define PX4IO_SET_DEBUG _IOC(0xff00, 0) #define PX4IO_REBOOT_BOOTLOADER _IOC(0xff00, 1) @@ -109,7 +109,7 @@ public: * Initialize all class variables. */ PX4IO() = delete; - explicit PX4IO(device::Device *interface); + explicit PX4IO(PX4IO_serial *interface); ~PX4IO() override; @@ -169,7 +169,7 @@ private: static constexpr int PX4IO_MAX_ACTUATORS = 8; - device::Device *const _interface; + PX4IO_serial *const _interface; unsigned _hardware{0}; ///< Hardware revision unsigned _max_actuators{0}; ///< Maximum # of actuators supported by PX4IO @@ -347,7 +347,7 @@ private: #define PX4IO_DEVICE_PATH "/dev/px4io" -PX4IO::PX4IO(device::Device *interface) : +PX4IO::PX4IO(PX4IO_serial *interface) : CDev(PX4IO_DEVICE_PATH), OutputModuleInterface(MODULE_NAME, px4::serial_port_to_wq(PX4IO_SERIAL_DEVICE)), _interface(interface) @@ -1805,9 +1805,9 @@ int PX4IO::ioctl(file *filep, int cmd, unsigned long arg) return ret; } -static device::Device *get_interface() +static PX4IO_serial *get_interface() { - device::Device *interface = PX4IO_serial_interface(); + PX4IO_serial *interface = new PX4IO_serial(); if (interface != nullptr) { if (interface->init() != OK) { @@ -1830,7 +1830,7 @@ int PX4IO::checkcrc(int argc, char *argv[]) return 1; } - device::Device *interface = get_interface(); + PX4IO_serial *interface = get_interface(); if (interface == nullptr) { PX4_ERR("interface allocation failed"); @@ -1922,7 +1922,7 @@ int PX4IO::bind(int argc, char *argv[]) int PX4IO::task_spawn(int argc, char *argv[]) { - device::Device *interface = get_interface(); + PX4IO_serial *interface = get_interface(); if (interface == nullptr) { PX4_ERR("Failed to create interface"); @@ -1976,7 +1976,7 @@ int PX4IO::custom_command(int argc, char *argv[]) while (ret != OK && retries < MAX_RETRIES) { - device::Device *interface = get_interface(); + PX4IO_serial *interface = get_interface(); if (interface == nullptr) { PX4_ERR("interface allocation failed"); diff --git a/src/drivers/px4io/px4io_driver.h b/src/drivers/px4io/px4io_driver.h deleted file mode 100644 index 2da2d0e05c..0000000000 --- a/src/drivers/px4io/px4io_driver.h +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2015 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 px4io_driver.h - * - * Interface for PX4IO - */ - -#pragma once - -#include - -#ifdef PX4IO_SERIAL_BASE -#include - -device::Device *PX4IO_serial_interface(); -#endif diff --git a/src/drivers/px4io/px4io_serial.cpp b/src/drivers/px4io/px4io_serial.cpp index efb7065c35..1ea44b5a03 100644 --- a/src/drivers/px4io/px4io_serial.cpp +++ b/src/drivers/px4io/px4io_serial.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2013-2015 PX4 Development Team. All rights reserved. + * Copyright (c) 2013-2021 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 @@ -37,20 +37,15 @@ * Serial interface for PX4IO */ -#include "px4io_driver.h" +#include "px4io_serial.h" -#include +#include + +uint8_t PX4IO_serial::_io_buffer_storage[sizeof(IOPacket)]; static PX4IO_serial *g_interface; -device::Device -*PX4IO_serial_interface() -{ - return new ArchPX4IOSerial(); -} - PX4IO_serial::PX4IO_serial() : - Device("PX4IO_serial"), _pc_txns(perf_alloc(PC_ELAPSED, MODULE_NAME": txns")), _pc_retries(perf_alloc(PC_COUNT, MODULE_NAME": retries")), _pc_timeouts(perf_alloc(PC_COUNT, MODULE_NAME": timeouts")), @@ -81,16 +76,89 @@ PX4IO_serial::~PX4IO_serial() if (g_interface == this) { g_interface = nullptr; } + + close(_uart_fd); } -int -PX4IO_serial::init(IOPacket *io_buffer) +int PX4IO_serial::init() { - _io_buffer_ptr = io_buffer; + _io_buffer_ptr = (IOPacket *)&_io_buffer_storage[0]; + /* create semaphores */ // in case the sub-class impl fails, the semaphore is cleaned up by destructor. px4_sem_init(&_bus_semaphore, 0, 1); + if (_uart_fd < 0) { + _uart_fd = open(PX4IO_SERIAL_DEVICE, O_RDWR | O_NONBLOCK); + } + + if (_uart_fd < 0) { + PX4_ERR("Open failed in %s", __FUNCTION__); + return -1; + + } else { + PX4_INFO("serial port fd %d", _uart_fd); + } + + // Configuration copied from dsm_config + struct termios uart_config; + + int termios_state; + + /* fill the struct for the new configuration */ + tcgetattr(_uart_fd, &uart_config); + + /* properly configure the terminal (see also https://en.wikibooks.org/wiki/Serial_Programming/termios ) */ + + // + // Input flags - Turn off input processing + // + // convert break to null byte, no CR to NL translation, + // no NL to CR translation, don't mark parity errors or breaks + // no input parity check, don't strip high bit off, + // no XON/XOFF software flow control + // + uart_config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP | IXON); + + // + // Output flags - Turn off output processing + // + // no CR to NL translation, no NL to CR-NL translation, + // no NL to CR translation, no column 0 CR suppression, + // no Ctrl-D suppression, no fill characters, no case mapping, + // no local output processing + // + // config.c_oflag &= ~(OCRNL | ONLCR | ONLRET | + // ONOCR | ONOEOT| OFILL | OLCUC | OPOST); + uart_config.c_oflag = 0; + + // + // No line processing + // + // echo off, echo newline off, canonical mode off, + // extended input processing off, signal chars off + // + uart_config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); + + /* no parity, one stop bit, disable flow control */ + uart_config.c_cflag &= ~(CSTOPB | PARENB | CRTSCTS); + + /* set baud rate */ + if ((termios_state = cfsetispeed(&uart_config, B1500000)) < 0) { + PX4_ERR("ERR: %d (cfsetispeed)", termios_state); + return -1; + } + + if ((termios_state = cfsetospeed(&uart_config, B1500000)) < 0) { + PX4_ERR("ERR: %d (cfsetospeed)", termios_state); + return -1; + } + + if ((termios_state = tcsetattr(_uart_fd, TCSANOW, &uart_config)) < 0) { + PX4_ERR("ERR: %d (tcsetattr)", termios_state); + return -1; + } + return 0; } @@ -218,3 +286,46 @@ PX4IO_serial::read(unsigned address, void *data, unsigned count) return result; } + +int PX4IO_serial::_bus_exchange(IOPacket *_packet) +{ + if (_uart_fd < 0) { + init(); + } + + _current_packet = _packet; + + perf_begin(_pc_txns); + + int ret = ::write(_uart_fd, _packet, sizeof(IOPacket)); + + if (ret > 0) { + // PX4_INFO("Write %d bytes", ret); + px4_usleep(2000); + + ret = ::read(_uart_fd, _packet, sizeof(IOPacket)); + + if (ret > 0) { + // PX4_INFO("Read %d bytes", ret); + + // Check CRC + uint8_t crc = _packet->crc; + _packet->crc = 0; + + if ((crc != crc_packet(_packet)) || (PKT_CODE(*_packet) == PKT_CODE_CORRUPT)) { + // PX4_ERR("Packet CRC error"); + perf_count(_pc_crcerrs); + perf_end(_pc_txns); + return -EIO; + } + } + } + + if (ret <= 0) { + perf_cancel(_pc_txns); // don't count this as a transaction + return -EIO; + } + + perf_end(_pc_txns); + return 0; +} diff --git a/platforms/nuttx/src/px4/stm/stm32_common/include/px4_arch/px4io_serial.h b/src/drivers/px4io/px4io_serial.h similarity index 62% rename from platforms/nuttx/src/px4/stm/stm32_common/include/px4_arch/px4io_serial.h rename to src/drivers/px4io/px4io_serial.h index 964627c636..1b1500a1f5 100644 --- a/platforms/nuttx/src/px4/stm/stm32_common/include/px4_arch/px4io_serial.h +++ b/src/drivers/px4io/px4io_serial.h @@ -48,28 +48,22 @@ #include #include -class PX4IO_serial : public device::Device +class PX4IO_serial { public: PX4IO_serial(); - virtual ~PX4IO_serial(); + ~PX4IO_serial(); - virtual int init() = 0; - virtual int read(unsigned offset, void *data, unsigned count = 1); - virtual int write(unsigned address, void *data, unsigned count = 1); + int init(); -protected: - /** - * Does the PX4IO_serial instance initialization. - * @param io_buffer The IO buffer that should be used for transfers. - * @return 0 on success. - */ - int init(IOPacket *io_buffer); + int read(unsigned offset, void *data, unsigned count); + int write(unsigned address, void *data, unsigned count); +private: /** * Start the transaction with IO and wait for it to complete. */ - virtual int _bus_exchange(IOPacket *_packet) = 0; + int _bus_exchange(IOPacket *_packet); /** * Performance counters. @@ -82,7 +76,7 @@ protected: perf_counter_t _pc_uerrs; perf_counter_t _pc_idle; perf_counter_t _pc_badidle; -private: + /* * XXX tune this value * @@ -99,71 +93,12 @@ private: /** bus-ownership lock */ px4_sem_t _bus_semaphore; - /* do not allow top copying this class */ - PX4IO_serial(PX4IO_serial &); - PX4IO_serial &operator = (const PX4IO_serial &); -}; - - -#include - - -class ArchPX4IOSerial : public PX4IO_serial -{ -public: - ArchPX4IOSerial(); - ArchPX4IOSerial(ArchPX4IOSerial &) = delete; - ArchPX4IOSerial &operator = (const ArchPX4IOSerial &) = delete; - virtual ~ArchPX4IOSerial(); - - virtual int init(); - virtual int ioctl(unsigned operation, unsigned &arg); - -protected: - /** - * Start the transaction with IO and wait for it to complete. - */ - int _bus_exchange(IOPacket *_packet); - -private: - DMA_HANDLE _tx_dma; - DMA_HANDLE _rx_dma; + int _uart_fd{-1}; IOPacket *_current_packet; - /** saved DMA status */ - static const unsigned _dma_status_inactive = 0x80000000; // low bits overlap DMA_STATUS_* values - static const unsigned _dma_status_waiting = 0x00000000; - volatile unsigned _rx_dma_status; - - /** client-waiting lock/signal */ - px4_sem_t _completion_semaphore; - - /** - * DMA completion handler. - */ - static void _dma_callback(DMA_HANDLE handle, uint8_t status, void *arg); - void _do_rx_dma_callback(unsigned status); - - /** - * Serial interrupt handler. - */ - static int _interrupt(int vector, void *context, void *arg); - void _do_interrupt(); - - /** - * Cancel any DMA in progress with an error. - */ - void _abort_dma(); - - /** - * Performance counters. - */ - perf_counter_t _pc_dmaerrs; - /** * IO Buffer storage */ static uint8_t _io_buffer_storage[] px4_cache_aligned_data(); }; -