LCOV - code coverage report
Current view: top level - zephyr/drivers - uart.h Hit Total Coverage
Test: new.info Lines: 71 72 98.6 %
Date: 2024-12-22 00:14:23

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

Generated by: LCOV version 1.14