<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12803">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add SERCOM HAL Async library<br><br>Change-Id: I530a5bc5ee7e89149eb251bda0adf7963733d2ee<br>---<br>M sysmoOCTSIM/AtmelStart.gpdsc<br>M sysmoOCTSIM/atmel_start_config.atstart<br>M sysmoOCTSIM/driver_init.c<br>M sysmoOCTSIM/driver_init.h<br>M sysmoOCTSIM/examples/driver_examples.c<br>M sysmoOCTSIM/gcc/Makefile<br>A sysmoOCTSIM/hal/documentation/usart_async.rst<br>A sysmoOCTSIM/hal/include/hal_usart_async.h<br>A sysmoOCTSIM/hal/src/hal_usart_async.c<br>A sysmoOCTSIM/hal/utils/include/utils_ringbuffer.h<br>A sysmoOCTSIM/hal/utils/src/utils_ringbuffer.c<br>M sysmoOCTSIM/hpl/sercom/hpl_sercom.c<br>12 files changed, 1,207 insertions(+), 30 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/sysmoOCTSIM/AtmelStart.gpdsc b/sysmoOCTSIM/AtmelStart.gpdsc</span><br><span>index 44b5c62..ebb4d1e 100644</span><br><span>--- a/sysmoOCTSIM/AtmelStart.gpdsc</span><br><span>+++ b/sysmoOCTSIM/AtmelStart.gpdsc</span><br><span>@@ -42,7 +42,7 @@</span><br><span>       <description>Atmel Start Framework</description></span><br><span>       <RTE_Components_h>#define ATMEL_START</RTE_Components_h></span><br><span>       <files></span><br><span style="color: hsl(0, 100%, 40%);">-        <file category="doc" condition="ARMCC, GCC, IAR" name="hal/documentation/usart_sync.rst"/></span><br><span style="color: hsl(120, 100%, 40%);">+        <file category="doc" condition="ARMCC, GCC, IAR" name="hal/documentation/usart_async.rst"/></span><br><span>         <file category="doc" condition="ARMCC, GCC, IAR" name="hal/documentation/usb_device_async.rst"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_atomic.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_cache.h"/></span><br><span>@@ -94,9 +94,11 @@</span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_increment_macro.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_list.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_repeat_macro.h"/></span><br><span style="color: hsl(120, 100%, 40%);">+        <file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_ringbuffer.h"/></span><br><span>         <file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_assert.c"/></span><br><span>         <file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_event.c"/></span><br><span>         <file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_list.c"/></span><br><span style="color: hsl(120, 100%, 40%);">+        <file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_ringbuffer.c"/></span><br><span>         <file category="source" condition="GCC" name="hal/utils/src/utils_syscalls.c"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_ac_e54.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_adc_e54.h"/></span><br><span>@@ -165,12 +167,12 @@</span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="atmel_start_pins.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="examples/driver_examples.h"/></span><br><span>         <file category="source" condition="ARMCC, GCC, IAR" name="examples/driver_examples.c"/></span><br><span style="color: hsl(0, 100%, 40%);">-        <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_usart_sync.h"/></span><br><span style="color: hsl(120, 100%, 40%);">+        <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_usart_async.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_missing_features.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_reset.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_usart_async.h"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_usart_sync.h"/></span><br><span style="color: hsl(0, 100%, 40%);">-        <file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_usart_sync.c"/></span><br><span style="color: hsl(120, 100%, 40%);">+        <file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_usart_async.c"/></span><br><span>         <file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/parts.h"/></span><br><span>         <file category="source" condition="ARMCC, GCC, IAR" name="hpl/cmcc/hpl_cmcc.c"/></span><br><span>         <file category="source" condition="ARMCC, GCC, IAR" name="hpl/core/hpl_core_m4.c"/></span><br><span>diff --git a/sysmoOCTSIM/atmel_start_config.atstart b/sysmoOCTSIM/atmel_start_config.atstart</span><br><span>index cb7826a..af87e97 100644</span><br><span>--- a/sysmoOCTSIM/atmel_start_config.atstart</span><br><span>+++ b/sysmoOCTSIM/atmel_start_config.atstart</span><br><span>@@ -959,9 +959,9 @@</span><br><span>       domain_group: null</span><br><span>   UART_debug:</span><br><span>     user_label: UART_debug</span><br><span style="color: hsl(0, 100%, 40%);">-    definition: Atmel:SAME54_Drivers:0.0.1::SAME54P20A-AU::SERCOM2::driver_config_definition::UART::HAL:Driver:USART.Sync</span><br><span style="color: hsl(120, 100%, 40%);">+    definition: Atmel:SAME54_Drivers:0.0.1::SAME54P20A-AU::SERCOM2::driver_config_definition::UART::HAL:Driver:USART.Async</span><br><span>     functionality: USART</span><br><span style="color: hsl(0, 100%, 40%);">-    api: HAL:Driver:USART_Sync</span><br><span style="color: hsl(120, 100%, 40%);">+    api: HAL:Driver:USART_Async</span><br><span>     configuration:</span><br><span>       usart_advanced: false</span><br><span>       usart_arch_clock_mode: USART with internal clock</span><br><span>diff --git a/sysmoOCTSIM/driver_init.c b/sysmoOCTSIM/driver_init.c</span><br><span>index 72f2c88..efd24bc 100644</span><br><span>--- a/sysmoOCTSIM/driver_init.c</span><br><span>+++ b/sysmoOCTSIM/driver_init.c</span><br><span>@@ -11,9 +11,33 @@</span><br><span> #include <utils.h></span><br><span> #include <hal_init.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct usart_sync_descriptor UART_debug;</span><br><span style="color: hsl(120, 100%, 40%);">+/*! The buffer size for USART */</span><br><span style="color: hsl(120, 100%, 40%);">+#define UART_DEBUG_BUFFER_SIZE 16</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void UART_debug_PORT_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+struct usart_async_descriptor UART_debug;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t UART_debug_buffer[UART_DEBUG_BUFFER_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 USART Clock initialization function</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Enables register interface and peripheral clock</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void UART_debug_CLOCK_init()</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%);">+ hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_CORE, CONF_GCLK_SERCOM2_CORE_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));</span><br><span style="color: hsl(120, 100%, 40%);">+      hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_SLOW, CONF_GCLK_SERCOM2_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    hri_mclk_set_APBBMASK_SERCOM2_bit(MCLK);</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 USART pinmux initialization function</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Set each required pin to USART functionality</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void UART_debug_PORT_init()</span><br><span> {</span><br><span> </span><br><span>   gpio_set_pin_function(PB25, PINMUX_PB25D_SERCOM2_PAD0);</span><br><span>@@ -21,18 +45,15 @@</span><br><span>        gpio_set_pin_function(PB24, PINMUX_PB24D_SERCOM2_PAD1);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void UART_debug_CLOCK_init(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_CORE, CONF_GCLK_SERCOM2_CORE_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));</span><br><span style="color: hsl(0, 100%, 40%);">-        hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM2_GCLK_ID_SLOW, CONF_GCLK_SERCOM2_SLOW_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        hri_mclk_set_APBBMASK_SERCOM2_bit(MCLK);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief USART initialization function</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Enables USART peripheral, clocks and initializes USART driver</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> void UART_debug_init(void)</span><br><span> {</span><br><span>        UART_debug_CLOCK_init();</span><br><span style="color: hsl(0, 100%, 40%);">-        usart_sync_init(&UART_debug, SERCOM2, (void *)NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      usart_async_init(&UART_debug, SERCOM2, UART_debug_buffer, UART_DEBUG_BUFFER_SIZE, (void *)NULL);</span><br><span>         UART_debug_PORT_init();</span><br><span> }</span><br><span> </span><br><span>diff --git a/sysmoOCTSIM/driver_init.h b/sysmoOCTSIM/driver_init.h</span><br><span>index 7067684..25e6370 100644</span><br><span>--- a/sysmoOCTSIM/driver_init.h</span><br><span>+++ b/sysmoOCTSIM/driver_init.h</span><br><span>@@ -21,11 +21,11 @@</span><br><span> #include <hal_io.h></span><br><span> #include <hal_sleep.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <hal_usart_sync.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <hal_usart_async.h></span><br><span> </span><br><span> #include "hal_usb_device.h"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern struct usart_sync_descriptor UART_debug;</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct usart_async_descriptor UART_debug;</span><br><span> </span><br><span> void UART_debug_PORT_init(void);</span><br><span> void UART_debug_CLOCK_init(void);</span><br><span>diff --git a/sysmoOCTSIM/examples/driver_examples.c b/sysmoOCTSIM/examples/driver_examples.c</span><br><span>index 56247ff..8384c87 100644</span><br><span>--- a/sysmoOCTSIM/examples/driver_examples.c</span><br><span>+++ b/sysmoOCTSIM/examples/driver_examples.c</span><br><span>@@ -12,12 +12,29 @@</span><br><span> </span><br><span> /**</span><br><span>  * Example of using UART_debug to write "Hello World" using the IO abstraction.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Since the driver is asynchronous we need to use statically allocated memory for string</span><br><span style="color: hsl(120, 100%, 40%);">+ * because driver initiates transfer and then returns before the transmission is completed.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Once transfer has been completed the tx_cb function will be called.</span><br><span>  */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t example_UART_debug[12] = "Hello World!";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void tx_cb_UART_debug(const struct usart_async_descriptor *const io_descr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Transfer completed */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void UART_debug_example(void)</span><br><span> {</span><br><span>  struct io_descriptor *io;</span><br><span style="color: hsl(0, 100%, 40%);">-       usart_sync_get_io_descriptor(&UART_debug, &io);</span><br><span style="color: hsl(0, 100%, 40%);">- usart_sync_enable(&UART_debug);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- io_write(io, (uint8_t *)"Hello World!", 12);</span><br><span style="color: hsl(120, 100%, 40%);">+        usart_async_register_callback(&UART_debug, USART_ASYNC_TXC_CB, tx_cb_UART_debug);</span><br><span style="color: hsl(120, 100%, 40%);">+ /*usart_async_register_callback(&UART_debug, USART_ASYNC_RXC_CB, rx_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+  usart_async_register_callback(&UART_debug, USART_ASYNC_ERROR_CB, err_cb);*/</span><br><span style="color: hsl(120, 100%, 40%);">+       usart_async_get_io_descriptor(&UART_debug, &io);</span><br><span style="color: hsl(120, 100%, 40%);">+      usart_async_enable(&UART_debug);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        io_write(io, example_UART_debug, 12);</span><br><span> }</span><br><span>diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile</span><br><span>index 57ec70c..ff11dd9 100644</span><br><span>--- a/sysmoOCTSIM/gcc/Makefile</span><br><span>+++ b/sysmoOCTSIM/gcc/Makefile</span><br><span>@@ -52,7 +52,7 @@</span><br><span> hpl/core/hpl_core_m4.o \</span><br><span> usb/class/cdc/device/cdcdf_acm.o \</span><br><span> hal/utils/src/utils_syscalls.o \</span><br><span style="color: hsl(0, 100%, 40%);">-hpl/dmac/hpl_dmac.o \</span><br><span style="color: hsl(120, 100%, 40%);">+usb_start.o \</span><br><span> gcc/system_same54.o \</span><br><span> hpl/usb/hpl_usb.o \</span><br><span> hal/src/hal_delay.o \</span><br><span>@@ -61,9 +61,8 @@</span><br><span> hpl/gclk/hpl_gclk.o \</span><br><span> hal/utils/src/utils_list.o \</span><br><span> hal/utils/src/utils_assert.o \</span><br><span style="color: hsl(0, 100%, 40%);">-usb_start.o \</span><br><span style="color: hsl(120, 100%, 40%);">+hpl/dmac/hpl_dmac.o \</span><br><span> hpl/oscctrl/hpl_oscctrl.o \</span><br><span style="color: hsl(0, 100%, 40%);">-hal/src/hal_usart_sync.o \</span><br><span> hpl/mclk/hpl_mclk.o \</span><br><span> hpl/ramecc/hpl_ramecc.o \</span><br><span> usb/usb_protocol.o \</span><br><span>@@ -73,7 +72,9 @@</span><br><span> hpl/osc32kctrl/hpl_osc32kctrl.o \</span><br><span> examples/driver_examples.o \</span><br><span> driver_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+hal/src/hal_usart_async.o \</span><br><span> hpl/sercom/hpl_sercom.o \</span><br><span style="color: hsl(120, 100%, 40%);">+hal/utils/src/utils_ringbuffer.o \</span><br><span> hal/src/hal_gpio.o \</span><br><span> hal/utils/src/utils_event.o \</span><br><span> hal/src/hal_sleep.o \</span><br><span>@@ -89,7 +90,7 @@</span><br><span> "hpl/core/hpl_core_m4.o" \</span><br><span> "usb/class/cdc/device/cdcdf_acm.o" \</span><br><span> "hal/utils/src/utils_syscalls.o" \</span><br><span style="color: hsl(0, 100%, 40%);">-"hpl/dmac/hpl_dmac.o" \</span><br><span style="color: hsl(120, 100%, 40%);">+"usb_start.o" \</span><br><span> "gcc/system_same54.o" \</span><br><span> "hpl/usb/hpl_usb.o" \</span><br><span> "hal/src/hal_delay.o" \</span><br><span>@@ -98,9 +99,8 @@</span><br><span> "hpl/gclk/hpl_gclk.o" \</span><br><span> "hal/utils/src/utils_list.o" \</span><br><span> "hal/utils/src/utils_assert.o" \</span><br><span style="color: hsl(0, 100%, 40%);">-"usb_start.o" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hpl/dmac/hpl_dmac.o" \</span><br><span> "hpl/oscctrl/hpl_oscctrl.o" \</span><br><span style="color: hsl(0, 100%, 40%);">-"hal/src/hal_usart_sync.o" \</span><br><span> "hpl/mclk/hpl_mclk.o" \</span><br><span> "hpl/ramecc/hpl_ramecc.o" \</span><br><span> "usb/usb_protocol.o" \</span><br><span>@@ -110,7 +110,9 @@</span><br><span> "hpl/osc32kctrl/hpl_osc32kctrl.o" \</span><br><span> "examples/driver_examples.o" \</span><br><span> "driver_init.o" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hal/src/hal_usart_async.o" \</span><br><span> "hpl/sercom/hpl_sercom.o" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hal/utils/src/utils_ringbuffer.o" \</span><br><span> "hal/src/hal_gpio.o" \</span><br><span> "hal/utils/src/utils_event.o" \</span><br><span> "hal/src/hal_sleep.o" \</span><br><span>@@ -135,7 +137,7 @@</span><br><span> "hpl/usb/hpl_usb.d" \</span><br><span> "hal/utils/src/utils_list.d" \</span><br><span> "hpl/cmcc/hpl_cmcc.d" \</span><br><span style="color: hsl(0, 100%, 40%);">-"usb_start.d" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hpl/dmac/hpl_dmac.d" \</span><br><span> "hal/utils/src/utils_assert.d" \</span><br><span> "hal/src/hal_delay.d" \</span><br><span> "hpl/core/hpl_init.d" \</span><br><span>@@ -143,16 +145,17 @@</span><br><span> "usb/usb_protocol.d" \</span><br><span> "hpl/gclk/hpl_gclk.d" \</span><br><span> "hal/src/hal_usb_device.d" \</span><br><span style="color: hsl(0, 100%, 40%);">-"hpl/dmac/hpl_dmac.d" \</span><br><span style="color: hsl(120, 100%, 40%);">+"usb_start.d" \</span><br><span> "hal/src/hal_init.d" \</span><br><span style="color: hsl(0, 100%, 40%);">-"hal/src/hal_usart_sync.d" \</span><br><span> "main.d" \</span><br><span> "hpl/mclk/hpl_mclk.d" \</span><br><span> "driver_init.d" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hal/src/hal_usart_async.d" \</span><br><span> "hpl/osc32kctrl/hpl_osc32kctrl.d" \</span><br><span> "examples/driver_examples.d" \</span><br><span> "hal/src/hal_cache.d" \</span><br><span> "hal/src/hal_sleep.d" \</span><br><span style="color: hsl(120, 100%, 40%);">+"hal/utils/src/utils_ringbuffer.d" \</span><br><span> "hpl/sercom/hpl_sercom.d" \</span><br><span> "hal/src/hal_gpio.d" \</span><br><span> "hal/src/hal_atomic.d" \</span><br><span>diff --git a/sysmoOCTSIM/hal/documentation/usart_async.rst b/sysmoOCTSIM/hal/documentation/usart_async.rst</span><br><span>new file mode 100644</span><br><span>index 0000000..6bf4a23</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/hal/documentation/usart_async.rst</span><br><span>@@ -0,0 +1,72 @@</span><br><span style="color: hsl(120, 100%, 40%);">+The USART Asynchronous Driver</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%);">+The universal synchronous and asynchronous receiver and transmitter</span><br><span style="color: hsl(120, 100%, 40%);">+(USART) is usually used to transfer data from one device to the other.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The USART driver use a ring buffer to store received data. When the USART</span><br><span style="color: hsl(120, 100%, 40%);">+raise the data received interrupt, this data will be stored in the ring buffer</span><br><span style="color: hsl(120, 100%, 40%);">+at the next free location. When the ring buffer is full, the next reception</span><br><span style="color: hsl(120, 100%, 40%);">+will overwrite the oldest data stored in the ring buffer. There is one</span><br><span style="color: hsl(120, 100%, 40%);">+USART_BUFFER_SIZE macro per used hardware instance, e.g. for SERCOM0 the macro</span><br><span style="color: hsl(120, 100%, 40%);">+is called SERCOM0_USART_BUFFER_SIZE.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+On the other hand, when sending data over USART, the data is not copied to an</span><br><span style="color: hsl(120, 100%, 40%);">+internal buffer, but the data buffer supplied by the user is used. The callback</span><br><span style="color: hsl(120, 100%, 40%);">+will only be generated at the end of the buffer and not for each byte.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+User can set action for flow control pins by function usart_set_flow_control,</span><br><span style="color: hsl(120, 100%, 40%);">+if the flow control is enabled. All the available states are defined in union</span><br><span style="color: hsl(120, 100%, 40%);">+usart_flow_control_state.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Note that user can set 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%);">+Features</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%);">+* Initialization/de-initialization</span><br><span style="color: hsl(120, 100%, 40%);">+* Enabling/disabling</span><br><span style="color: hsl(120, 100%, 40%);">+* Control of the following settings:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  * Baudrate</span><br><span style="color: hsl(120, 100%, 40%);">+  * UART or USRT communication mode</span><br><span style="color: hsl(120, 100%, 40%);">+  * Character size</span><br><span style="color: hsl(120, 100%, 40%);">+  * Data order</span><br><span style="color: hsl(120, 100%, 40%);">+  * Flow control</span><br><span style="color: hsl(120, 100%, 40%);">+* Data transfer: transmission, reception</span><br><span style="color: hsl(120, 100%, 40%);">+* Notifications about transfer done or error case via callbacks</span><br><span style="color: hsl(120, 100%, 40%);">+* Status information with busy state and transfer count</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Applications</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%);">+They are commonly used in a terminal application or low-speed communication</span><br><span style="color: hsl(120, 100%, 40%);">+between devices.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Dependencies</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 capable hardware, with interrupt on each character is sent or</span><br><span style="color: hsl(120, 100%, 40%);">+received.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Concurrency</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%);">+Write buffer should not be changed while data is being sent.</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%);">+Limitations</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%);">+* The driver does not support 9-bit character size.</span><br><span style="color: hsl(120, 100%, 40%);">+* The "USART with ISO7816" mode can be only used in ISO7816 capable devices. </span><br><span style="color: hsl(120, 100%, 40%);">+  And the SCK pin can't be set directly. Application can use a GCLK output PIN</span><br><span style="color: hsl(120, 100%, 40%);">+  to generate SCK. For example to communicate with a SMARTCARD with ISO7816</span><br><span style="color: hsl(120, 100%, 40%);">+  (F = 372 ; D = 1), and baudrate=9600, the SCK pin output frequency should be</span><br><span style="color: hsl(120, 100%, 40%);">+  config as 372*9600=3571200Hz. More information can be refer to ISO7816 Specification.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Known issues and workarounds</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%);">+N/A</span><br><span>diff --git a/sysmoOCTSIM/hal/include/hal_usart_async.h b/sysmoOCTSIM/hal/include/hal_usart_async.h</span><br><span>new file mode 100644</span><br><span>index 0000000..3a6de39</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/hal/include/hal_usart_async.h</span><br><span>@@ -0,0 +1,339 @@</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%);">+ *</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_H_INCLUDED</span><br><span style="color: hsl(120, 100%, 40%);">+#define _HAL_USART_ASYNC_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_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_cb_t)(const struct usart_async_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_callback_type { USART_ASYNC_RXC_CB, USART_ASYNC_TXC_CB, USART_ASYNC_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_callbacks {</span><br><span style="color: hsl(120, 100%, 40%);">+        usart_cb_t tx_done;</span><br><span style="color: hsl(120, 100%, 40%);">+   usart_cb_t rx_done;</span><br><span style="color: hsl(120, 100%, 40%);">+   usart_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_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_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_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%);">+ uint16_t          tx_por;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t *         tx_buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t          tx_buffer_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%);">+/** USART write busy */</span><br><span style="color: hsl(120, 100%, 40%);">+#define USART_ASYNC_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] 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_init(struct usart_async_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, 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_deinit(struct usart_async_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_enable(struct usart_async_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_disable(struct usart_async_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_get_io_descriptor(struct usart_async_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_register_callback(struct usart_async_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      const enum usart_async_callback_type type, usart_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_set_flow_control(struct usart_async_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_set_baud_rate(struct usart_async_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_set_data_order(struct usart_async_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_set_mode(struct usart_async_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_set_parity(struct usart_async_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_set_stopbits(struct usart_async_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_set_character_size(struct usart_async_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_flow_control_status(const struct usart_async_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_is_tx_empty(const struct usart_async_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_is_rx_not_empty(const struct usart_async_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_get_status(struct usart_async_descriptor *const descr, struct usart_async_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_flush_rx_buffer(struct usart_async_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_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_H_INCLUDED */</span><br><span>diff --git a/sysmoOCTSIM/hal/src/hal_usart_async.c b/sysmoOCTSIM/hal/src/hal_usart_async.c</span><br><span>new file mode 100644</span><br><span>index 0000000..f07b266</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/hal/src/hal_usart_async.c</span><br><span>@@ -0,0 +1,420 @@</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%);">+ *</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.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_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_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_init(struct usart_async_descriptor *const descr, void *const hw, uint8_t *rx_buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+                         uint16_t rx_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);</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%);">+     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_read;</span><br><span style="color: hsl(120, 100%, 40%);">+        descr->io.write = usart_async_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_deinit(struct usart_async_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_enable(struct usart_async_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_disable(struct usart_async_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_get_io_descriptor(struct usart_async_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_register_callback(struct usart_async_descriptor *const descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      const enum usart_async_callback_type type, usart_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_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_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_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_set_flow_control(struct usart_async_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_set_baud_rate(struct usart_async_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_set_data_order(struct usart_async_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_set_mode(struct usart_async_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_set_parity(struct usart_async_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_set_stopbits(struct usart_async_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_set_character_size(struct usart_async_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_flow_control_status(const struct usart_async_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_is_tx_empty(const struct usart_async_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_is_rx_not_empty(const struct usart_async_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_get_status(struct usart_async_descriptor *const descr, struct usart_async_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%);">+ volatile uint16_t *tmp_txcnt = &(descr->tx_por);</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 = *tmp_txcnt;</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_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_flush_rx_buffer(struct usart_async_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_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_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_descriptor *descr = CONTAINER_OF(io_descr, struct usart_async_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%);">+     if (descr->tx_por != descr->tx_buffer_length) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return ERR_NO_RESOURCE;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     descr->tx_buffer        = (uint8_t *)buf;</span><br><span style="color: hsl(120, 100%, 40%);">+  descr->tx_buffer_length = length;</span><br><span style="color: hsl(120, 100%, 40%);">+  descr->tx_por           = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       descr->stat             = USART_ASYNC_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_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_descriptor *descr = CONTAINER_OF(io_descr, struct usart_async_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_descriptor *descr = CONTAINER_OF(device, struct usart_async_descriptor, device);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (descr->tx_por != descr->tx_buffer_length) {</span><br><span style="color: hsl(120, 100%, 40%);">+         _usart_async_write_byte(&descr->device, descr->tx_buffer[descr->tx_por++]);</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_descriptor *descr = CONTAINER_OF(device, struct usart_async_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_descriptor *descr = CONTAINER_OF(device, struct usart_async_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_descriptor *descr = CONTAINER_OF(device, struct usart_async_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>diff --git a/sysmoOCTSIM/hal/utils/include/utils_ringbuffer.h b/sysmoOCTSIM/hal/utils/include/utils_ringbuffer.h</span><br><span>new file mode 100644</span><br><span>index 0000000..401d557</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/hal/utils/include/utils_ringbuffer.h</span><br><span>@@ -0,0 +1,116 @@</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 Ringbuffer 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%);">+ *</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%);">+#ifndef _UTILS_RINGBUFFER_H_INCLUDED</span><br><span style="color: hsl(120, 100%, 40%);">+#define _UTILS_RINGBUFFER_H_INCLUDED</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%);">+ * \addtogroup doc_driver_hal_utils_ringbuffer</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%);">+#include "compiler.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "utils_assert.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 Ring buffer element type</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ringbuffer {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t *buf;         /** Buffer base address */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t size;        /** Buffer size */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t read_index;  /** Buffer read index */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t write_index; /** Buffer write index */</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 Ring buffer init</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rb The pointer to a ring buffer structure instance</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] buf Space to store the data</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] size The buffer length, must be aligned with power of 2</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return ERR_NONE on success, or an error code on failure.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t ringbuffer_init(struct ringbuffer *const rb, void *buf, uint32_t 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 Get one byte from ring buffer, the user needs to handle the concurrent</span><br><span style="color: hsl(120, 100%, 40%);">+ * access on buffer via put/get/flush</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rb The pointer to a ring buffer structure instance</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] data One byte space to store the read data</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return ERR_NONE on success, or an error code on failure.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t ringbuffer_get(struct ringbuffer *const rb, 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 Put one byte to ring buffer, the user needs to handle the concurrent access</span><br><span style="color: hsl(120, 100%, 40%);">+ * on buffer via put/get/flush</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rb The pointer to a ring buffer structure instance</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] data One byte data to be put into ring buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return ERR_NONE on success, or an error code on failure.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t ringbuffer_put(struct ringbuffer *const rb, 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 Return the element number of ring buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rb The pointer to a ring buffer structure instance</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return The number of elements in ring buffer [0, rb->size]</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t ringbuffer_num(const struct ringbuffer *const rb);</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 ring buffer, the user needs to handle the concurrent access on buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ * via put/get/flush</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] rb The pointer to a ring buffer structure instance</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return ERR_NONE on success, or an error code on failure.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t ringbuffer_flush(struct ringbuffer *const rb);</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* _UTILS_RINGBUFFER_H_INCLUDED */</span><br><span>diff --git a/sysmoOCTSIM/hal/utils/src/utils_ringbuffer.c b/sysmoOCTSIM/hal/utils/src/utils_ringbuffer.c</span><br><span>new file mode 100644</span><br><span>index 0000000..45cac83</span><br><span>--- /dev/null</span><br><span>+++ b/sysmoOCTSIM/hal/utils/src/utils_ringbuffer.c</span><br><span>@@ -0,0 +1,118 @@</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 Ringbuffer 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%);">+ *</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%);">+#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%);">+ * \brief Ringbuffer init</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t ringbuffer_init(struct ringbuffer *const rb, void *buf, uint32_t size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    ASSERT(rb && buf && 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%);">+     * buf size must be aligned to power of 2</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   if ((size & (size - 1)) != 0) {</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%);">+   /* size - 1 is faster in calculation */</span><br><span style="color: hsl(120, 100%, 40%);">+       rb->size        = size - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        rb->read_index  = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       rb->write_index = rb->read_index;</span><br><span style="color: hsl(120, 100%, 40%);">+       rb->buf         = (uint8_t *)buf;</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 Get one byte from ringbuffer</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%);">+int32_t ringbuffer_get(struct ringbuffer *const rb, uint8_t *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    ASSERT(rb && data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rb->write_index != rb->read_index) {</span><br><span style="color: hsl(120, 100%, 40%);">+                *data = rb->buf[rb->read_index & rb->size];</span><br><span style="color: hsl(120, 100%, 40%);">+              rb->read_index++;</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%);">+   return ERR_NOT_FOUND;</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 Put one byte to ringbuffer</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%);">+int32_t ringbuffer_put(struct ringbuffer *const rb, uint8_t data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  ASSERT(rb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rb->buf[rb->write_index & rb->size] = 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%);">+     * buffer full strategy: new data will overwrite the oldest data in</span><br><span style="color: hsl(120, 100%, 40%);">+    * the buffer</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+   if ((rb->write_index - rb->read_index) > rb->size) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rb->read_index = rb->write_index - rb->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%);">+   rb->write_index++;</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 Return the element number of ringbuffer</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t ringbuffer_num(const struct ringbuffer *const rb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     ASSERT(rb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return rb->write_index - rb->read_index;</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 ringbuffer</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint32_t ringbuffer_flush(struct ringbuffer *const rb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  ASSERT(rb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rb->read_index = rb->write_index;</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>diff --git a/sysmoOCTSIM/hpl/sercom/hpl_sercom.c b/sysmoOCTSIM/hpl/sercom/hpl_sercom.c</span><br><span>index 130f63a..11192d0 100644</span><br><span>--- a/sysmoOCTSIM/hpl/sercom/hpl_sercom.c</span><br><span>+++ b/sysmoOCTSIM/hpl/sercom/hpl_sercom.c</span><br><span>@@ -163,6 +163,8 @@</span><br><span> };</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static struct _usart_async_device *_sercom2_dev = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static uint8_t _get_sercom_index(const void *const hw);</span><br><span> static uint8_t _sercom_get_irq_num(const void *const hw);</span><br><span> static void    _sercom_init_irq_param(const void *const hw, void *dev);</span><br><span>@@ -563,6 +565,40 @@</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \internal Sercom interrupt handler</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] p The pointer to interrupt parameter</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void _sercom_usart_interrupt_handler(struct _usart_async_device *device)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   void *hw = device->hw;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (hri_sercomusart_get_interrupt_DRE_bit(hw) && hri_sercomusart_get_INTEN_DRE_bit(hw)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             hri_sercomusart_clear_INTEN_DRE_bit(hw);</span><br><span style="color: hsl(120, 100%, 40%);">+              device->usart_cb.tx_byte_sent(device);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (hri_sercomusart_get_interrupt_TXC_bit(hw) && hri_sercomusart_get_INTEN_TXC_bit(hw)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              hri_sercomusart_clear_INTEN_TXC_bit(hw);</span><br><span style="color: hsl(120, 100%, 40%);">+              device->usart_cb.tx_done_cb(device);</span><br><span style="color: hsl(120, 100%, 40%);">+       } else if (hri_sercomusart_get_interrupt_RXC_bit(hw)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (hri_sercomusart_read_STATUS_reg(hw)</span><br><span style="color: hsl(120, 100%, 40%);">+                   & (SERCOM_USART_STATUS_PERR | SERCOM_USART_STATUS_FERR | SERCOM_USART_STATUS_BUFOVF</span><br><span style="color: hsl(120, 100%, 40%);">+                  | SERCOM_USART_STATUS_ISF | SERCOM_USART_STATUS_COLL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       hri_sercomusart_clear_STATUS_reg(hw, SERCOM_USART_STATUS_MASK);</span><br><span style="color: hsl(120, 100%, 40%);">+                       return;</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%);">+           device->usart_cb.rx_done_cb(device, hri_sercomusart_read_DATA_reg(hw));</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if (hri_sercomusart_get_interrupt_ERROR_bit(hw)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             uint32_t status;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            hri_sercomusart_clear_interrupt_ERROR_bit(hw);</span><br><span style="color: hsl(120, 100%, 40%);">+                device->usart_cb.error_cb(device);</span><br><span style="color: hsl(120, 100%, 40%);">+         status = hri_sercomusart_read_STATUS_reg(hw);</span><br><span style="color: hsl(120, 100%, 40%);">+         hri_sercomusart_clear_STATUS_reg(hw, 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span>  * \internal Retrieve ordinal number of the given sercom hardware instance</span><br><span>  *</span><br><span>  * \param[in] hw The pointer to hardware instance</span><br><span>@@ -589,6 +625,10 @@</span><br><span>  */</span><br><span> static void _sercom_init_irq_param(const void *const hw, void *dev)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (hw == SERCOM2) {</span><br><span style="color: hsl(120, 100%, 40%);">+          _sercom2_dev = (struct _usart_async_device *)dev;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -2349,6 +2389,35 @@</span><br><span>   return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \internal Sercom interrupt handler</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void SERCOM2_0_Handler(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       _sercom_usart_interrupt_handler(_sercom2_dev);</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 Sercom interrupt handler</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void SERCOM2_1_Handler(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   _sercom_usart_interrupt_handler(_sercom2_dev);</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 Sercom interrupt handler</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void SERCOM2_2_Handler(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   _sercom_usart_interrupt_handler(_sercom2_dev);</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 Sercom interrupt handler</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void SERCOM2_3_Handler(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   _sercom_usart_interrupt_handler(_sercom2_dev);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int32_t _spi_m_sync_init(struct _spi_m_sync_dev *dev, void *const hw)</span><br><span> {</span><br><span>    const struct sercomspi_regs_cfg *regs = _spi_get_regs((uint32_t)hw);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12803">change 12803</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/12803"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: I530a5bc5ee7e89149eb251bda0adf7963733d2ee </div>
<div style="display:none"> Gerrit-Change-Number: 12803 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>