Port CRSF RC driver to new Serial UART API (#22917)

* Added implementations of Rx Tx swap and single wire for new UART API needed by CRSF driver
* Added inverted mode to Serial interface API
This commit is contained in:
Eric Katzfey
2024-04-01 19:09:13 -07:00
committed by GitHub
parent a9ba0acb2a
commit 8e61026511
14 changed files with 367 additions and 79 deletions
+15
View File
@@ -64,6 +64,8 @@ public:
ssize_t write(const void *buffer, size_t buffer_size);
void flush();
const char *getPort() const;
static bool validatePort(const char *port);
bool setPort(const char *port);
@@ -83,6 +85,15 @@ public:
FlowControl getFlowcontrol() const;
bool setFlowcontrol(FlowControl flowcontrol);
bool getSingleWireMode() const;
bool setSingleWireMode();
bool getSwapRxTxMode() const;
bool setSwapRxTxMode();
bool getInvertedMode() const;
bool setInvertedMode(bool enable);
private:
int _serial_fd{-1};
@@ -100,6 +111,10 @@ private:
bool validateBaudrate(uint32_t baudrate);
bool configure();
bool _single_wire_mode{false};
bool _swap_rx_tx_mode{false};
bool _inverted_mode{false};
};
} // namespace device
@@ -212,6 +212,16 @@ bool SerialImpl::open()
_open = true;
if (_single_wire_mode) {
setSingleWireMode();
}
if (_swap_rx_tx_mode) {
setSwapRxTxMode();
}
setInvertedMode(_inverted_mode);
return _open;
}
@@ -316,6 +326,13 @@ ssize_t SerialImpl::write(const void *buffer, size_t buffer_size)
return written;
}
void SerialImpl::flush()
{
if (_open) {
tcflush(_serial_fd, TCIOFLUSH);
}
}
const char *SerialImpl::getPort() const
{
return _port;
@@ -409,4 +426,69 @@ bool SerialImpl::setFlowcontrol(FlowControl flowcontrol)
return flowcontrol == FlowControl::Disabled;
}
bool SerialImpl::getSingleWireMode() const
{
return _single_wire_mode;
}
bool SerialImpl::setSingleWireMode()
{
#if defined(TIOCSSINGLEWIRE)
if (_open) {
ioctl(_serial_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED);
}
_single_wire_mode = true;
return true;
#else
return false;
#endif // TIOCSSINGLEWIRE
}
bool SerialImpl::getSwapRxTxMode() const
{
return _swap_rx_tx_mode;
}
bool SerialImpl::setSwapRxTxMode()
{
#if defined(TIOCSSWAP)
if (_open) {
ioctl(_serial_fd, TIOCSSWAP, SER_SWAP_ENABLED);
}
_swap_rx_tx_mode = true;
return true;
#else
return false;
#endif // TIOCSSWAP
}
bool SerialImpl::getInvertedMode() const
{
return _inverted_mode;
}
bool SerialImpl::setInvertedMode(bool enable)
{
#if defined(TIOCSINVERT)
if (_open) {
if (enable) {
ioctl(_serial_fd, TIOCSINVERT, SER_INVERT_ENABLED_RX | SER_INVERT_ENABLED_TX);
} else {
ioctl(_serial_fd, TIOCSINVERT, 0);
}
}
_inverted_mode = enable;
return true;
#else
return _inverted_mode == enable;
#endif // TIOCSINVERT
}
} // namespace device