Skip to content

Commit

Permalink
boards: simplify RC port configuration by using NuttX ioctl's
Browse files Browse the repository at this point in the history
A board only needs to define:
 #define RC_SERIAL_PORT                     "/dev/ttyS4"

Then it can optionally define one or more of the following:
 #define RC_SERIAL_SWAP_RXTX
 #define RC_SERIAL_SINGLEWIRE
 #define RC_INVERT_INPUT(_invert_true) px4_arch_gpiowrite(GPIO_SBUS_INV, _invert_true)
  • Loading branch information
bkueng committed Jul 16, 2019
1 parent 9a1ad97 commit b7a0e1e
Show file tree
Hide file tree
Showing 18 changed files with 139 additions and 307 deletions.
2 changes: 1 addition & 1 deletion boards/airmind/mindpx-v2/src/board_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@

// #define GPIO_RSSI_IN (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN1)
#define GPIO_SBUS_INV (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN10)
#define BOARD_INVERT_RC_INPUT(_invert_true, _na) px4_arch_gpiowrite(GPIO_SBUS_INV, _invert_true);
#define RC_INVERT_INPUT(_invert_true) px4_arch_gpiowrite(GPIO_SBUS_INV, _invert_true);

#define GPIO_FRSKY_INV (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN12)
#define INVERT_FRSKY(_invert_true) px4_arch_gpiowrite(GPIO_FRSKY_INV, _invert_true);
Expand Down
3 changes: 3 additions & 0 deletions boards/av/x-v1/nuttx-config/nsh/defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,9 @@ CONFIG_STM32F7_USART2=y
CONFIG_STM32F7_USART3=y
CONFIG_STM32F7_USART6=y
CONFIG_STM32F7_USART_BREAKS=y
CONFIG_STM32F7_USART_INVERT=y
CONFIG_STM32F7_USART_SINGLEWIRE=y
CONFIG_STM32F7_USART_SWAP=y
CONFIG_STM32F7_WWDG=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_PING=y
Expand Down
1 change: 0 additions & 1 deletion boards/av/x-v1/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@

add_library(drivers_board
init.c
manifest.c
sdio.c
spi.cpp
timer_config.c
Expand Down
5 changes: 0 additions & 5 deletions boards/av/x-v1/src/board_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,12 +268,7 @@

/* RC Serial port */

#define RC_UXART_BASE STM32_UART5_BASE
#define RC_SERIAL_PORT "/dev/ttyS4"
#define BOARD_HAS_SINGLE_WIRE 0 /* HW is capable of Single Wire */
#define BOARD_HAS_SINGLE_WIRE_ON_TX 0 /* HW default is wired as Single Wire On TX pin */
#define BOARD_HAS_RX_TX_SWAP 0 /* HW Can swap TX and RX */
#define RC_SERIAL_PORT_IS_SWAPED 0 /* Board wired with RC's TX is on cpu RX */

/* Power switch controls ******************************************************/

Expand Down
45 changes: 0 additions & 45 deletions boards/av/x-v1/src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,51 +75,6 @@

static int configure_switch(void);

/************************************************************************************
* Name: board_rc_input
*
* Description:
* All boards my optionally provide this API to invert the Serial RC input.
* This is needed on SoCs that support the notion RXINV or TXINV as apposed to
* and external XOR controlled by a GPIO
*
************************************************************************************/

__EXPORT void board_rc_input(bool invert_on, uint32_t uxart_base)
{

irqstate_t irqstate = px4_enter_critical_section();

uint32_t cr1 = getreg32(STM32_USART_CR1_OFFSET + uxart_base);
uint32_t cr2 = getreg32(STM32_USART_CR2_OFFSET + uxart_base);
uint32_t regval = cr1;

/* {R|T}XINV bit fields can only be written when the USART is disabled (UE=0). */

regval &= ~USART_CR1_UE;

putreg32(regval, STM32_USART_CR1_OFFSET + uxart_base);

if (invert_on) {
#if defined(BOARD_HAS_RX_TX_SWAP) && RC_SERIAL_PORT_IS_SWAPED == 1

/* This is only ever turned on */

cr2 |= (USART_CR2_RXINV | USART_CR2_TXINV | USART_CR2_SWAP);
#else
cr2 |= (USART_CR2_RXINV | USART_CR2_TXINV);
#endif

} else {
cr2 &= ~(USART_CR2_RXINV | USART_CR2_TXINV);
}

putreg32(cr2, STM32_USART_CR2_OFFSET + uxart_base);
putreg32(cr1, STM32_USART_CR1_OFFSET + uxart_base);

leave_critical_section(irqstate);
}

/************************************************************************************
* Name: board_on_reset
*
Expand Down
67 changes: 0 additions & 67 deletions boards/av/x-v1/src/manifest.c

This file was deleted.

1 change: 1 addition & 0 deletions boards/nxp/fmuk66-v3/nuttx-config/nsh/defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ CONFIG_KINETIS_UART4_RXDMA=y
CONFIG_KINETIS_UARTFIFOS=y
CONFIG_KINETIS_UART_BREAKS=y
CONFIG_KINETIS_UART_EXTEDED_BREAK=y
CONFIG_KINETIS_UART_INVERT=y
CONFIG_KINETIS_USBDCD=y
CONFIG_KINETS_LPUART_LOWEST=y
CONFIG_LIBC_FLOATINGPOINT=y
Expand Down
1 change: 0 additions & 1 deletion boards/nxp/fmuk66-v3/src/board_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ __BEGIN_DECLS

/* RC input */

#define RC_UXART_BASE KINETIS_UART1_BASE
#define RC_SERIAL_PORT "/dev/ttyS2" /* UART1 */
#define GPIO_RSSI_IN PIN_ADC1_SE13

Expand Down
35 changes: 0 additions & 35 deletions boards/nxp/fmuk66-v3/src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,41 +140,6 @@ int board_read_VBUS_state(void)
return BOARD_ADC_USB_CONNECTED ? 0 : 1;
}

/************************************************************************************
* Name: board_rc_input
*
* Description:
* All boards my optionally provide this API to invert the Serial RC input.
* This is needed on SoCs that support the notion RXINV or TXINV as opposed to
* and external XOR controlled by a GPIO
*
************************************************************************************/

__EXPORT void board_rc_input(bool invert_on, uint32_t uxart_base)
{

irqstate_t irqstate = px4_enter_critical_section();

uint8_t s2 = getreg8(KINETIS_UART_S2_OFFSET + uxart_base);
uint8_t c3 = getreg8(KINETIS_UART_C3_OFFSET + uxart_base);

/* {R|T}XINV bit fields can written any time */

if (invert_on) {
s2 |= (UART_S2_RXINV);
c3 |= (UART_C3_TXINV);

} else {
s2 &= ~(UART_S2_RXINV);
c3 &= ~(UART_C3_TXINV);
}

putreg8(s2, KINETIS_UART_S2_OFFSET + uxart_base);
putreg8(c3, KINETIS_UART_C3_OFFSET + uxart_base);

leave_critical_section(irqstate);
}

/************************************************************************************
* Name: board_peripheral_reset
*
Expand Down
2 changes: 1 addition & 1 deletion boards/px4/fmu-v4/src/board_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@

/* For R12, this signal is active high. */
#define GPIO_SBUS_INV (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN13)
#define BOARD_INVERT_RC_INPUT(_invert_true, _na) px4_arch_gpiowrite(GPIO_SBUS_INV, _invert_true)
#define RC_INVERT_INPUT(_invert_true) px4_arch_gpiowrite(GPIO_SBUS_INV, _invert_true)

#define GPIO_SPEKTRUM_PWR_EN (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN4)

Expand Down
1 change: 0 additions & 1 deletion boards/px4/fmu-v4pro/src/board_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,6 @@
*/
#define GPIO_BTN_SAFETY_FMU (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTC|GPIO_PIN4)
#define GPIO_SBUS_INV (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN13)
#define BOARD_INVERT_RC_INPUT(_invert_true, _na) px4_arch_gpiowrite(GPIO_SBUS_INV, _invert_true)

#define GPIO_8266_GPIO0 (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN2)
//TODO: fo not see on schematic #define GPIO_SPEKTRUM_PWR_EN (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN4)
Expand Down
2 changes: 2 additions & 0 deletions boards/px4/fmu-v5/nuttx-config/nsh/defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,9 @@ CONFIG_STM32F7_USART2=y
CONFIG_STM32F7_USART3=y
CONFIG_STM32F7_USART6=y
CONFIG_STM32F7_USART_BREAKS=y
CONFIG_STM32F7_USART_INVERT=y
CONFIG_STM32F7_USART_SINGLEWIRE=y
CONFIG_STM32F7_USART_SWAP=y
CONFIG_STM32F7_WWDG=y
CONFIG_SYSTEM_CDCACM=y
CONFIG_SYSTEM_NSH=y
Expand Down
6 changes: 1 addition & 5 deletions boards/px4/fmu-v5/src/board_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -496,12 +496,8 @@

/* RC Serial port */

#define RC_UXART_BASE STM32_USART6_BASE
#define RC_SERIAL_PORT "/dev/ttyS4"
#define BOARD_HAS_SINGLE_WIRE 1 /* HW is capable of Single Wire */
#define BOARD_HAS_SINGLE_WIRE_ON_TX 1 /* HW default is wired as Single Wire On TX pin */
#define BOARD_HAS_RX_TX_SWAP 1 /* HW Can swap TX and RX */
#define RC_SERIAL_PORT_IS_SWAPED 0 /* Board wired with RC's TX is on cpu RX */
#define RC_SERIAL_SINGLEWIRE

/* Input Capture Channels. */
#define INPUT_CAP1_TIMER 2
Expand Down
45 changes: 0 additions & 45 deletions boards/px4/fmu-v5/src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,51 +91,6 @@ extern void led_off(int led);
__END_DECLS


/************************************************************************************
* Name: board_rc_input
*
* Description:
* All boards my optionally provide this API to invert the Serial RC input.
* This is needed on SoCs that support the notion RXINV or TXINV as apposed to
* and external XOR controlled by a GPIO
*
************************************************************************************/

__EXPORT void board_rc_input(bool invert_on, uint32_t uxart_base)
{

irqstate_t irqstate = px4_enter_critical_section();

uint32_t cr1 = getreg32(STM32_USART_CR1_OFFSET + uxart_base);
uint32_t cr2 = getreg32(STM32_USART_CR2_OFFSET + uxart_base);
uint32_t regval = cr1;

/* {R|T}XINV bit fields can only be written when the USART is disabled (UE=0). */

regval &= ~USART_CR1_UE;

putreg32(regval, STM32_USART_CR1_OFFSET + uxart_base);

if (invert_on) {
#if defined(BOARD_HAS_RX_TX_SWAP) && RC_SERIAL_PORT_IS_SWAPED == 1

/* This is only ever turned on */

cr2 |= (USART_CR2_RXINV | USART_CR2_TXINV | USART_CR2_SWAP);
#else
cr2 |= (USART_CR2_RXINV | USART_CR2_TXINV);
#endif

} else {
cr2 &= ~(USART_CR2_RXINV | USART_CR2_TXINV);
}

putreg32(cr2, STM32_USART_CR2_OFFSET + uxart_base);
putreg32(cr1, STM32_USART_CR1_OFFSET + uxart_base);

leave_critical_section(irqstate);
}

/************************************************************************************
* Name: board_peripheral_reset
*
Expand Down
14 changes: 0 additions & 14 deletions boards/px4/fmu-v5/src/manifest.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,20 +96,6 @@ static px4_hw_mft_list_entry_t mft_lists[] = {
};


/************************************************************************************
* Name: board_rc_input
*
* Description:
* All boards my optionally provide this API to invert the Serial RC input.
* This is needed on SoCs that support the notion RXINV or TXINV as opposed to
* and external XOR controlled by a GPIO
*
************************************************************************************/
__EXPORT bool board_supports_single_wire(uint32_t uxart_base)
{
return uxart_base == RC_UXART_BASE;
}

/************************************************************************************
* Name: board_query_manifest
*
Expand Down
Loading

0 comments on commit b7a0e1e

Please sign in to comment.