161 lines
4.1 KiB
C
161 lines
4.1 KiB
C
/*
|
|
* Copyright (c) 2020 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Public APIs for UART MUX drivers
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_DRIVERS_UART_MUX_H_
|
|
#define ZEPHYR_INCLUDE_DRIVERS_UART_MUX_H_
|
|
|
|
/**
|
|
* @brief UART Mux Interface
|
|
* @defgroup uart_mux_interface UART Mux Interface
|
|
* @ingroup io_interfaces
|
|
* @{
|
|
*/
|
|
|
|
#include <device.h>
|
|
#include <drivers/uart.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct gsm_dlci;
|
|
|
|
/**
|
|
* @typedef uart_mux_attach_cb_t
|
|
*
|
|
* @brief Define the user callback function which is called when
|
|
* the UART mux is attached properly.
|
|
*
|
|
* @param mux UART mux device
|
|
* @param dlci_address DLCI id for the virtual muxing channel
|
|
* @param connected True if DLCI is connected, false otherwise.
|
|
* @param user_data Arbitrary user data.
|
|
*/
|
|
typedef void (*uart_mux_attach_cb_t)(const struct device *mux,
|
|
int dlci_address,
|
|
bool connected, void *user_data);
|
|
|
|
/** @brief UART mux driver API structure. */
|
|
__subsystem struct uart_mux_driver_api {
|
|
/**
|
|
* The uart_driver_api must be placed in first position in this
|
|
* struct so that we are compatible with uart API. Note that currently
|
|
* not all of the UART API functions are implemented.
|
|
*/
|
|
struct uart_driver_api uart_api;
|
|
|
|
/**
|
|
* Attach the mux to this UART. The API will call the callback after
|
|
* the DLCI is created or not.
|
|
*/
|
|
int (*attach)(const struct device *mux, const struct device *uart,
|
|
int dlci_address, uart_mux_attach_cb_t cb,
|
|
void *user_data);
|
|
};
|
|
|
|
/**
|
|
* @brief Attach physical/real UART to UART muxing device.
|
|
*
|
|
* @param mux UART mux device structure.
|
|
* @param uart Real UART device structure.
|
|
* @param dlci_address DLCI id for the virtual muxing channel
|
|
* @param cb Callback is called when the DLCI is ready and connected
|
|
* @param user_data Caller supplied optional data
|
|
*
|
|
* @retval 0 No errors, the attachment was successful
|
|
* @retval <0 Error
|
|
*/
|
|
static inline int uart_mux_attach(const struct device *mux,
|
|
const struct device *uart,
|
|
int dlci_address, uart_mux_attach_cb_t cb,
|
|
void *user_data)
|
|
{
|
|
const struct uart_mux_driver_api *api =
|
|
(const struct uart_mux_driver_api *)mux->api;
|
|
|
|
return api->attach(mux, uart, dlci_address, cb, user_data);
|
|
}
|
|
|
|
/**
|
|
* @brief Get UART related to a specific DLCI channel
|
|
*
|
|
* @param dlci_address DLCI address, value >0 and <63
|
|
*
|
|
* @return UART device if found, NULL otherwise
|
|
*/
|
|
__syscall const struct device *uart_mux_find(int dlci_address);
|
|
|
|
/**
|
|
* @brief Allocate muxing UART device.
|
|
*
|
|
* @details This will return next available uart mux driver that will mux the
|
|
* data when read or written. This device corresponds to one DLCI channel.
|
|
* User must first call this to allocate the DLCI and then call the attach
|
|
* function to fully enable the muxing.
|
|
*
|
|
* @retval device New UART device that will automatically mux data sent to it.
|
|
* @retval NULL if error
|
|
*/
|
|
const struct device *uart_mux_alloc(void);
|
|
|
|
/**
|
|
* @typedef uart_mux_cb_t
|
|
* @brief Callback used while iterating over UART muxes
|
|
*
|
|
* @param uart Pointer to UART device where the mux is running
|
|
* @param dev Pointer to UART mux device
|
|
* @param dlci_address DLCI channel id this UART is muxed
|
|
* @param user_data A valid pointer to user data or NULL
|
|
*/
|
|
typedef void (*uart_mux_cb_t)(const struct device *uart,
|
|
const struct device *dev,
|
|
int dlci_address, void *user_data);
|
|
|
|
/**
|
|
* @brief Go through all the UART muxes and call callback
|
|
* for each of them
|
|
*
|
|
* @param cb User-supplied callback function to call
|
|
* @param user_data User specified data
|
|
*/
|
|
void uart_mux_foreach(uart_mux_cb_t cb, void *user_data);
|
|
|
|
/**
|
|
* @brief Disable the mux.
|
|
*
|
|
* @details Disable does not re-instate whatever ISRs and configs were present
|
|
* before the mux was enabled. This must be done by the user.
|
|
*
|
|
* @param dev UART mux device pointer
|
|
*/
|
|
void uart_mux_disable(const struct device *dev);
|
|
|
|
/**
|
|
* @brief Enable the mux.
|
|
*
|
|
* @details Enables the correct ISRs for the UART mux.
|
|
*
|
|
* @param dev UART mux device pointer
|
|
*/
|
|
void uart_mux_enable(const struct device *dev);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#include <syscalls/uart_mux.h>
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* ZEPHYR_INCLUDE_DRIVERS_UART_MUX_H_ */
|