mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-29 21:03:35 +08:00
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:
@@ -84,6 +84,11 @@ ssize_t Serial::write(const void *buffer, size_t buffer_size)
|
||||
return _impl.write(buffer, buffer_size);
|
||||
}
|
||||
|
||||
void Serial::flush()
|
||||
{
|
||||
return _impl.flush();
|
||||
}
|
||||
|
||||
uint32_t Serial::getBaudrate() const
|
||||
{
|
||||
return _impl.getBaudrate();
|
||||
@@ -134,6 +139,34 @@ bool Serial::setFlowcontrol(FlowControl flowcontrol)
|
||||
return _impl.setFlowcontrol(flowcontrol);
|
||||
}
|
||||
|
||||
bool Serial::getSingleWireMode() const
|
||||
{
|
||||
return _impl.getSingleWireMode();
|
||||
}
|
||||
bool Serial::setSingleWireMode()
|
||||
{
|
||||
return _impl.setSingleWireMode();
|
||||
}
|
||||
|
||||
bool Serial::getSwapRxTxMode() const
|
||||
{
|
||||
return _impl.getSwapRxTxMode();
|
||||
}
|
||||
bool Serial::setSwapRxTxMode()
|
||||
{
|
||||
return _impl.setSwapRxTxMode();
|
||||
}
|
||||
|
||||
bool Serial::getInvertedMode() const
|
||||
{
|
||||
return _impl.getInvertedMode();
|
||||
}
|
||||
|
||||
bool Serial::setInvertedMode(bool enable)
|
||||
{
|
||||
return _impl.setInvertedMode(enable);
|
||||
}
|
||||
|
||||
const char *Serial::getPort() const
|
||||
{
|
||||
return _impl.getPort();
|
||||
|
||||
@@ -65,6 +65,8 @@ public:
|
||||
|
||||
ssize_t write(const void *buffer, size_t buffer_size);
|
||||
|
||||
void flush();
|
||||
|
||||
// If port is already open then the following configuration functions
|
||||
// will reconfigure the port. If the port is not yet open then they will
|
||||
// simply store the configuration in preparation for the port to be opened.
|
||||
@@ -84,6 +86,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);
|
||||
|
||||
static bool validatePort(const char *port);
|
||||
bool setPort(const char *port);
|
||||
const char *getPort() const;
|
||||
|
||||
@@ -214,6 +214,17 @@ bool SerialImpl::open()
|
||||
|
||||
_open = true;
|
||||
|
||||
// Do pin operations after port has been opened
|
||||
if (_single_wire_mode) {
|
||||
setSingleWireMode();
|
||||
}
|
||||
|
||||
if (_swap_rx_tx_mode) {
|
||||
setSwapRxTxMode();
|
||||
}
|
||||
|
||||
setInvertedMode(_inverted_mode);
|
||||
|
||||
return _open;
|
||||
}
|
||||
|
||||
@@ -323,6 +334,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;
|
||||
@@ -416,4 +434,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
|
||||
|
||||
@@ -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};
|
||||
@@ -101,6 +112,9 @@ 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
|
||||
|
||||
@@ -46,6 +46,7 @@ target_link_libraries(px4_layer
|
||||
|
||||
add_library(px4_kernel_layer
|
||||
${KERNEL_SRCS}
|
||||
SerialImpl.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(px4_kernel_layer
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -63,6 +63,8 @@ public:
|
||||
|
||||
ssize_t write(const void *buffer, size_t buffer_size);
|
||||
|
||||
void flush();
|
||||
|
||||
const char *getPort() const;
|
||||
bool setPort(const char *port);
|
||||
static bool validatePort(const char *port);
|
||||
@@ -82,6 +84,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};
|
||||
|
||||
@@ -255,6 +255,11 @@ ssize_t SerialImpl::write(const void *buffer, size_t buffer_size)
|
||||
return ret_write;
|
||||
}
|
||||
|
||||
void SerialImpl::flush()
|
||||
{
|
||||
// TODO: Flush not implemented yet on Qurt
|
||||
}
|
||||
|
||||
const char *SerialImpl::getPort() const
|
||||
{
|
||||
return _port;
|
||||
@@ -348,4 +353,36 @@ bool SerialImpl::setFlowcontrol(FlowControl flowcontrol)
|
||||
return flowcontrol == FlowControl::Disabled;
|
||||
}
|
||||
|
||||
bool SerialImpl::getSingleWireMode() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SerialImpl::setSingleWireMode()
|
||||
{
|
||||
// Qurt platform does not support single wire mode
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SerialImpl::getSwapRxTxMode() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SerialImpl::setSwapRxTxMode()
|
||||
{
|
||||
// Qurt platform does not support swap rx tx mode
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SerialImpl::setInvertedMode(bool enable)
|
||||
{
|
||||
// Qurt platform does not support inverted mode
|
||||
return false == enable;
|
||||
}
|
||||
bool SerialImpl::getInvertedMode() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace device
|
||||
|
||||
Reference in New Issue
Block a user