<p>Kévin Redon has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13677">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add async library with ring on TX<br><br>the standard async library expected the caller to wait until the<br>transmission was complete (by counting using the transmit callback<br>or checking using usart_async_get_status) before freeing/reusing<br>the memory holding the data to be transmitted.<br>this is not practical when using stdio on top of the peripheral<br>since printf returns directly and reuses the memory.<br>the new USART async library has a ring buffer for the data to be<br>transmitted (similar to the data being received).<br><br>WARNING: the ring buffer library overwrites old data when the<br>buffer size is exceeded. We do not prevent this since don't want<br>to block. To prevent this behaviour, provide a large enough buffer<br>of check the buffer status yourself using usart_async_get_status.<br><br>Change-Id: Iafd5295b90ef9f428f640314c24f6c31ee82c9d6<br>---<br>M sysmoOCTSIM/gcc/Makefile<br>A sysmoOCTSIM/hal/include/hal_usart_async_rings.h<br>A sysmoOCTSIM/hal/src/hal_usart_async_rings.c<br>3 files changed, 767 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/77/13677/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile</span><br><span>index bd4bdb0..046970f 100644</span><br><span>--- a/sysmoOCTSIM/gcc/Makefile</span><br><span>+++ b/sysmoOCTSIM/gcc/Makefile</span><br><span>@@ -84,6 +84,7 @@</span><br><span> hpl/osc32kctrl/hpl_osc32kctrl.o \</span><br><span> driver_init.o \</span><br><span> hal/src/hal_usart_async.o \</span><br><span style="color: hsl(120, 100%, 40%);">+hal/src/hal_usart_async_rings.o \</span><br><span> hpl/sercom/hpl_sercom.o \</span><br><span> hal/utils/src/utils_ringbuffer.o \</span><br><span> main.o \</span><br><span>@@ -131,6 +132,7 @@</span><br><span> "hpl/osc32kctrl/hpl_osc32kctrl.o" \</span><br><span> "driver_init.o" \</span><br><span> "hal/src/hal_usart_async.o" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hal/src/hal_usart_async_rings.o" \</span><br><span> "hpl/sercom/hpl_sercom.o" \</span><br><span> "hal/utils/src/utils_ringbuffer.o" \</span><br><span> "main.o" \</span><br><span>@@ -177,6 +179,7 @@</span><br><span> "driver_init.d" \</span><br><span> "stdio_redirect/gcc/read.d" \</span><br><span> "hal/src/hal_usart_async.d" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hal/src/hal_usart_async_rings.d" \</span><br><span> "hpl/osc32kctrl/hpl_osc32kctrl.d" \</span><br><span> "i2c_bitbang.d" \</span><br><span> "octsim_i2c.d" \</span><br><span>diff --git a/sysmoOCTSIM/hal/include/hal_usart_async_rings.h b/sysmoOCTSIM/hal/include/hal_usart_async_rings.h</span><br><span>new file mode 100644</span><br><span>index 0000000..c66e21c</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/hal/include/hal_usart_async_rings.h</span><br><span>@@ -0,0 +1,341 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \file</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief USART related functionality declaration.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2019 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \asf_license_start</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \page License</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Subject to your compliance with these terms, you may use Microchip</span><br><span style="color: hsl(120, 100%, 40%);">+ * software and any derivatives exclusively with Microchip products.</span><br><span style="color: hsl(120, 100%, 40%);">+ * It is your responsibility to comply with third party license terms applicable</span><br><span style="color: hsl(120, 100%, 40%);">+ * to your use of third party software (including open source software) that</span><br><span style="color: hsl(120, 100%, 40%);">+ * may accompany Microchip software.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,</span><br><span style="color: hsl(120, 100%, 40%);">+ * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,</span><br><span style="color: hsl(120, 100%, 40%);">+ * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,</span><br><span style="color: hsl(120, 100%, 40%);">+ * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE</span><br><span style="color: hsl(120, 100%, 40%);">+ * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL</span><br><span style="color: hsl(120, 100%, 40%);">+ * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE</span><br><span style="color: hsl(120, 100%, 40%);">+ * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE</span><br><span style="color: hsl(120, 100%, 40%);">+ * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT</span><br><span style="color: hsl(120, 100%, 40%);">+ * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY</span><br><span style="color: hsl(120, 100%, 40%);">+ * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,</span><br><span style="color: hsl(120, 100%, 40%);">+ * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \asf_license_stop</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef _HAL_USART_ASYNC_RINGS_H_INCLUDED</span><br><span style="color: hsl(120, 100%, 40%);">+#define _HAL_USART_ASYNC_RINGS_H_INCLUDED</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "hal_io.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <hpl_usart_async.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <utils_ringbuffer.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \addtogroup doc_driver_hal_usart_async</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @{</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef __cplusplus</span><br><span style="color: hsl(120, 100%, 40%);">+extern "C" {</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief USART descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The USART descriptor forward declaration.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct usart_async_rings_descriptor;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief USART callback type</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+typedef void (*usart_rings_cb_t)(const struct usart_async_rings_descriptor *const descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief USART callback types</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum usart_async_rings_callback_type { USART_ASYNC_RINGS_RXC_CB, USART_ASYNC_RINGS_TXC_CB, USART_ASYNC_RINGS_ERROR_CB };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief USART callbacks</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct usart_async_rings_callbacks {</span><br><span style="color: hsl(120, 100%, 40%);">+       usart_rings_cb_t tx_done;</span><br><span style="color: hsl(120, 100%, 40%);">+     usart_rings_cb_t rx_done;</span><br><span style="color: hsl(120, 100%, 40%);">+     usart_rings_cb_t error;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/** \brief USART status</span><br><span style="color: hsl(120, 100%, 40%);">+ *  Status descriptor holds the current status of transfer.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct usart_async_rings_status {</span><br><span style="color: hsl(120, 100%, 40%);">+   /** Status flags */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t flags;</span><br><span style="color: hsl(120, 100%, 40%);">+       /** Number of characters transmitted */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t txcnt;</span><br><span style="color: hsl(120, 100%, 40%);">+       /** Number of characters receviced */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t rxcnt;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Asynchronous USART descriptor structure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct usart_async_rings_descriptor {</span><br><span style="color: hsl(120, 100%, 40%);">+     struct io_descriptor         io;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct _usart_async_device   device;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct usart_async_rings_callbacks usart_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t                     stat;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct ringbuffer rx;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ringbuffer tx;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/** USART write busy */</span><br><span style="color: hsl(120, 100%, 40%);">+#define USART_ASYNC_RINGS_STATUS_BUSY 0x0001</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Initialize USART interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function initializes the given I/O descriptor to be used as USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * interface descriptor.</span><br><span style="color: hsl(120, 100%, 40%);">+ * It checks if the given hardware is not initialized and if the given hardware</span><br><span style="color: hsl(120, 100%, 40%);">+ * is permitted to be initialized.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] descr A USART descriptor which is used to communicate via the USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] hw The pointer to the hardware instance</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rx_buffer An RX buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rx_buffer_length The length of the buffer above</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] tx_buffer An TX buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] tx_buffer_length The length of the buffer above</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] func The pointer to a set of function pointers</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return Initialization status.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval -1 Passed parameters were invalid or the interface is already</span><br><span style="color: hsl(120, 100%, 40%);">+ * initialized</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 0 The initialization is completed successfully</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_init(struct usart_async_rings_descriptor *const descr, void *const hw, uint8_t *const rx_buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint16_t rx_buffer_length, uint8_t *const tx_buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint16_t tx_buffer_length, void *const func);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Deinitialize USART interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function deinitializes the given I/O descriptor.</span><br><span style="color: hsl(120, 100%, 40%);">+ * It checks if the given hardware is initialized and if the given hardware</span><br><span style="color: hsl(120, 100%, 40%);">+ * is permitted to be deinitialized.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return De-initialization status.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_deinit(struct usart_async_rings_descriptor *const descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Enable USART interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Enables the USART interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return Enabling status.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_enable(struct usart_async_rings_descriptor *const descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Disable USART interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Disables the USART interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return Disabling status.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_disable(struct usart_async_rings_descriptor *const descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve I/O descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function retrieves the I/O descriptor of the given USART descriptor.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] io An I/O descriptor to retrieve</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of I/O descriptor retrieving.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_get_io_descriptor(struct usart_async_rings_descriptor *const descr, struct io_descriptor **io);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Register USART callback</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] type Callback type</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] cb A callback function</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of callback assignment.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval -1 Passed parameters were invalid or the interface is not initialized</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 0 A callback is registered successfully</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_register_callback(struct usart_async_rings_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      const enum usart_async_rings_callback_type type, usart_rings_cb_t cb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Specify action for flow control pins</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function sets action (or state) for flow control pins if</span><br><span style="color: hsl(120, 100%, 40%);">+ * the flow control is enabled.</span><br><span style="color: hsl(120, 100%, 40%);">+ * It sets state of flow control pins only if automatic support of</span><br><span style="color: hsl(120, 100%, 40%);">+ * the flow control is not supported by the hardware.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] state A state to set the flow control pins</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of flow control action setup.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_flow_control(struct usart_async_rings_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     const union usart_flow_control_state state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set USART baud rate</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] baud_rate A baud rate to set</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of baud rate setting.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_baud_rate(struct usart_async_rings_descriptor *const descr, const uint32_t baud_rate);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set USART data order</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] data_order A data order to set</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of data order setting.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_data_order(struct usart_async_rings_descriptor *const descr, const enum usart_data_order data_order);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set USART mode</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] mode A mode to set</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of mode setting.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_mode(struct usart_async_rings_descriptor *const descr, const enum usart_mode mode);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set USART parity</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] parity A parity to set</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of parity setting.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_parity(struct usart_async_rings_descriptor *const descr, const enum usart_parity parity);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set USART stop bits</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] stop_bits Stop bits to set</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of stop bits setting.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_stopbits(struct usart_async_rings_descriptor *const descr, const enum usart_stop_bits stop_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set USART character size</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] size A character size to set</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of character size setting.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_character_size(struct usart_async_rings_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       const enum usart_character_size      size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve the state of flow control pins</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function retrieves the flow control pins</span><br><span style="color: hsl(120, 100%, 40%);">+ * if the flow control is enabled.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The function can return USART_FLOW_CONTROL_STATE_UNAVAILABLE in case</span><br><span style="color: hsl(120, 100%, 40%);">+ * if the flow control is done by the hardware</span><br><span style="color: hsl(120, 100%, 40%);">+ * and the pins state cannot be read out.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] state The state of flow control pins</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of flow control state reading.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_flow_control_status(const struct usart_async_rings_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        union usart_flow_control_state *const      state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Check if the USART transmitter is empty</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of USART TX empty checking.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 0 The USART transmitter is not empty</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 1 The USART transmitter is empty</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_is_tx_empty(const struct usart_async_rings_descriptor *const descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Check if the USART receiver is not empty</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of the USART RX empty checking.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 1 The USART receiver is not empty</span><br><span style="color: hsl(120, 100%, 40%);">+ * \retval 0 The USART receiver is empty</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_is_rx_not_empty(const struct usart_async_rings_descriptor *const descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve the current interface status</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in]  descr A USART descriptor which is used to communicate via USART</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] status The state of USART</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The status of USART status retrieving.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_get_status(struct usart_async_rings_descriptor *const descr, struct usart_async_rings_status *const status);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief flush USART ringbuf</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function flush USART RX ringbuf.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr The pointer to USART descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return ERR_NONE</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_flush_rx_buffer(struct usart_async_rings_descriptor *const descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve the current driver version</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return Current driver version.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t usart_async_rings_get_version(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef __cplusplus</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+/**@}*/</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* _HAL_USART_ASYNC_RINGS_H_INCLUDED */</span><br><span>diff --git a/sysmoOCTSIM/hal/src/hal_usart_async_rings.c b/sysmoOCTSIM/hal/src/hal_usart_async_rings.c</span><br><span>new file mode 100644</span><br><span>index 0000000..578d945</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/hal/src/hal_usart_async_rings.c</span><br><span>@@ -0,0 +1,423 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \file</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief I/O USART related functionality implementation.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2019 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \asf_license_start</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \page License</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Subject to your compliance with these terms, you may use Microchip</span><br><span style="color: hsl(120, 100%, 40%);">+ * software and any derivatives exclusively with Microchip products.</span><br><span style="color: hsl(120, 100%, 40%);">+ * It is your responsibility to comply with third party license terms applicable</span><br><span style="color: hsl(120, 100%, 40%);">+ * to your use of third party software (including open source software) that</span><br><span style="color: hsl(120, 100%, 40%);">+ * may accompany Microchip software.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,</span><br><span style="color: hsl(120, 100%, 40%);">+ * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,</span><br><span style="color: hsl(120, 100%, 40%);">+ * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,</span><br><span style="color: hsl(120, 100%, 40%);">+ * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE</span><br><span style="color: hsl(120, 100%, 40%);">+ * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL</span><br><span style="color: hsl(120, 100%, 40%);">+ * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE</span><br><span style="color: hsl(120, 100%, 40%);">+ * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE</span><br><span style="color: hsl(120, 100%, 40%);">+ * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT</span><br><span style="color: hsl(120, 100%, 40%);">+ * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY</span><br><span style="color: hsl(120, 100%, 40%);">+ * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,</span><br><span style="color: hsl(120, 100%, 40%);">+ * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \asf_license_stop</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "hal_usart_async_rings.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <utils_assert.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <hal_atomic.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Driver version</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#define DRIVER_VERSION 0x00000001u</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int32_t usart_async_rings_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length);</span><br><span style="color: hsl(120, 100%, 40%);">+static int32_t usart_async_rings_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length);</span><br><span style="color: hsl(120, 100%, 40%);">+static void    usart_process_byte_sent(struct _usart_async_device *device);</span><br><span style="color: hsl(120, 100%, 40%);">+static void    usart_transmission_complete(struct _usart_async_device *device);</span><br><span style="color: hsl(120, 100%, 40%);">+static void    usart_error(struct _usart_async_device *device);</span><br><span style="color: hsl(120, 100%, 40%);">+static void    usart_fill_rx_buffer(struct _usart_async_device *device, uint8_t data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Initialize usart interface</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_init(struct usart_async_rings_descriptor *const descr, void *const hw, uint8_t *const rx_buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint16_t rx_buffer_length, uint8_t *const tx_buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const uint16_t tx_buffer_length, void *const func)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int32_t init_status;</span><br><span style="color: hsl(120, 100%, 40%);">+  ASSERT(descr && hw && rx_buffer && rx_buffer_length && tx_buffer && tx_buffer_length);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ERR_NONE != ringbuffer_init(&descr->rx, rx_buffer, rx_buffer_length)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ERR_INVALID_ARG;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ERR_NONE != ringbuffer_init(&descr->tx, tx_buffer, tx_buffer_length)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            return ERR_INVALID_ARG;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     init_status = _usart_async_init(&descr->device, hw);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (init_status) {</span><br><span style="color: hsl(120, 100%, 40%);">+            return init_status;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   descr->io.read  = usart_async_rings_read;</span><br><span style="color: hsl(120, 100%, 40%);">+  descr->io.write = usart_async_rings_write;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       descr->device.usart_cb.tx_byte_sent = usart_process_byte_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+     descr->device.usart_cb.rx_done_cb   = usart_fill_rx_buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+        descr->device.usart_cb.tx_done_cb   = usart_transmission_complete;</span><br><span style="color: hsl(120, 100%, 40%);">+ descr->device.usart_cb.error_cb     = usart_error;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Deinitialize usart interface</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_deinit(struct usart_async_rings_descriptor *const descr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_deinit(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+   descr->io.read  = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+    descr->io.write = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Enable usart interface</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_enable(struct usart_async_rings_descriptor *const descr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_enable(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Disable usart interface</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_disable(struct usart_async_rings_descriptor *const descr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_disable(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve I/O descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_get_io_descriptor(struct usart_async_rings_descriptor *const descr, struct io_descriptor **io)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       ASSERT(descr && io);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        *io = &descr->io;</span><br><span style="color: hsl(120, 100%, 40%);">+      return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Register usart callback</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_register_callback(struct usart_async_rings_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      const enum usart_async_rings_callback_type type, usart_rings_cb_t cb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case USART_ASYNC_RINGS_RXC_CB:</span><br><span style="color: hsl(120, 100%, 40%);">+                descr->usart_cb.rx_done = cb;</span><br><span style="color: hsl(120, 100%, 40%);">+              _usart_async_set_irq_state(&descr->device, USART_ASYNC_RX_DONE, NULL != cb);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case USART_ASYNC_RINGS_TXC_CB:</span><br><span style="color: hsl(120, 100%, 40%);">+                descr->usart_cb.tx_done = cb;</span><br><span style="color: hsl(120, 100%, 40%);">+              _usart_async_set_irq_state(&descr->device, USART_ASYNC_TX_DONE, NULL != cb);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case USART_ASYNC_RINGS_ERROR_CB:</span><br><span style="color: hsl(120, 100%, 40%);">+              descr->usart_cb.error = cb;</span><br><span style="color: hsl(120, 100%, 40%);">+                _usart_async_set_irq_state(&descr->device, USART_ASYNC_ERROR, NULL != cb);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return ERR_INVALID_ARG;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Specify action for flow control pins</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_flow_control(struct usart_async_rings_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     const union usart_flow_control_state state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_set_flow_control_state(&descr->device, state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set usart baud rate</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_baud_rate(struct usart_async_rings_descriptor *const descr, const uint32_t baud_rate)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_set_baud_rate(&descr->device, baud_rate);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set usart data order</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_data_order(struct usart_async_rings_descriptor *const descr, const enum usart_data_order data_order)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_set_data_order(&descr->device, data_order);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set usart mode</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_mode(struct usart_async_rings_descriptor *const descr, const enum usart_mode mode)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_set_mode(&descr->device, mode);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set usart parity</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_parity(struct usart_async_rings_descriptor *const descr, const enum usart_parity parity)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_set_parity(&descr->device, parity);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set usart stop bits</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_stopbits(struct usart_async_rings_descriptor *const descr, const enum usart_stop_bits stop_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_set_stop_bits(&descr->device, stop_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set usart character size</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_set_character_size(struct usart_async_rings_descriptor *const descr, const enum usart_character_size size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        _usart_async_set_character_size(&descr->device, size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve the state of flow control pins</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_flow_control_status(const struct usart_async_rings_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        union usart_flow_control_state *const      state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       ASSERT(descr && state);</span><br><span style="color: hsl(120, 100%, 40%);">+       *state = _usart_async_get_flow_control_state(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Check if the usart transmitter is empty</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_is_tx_empty(const struct usart_async_rings_descriptor *const descr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+        return _usart_async_is_byte_sent(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Check if the usart receiver is not empty</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_is_rx_not_empty(const struct usart_async_rings_descriptor *const descr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return ringbuffer_num(&descr->rx) > 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve the current interface status</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_get_status(struct usart_async_rings_descriptor *const descr, struct usart_async_rings_status *const status)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      volatile uint32_t *tmp_stat  = &(descr->stat);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (status) {</span><br><span style="color: hsl(120, 100%, 40%);">+         status->flags = *tmp_stat;</span><br><span style="color: hsl(120, 100%, 40%);">+         status->txcnt = ringbuffer_num(&descr->tx);</span><br><span style="color: hsl(120, 100%, 40%);">+         status->rxcnt = ringbuffer_num(&descr->rx);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (*tmp_stat & USART_ASYNC_RINGS_STATUS_BUSY) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return ERR_BUSY;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ERR_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief flush usart rx ringbuf</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t usart_async_rings_flush_rx_buffer(struct usart_async_rings_descriptor *const descr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     ASSERT(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return ringbuffer_flush(&descr->rx);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Retrieve the current driver version</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t usart_async_rings_get_version(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return DRIVER_VERSION;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * \internal Write the given data to usart interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr The pointer to an io descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] buf Data to write to usart</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] length The number of bytes to write</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The number of bytes written.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int32_t usart_async_rings_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct usart_async_rings_descriptor *descr = CONTAINER_OF(io_descr, struct usart_async_rings_descriptor, io);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       ASSERT(descr && buf && length);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (uint16_t i = 0; i < length; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ringbuffer_put(&descr->tx, buf[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     descr->stat             = USART_ASYNC_RINGS_STATUS_BUSY;</span><br><span style="color: hsl(120, 100%, 40%);">+   _usart_async_enable_byte_sent_irq(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return (int32_t)length;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * \internal Read data from usart interface</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] descr The pointer to an io descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] buf A buffer to read data to</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] length The size of a buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The number of bytes read.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int32_t usart_async_rings_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t                       was_read = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t                       num;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct usart_async_rings_descriptor *descr = CONTAINER_OF(io_descr, struct usart_async_rings_descriptor, io);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       ASSERT(descr && buf && length);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     CRITICAL_SECTION_ENTER()</span><br><span style="color: hsl(120, 100%, 40%);">+      num = ringbuffer_num(&descr->rx);</span><br><span style="color: hsl(120, 100%, 40%);">+      CRITICAL_SECTION_LEAVE()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    while ((was_read < num) && (was_read < length)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ringbuffer_get(&descr->rx, &buf[was_read++]);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return (int32_t)was_read;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Process "byte is sent" interrupt</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] device The pointer to device structure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void usart_process_byte_sent(struct _usart_async_device *device)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct usart_async_rings_descriptor *descr = CONTAINER_OF(device, struct usart_async_rings_descriptor, device);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ringbuffer_num(&descr->tx)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t byte;</span><br><span style="color: hsl(120, 100%, 40%);">+         ringbuffer_get(&descr->tx, &byte);</span><br><span style="color: hsl(120, 100%, 40%);">+         _usart_async_write_byte(&descr->device, byte);</span><br><span style="color: hsl(120, 100%, 40%);">+         _usart_async_enable_byte_sent_irq(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              _usart_async_enable_tx_done_irq(&descr->device);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Process completion of data sending</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] device The pointer to device structure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void usart_transmission_complete(struct _usart_async_device *device)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct usart_async_rings_descriptor *descr = CONTAINER_OF(device, struct usart_async_rings_descriptor, device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     descr->stat = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (descr->usart_cb.tx_done) {</span><br><span style="color: hsl(120, 100%, 40%);">+             descr->usart_cb.tx_done(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Process byte reception</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] device The pointer to device structure</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] data Data read</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void usart_fill_rx_buffer(struct _usart_async_device *device, uint8_t data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct usart_async_rings_descriptor *descr = CONTAINER_OF(device, struct usart_async_rings_descriptor, device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ringbuffer_put(&descr->rx, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (descr->usart_cb.rx_done) {</span><br><span style="color: hsl(120, 100%, 40%);">+             descr->usart_cb.rx_done(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Process error interrupt</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] device The pointer to device structure</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void usart_error(struct _usart_async_device *device)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct usart_async_rings_descriptor *descr = CONTAINER_OF(device, struct usart_async_rings_descriptor, device);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     descr->stat = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (descr->usart_cb.error) {</span><br><span style="color: hsl(120, 100%, 40%);">+               descr->usart_cb.error(descr);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+//@}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13677">change 13677</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13677"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Iafd5295b90ef9f428f640314c24f6c31ee82c9d6 </div>
<div style="display:none"> Gerrit-Change-Number: 13677 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>