summaryrefslogtreecommitdiff
path: root/components/drivers/serial/device/8250/8250.h
blob: 8416f1dc49376695c4c077921675a64bdecebf25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
 * Copyright (c) 2006-2022, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-11-16     GuEe-GUI     first version
 */

#ifndef __SERIAL_8250_H__
#define __SERIAL_8250_H__

#include <rthw.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <drivers/serial_dm.h>

#include <ioremap.h>

#include "regs.h"

enum
{
    PORT_UNKNOWN,
    PORT_IO,
    PORT_MMIO,
    PORT_MMIO16,
    PORT_MMIO32,
    PORT_MMIO32BE,
};

struct serial8250
{
    struct rt_serial_device parent;
    struct rt_clk *clk;

    int irq;
    void *base;
    rt_size_t size;
    rt_uint32_t freq;       /* frequency */
    rt_uint32_t regshift;   /* reg offset shift */
    rt_uint8_t iotype;      /* io access style */

    struct rt_spinlock spinlock;

    rt_err_t (*serial_ios)(struct serial8250 *, struct serial_configure *ios);
    rt_uint32_t (*serial_in)(struct serial8250 *, int offset);
    void (*serial_out)(struct serial8250 *, int offset, int value);
    rt_err_t (*serial_dma_enable)(struct serial8250 *, rt_bool_t enabled);
    rt_ssize_t (*serial_dma_tx)(struct serial8250 *, const rt_uint8_t *buf, rt_size_t size);
    rt_ssize_t (*serial_dma_rx)(struct serial8250 *, rt_uint8_t *buf, rt_size_t size);
    rt_err_t (*handle_irq)(struct serial8250 *, int irq);

    /* Free all resource (and parent) by child */
    void (*remove)(struct serial8250 *);
    void *data;
};

#define serial8250_alloc(obj) rt_calloc(1, sizeof(typeof(*obj)))
#define raw_to_serial8250(raw_serial) rt_container_of(raw_serial, struct serial8250, parent)

rt_err_t serial8250_config(struct serial8250 *serial, const char *options);
rt_err_t serial8250_setup(struct serial8250 *serial);
rt_err_t serial8250_remove(struct serial8250 *serial);

rt_uint32_t serial8250_in(struct serial8250 *serial, int offset);
void serial8250_out(struct serial8250 *serial, int offset, int value);
void serial8250_dma_tx_done(struct serial8250 *serial);
void serial8250_dma_rx_done(struct serial8250 *serial, int recv_len);
rt_err_t serial8250_ios(struct serial8250 *serial, struct serial_configure *cfg);

rt_err_t serial8250_uart_configure(struct rt_serial_device *raw_serial, struct serial_configure *cfg);
rt_err_t serial8250_uart_control(struct rt_serial_device *raw_serial, int cmd, void *arg);
int serial8250_uart_putc(struct rt_serial_device *raw_serial, char c);
int serial8250_uart_getc(struct rt_serial_device *raw_serial);
rt_ssize_t serial8250_uart_dma_transmit(struct rt_serial_device *raw_serial,
        rt_uint8_t *buf, rt_size_t size, int direction);

int serial8250_early_putc(struct rt_serial_device *raw_serial, char c);
rt_err_t serial8250_early_fdt_setup(struct serial8250 *serial, struct rt_fdt_earlycon *con, const char *options);

extern struct serial8250 early_serial8250;
extern const struct rt_uart_ops serial8250_uart_ops;

#endif /* __SERIAL_8250_H__ */