Blame view

RIOT/drivers/include/periph/uart.h 5.41 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
  /*
   * Copyright (C) 2014-2015 Freie Universitรคt Berlin
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @defgroup    drivers_periph_uart UART
   * @ingroup     drivers_periph
   * @brief       Low-level UART peripheral driver
   *
   * This is a basic UART (Universal Asynchronous Receiver Transmitter) interface
   * to allow platform independent access to the MCU's serial communication abilities.
   * This interface is intentionally designed to be as simple as possible, to allow
   * for easy implementation and maximum portability. In RIOT we only use the
   * common 8-N-1 format of the serial port (8 data bits, no parity bit, one stop bit).
   *
   * The simple interface provides capabilities to initialize the serial communication
   * module, which automatically enables for receiving data, as well as writing data
   * to the UART port, which means transmitting data. The UART device and the
   * corresponding pins need to be mapped in `RIOT/boards/ * /include/periph_conf.h`.
   * Furthermore you need to select the baudrate for initialization which is typically
   * {9600, 19200, 38400, 57600, 115200} baud. Additionally you should register a
   * callback function that is executed in interrupt context when data is being received.
   * The driver will then read the received data byte, call the registered callback
   * function and pass the received data to it via its argument. The interface enforces
   * the receiving to be implemented in an interrupt driven mode. Thus, you never know how
   * many bytes are going to be received and might want to handle that in your specific
   * callback function. The transmit function can be implemented in any way.
   *
   * By default the @p UART_DEV(0) device of each board is initialized and mapped to STDIO
   * in RIOT which is used for standard input/output functions like `printf()` or
   * `puts()`.
   *
   * @{
   *
   * @file
   * @brief       Low-level UART peripheral driver interface definition
   *
   * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
   */
  
  #ifndef PERIPH_UART_H
  #define PERIPH_UART_H
  
  #include <stddef.h>
  #include <stdint.h>
  #include <limits.h>
  
  #include "periph_cpu.h"
  #include "periph_conf.h"
  /* TODO: remove once all platforms are ported to this interface */
  #include "periph/dev_enums.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /**
   * @brief   Define default UART type identifier
   */
  #ifndef HAVE_UART_T
  typedef unsigned int uart_t;
  #endif
  
  /**
   * @brief   Default UART undefined value
   */
  #ifndef UART_UNDEF
  #define UART_UNDEF          (UINT_MAX)
  #endif
  
  /**
   * @brief   Default UART device access macro
   */
  #ifndef UART_DEV
  #define UART_DEV(x)         (x)
  #endif
  
  /**
   * @brief   Signature for receive interrupt callback
   *
   * @param[in] arg           context to the callback (optional)
   * @param[in] data          the byte that was received
   */
  typedef void(*uart_rx_cb_t)(void *arg, uint8_t data);
  
  /**
   * @brief   Interrupt context for a UART device
   */
  #ifndef HAVE_UART_ISR_CTX_T
  typedef struct {
      uart_rx_cb_t rx_cb;     /**< data received interrupt callback */
      void *arg;              /**< argument to both callback routines */
  } uart_isr_ctx_t;
  #endif
  
  /**
   * @brief   Possible UART return values
   */
  enum {
      UART_OK         =  0,   /**< everything in order */
      UART_NODEV      = -1,   /**< invalid UART device given */
      UART_NOBAUD     = -2,   /**< given baudrate is not applicable */
      UART_INTERR     = -3,   /**< all other internal errors */
      UART_NOMODE     = -4    /**< given mode is not applicable */
  };
  
  /**
   * @brief   Initialize a given UART device
   *
   * The UART device will be initialized with the following configuration:
   * - 8 data bits
   * - no parity
   * - 1 stop bit
   * - baudrate as given
   *
   * If no callback parameter is given (rx_cb := NULL), the UART will be
   * initialized in TX only mode.
   *
   * @param[in] uart          UART device to initialize
   * @param[in] baudrate      desired baudrate in baud/s
   * @param[in] rx_cb         receive callback, executed in interrupt context once
   *                          for every byte that is received (RX buffer filled),
   *                          set to NULL for TX only mode
   * @param[in] arg           optional context passed to the callback functions
   *
   * @return                  UART_OK on success
   * @return                  UART_NODEV on invalid UART device
   * @return                  UART_NOBAUD on inapplicable baudrate
   * @return                  UART_INTERR on other errors
   */
  int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg);
  
  /**
   * @brief   Write data from the given buffer to the specified UART device
   *
   * This function is blocking, as it will only return after @p len bytes from the
   * given buffer have been send. The way this data is send is up to the
   * implementation: active waiting, interrupt driven, DMA, etc.
   *
   * @param[in] uart          UART device to use for transmission
   * @param[in] data          data buffer to send
   * @param[in] len           number of bytes to send
   *
   */
  void uart_write(uart_t uart, const uint8_t *data, size_t len);
  
  /**
   * @brief   Power on the given UART device
   *
   * @param[in] uart          the UART device to power on
   */
  void uart_poweron(uart_t uart);
  
  /**
   * @brief Power off the given UART device
   *
   * @param[in] uart          the UART device to power off
   */
  void uart_poweroff(uart_t uart);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* PERIPH_UART_H */
  /** @} */