diff --git a/libraries/AP_HAL_ChibiOS/UARTDriver.cpp b/libraries/AP_HAL_ChibiOS/UARTDriver.cpp index a906709d4b..5f939631e2 100644 --- a/libraries/AP_HAL_ChibiOS/UARTDriver.cpp +++ b/libraries/AP_HAL_ChibiOS/UARTDriver.cpp @@ -694,4 +694,60 @@ bool UARTDriver::set_unbuffered_writes(bool on) return true; } +/* + setup parity + */ +void UARTDriver::configure_parity(uint8_t v) +{ + if (sdef.is_usb) { + // not possible + return; + } + + switch (v) { + case 0: + // no parity + sercfg.cr1 &= ~(USART_CR1_PCE | USART_CR1_PS); + break; + case 1: + // odd parity + sercfg.cr1 |= USART_CR1_PCE; + sercfg.cr1 |= USART_CR1_PS; + break; + case 2: + // even parity + sercfg.cr1 |= USART_CR1_PCE; + sercfg.cr1 &= ~USART_CR1_PS; + break; + } + + // stop and start to take effect + sdStop((SerialDriver*)sdef.serial); + sdStart((SerialDriver*)sdef.serial, &sercfg); +} + +/* + set stop bits + */ +void UARTDriver::set_stop_bits(int n) +{ + if (sdef.is_usb) { + // not possible + return; + } + + switch (n) { + case 1: + sercfg.cr2 = USART_CR2_STOP1_BITS; + break; + case 2: + sercfg.cr2 = USART_CR2_STOP2_BITS; + break; + } + // stop and start to take effect + sdStop((SerialDriver*)sdef.serial); + sdStart((SerialDriver*)sdef.serial, &sercfg); +} + + #endif //CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS diff --git a/libraries/AP_HAL_ChibiOS/UARTDriver.h b/libraries/AP_HAL_ChibiOS/UARTDriver.h index 23a04879df..6932ba1ac4 100644 --- a/libraries/AP_HAL_ChibiOS/UARTDriver.h +++ b/libraries/AP_HAL_ChibiOS/UARTDriver.h @@ -66,6 +66,9 @@ public: // allow for low latency writes bool set_unbuffered_writes(bool on) override; + + void configure_parity(uint8_t v) override; + void set_stop_bits(int n) override; private: bool tx_bounce_buf_ready;