blob: 8f0c34f1e86f8f9e57d14f4f0c852afd3461d4c9 [file] [log] [blame]
Gabor Ambrus54a10082023-08-14 21:56:06 +02001/*
2 * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef TS_PLATFORM_INTERFACE_UART_H
8#define TS_PLATFORM_INTERFACE_UART_H
9
10/*
11 * Interface definintion for a platform uart driver. A platform provider will
12 * provide concrete implementations of this interface for each alternative
13 * implementation supported.
14 */
15#include <stddef.h>
16
17#include "device_region.h"
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23/*
24 * A platform uart driver context.
25 */
26typedef struct {
27 /* Base address of the driver instance */
28 uintptr_t base_address;
29} platform_uart_context;
30
31/*
32 * Virtual interface for a platform uart driver. A platform will provide
33 * one or more concrete implementations of this interface.
34 */
35struct platform_uart_iface {
36 /**
37 * \brief Putc to submit a character to platform uart
38 * *
39 * * \param context Platform driver context
40 * \param ch Character to be written to UART
41 *
42 * \return 0 if successful.
43 */
44 int (*uart_putc)(platform_uart_context *context, uint8_t ch);
45 /**
46 * \brief Wait for empty input FIFO in platform uart
47 *
48 * * \param context Platform driver context
49 * *
50 * \return 0 if successful.
51 */
52 int (*uart_flush)(platform_uart_context *context);
53};
54
55/*
56 * A platform uart driver instance.
57 */
58struct platform_uart_driver {
59 void *context; /**< Opaque driver context */
60 const struct platform_uart_iface *iface; /**< Interface methods */
61};
62
63/**
64 * \brief Factory method to construct a platform specific uart driver
65 *
66 * \param driver Pointer to driver structure to initialize on construction.
67 * \param instance Deployment specific uart instance.
68 *
69 * \return 0 if successful.
70 */
71int platform_uart_create(struct platform_uart_driver *driver, int instance);
72
73/**
74 * \brief Destroy a driver constructed using the factory method
75 *
76 * \param driver Pointer to driver structure for constructed driver.
77 */
78void platform_uart_destroy(struct platform_uart_driver *driver);
79
80#ifdef __cplusplus
81}
82#endif
83
84#endif /* TS_PLATFORM_INTERFACE_UART_H */