Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Revision:
18:6a4db94011d3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-dev/targets/TARGET_Atmel/TARGET_SAM_CortexM4/drivers/usart/usart.h	Sun May 14 23:18:57 2017 +0000
@@ -0,0 +1,779 @@
+/**
+ * \file
+ *
+ * \brief Universal Synchronous Asynchronous Receiver Transmitter (USART) driver
+ * for SAM.
+ *
+ * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved.
+ *
+ * \asf_license_start
+ *
+ * \page License
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ *    this list of conditions and the following disclaimer in the documentation
+ *    and/or other materials provided with the distribution.
+ *
+ * 3. The name of Atmel may not be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * 4. This software may only be redistributed and used in connection with an
+ *    Atmel microcontroller product.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \asf_license_stop
+ *
+ */
+/*
+ * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
+ */
+
+#ifndef USART_H_INCLUDED
+#define USART_H_INCLUDED
+
+#include "compiler.h"
+
+/**
+ * \defgroup group_sam_drivers_usart Universal Synchronous Asynchronous Receiver
+ * Transmitter (USART).
+ *
+ * See \ref sam_usart_quickstart.
+ *
+ * This is a low-level driver implementation for the SAM Universal
+ * Synchronous/Asynchronous Receiver/Transmitter.
+ *
+ * @{
+ */
+
+/// @cond 0
+/**INDENT-OFF**/
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**INDENT-ON**/
+/// @endcond
+
+    /** Clock phase. */
+#define SPI_CPHA    (1 << 0)
+
+    /** Clock polarity. */
+#define SPI_CPOL    (1 << 1)
+
+    /** SPI mode definition. */
+#define SPI_MODE_0  0
+#define SPI_MODE_1  (SPI_CPHA)
+#define SPI_MODE_2  (SPI_CPOL)
+#define SPI_MODE_3  (SPI_CPOL | SPI_CPHA)
+
+    /**micro definition for LIN mode of SAMV71*/
+#if (SAMV71 || SAMV70 || SAME70 || SAMS70)
+#define US_MR_USART_MODE_LIN_MASTER  0x0A
+#define US_MR_USART_MODE_LIN_SLAVE   0x0B
+#endif
+    /* Input parameters when initializing RS232 and similar modes. */
+    typedef struct {
+        /* Set baud rate of the USART (unused in slave modes). */
+        uint32_t baudrate;
+
+        /*
+         * Number of bits, which should be one of the following: US_MR_CHRL_5_BIT,
+         * US_MR_CHRL_6_BIT, US_MR_CHRL_7_BIT, US_MR_CHRL_8_BIT or
+         * US_MR_MODE9.
+         */
+        uint32_t char_length;
+
+        /*
+         * Parity type, which should be one of the following: US_MR_PAR_EVEN,
+         * US_MR_PAR_ODD, US_MR_PAR_SPACE, US_MR_PAR_MARK, US_MR_PAR_NO
+         * or US_MR_PAR_MULTIDROP.
+         */
+        uint32_t parity_type;
+
+        /*
+         * Number of stop bits between two characters: US_MR_NBSTOP_1_BIT,
+         * US_MR_NBSTOP_1_5_BIT, US_MR_NBSTOP_2_BIT.
+         * \note US_MR_NBSTOP_1_5_BIT is supported in asynchronous modes only.
+         */
+        uint32_t stop_bits;
+
+        /*
+         * Run the channel in test mode, which should be one of following:
+         * US_MR_CHMODE_NORMAL, US_MR_CHMODE_AUTOMATIC,
+         * US_MR_CHMODE_LOCAL_LOOPBACK, US_MR_CHMODE_REMOTE_LOOPBACK.
+         */
+        uint32_t channel_mode;
+
+        /* Filter of IrDA mode, useless in other modes. */
+        uint32_t irda_filter;
+    } sam_usart_opt_t;
+
+    /* Input parameters when initializing ISO7816 mode. */
+    typedef struct {
+        /* Set the frequency of the ISO7816 clock. */
+        uint32_t iso7816_hz;
+
+        /*
+         * The number of ISO7816 clock ticks in every bit period (1 to 2047,
+         * 0 = disable clock). Baudrate rate = iso7816_hz / fidi_ratio.
+         */
+        uint32_t fidi_ratio;
+
+        /*
+         * How to calculate the parity bit: US_MR_PAR_EVEN for normal mode or
+         * US_MR_PAR_ODD for inverse mode.
+         */
+        uint32_t parity_type;
+
+        /*
+         * Inhibit Non Acknowledge:
+         *   - 0: the NACK is generated;
+         *   - 1: the NACK is not generated.
+         *
+         * \note This bit will be used only in ISO7816 mode, protocol T = 0
+         * receiver.
+         */
+        uint32_t inhibit_nack;
+
+        /*
+         * Disable successive NACKs.
+         *  - 0: NACK is sent on the ISO line as soon as a parity error occurs
+         * in the received character. Successive parity errors are counted up to
+         * the value in the max_iterations field. These parity errors generate
+         * a NACK on the ISO line. As soon as this value is reached, no additional
+         * NACK is sent on the ISO line. The ITERATION flag is asserted.
+         */
+        uint32_t dis_suc_nack;
+
+        /* Max number of repetitions (0 to 7). */
+        uint32_t max_iterations;
+
+        /*
+         * Bit order in transmitted characters:
+         *   - 0: LSB first;
+         *   - 1: MSB first.
+         */
+        uint32_t bit_order;
+
+        /*
+         * Which protocol is used:
+         *   - 0: T = 0;
+         *   - 1: T = 1.
+         */
+        uint32_t protocol_type;
+    } usart_iso7816_opt_t;
+
+    /* Input parameters when initializing SPI mode. */
+    typedef struct {
+        /* Set the frequency of the SPI clock (unused in slave mode). */
+        uint32_t baudrate;
+
+        /*
+         * Number of bits, which should be one of the following: US_MR_CHRL_5_BIT,
+         * US_MR_CHRL_6_BIT, US_MR_CHRL_7_BIT, US_MR_CHRL_8_BIT or
+         * US_MR_MODE9.
+         */
+        uint32_t char_length;
+
+        /*
+         * Which SPI mode to use, which should be one of the following:
+         * SPI_MODE_0, SPI_MODE_1, SPI_MODE_2, SPI_MODE_3.
+         */
+        uint32_t spi_mode;
+
+        /*
+         * Run the channel in test mode, which should be one of following:
+         * US_MR_CHMODE_NORMAL, US_MR_CHMODE_AUTOMATIC,
+         * US_MR_CHMODE_LOCAL_LOOPBACK, US_MR_CHMODE_REMOTE_LOOPBACK.
+         */
+        uint32_t channel_mode;
+    } usart_spi_opt_t;
+
+    void usart_reset(Usart *p_usart);
+    uint32_t usart_set_async_baudrate(Usart *p_usart,
+                                      uint32_t baudrate, uint32_t ul_mck);
+    uint32_t usart_init_rs232(Usart *p_usart,
+                              const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck);
+    uint32_t usart_init_hw_handshaking(Usart *p_usart,
+                                       const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck);
+#if (SAM3S || SAM4S || SAM3U || SAM4L || SAM4E)
+    uint32_t usart_init_modem(Usart *p_usart,
+                              const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck);
+#endif
+    uint32_t usart_init_sync_master(Usart *p_usart,
+                                    const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck);
+    uint32_t usart_init_sync_slave(Usart *p_usart,
+                                   const sam_usart_opt_t *p_usart_opt);
+    uint32_t usart_init_rs485(Usart *p_usart,
+                              const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck);
+#if (!SAMG55 && !SAMV71 && !SAMV70 && !SAME70 && !SAMS70)
+    uint32_t usart_init_irda(Usart *p_usart,
+                             const sam_usart_opt_t *p_usart_opt, uint32_t ul_mck);
+#endif
+#if (!SAMV71 && !SAMV70 && !SAME70 && !SAMS70)
+    uint32_t usart_init_iso7816(Usart *p_usart,
+                                const usart_iso7816_opt_t *p_usart_opt, uint32_t ul_mck);
+    void usart_reset_iterations(Usart *p_usart);
+    void usart_reset_nack(Usart *p_usart);
+    uint32_t usart_is_rx_buf_end(Usart *p_usart);
+    uint32_t usart_is_tx_buf_end(Usart *p_usart);
+    uint32_t usart_is_rx_buf_full(Usart *p_usart);
+    uint32_t usart_is_tx_buf_empty(Usart *p_usart);
+    uint8_t usart_get_error_number(Usart *p_usart);
+#endif
+    uint32_t usart_init_spi_master(Usart *p_usart,
+                                   const usart_spi_opt_t *p_usart_opt, uint32_t ul_mck);
+    uint32_t usart_init_spi_slave(Usart *p_usart,
+                                  const usart_spi_opt_t *p_usart_opt);
+#if (SAM3XA || SAM4L || SAMG55 || SAMV71 || SAMV70 || SAME70 || SAMS70)
+    uint32_t usart_init_lin_master(Usart *p_usart, uint32_t ul_baudrate,
+                                   uint32_t ul_mck);
+    uint32_t usart_init_lin_slave(Usart *p_usart, uint32_t ul_baudrate,
+                                  uint32_t ul_mck);
+    void usart_lin_abort_tx(Usart *p_usart);
+    void usart_lin_send_wakeup_signal(Usart *p_usart);
+    void usart_lin_set_node_action(Usart *p_usart, uint8_t uc_action);
+    void usart_lin_disable_parity(Usart *p_usart);
+    void usart_lin_enable_parity(Usart *p_usart);
+    void usart_lin_disable_checksum(Usart *p_usart);
+    void usart_lin_enable_checksum(Usart *p_usart);
+    void usart_lin_set_checksum_type(Usart *p_usart, uint8_t uc_type);
+    void usart_lin_set_data_len_mode(Usart *p_usart, uint8_t uc_mode);
+    void usart_lin_disable_frame_slot(Usart *p_usart);
+    void usart_lin_enable_frame_slot(Usart *p_usart);
+    void usart_lin_set_wakeup_signal_type(Usart *p_usart, uint8_t uc_type);
+    void usart_lin_set_response_data_len(Usart *p_usart, uint8_t uc_len);
+    void usart_lin_disable_pdc_mode(Usart *p_usart);
+    void usart_lin_enable_pdc_mode(Usart *p_usart);
+    void usart_lin_set_tx_identifier(Usart *p_usart, uint8_t uc_id);
+    uint8_t usart_lin_read_identifier(Usart *p_usart);
+    uint8_t usart_lin_get_data_length(Usart *usart);
+#endif
+#if (SAMV71 || SAMV70 || SAME70 || SAMS70)
+    uint8_t usart_lin_identifier_send_complete(Usart *usart);
+    uint8_t usart_lin_identifier_reception_complete(Usart *usart);
+    uint8_t usart_lin_tx_complete(Usart *usart);
+    uint32_t usart_init_lon(Usart *p_usart, uint32_t ul_baudrate, uint32_t ul_mck);
+    void  usart_lon_set_comm_type(Usart *p_usart, uint8_t uc_type);
+    void usart_lon_disable_coll_detection(Usart *p_usart);
+    void usart_lon_enable_coll_detection(Usart *p_usart);
+    void  usart_lon_set_tcol(Usart *p_usart, uint8_t uc_type);
+    void  usart_lon_set_cdtail(Usart *p_usart, uint8_t uc_type);
+    void  usart_lon_set_dmam(Usart *p_usart, uint8_t uc_type);
+    void  usart_lon_set_beta1_tx_len(Usart *p_usart, uint32_t ul_len);
+    void  usart_lon_set_beta1_rx_len(Usart *p_usart, uint32_t ul_len);
+    void  usart_lon_set_priority(Usart *p_usart, uint8_t uc_psnb, uint8_t uc_nps);
+    void  usart_lon_set_tx_idt(Usart *p_usart, uint32_t ul_time);
+    void  usart_lon_set_rx_idt(Usart *p_usart, uint32_t ul_time);
+    void  usart_lon_set_pre_len(Usart *p_usart, uint32_t ul_len);
+    void  usart_lon_set_data_len(Usart *p_usart, uint8_t uc_len);
+    void  usart_lon_set_l2hdr(Usart *p_usart, uint8_t uc_bli, uint8_t uc_altp, uint8_t uc_pb);
+    uint32_t usart_lon_is_tx_end(Usart *p_usart);
+    uint32_t usart_lon_is_rx_end(Usart *p_usart);
+#endif
+    void usart_enable_tx(Usart *p_usart);
+    void usart_disable_tx(Usart *p_usart);
+    void usart_reset_tx(Usart *p_usart);
+    void usart_set_tx_timeguard(Usart *p_usart, uint32_t timeguard);
+    void usart_enable_rx(Usart *p_usart);
+    void usart_disable_rx(Usart *p_usart);
+    void usart_reset_rx(Usart *p_usart);
+    void usart_set_rx_timeout(Usart *p_usart, uint32_t timeout);
+    void usart_enable_interrupt(Usart *p_usart, uint32_t ul_sources);
+    void usart_disable_interrupt(Usart *p_usart, uint32_t ul_sources);
+    uint32_t usart_get_interrupt_mask(Usart *p_usart);
+    uint32_t usart_get_status(Usart *p_usart);
+    void usart_reset_status(Usart *p_usart);
+    void usart_start_tx_break(Usart *p_usart);
+    void usart_stop_tx_break(Usart *p_usart);
+    void usart_start_rx_timeout(Usart *p_usart);
+    uint32_t usart_send_address(Usart *p_usart, uint32_t ul_addr);
+    void usart_restart_rx_timeout(Usart *p_usart);
+#if (SAM3S || SAM4S || SAM3U || SAM4L || SAM4E)
+    void usart_drive_DTR_pin_low(Usart *p_usart);
+    void usart_drive_DTR_pin_high(Usart *p_usart);
+#endif
+    void usart_drive_RTS_pin_low(Usart *p_usart);
+    void usart_drive_RTS_pin_high(Usart *p_usart);
+    void usart_spi_force_chip_select(Usart *p_usart);
+    void usart_spi_release_chip_select(Usart *p_usart);
+    uint32_t usart_is_tx_ready(Usart *p_usart);
+    uint32_t usart_is_tx_empty(Usart *p_usart);
+    uint32_t usart_is_rx_ready(Usart *p_usart);
+    uint32_t usart_write(Usart *p_usart, uint32_t c);
+    uint32_t usart_putchar(Usart *p_usart, uint32_t c);
+    void usart_write_line(Usart *p_usart, const char *string);
+    uint32_t usart_read(Usart *p_usart, uint32_t *c);
+    uint32_t usart_getchar(Usart *p_usart, uint32_t *c);
+#if (SAM3XA || SAM3U)
+    uint32_t *usart_get_tx_access(Usart *p_usart);
+    uint32_t *usart_get_rx_access(Usart *p_usart);
+#endif
+#if (!SAM4L && !SAMV71 && !SAMV70 && !SAME70 && !SAMS70)
+    Pdc *usart_get_pdc_base(Usart *p_usart);
+#endif
+    void usart_enable_writeprotect(Usart *p_usart);
+    void usart_disable_writeprotect(Usart *p_usart);
+    uint32_t usart_get_writeprotect_status(Usart *p_usart);
+#if (SAM3S || SAM4S || SAM3U || SAM3XA || SAM4L || SAM4E || SAM4C || SAM4CP || SAM4CM || SAMV70 || SAMV71 || SAMS70 || SAME70)
+    void usart_man_set_tx_pre_len(Usart *p_usart, uint8_t uc_len);
+    void usart_man_set_tx_pre_pattern(Usart *p_usart, uint8_t uc_pattern);
+    void usart_man_set_tx_polarity(Usart *p_usart, uint8_t uc_polarity);
+    void usart_man_set_rx_pre_len(Usart *p_usart, uint8_t uc_len);
+    void usart_man_set_rx_pre_pattern(Usart *p_usart, uint8_t uc_pattern);
+    void usart_man_set_rx_polarity(Usart *p_usart, uint8_t uc_polarity);
+    void usart_man_enable_drift_compensation(Usart *p_usart);
+    void usart_man_disable_drift_compensation(Usart *p_usart);
+#endif
+
+#if SAM4L
+    uint32_t usart_get_version(Usart *p_usart);
+#endif
+
+#if SAMG55
+    void usart_set_sleepwalking(Usart *p_uart, uint8_t ul_low_value,
+                                bool cmpmode, bool cmppar, uint8_t ul_high_value);
+#endif
+
+/// @cond 0
+/**INDENT-OFF**/
+#ifdef __cplusplus
+}
+#endif
+/**INDENT-ON**/
+/// @endcond
+
+//! @}
+
+/**
+ * \page sam_usart_quickstart Quick start guide for the SAM USART module
+ *
+ * This is the quick start guide for the \ref group_sam_drivers_usart
+ * "USART module", with step-by-step instructions on how to configure and
+ * use the driver in a selection of use cases.
+ *
+ * The use cases contain several code fragments. The code fragments in the
+ * steps for setup can be copied into a custom initialization function, while
+ * the steps for usage can be copied into, e.g., the main application function.
+ *
+ * \note Some SAM devices contain both USART and UART modules, with the latter
+ *       being a subset in functionality of the former but physically separate
+ *       peripherals. UART modules are compatible with the USART driver, but
+ *       only for the functions and modes supported by the base UART driver.
+ *
+ * \section usart_use_cases USART use cases
+ * - \ref usart_basic_use_case
+ * - \subpage usart_use_case_1
+ * - \subpage usart_use_case_2
+ *
+ * \note The USART pins configuration are not included here. Please refer
+ *       the related code in board_init() function.
+ *
+ * \section usart_basic_use_case Basic use case - transmit a character
+ * In this use case, the USART module is configured for:
+ * - Using USART0
+ * - Baudrate: 9600
+ * - Character length: 8 bit
+ * - Parity mode: Disabled
+ * - Stop bit: None
+ * - RS232 mode
+ *
+ * \section usart_basic_use_case_setup Setup steps
+ *
+ * \subsection usart_basic_use_case_setup_prereq Prerequisites
+ * -# \ref sysclk_group "System Clock Management (sysclock)"
+ * -# \ref ioport_group "Common IOPORT API (ioport)"
+ *
+ * \subsection usart_basic_use_case_setup_code Example code
+ * The following configuration must be added to the project (typically to a
+ * conf_usart.h file, but it can also be added to your main application file.)
+ * \code
+	#define USART_SERIAL                 USART0
+	#define USART_SERIAL_ID              ID_USART0  //USART0 for sam4l
+	#define USART_SERIAL_BAUDRATE        9600
+	#define USART_SERIAL_CHAR_LENGTH     US_MR_CHRL_8_BIT
+	#define USART_SERIAL_PARITY          US_MR_PAR_NO
+	#define USART_SERIAL_STOP_BIT        US_MR_NBSTOP_1_BIT
+\endcode
+ *
+ * Add to application initialization:
+ * \code
+	    sysclk_init();
+
+	    board_init();
+
+	    const sam_usart_opt_t usart_console_settings = {
+	        USART_SERIAL_BAUDRATE,
+	        USART_SERIAL_CHAR_LENGTH,
+	        USART_SERIAL_PARITY,
+	        USART_SERIAL_STOP_BIT,
+	        US_MR_CHMODE_NORMAL
+	    };
+    #if SAM4L
+      sysclk_enable_peripheral_clock(USART_SERIAL);
+    #else
+	    sysclk_enable_peripheral_clock(USART_SERIAL_ID);
+    #endif
+	    usart_init_rs232(USART_SERIAL, &usart_console_settings,
+	            sysclk_get_main_hz());
+	    usart_enable_tx(USART_SERIAL);
+	    usart_enable_rx(USART_SERIAL);
+\endcode
+ *
+ * \subsection usart_basic_use_case_setup_flow Workflow
+ * -# Initialize system clock:
+ *   \code
+	sysclk_init();
+\endcode
+ * -# Configure the USART Tx and Rx pins by call the board init function:
+ *   \code
+	board_init();
+\endcode
+ * \note Set the following define in conf_board.h file to enable COM port,it will be used in
+ * board_init() function to set up IOPorts for the USART pins.
+ * For SAM4L:
+ *   \code
+  #define CONF_BOARD_COM_PORT
+\endcode
+ * For other SAM devices:
+ *   \code
+  #define CONF_BOARD_UART_CONSOLE
+\endcode
+ * -# Create USART options struct:
+ *   \code
+	const sam_usart_opt_t usart_console_settings = {
+	     USART_SERIAL_BAUDRATE,
+	     USART_SERIAL_CHAR_LENGTH,
+	     USART_SERIAL_PARITY,
+	     USART_SERIAL_STOP_BIT,
+	     US_MR_CHMODE_NORMAL
+	};
+\endcode
+ * -# Enable the clock to the USART module:
+ *   \code
+	  #if SAM4L
+      sysclk_enable_peripheral_clock(USART_SERIAL);
+    #else
+	    sysclk_enable_peripheral_clock(USART_SERIAL_ID);
+    #endif
+\endcode
+ * -# Initialize the USART module in RS232 mode:
+ *   \code
+	usart_init_rs232(USART_SERIAL, &usart_console_settings,
+	        sysclk_get_main_hz());
+\endcode
+ * -# Enable the Rx and Tx modes of the USART module:
+ *   \code
+	usart_enable_tx(USART_SERIAL);
+	usart_enable_rx(USART_SERIAL);
+\endcode
+ *
+ * \section usart_basic_use_case_usage Usage steps
+ *
+ * \subsection usart_basic_use_case_usage_code Example code
+ * Add to application C-file:
+ * \code
+	usart_putchar(USART_SERIAL, 'a');
+\endcode
+ *
+ * \subsection usart_basic_use_case_usage_flow Workflow
+ * -# Send an 'a' character via USART
+ *   \code usart_putchar(USART_SERIAL, 'a'); \endcode
+ */
+
+/**
+ * \page usart_use_case_1 USART receive character and echo back
+ *
+ * In this use case, the USART module is configured for:
+ * - Using USART0
+ * - Baudrate: 9600
+ * - Character length: 8 bit
+ * - Parity mode: Disabled
+ * - Stop bit: None
+ * - RS232 mode
+ *
+ * The use case waits for a received character on the configured USART and
+ * echoes the character back to the same USART.
+ *
+ * \section usart_use_case_1_setup Setup steps
+ *
+ * \subsection usart_use_case_1_setup_prereq Prerequisites
+ * -# \ref sysclk_group "System Clock Management (sysclock)"
+ * -# \ref ioport_group "Common IOPORT API (ioport)"
+ *
+ * \subsection usart_use_case_1_setup_code Example code
+ * The following configuration must be added to the project (typically to a
+ * conf_usart.h file, but it can also be added to your main application file.):
+ * \code
+	#define USART_SERIAL                 USART0
+	#define USART_SERIAL_ID              ID_USART0  //USART0 for sam4l
+	#define USART_SERIAL_BAUDRATE        9600
+	#define USART_SERIAL_CHAR_LENGTH     US_MR_CHRL_8_BIT
+	#define USART_SERIAL_PARITY          US_MR_PAR_NO
+	#define USART_SERIAL_STOP_BIT        US_MR_NBSTOP_1_BIT
+\endcode
+ *
+ * A variable for the received byte must be added:
+ * \code
+	uint32_t received_byte;
+\endcode
+ *
+ * Add to application initialization:
+ * \code
+	    sysclk_init();
+
+	    board_init();
+
+	    const sam_usart_opt_t usart_console_settings = {
+	        USART_SERIAL_BAUDRATE,
+	        USART_SERIAL_CHAR_LENGTH,
+	        USART_SERIAL_PARITY,
+	        USART_SERIAL_STOP_BIT,
+	        US_MR_CHMODE_NORMAL
+	    };
+
+    #if SAM4L
+      sysclk_enable_peripheral_clock(USART_SERIAL);
+    #else
+	    sysclk_enable_peripheral_clock(USART_SERIAL_ID);
+    #endif
+
+	    usart_init_rs232(USART_SERIAL, &usart_console_settings,
+	            sysclk_get_main_hz());
+	    usart_enable_tx(USART_SERIAL);
+	    usart_enable_rx(USART_SERIAL);
+\endcode
+ *
+ * \subsection usart_use_case_1_setup_flow Workflow
+ * -# Initialize system clock:
+ *   \code
+	sysclk_init();
+\endcode
+ * -# Configure the USART Tx and Rx pins  by call the board init function:
+ *   \code
+	board_init();
+\endcode
+ * \note Set the following define in conf_board.h file to enable COM port,it will be used in
+ * board_init() function to set up IOPorts for the USART pins.
+ * For SAM4L:
+ *   \code
+  #define CONF_BOARD_COM_PORT
+\endcode
+ * For other SAM devices:
+ *   \code
+  #define CONF_BOARD_UART_CONSOLE
+\endcode
+ * -# Create USART options struct:
+ *   \code
+	const sam_usart_opt_t usart_console_settings = {
+	     USART_SERIAL_BAUDRATE,
+	     USART_SERIAL_CHAR_LENGTH,
+	     USART_SERIAL_PARITY,
+	     USART_SERIAL_STOP_BIT,
+	     US_MR_CHMODE_NORMAL
+	};
+\endcode
+ * -# Enable the clock to the USART module:
+ *   \code
+    #if SAM4L
+      sysclk_enable_peripheral_clock(USART_SERIAL);
+    #else
+	    sysclk_enable_peripheral_clock(USART_SERIAL_ID);
+    #endif
+\endcode
+ * -# Initialize the USART module in RS232 mode:
+ *   \code
+	usart_init_rs232(USART_SERIAL, &usart_console_settings,
+	        sysclk_get_main_hz());
+\endcode
+ * -# Enable the Rx and Tx modes of the USART module:
+ *   \code
+	usart_enable_tx(USART_SERIAL);
+	usart_enable_rx(USART_SERIAL);
+\endcode
+ *
+ * \section usart_use_case_1_usage Usage steps
+ *
+ * \subsection usart_use_case_1_usage_code Example code
+ * Add to, e.g., main loop in application C-file:
+ * \code
+	received_byte = usart_getchar(USART_SERIAL);
+	usart_putchar(USART_SERIAL, received_byte);
+\endcode
+ *
+ * \subsection usart_use_case_1_usage_flow Workflow
+ * -# Wait for reception of a character:
+ *   \code usart_getchar(USART_SERIAL, &received_byte); \endcode
+ * -# Echo the character back:
+ *   \code usart_putchar(USART_SERIAL, received_byte); \endcode
+ */
+
+/**
+ * \page usart_use_case_2 USART receive character and echo back via interrupts
+ *
+ * In this use case, the USART module is configured for:
+ * - Using USART0
+ * - Baudrate: 9600
+ * - Character length: 8 bit
+ * - Parity mode: Disabled
+ * - Stop bit: None
+ * - RS232 mode
+ *
+ * The use case waits for a received character on the configured USART and
+ * echoes the character back to the same USART. The character reception is
+ * performed via an interrupt handler, rather than the polling method used
+ * in \ref usart_use_case_1.
+ *
+ * \section usart_use_case_2_setup Setup steps
+ *
+ * \subsection usart_use_case_2_setup_prereq Prerequisites
+ * -# \ref sysclk_group "System Clock Management (sysclock)"
+ * -# \ref pio_group "Parallel Input/Output Controller (pio)"
+ * -# \ref pmc_group "Power Management Controller (pmc)"
+ *
+ * \subsection usart_use_case_2_setup_code Example code
+ * The following configuration must be added to the project (typically to a
+ * conf_usart.h file, but it can also be added to your main application file.):
+ * \code
+	#define USART_SERIAL                 USART0
+	#define USART_SERIAL_ID              ID_USART0  //USART0 for sam4l
+	#define USART_SERIAL_ISR_HANDLER     USART0_Handler
+	#define USART_SERIAL_BAUDRATE        9600
+	#define USART_SERIAL_CHAR_LENGTH     US_MR_CHRL_8_BIT
+	#define USART_SERIAL_PARITY          US_MR_PAR_NO
+	#define USART_SERIAL_STOP_BIT        US_MR_NBSTOP_1_BIT
+\endcode
+ *
+ * A variable for the received byte must be added:
+ * \code
+	uint32_t received_byte;
+\endcode
+ *
+ * Add to application initialization:
+ * \code
+	    sysclk_init();
+
+	    board_init();
+
+	    const sam_usart_opt_t usart_console_settings = {
+	        USART_SERIAL_BAUDRATE,
+	        USART_SERIAL_CHAR_LENGTH,
+	        USART_SERIAL_PARITY,
+	        USART_SERIAL_STOP_BIT,
+	        US_MR_CHMODE_NORMAL
+	    };
+
+    #if SAM4L
+      sysclk_enable_peripheral_clock(USART_SERIAL);
+    #else
+	    sysclk_enable_peripheral_clock(USART_SERIAL_ID);
+    #endif
+
+	    usart_init_rs232(USART_SERIAL, &usart_console_settings,
+	            sysclk_get_main_hz());
+	    usart_enable_tx(USART_SERIAL);
+	    usart_enable_rx(USART_SERIAL);
+
+	    usart_enable_interrupt(USART_SERIAL, US_IER_RXRDY);
+	    NVIC_EnableIRQ(USART_SERIAL_IRQ);
+\endcode
+ *
+ * \subsection usart_use_case_2_setup_flow Workflow
+ * -# Initialize system clock:
+ *   \code
+	sysclk_init();
+\endcode
+ * -# Configure the USART Tx and Rx pins  by call the board init function:
+ *   \code
+	board_init();
+\endcode
+ * \note Set the following define in conf_board.h file to enable COM port,it will be used in
+ * board_init() function to set up IOPorts for the USART pins.
+ * For SAM4L:
+ *   \code
+  #define CONF_BOARD_COM_PORT
+\endcode
+ * For other SAM devices:
+ *   \code
+  #define CONF_BOARD_UART_CONSOLE
+\endcode
+ * -# Create USART options struct:
+ *   \code
+	const sam_usart_opt_t usart_console_settings = {
+	     USART_SERIAL_BAUDRATE,
+	     USART_SERIAL_CHAR_LENGTH,
+	     USART_SERIAL_PARITY,
+	     USART_SERIAL_STOP_BIT,
+	     US_MR_CHMODE_NORMAL
+	};
+\endcode
+ * -# Enable the clock to the USART module:
+ *   \code
+    #if SAM4L
+      sysclk_enable_peripheral_clock(USART_SERIAL);
+    #else
+	    sysclk_enable_peripheral_clock(USART_SERIAL_ID);
+    #endif
+\endcode
+ * -# Initialize the USART module in RS232 mode:
+ *   \code
+	usart_init_rs232(USART_SERIAL, &usart_console_settings,
+	        sysclk_get_main_hz());
+\endcode
+ * -# Enable the Rx and Tx modes of the USART module:
+ *   \code
+	usart_enable_tx(USART_SERIAL);
+	usart_enable_rx(USART_SERIAL);
+\endcode
+ * -# Enable the USART character reception interrupt, and general interrupts
+ *   for the USART module.
+ *   \code
+	usart_enable_interrupt(USART_SERIAL, US_IER_RXRDY);
+	NVIC_EnableIRQ(USART_SERIAL_IRQ);
+\endcode
+ * \section usart_use_case_2_usage Usage steps
+ *
+ * \subsection usart_use_case_2_usage_code Example code
+ * Add to your main application C-file the USART interrupt handler:
+ * \code
+	 void USART_SERIAL_ISR_HANDLER(void)
+	 {
+	    uint32_t dw_status = usart_get_status(USART_SERIAL);
+
+	    if (dw_status & US_CSR_RXRDY) {
+	        uint32_t received_byte;
+
+	        usart_read(USART_SERIAL, &received_byte);
+	        usart_write(USART_SERIAL, received_byte);
+	    }
+	 }
+\endcode
+ *
+ * \subsection usart_use_case_2_usage_flow Workflow
+ * -# When the USART ISR fires, retrieve the USART module interrupt flags:
+ *   \code uint32_t dw_status = usart_get_status(USART_SERIAL); \endcode
+ * -# Check if the USART Receive Character interrupt has fired:
+ *   \code if (dw_status & US_CSR_RXRDY) \endcode
+ * -# If a character has been received, fetch it into a temporary variable:
+ *   \code usart_read(USART_SERIAL, &received_byte); \endcode
+ * -# Echo the character back:
+ *   \code usart_write(USART_SERIAL, received_byte); \endcode
+ */
+
+#endif /* USART_H_INCLUDED */