Line data Source code
1 1 : /*
2 : * Copyright (c) 2018-2019 Nordic Semiconductor ASA
3 : * Copyright (c) 2015 Wind River Systems, Inc.
4 : *
5 : * SPDX-License-Identifier: Apache-2.0
6 : */
7 :
8 : /**
9 : * @file
10 : * @ingroup uart_interface
11 : * @brief Main header file for UART driver API.
12 : */
13 :
14 : #ifndef ZEPHYR_INCLUDE_DRIVERS_UART_H_
15 : #define ZEPHYR_INCLUDE_DRIVERS_UART_H_
16 :
17 : /**
18 : * @brief Interfaces for Universal Asynchronous Receiver/Transmitter (UART)
19 : * controllers.
20 : * @defgroup uart_interface UART
21 : * @since 1.0
22 : * @version 1.0.0
23 : * @ingroup io_interfaces
24 : * @{
25 : */
26 :
27 : #include <stddef.h>
28 :
29 : #include <zephyr/device.h>
30 :
31 : #ifdef __cplusplus
32 : extern "C" {
33 : #endif
34 :
35 : /** @brief Line control signals. */
36 1 : enum uart_line_ctrl {
37 : UART_LINE_CTRL_BAUD_RATE = BIT(0), /**< Baud rate */
38 : UART_LINE_CTRL_RTS = BIT(1), /**< Request To Send (RTS) */
39 : UART_LINE_CTRL_DTR = BIT(2), /**< Data Terminal Ready (DTR) */
40 : UART_LINE_CTRL_DCD = BIT(3), /**< Data Carrier Detect (DCD) */
41 : UART_LINE_CTRL_DSR = BIT(4), /**< Data Set Ready (DSR) */
42 : };
43 :
44 : /**
45 : * @brief Reception stop reasons.
46 : *
47 : * Values that correspond to events or errors responsible for stopping
48 : * receiving.
49 : */
50 1 : enum uart_rx_stop_reason {
51 : /** @brief Overrun error */
52 : UART_ERROR_OVERRUN = (1 << 0),
53 : /** @brief Parity error */
54 : UART_ERROR_PARITY = (1 << 1),
55 : /** @brief Framing error */
56 : UART_ERROR_FRAMING = (1 << 2),
57 : /**
58 : * @brief Break interrupt
59 : *
60 : * A break interrupt was received. This happens when the serial input
61 : * is held at a logic '0' state for longer than the sum of
62 : * start time + data bits + parity + stop bits.
63 : */
64 : UART_BREAK = (1 << 3),
65 : /**
66 : * @brief Collision error
67 : *
68 : * This error is raised when transmitted data does not match
69 : * received data. Typically this is useful in scenarios where
70 : * the TX and RX lines maybe connected together such as
71 : * RS-485 half-duplex. This error is only valid on UARTs that
72 : * support collision checking.
73 : */
74 : UART_ERROR_COLLISION = (1 << 4),
75 : /** @brief Noise error */
76 : UART_ERROR_NOISE = (1 << 5),
77 : };
78 :
79 : /** @brief Parity modes */
80 1 : enum uart_config_parity {
81 : UART_CFG_PARITY_NONE, /**< No parity */
82 : UART_CFG_PARITY_ODD, /**< Odd parity */
83 : UART_CFG_PARITY_EVEN, /**< Even parity */
84 : UART_CFG_PARITY_MARK, /**< Mark parity */
85 : UART_CFG_PARITY_SPACE, /**< Space parity */
86 : };
87 :
88 : /** @brief Number of stop bits. */
89 1 : enum uart_config_stop_bits {
90 : UART_CFG_STOP_BITS_0_5, /**< 0.5 stop bit */
91 : UART_CFG_STOP_BITS_1, /**< 1 stop bit */
92 : UART_CFG_STOP_BITS_1_5, /**< 1.5 stop bits */
93 : UART_CFG_STOP_BITS_2, /**< 2 stop bits */
94 : };
95 :
96 : /** @brief Number of data bits. */
97 1 : enum uart_config_data_bits {
98 : UART_CFG_DATA_BITS_5, /**< 5 data bits */
99 : UART_CFG_DATA_BITS_6, /**< 6 data bits */
100 : UART_CFG_DATA_BITS_7, /**< 7 data bits */
101 : UART_CFG_DATA_BITS_8, /**< 8 data bits */
102 : UART_CFG_DATA_BITS_9, /**< 9 data bits */
103 : };
104 :
105 : /**
106 : * @brief Hardware flow control options.
107 : *
108 : * With flow control set to none, any operations related to flow control
109 : * signals can be managed by user with uart_line_ctrl functions.
110 : * In other cases, flow control is managed by hardware/driver.
111 : */
112 1 : enum uart_config_flow_control {
113 : UART_CFG_FLOW_CTRL_NONE, /**< No flow control */
114 : UART_CFG_FLOW_CTRL_RTS_CTS, /**< RTS/CTS flow control */
115 : UART_CFG_FLOW_CTRL_DTR_DSR, /**< DTR/DSR flow control */
116 : UART_CFG_FLOW_CTRL_RS485, /**< RS485 flow control */
117 : };
118 :
119 : /**
120 : * @brief UART controller configuration structure
121 : */
122 1 : struct uart_config {
123 1 : uint32_t baudrate; /**< Baudrate setting in bps */
124 1 : uint8_t parity; /**< Parity bit, use @ref uart_config_parity */
125 1 : uint8_t stop_bits; /**< Stop bits, use @ref uart_config_stop_bits */
126 1 : uint8_t data_bits; /**< Data bits, use @ref uart_config_data_bits */
127 1 : uint8_t flow_ctrl; /**< Flow control setting, use @ref uart_config_flow_control */
128 : };
129 :
130 : /**
131 : * @defgroup uart_interrupt Interrupt-driven UART API
132 : * @{
133 : */
134 :
135 : /**
136 : * @brief Define the application callback function signature for
137 : * uart_irq_callback_user_data_set() function.
138 : *
139 : * @param dev UART device instance.
140 : * @param user_data Arbitrary user data.
141 : */
142 1 : typedef void (*uart_irq_callback_user_data_t)(const struct device *dev,
143 : void *user_data);
144 :
145 : /**
146 : * @}
147 : *
148 : * @defgroup uart_async Async UART API
149 : * @since 1.14
150 : * @version 0.8.0
151 : * @{
152 : */
153 :
154 : /**
155 : * @brief Types of events passed to callback in UART_ASYNC_API
156 : *
157 : * Receiving:
158 : * 1. To start receiving, uart_rx_enable has to be called with first buffer
159 : * 2. When receiving starts to current buffer,
160 : * #UART_RX_BUF_REQUEST will be generated, in response to that user can
161 : * either:
162 : *
163 : * - Provide second buffer using uart_rx_buf_rsp, when first buffer is
164 : * filled, receiving will automatically start to second buffer.
165 : * - Ignore the event, this way when current buffer is filled
166 : * #UART_RX_RDY event will be generated and receiving will be stopped.
167 : *
168 : * 3. If some data was received and timeout occurred #UART_RX_RDY event will be
169 : * generated. It can happen multiples times for the same buffer. RX timeout
170 : * is counted from last byte received i.e. if no data was received, there
171 : * won't be any timeout event.
172 : * 4. #UART_RX_BUF_RELEASED event will be generated when the current buffer is
173 : * no longer used by the driver. It will immediately follow #UART_RX_RDY event.
174 : * Depending on the implementation buffer may be released when it is completely
175 : * or partially filled.
176 : * 5. If there was second buffer provided, it will become current buffer and
177 : * we start again at point 2.
178 : * If no second buffer was specified receiving is stopped and
179 : * #UART_RX_DISABLED event is generated. After that whole process can be
180 : * repeated.
181 : *
182 : * Any time during reception #UART_RX_STOPPED event can occur. if there is any
183 : * data received, #UART_RX_RDY event will be generated. It will be followed by
184 : * #UART_RX_BUF_RELEASED event for every buffer currently passed to driver and
185 : * finally by #UART_RX_DISABLED event.
186 : *
187 : * Receiving can be disabled using uart_rx_disable, after calling that
188 : * function, if there is any data received, #UART_RX_RDY event will be
189 : * generated. #UART_RX_BUF_RELEASED event will be generated for every buffer
190 : * currently passed to driver and finally #UART_RX_DISABLED event will occur.
191 : *
192 : * Transmitting:
193 : * 1. Transmitting starts by uart_tx function.
194 : * 2. If whole buffer was transmitted #UART_TX_DONE is generated. If timeout
195 : * occurred #UART_TX_ABORTED will be generated.
196 : *
197 : * Transmitting can be aborted using @ref uart_tx_abort, after calling that
198 : * function #UART_TX_ABORTED event will be generated.
199 : *
200 : */
201 1 : enum uart_event_type {
202 : /** @brief Whole TX buffer was transmitted. */
203 : UART_TX_DONE,
204 : /**
205 : * @brief Transmitting aborted due to timeout or uart_tx_abort call
206 : *
207 : * When flow control is enabled, there is a possibility that TX transfer
208 : * won't finish in the allotted time. Some data may have been
209 : * transferred, information about it can be found in event data.
210 : */
211 : UART_TX_ABORTED,
212 : /**
213 : * @brief Received data is ready for processing.
214 : *
215 : * This event is generated in the following cases:
216 : * - When RX timeout occurred, and data was stored in provided buffer.
217 : * This can happen multiple times in the same buffer.
218 : * - When provided buffer is full.
219 : * - After uart_rx_disable().
220 : * - After stopping due to external event (#UART_RX_STOPPED).
221 : */
222 : UART_RX_RDY,
223 : /**
224 : * @brief Driver requests next buffer for continuous reception.
225 : *
226 : * This event is triggered when receiving has started for a new buffer,
227 : * i.e. it's time to provide a next buffer for a seamless switchover to
228 : * it. For continuous reliable receiving, user should provide another RX
229 : * buffer in response to this event, using uart_rx_buf_rsp function
230 : *
231 : * If uart_rx_buf_rsp is not called before current buffer
232 : * is filled up, receiving will stop.
233 : */
234 : UART_RX_BUF_REQUEST,
235 : /**
236 : * @brief Buffer is no longer used by UART driver.
237 : */
238 : UART_RX_BUF_RELEASED,
239 : /**
240 : * @brief RX has been disabled and can be reenabled.
241 : *
242 : * This event is generated whenever receiver has been stopped, disabled
243 : * or finished its operation and can be enabled again using
244 : * uart_rx_enable
245 : */
246 : UART_RX_DISABLED,
247 : /**
248 : * @brief RX has stopped due to external event.
249 : *
250 : * Reason is one of uart_rx_stop_reason.
251 : */
252 : UART_RX_STOPPED,
253 : };
254 :
255 : /** @brief UART TX event data. */
256 1 : struct uart_event_tx {
257 : /** @brief Pointer to current buffer. */
258 1 : const uint8_t *buf;
259 : /** @brief Number of bytes sent. */
260 1 : size_t len;
261 : };
262 :
263 : /**
264 : * @brief UART RX event data.
265 : *
266 : * The data represented by the event is stored in rx.buf[rx.offset] to
267 : * rx.buf[rx.offset+rx.len]. That is, the length is relative to the offset.
268 : */
269 1 : struct uart_event_rx {
270 : /** @brief Pointer to current buffer. */
271 1 : uint8_t *buf;
272 : /** @brief Currently received data offset in bytes. */
273 1 : size_t offset;
274 : /** @brief Number of new bytes received. */
275 1 : size_t len;
276 : };
277 :
278 : /** @brief UART RX buffer released event data. */
279 1 : struct uart_event_rx_buf {
280 : /** @brief Pointer to buffer that is no longer in use. */
281 1 : uint8_t *buf;
282 : };
283 :
284 : /** @brief UART RX stopped data. */
285 1 : struct uart_event_rx_stop {
286 : /** @brief Reason why receiving stopped */
287 1 : enum uart_rx_stop_reason reason;
288 : /** @brief Last received data. */
289 1 : struct uart_event_rx data;
290 : };
291 :
292 : /** @brief Structure containing information about current event. */
293 1 : struct uart_event {
294 : /** @brief Type of event */
295 1 : enum uart_event_type type;
296 : /** @brief Event data */
297 1 : union uart_event_data {
298 : /** @brief #UART_TX_DONE and #UART_TX_ABORTED events data. */
299 1 : struct uart_event_tx tx;
300 : /** @brief #UART_RX_RDY event data. */
301 1 : struct uart_event_rx rx;
302 : /** @brief #UART_RX_BUF_RELEASED event data. */
303 1 : struct uart_event_rx_buf rx_buf;
304 : /** @brief #UART_RX_STOPPED event data. */
305 1 : struct uart_event_rx_stop rx_stop;
306 0 : } data;
307 : };
308 :
309 : /**
310 : * @typedef uart_callback_t
311 : * @brief Define the application callback function signature for
312 : * uart_callback_set() function.
313 : *
314 : * @param dev UART device instance.
315 : * @param evt Pointer to uart_event instance.
316 : * @param user_data Pointer to data specified by user.
317 : */
318 1 : typedef void (*uart_callback_t)(const struct device *dev,
319 : struct uart_event *evt, void *user_data);
320 :
321 : /**
322 : * @}
323 : */
324 :
325 : /**
326 : * @brief Check whether an error was detected.
327 : *
328 : * @param dev UART device instance.
329 : *
330 : * @retval 0 If no error was detected.
331 : * @retval err Error flags as defined in @ref uart_rx_stop_reason
332 : * @retval -ENOSYS If not implemented.
333 : */
334 1 : __syscall int uart_err_check(const struct device *dev);
335 :
336 : /**
337 : * @defgroup uart_polling Polling UART API
338 : * @{
339 : */
340 :
341 : /**
342 : * @brief Read a character from the device for input.
343 : *
344 : * This routine checks if the receiver has valid data. When the
345 : * receiver has valid data, it reads a character from the device,
346 : * stores to the location pointed to by p_char, and returns 0 to the
347 : * calling thread. It returns -1, otherwise. This function is a
348 : * non-blocking call.
349 : *
350 : * @param dev UART device instance.
351 : * @param p_char Pointer to character.
352 : *
353 : * @retval 0 If a character arrived.
354 : * @retval -1 If no character was available to read (i.e. the UART
355 : * input buffer was empty).
356 : * @retval -ENOSYS If the operation is not implemented.
357 : * @retval -EBUSY If async reception was enabled using @ref uart_rx_enable
358 : */
359 1 : __syscall int uart_poll_in(const struct device *dev, unsigned char *p_char);
360 :
361 : /**
362 : * @brief Read a 16-bit datum from the device for input.
363 : *
364 : * This routine checks if the receiver has valid data. When the
365 : * receiver has valid data, it reads a 16-bit datum from the device,
366 : * stores to the location pointed to by p_u16, and returns 0 to the
367 : * calling thread. It returns -1, otherwise. This function is a
368 : * non-blocking call.
369 : *
370 : * @param dev UART device instance.
371 : * @param p_u16 Pointer to 16-bit data.
372 : *
373 : * @retval 0 If data arrived.
374 : * @retval -1 If no data was available to read (i.e., the UART
375 : * input buffer was empty).
376 : * @retval -ENOTSUP If API is not enabled.
377 : * @retval -ENOSYS If the function is not implemented.
378 : * @retval -EBUSY If async reception was enabled using @ref uart_rx_enable
379 : */
380 1 : __syscall int uart_poll_in_u16(const struct device *dev, uint16_t *p_u16);
381 :
382 : /**
383 : * @brief Write a character to the device for output.
384 : *
385 : * This routine checks if the transmitter is full. When the
386 : * transmitter is not full, it writes a character to the data
387 : * register. It waits and blocks the calling thread otherwise. This
388 : * function is a blocking call. It blocks the calling thread until the
389 : * character is sent.
390 : *
391 : * To send a character when hardware flow control is enabled, the handshake
392 : * signal CTS must be asserted.
393 : *
394 : * @param dev UART device instance.
395 : * @param out_char Character to send.
396 : */
397 1 : __syscall void uart_poll_out(const struct device *dev,
398 : unsigned char out_char);
399 :
400 : /**
401 : * @brief Write a 16-bit datum to the device for output.
402 : *
403 : * This routine checks if the transmitter is full. When the
404 : * transmitter is not full, it writes a 16-bit datum to the data
405 : * register. It waits and blocks the calling thread, otherwise. This
406 : * function is a blocking call.
407 : *
408 : * To send a datum when hardware flow control is enabled, the handshake
409 : * signal CTS must be asserted.
410 : *
411 : * @param dev UART device instance.
412 : * @param out_u16 Wide data to send.
413 : */
414 1 : __syscall void uart_poll_out_u16(const struct device *dev, uint16_t out_u16);
415 :
416 : /**
417 : * @}
418 : */
419 :
420 : /**
421 : * @brief Set UART configuration.
422 : *
423 : * Sets UART configuration using data from *cfg.
424 : *
425 : * @param dev UART device instance.
426 : * @param cfg UART configuration structure.
427 : *
428 : * @retval 0 If successful.
429 : * @retval -errno Negative errno code in case of failure.
430 : * @retval -ENOSYS If configuration is not supported by device
431 : * or driver does not support setting configuration in runtime.
432 : * @retval -ENOTSUP If API is not enabled.
433 : */
434 1 : __syscall int uart_configure(const struct device *dev,
435 : const struct uart_config *cfg);
436 :
437 : /**
438 : * @brief Get UART configuration.
439 : *
440 : * Stores current UART configuration to *cfg, can be used to retrieve initial
441 : * configuration after device was initialized using data from DTS.
442 : *
443 : * @param dev UART device instance.
444 : * @param cfg UART configuration structure.
445 : *
446 : * @retval 0 If successful.
447 : * @retval -errno Negative errno code in case of failure.
448 : * @retval -ENOSYS If driver does not support getting current configuration.
449 : * @retval -ENOTSUP If API is not enabled.
450 : */
451 1 : __syscall int uart_config_get(const struct device *dev,
452 : struct uart_config *cfg);
453 :
454 : /**
455 : * @addtogroup uart_interrupt
456 : * @{
457 : */
458 :
459 : /**
460 : * @brief Fill FIFO with data.
461 : *
462 : * @details This function is expected to be called from UART
463 : * interrupt handler (ISR), if uart_irq_tx_ready() returns true.
464 : * Result of calling this function not from an ISR is undefined
465 : * (hardware-dependent). Likewise, *not* calling this function
466 : * from an ISR if uart_irq_tx_ready() returns true may lead to
467 : * undefined behavior, e.g. infinite interrupt loops. It's
468 : * mandatory to test return value of this function, as different
469 : * hardware has different FIFO depth (oftentimes just 1).
470 : *
471 : * @param dev UART device instance.
472 : * @param tx_data Data to transmit.
473 : * @param size Number of bytes to send.
474 : *
475 : * @return Number of bytes sent.
476 : * @retval -ENOSYS if this function is not supported
477 : * @retval -ENOTSUP If API is not enabled.
478 : */
479 1 : static inline int uart_fifo_fill(const struct device *dev, const uint8_t *tx_data, int size);
480 :
481 : /**
482 : * @brief Fill FIFO with wide data.
483 : *
484 : * @details This function is expected to be called from UART
485 : * interrupt handler (ISR), if uart_irq_tx_ready() returns true.
486 : * Result of calling this function not from an ISR is undefined
487 : * (hardware-dependent). Likewise, *not* calling this function
488 : * from an ISR if uart_irq_tx_ready() returns true may lead to
489 : * undefined behavior, e.g. infinite interrupt loops. It's
490 : * mandatory to test return value of this function, as different
491 : * hardware has different FIFO depth (oftentimes just 1).
492 : *
493 : * @param dev UART device instance.
494 : * @param tx_data Wide data to transmit.
495 : * @param size Number of datum to send.
496 : *
497 : * @return Number of datum sent.
498 : * @retval -ENOSYS If this function is not implemented
499 : * @retval -ENOTSUP If API is not enabled.
500 : */
501 1 : static inline int uart_fifo_fill_u16(const struct device *dev, const uint16_t *tx_data, int size);
502 :
503 : /**
504 : * @brief Read data from FIFO.
505 : *
506 : * @details This function is expected to be called from UART
507 : * interrupt handler (ISR), if uart_irq_rx_ready() returns true.
508 : * Result of calling this function not from an ISR is undefined
509 : * (hardware-dependent). It's unspecified whether "RX ready"
510 : * condition as returned by uart_irq_rx_ready() is level- or
511 : * edge- triggered. That means that once uart_irq_rx_ready() is
512 : * detected, uart_fifo_read() must be called until it reads all
513 : * available data in the FIFO (i.e. until it returns less data
514 : * than was requested).
515 : *
516 : * @param dev UART device instance.
517 : * @param rx_data Data container.
518 : * @param size Container size.
519 : *
520 : * @return Number of bytes read.
521 : * @retval -ENOSYS If this function is not implemented.
522 : * @retval -ENOTSUP If API is not enabled.
523 : */
524 1 : static inline int uart_fifo_read(const struct device *dev, uint8_t *rx_data, const int size);
525 :
526 : /**
527 : * @brief Read wide data from FIFO.
528 : *
529 : * @details This function is expected to be called from UART
530 : * interrupt handler (ISR), if uart_irq_rx_ready() returns true.
531 : * Result of calling this function not from an ISR is undefined
532 : * (hardware-dependent). It's unspecified whether "RX ready"
533 : * condition as returned by uart_irq_rx_ready() is level- or
534 : * edge- triggered. That means that once uart_irq_rx_ready() is
535 : * detected, uart_fifo_read() must be called until it reads all
536 : * available data in the FIFO (i.e. until it returns less data
537 : * than was requested).
538 : *
539 : * @param dev UART device instance.
540 : * @param rx_data Wide data container.
541 : * @param size Container size.
542 : *
543 : * @return Number of datum read.
544 : * @retval -ENOSYS If this function is not implemented.
545 : * @retval -ENOTSUP If API is not enabled.
546 : */
547 1 : static inline int uart_fifo_read_u16(const struct device *dev, uint16_t *rx_data, const int size);
548 :
549 : /**
550 : * @brief Enable TX interrupt in IER.
551 : *
552 : * @param dev UART device instance.
553 : */
554 1 : __syscall void uart_irq_tx_enable(const struct device *dev);
555 :
556 : /**
557 : * @brief Disable TX interrupt in IER.
558 : *
559 : * @param dev UART device instance.
560 : */
561 1 : __syscall void uart_irq_tx_disable(const struct device *dev);
562 :
563 : /**
564 : * @brief Check if UART TX buffer can accept bytes
565 : *
566 : * @details Check if UART TX buffer can accept more bytes
567 : * for transmission (i.e. uart_fifo_fill() will succeed and return
568 : * non-zero). This function must be called in a UART interrupt
569 : * handler, or its result is undefined. Before calling this function
570 : * in the interrupt handler, uart_irq_update() must be called once per
571 : * the handler invocation.
572 : *
573 : * @param dev UART device instance.
574 : *
575 : * @retval 0 If device is not ready to write a new byte.
576 : * @retval >0 Minimum number of bytes that can be written in a single call to
577 : * @ref uart_fifo_fill. It may be possible to write more bytes, but
578 : * the actual number written must be checked in the return code from
579 : * @ref uart_fifo_fill.
580 : * @retval -ENOSYS If this function is not implemented.
581 : * @retval -ENOTSUP If API is not enabled.
582 : */
583 1 : static inline int uart_irq_tx_ready(const struct device *dev);
584 :
585 : /**
586 : * @brief Enable RX interrupt.
587 : *
588 : * @param dev UART device instance.
589 : */
590 1 : __syscall void uart_irq_rx_enable(const struct device *dev);
591 :
592 : /**
593 : * @brief Disable RX interrupt.
594 : *
595 : * @param dev UART device instance.
596 : */
597 1 : __syscall void uart_irq_rx_disable(const struct device *dev);
598 :
599 : /**
600 : * @brief Check if UART TX block finished transmission
601 : *
602 : * @details Check if any outgoing data buffered in UART TX block was
603 : * fully transmitted and TX block is idle. When this condition is
604 : * true, UART device (or whole system) can be power off. Note that
605 : * this function is *not* useful to check if UART TX can accept more
606 : * data, use uart_irq_tx_ready() for that. This function must be called
607 : * in a UART interrupt handler, or its result is undefined. Before
608 : * calling this function in the interrupt handler, uart_irq_update()
609 : * must be called once per the handler invocation.
610 : *
611 : * @param dev UART device instance.
612 : *
613 : * @retval 1 If nothing remains to be transmitted.
614 : * @retval 0 If transmission is not completed.
615 : * @retval -ENOSYS If this function is not implemented.
616 : * @retval -ENOTSUP If API is not enabled.
617 : */
618 1 : static inline int uart_irq_tx_complete(const struct device *dev);
619 :
620 : /**
621 : * @brief Check if UART RX buffer has a received char
622 : *
623 : * @details Check if UART RX buffer has at least one pending character
624 : * (i.e. uart_fifo_read() will succeed and return non-zero). This function
625 : * must be called in a UART interrupt handler, or its result is undefined.
626 : * Before calling this function in the interrupt handler, uart_irq_update()
627 : * must be called once per the handler invocation. It's unspecified whether
628 : * condition as returned by this function is level- or edge- triggered (i.e.
629 : * if this function returns true when RX FIFO is non-empty, or when a new
630 : * char was received since last call to it). See description of
631 : * uart_fifo_read() for implication of this.
632 : *
633 : * @param dev UART device instance.
634 : *
635 : * @retval 1 If a received char is ready.
636 : * @retval 0 If a received char is not ready.
637 : * @retval -ENOSYS If this function is not implemented.
638 : * @retval -ENOTSUP If API is not enabled.
639 : */
640 1 : static inline int uart_irq_rx_ready(const struct device *dev);
641 :
642 : /**
643 : * @brief Enable error interrupt.
644 : *
645 : * @param dev UART device instance.
646 : */
647 1 : __syscall void uart_irq_err_enable(const struct device *dev);
648 :
649 : /**
650 : * @brief Disable error interrupt.
651 : *
652 : * @param dev UART device instance.
653 : */
654 1 : __syscall void uart_irq_err_disable(const struct device *dev);
655 :
656 : /**
657 : * @brief Check if any IRQs is pending.
658 : *
659 : * @param dev UART device instance.
660 : *
661 : * @retval 1 If an IRQ is pending.
662 : * @retval 0 If an IRQ is not pending.
663 : * @retval -ENOSYS If this function is not implemented.
664 : * @retval -ENOTSUP If API is not enabled.
665 : */
666 1 : __syscall int uart_irq_is_pending(const struct device *dev);
667 :
668 : /**
669 : * @brief Start processing interrupts in ISR.
670 : *
671 : * This function should be called the first thing in the ISR. Calling
672 : * uart_irq_rx_ready(), uart_irq_tx_ready(), uart_irq_tx_complete()
673 : * allowed only after this.
674 : *
675 : * The purpose of this function is:
676 : *
677 : * * For devices with auto-acknowledge of interrupt status on register
678 : * read to cache the value of this register (rx_ready, etc. then use
679 : * this case).
680 : * * For devices with explicit acknowledgment of interrupts, to ack
681 : * any pending interrupts and likewise to cache the original value.
682 : * * For devices with implicit acknowledgment, this function will be
683 : * empty. But the ISR must perform the actions needs to ack the
684 : * interrupts (usually, call uart_fifo_read() on rx_ready, and
685 : * uart_fifo_fill() on tx_ready).
686 : *
687 : * @param dev UART device instance.
688 : *
689 : * @retval 1 On success.
690 : * @retval -ENOSYS If this function is not implemented.
691 : * @retval -ENOTSUP If API is not enabled.
692 : */
693 1 : __syscall int uart_irq_update(const struct device *dev);
694 :
695 : /**
696 : * @brief Set the IRQ callback function pointer.
697 : *
698 : * This sets up the callback for IRQ. When an IRQ is triggered,
699 : * the specified function will be called with specified user data.
700 : * See description of uart_irq_update() for the requirements on ISR.
701 : *
702 : * @param dev UART device instance.
703 : * @param cb Pointer to the callback function.
704 : * @param user_data Data to pass to callback function.
705 : *
706 : * @retval 0 On success.
707 : * @retval -ENOSYS If this function is not implemented.
708 : * @retval -ENOTSUP If API is not enabled.
709 : */
710 1 : static inline int uart_irq_callback_user_data_set(const struct device *dev,
711 : uart_irq_callback_user_data_t cb,
712 : void *user_data);
713 :
714 : /**
715 : * @brief Set the IRQ callback function pointer (legacy).
716 : *
717 : * This sets up the callback for IRQ. When an IRQ is triggered,
718 : * the specified function will be called with the device pointer.
719 : *
720 : * @param dev UART device instance.
721 : * @param cb Pointer to the callback function.
722 : *
723 : * @retval 0 On success.
724 : * @retval -ENOSYS If this function is not implemented.
725 : * @retval -ENOTSUP If API is not enabled.
726 : */
727 1 : static inline int uart_irq_callback_set(const struct device *dev,
728 : uart_irq_callback_user_data_t cb);
729 :
730 : /**
731 : * @}
732 : */
733 :
734 : /**
735 : * @addtogroup uart_async
736 : * @{
737 : */
738 :
739 : /**
740 : * @brief Set event handler function.
741 : *
742 : * Since it is mandatory to set callback to use other asynchronous functions,
743 : * it can be used to detect if the device supports asynchronous API. Remaining
744 : * API does not have that detection.
745 : *
746 : * @param dev UART device instance.
747 : * @param callback Event handler.
748 : * @param user_data Data to pass to event handler function.
749 : *
750 : * @retval 0 If successful.
751 : * @retval -ENOSYS If not supported by the device.
752 : * @retval -ENOTSUP If API not enabled.
753 : */
754 1 : static inline int uart_callback_set(const struct device *dev,
755 : uart_callback_t callback,
756 : void *user_data);
757 :
758 : /**
759 : * @brief Send given number of bytes from buffer through UART.
760 : *
761 : * Function returns immediately and event handler,
762 : * set using @ref uart_callback_set, is called after transfer is finished.
763 : *
764 : * @param dev UART device instance.
765 : * @param buf Pointer to transmit buffer.
766 : * @param len Length of transmit buffer.
767 : * @param timeout Timeout in microseconds. Valid only if flow control is
768 : * enabled. @ref SYS_FOREVER_US disables timeout.
769 : *
770 : * @retval 0 If successful.
771 : * @retval -ENOTSUP If API is not enabled.
772 : * @retval -EBUSY If There is already an ongoing transfer.
773 : * @retval -errno Other negative errno value in case of failure.
774 : */
775 1 : __syscall int uart_tx(const struct device *dev, const uint8_t *buf,
776 : size_t len,
777 : int32_t timeout);
778 :
779 : /**
780 : * @brief Send given number of datum from buffer through UART.
781 : *
782 : * Function returns immediately and event handler,
783 : * set using @ref uart_callback_set, is called after transfer is finished.
784 : *
785 : * @param dev UART device instance.
786 : * @param buf Pointer to wide data transmit buffer.
787 : * @param len Length of wide data transmit buffer.
788 : * @param timeout Timeout in milliseconds. Valid only if flow control is
789 : * enabled. @ref SYS_FOREVER_MS disables timeout.
790 : *
791 : * @retval 0 If successful.
792 : * @retval -ENOTSUP If API is not enabled.
793 : * @retval -EBUSY If there is already an ongoing transfer.
794 : * @retval -errno Other negative errno value in case of failure.
795 : */
796 1 : __syscall int uart_tx_u16(const struct device *dev, const uint16_t *buf,
797 : size_t len, int32_t timeout);
798 :
799 : /**
800 : * @brief Abort current TX transmission.
801 : *
802 : * #UART_TX_DONE event will be generated with amount of data sent.
803 : *
804 : * @param dev UART device instance.
805 : *
806 : * @retval 0 If successful.
807 : * @retval -ENOTSUP If API is not enabled.
808 : * @retval -EFAULT There is no active transmission.
809 : * @retval -errno Other negative errno value in case of failure.
810 : */
811 1 : __syscall int uart_tx_abort(const struct device *dev);
812 :
813 : /**
814 : * @brief Start receiving data through UART.
815 : *
816 : * Function sets given buffer as first buffer for receiving and returns
817 : * immediately. After that event handler, set using @ref uart_callback_set,
818 : * is called with #UART_RX_RDY or #UART_RX_BUF_REQUEST events.
819 : *
820 : * @param dev UART device instance.
821 : * @param buf Pointer to receive buffer.
822 : * @param len Buffer length.
823 : * @param timeout Inactivity period after receiving at least a byte which
824 : * triggers #UART_RX_RDY event. Given in microseconds.
825 : * @ref SYS_FOREVER_US disables timeout. See @ref uart_event_type
826 : * for details.
827 : *
828 : * @retval 0 If successful.
829 : * @retval -ENOTSUP If API is not enabled.
830 : * @retval -EBUSY RX already in progress.
831 : * @retval -errno Other negative errno value in case of failure.
832 : *
833 : */
834 1 : __syscall int uart_rx_enable(const struct device *dev, uint8_t *buf,
835 : size_t len,
836 : int32_t timeout);
837 :
838 : /**
839 : * @brief Start receiving wide data through UART.
840 : *
841 : * Function sets given buffer as first buffer for receiving and returns
842 : * immediately. After that event handler, set using @ref uart_callback_set,
843 : * is called with #UART_RX_RDY or #UART_RX_BUF_REQUEST events.
844 : *
845 : * @param dev UART device instance.
846 : * @param buf Pointer to wide data receive buffer.
847 : * @param len Buffer length.
848 : * @param timeout Inactivity period after receiving at least a byte which
849 : * triggers #UART_RX_RDY event. Given in milliseconds.
850 : * @ref SYS_FOREVER_MS disables timeout. See
851 : * @ref uart_event_type for details.
852 : *
853 : * @retval 0 If successful.
854 : * @retval -ENOTSUP If API is not enabled.
855 : * @retval -EBUSY RX already in progress.
856 : * @retval -errno Other negative errno value in case of failure.
857 : *
858 : */
859 1 : __syscall int uart_rx_enable_u16(const struct device *dev, uint16_t *buf,
860 : size_t len, int32_t timeout);
861 :
862 : /**
863 : * @brief Provide receive buffer in response to #UART_RX_BUF_REQUEST event.
864 : *
865 : * Provide pointer to RX buffer, which will be used when current buffer is
866 : * filled.
867 : *
868 : * @note Providing buffer that is already in usage by driver leads to
869 : * undefined behavior. Buffer can be reused when it has been released
870 : * by driver.
871 : *
872 : * @param dev UART device instance.
873 : * @param buf Pointer to receive buffer.
874 : * @param len Buffer length.
875 : *
876 : * @retval 0 If successful.
877 : * @retval -ENOTSUP If API is not enabled.
878 : * @retval -EBUSY Next buffer already set.
879 : * @retval -EACCES Receiver is already disabled (function called too late?).
880 : * @retval -errno Other negative errno value in case of failure.
881 : */
882 1 : static inline int uart_rx_buf_rsp(const struct device *dev, uint8_t *buf,
883 : size_t len);
884 :
885 : /**
886 : * @brief Provide wide data receive buffer in response to #UART_RX_BUF_REQUEST
887 : * event.
888 : *
889 : * Provide pointer to RX buffer, which will be used when current buffer is
890 : * filled.
891 : *
892 : * @note Providing buffer that is already in usage by driver leads to
893 : * undefined behavior. Buffer can be reused when it has been released
894 : * by driver.
895 : *
896 : * @param dev UART device instance.
897 : * @param buf Pointer to wide data receive buffer.
898 : * @param len Buffer length.
899 : *
900 : * @retval 0 If successful.
901 : * @retval -ENOTSUP If API is not enabled
902 : * @retval -EBUSY Next buffer already set.
903 : * @retval -EACCES Receiver is already disabled (function called too late?).
904 : * @retval -errno Other negative errno value in case of failure.
905 : */
906 1 : static inline int uart_rx_buf_rsp_u16(const struct device *dev, uint16_t *buf,
907 : size_t len);
908 :
909 : /**
910 : * @brief Disable RX
911 : *
912 : * #UART_RX_BUF_RELEASED event will be generated for every buffer scheduled,
913 : * after that #UART_RX_DISABLED event will be generated. Additionally, if there
914 : * is any pending received data, the #UART_RX_RDY event for that data will be
915 : * generated before the #UART_RX_BUF_RELEASED events.
916 : *
917 : * @param dev UART device instance.
918 : *
919 : * @retval 0 If successful.
920 : * @retval -ENOTSUP If API is not enabled.
921 : * @retval -EFAULT There is no active reception.
922 : * @retval -errno Other negative errno value in case of failure.
923 : */
924 1 : __syscall int uart_rx_disable(const struct device *dev);
925 :
926 : /**
927 : * @}
928 : */
929 :
930 : /**
931 : * @brief Manipulate line control for UART.
932 : *
933 : * @param dev UART device instance.
934 : * @param ctrl The line control to manipulate (see enum uart_line_ctrl).
935 : * @param val Value to set to the line control.
936 : *
937 : * @retval 0 If successful.
938 : * @retval -ENOSYS If this function is not implemented.
939 : * @retval -ENOTSUP If API is not enabled.
940 : * @retval -errno Other negative errno value in case of failure.
941 : */
942 1 : __syscall int uart_line_ctrl_set(const struct device *dev,
943 : uint32_t ctrl, uint32_t val);
944 :
945 : /**
946 : * @brief Retrieve line control for UART.
947 : *
948 : * @param dev UART device instance.
949 : * @param ctrl The line control to retrieve (see enum uart_line_ctrl).
950 : * @param val Pointer to variable where to store the line control value.
951 : *
952 : * @retval 0 If successful.
953 : * @retval -ENOSYS If this function is not implemented.
954 : * @retval -ENOTSUP If API is not enabled.
955 : * @retval -errno Other negative errno value in case of failure.
956 : */
957 1 : __syscall int uart_line_ctrl_get(const struct device *dev, uint32_t ctrl,
958 : uint32_t *val);
959 :
960 : /**
961 : * @brief Send extra command to driver.
962 : *
963 : * Implementation and accepted commands are driver specific.
964 : * Refer to the drivers for more information.
965 : *
966 : * @param dev UART device instance.
967 : * @param cmd Command to driver.
968 : * @param p Parameter to the command.
969 : *
970 : * @retval 0 If successful.
971 : * @retval -ENOSYS If this function is not implemented.
972 : * @retval -ENOTSUP If API is not enabled.
973 : * @retval -errno Other negative errno value in case of failure.
974 : */
975 1 : __syscall int uart_drv_cmd(const struct device *dev, uint32_t cmd, uint32_t p);
976 :
977 : #ifdef __cplusplus
978 : }
979 : #endif
980 :
981 : /**
982 : * @}
983 : */
984 :
985 : #include <zephyr/drivers/uart/uart_internal.h>
986 : #include <zephyr/syscalls/uart.h>
987 :
988 : #endif /* ZEPHYR_INCLUDE_DRIVERS_UART_H_ */
|