summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart/uart_if.m
blob: aab777172fb00e8286f176ed1766eb709c96fd0f (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#-
# Copyright (c) 2003 Marcel Moolenaar
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# $FreeBSD$

#include <sys/param.h>
#include <sys/systm.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <dev/uart/uart.h>
#include <dev/uart/uart_bus.h>

# The UART hardware interface. The core UART code is hardware independent.
# The details of the hardware are abstracted by the UART hardware interface.

INTERFACE uart;

# attach() - attach hardware.
# This method is called when the device is being attached. All resources
# have been allocated. The transmit and receive buffers exist, but no
# high-level (ie tty) initialization has been done yet.
# The intend of this method is to setup the hardware for normal operation.
METHOD int attach {
	struct uart_softc *this;
};

# detach() - detach hardware.
# This method is called when a device is being detached from its bus. It
# is the first action performed, so even the high-level (ie tty) interface
# is still operational.
# The intend of this method is to disable the hardware.
METHOD int detach {
	struct uart_softc *this;
};

# flush() - flush FIFOs.
# This method is called to flush the transmitter and/or the receiver as
# specified by the what argument. Characters are expected to be lost.
METHOD int flush {
	struct uart_softc *this;
	int	what;
};

# getsig() - get line and modem signals.
# This method retrieves the DTE and DCE signals and their corresponding
# delta bits. The delta bits include those corresponding to DTE signals
# when they were changed by a call to setsig. The delta bits maintained
# by the hardware driver are cleared as a side-effect. A second call to
# this function will not have any delta bits set, unless there was a
# change in the signals in the mean time.
METHOD int getsig {
	struct uart_softc *this;
};

# ioctl() - get or set miscellaneous parameters.
# This method is the bitbucket method. It can (and will) be used when there's
# something we need to set or get for which a new method is overkill. It's
# used for example to set HW or SW flow-control.
METHOD int ioctl {
	struct uart_softc *this;
	int request;
	intptr_t data;
};

# ipend() - query UART for pending interrupts.
# When an interrupt is signalled, the handler will call this method to find
# out which of the interrupt sources needs attention. The handler will use
# this information to dispatch service routines that deal with each of the
# interrupt sources. An advantage of this approach is that it allows multi-
# port drivers (like puc(4)) to query multiple devices concurrently and
# service them on an interrupt priority basis. If the hardware cannot provide
# the information reliably, it is free to service the interrupt and return 0,
# meaning that no attention is required.
METHOD int ipend {
	struct uart_softc *this;
}

# param() - set communication parameters.
# This method is called to change the communication parameters.
METHOD int param {
	struct uart_softc *this;
	int	baudrate;
	int	databits;
	int	stopbits;
	int	parity;
};

# probe() - detect hardware.
# This method is called as part of the bus probe to make sure the
# hardware exists. This function should also set the device description
# to something that represents the hardware.
METHOD int probe {
	struct uart_softc *this;
};

# receive() - move data from the receive FIFO to the receive buffer.
# This method is called to move received data to the receive buffer and
# additionally should make sure the receive interrupt should be cleared.
METHOD int receive {
	struct uart_softc *this;
};

# setsig() - set line and modem signals.
# This method allows changing DTE signals. The DTE delta bits indicate which
# signals are to be changed and the DTE bits themselves indicate whether to
# set or clear the signals. A subsequent call to getsig will return with the
# DTE delta bits set of those DTE signals that did change by this method.
METHOD int setsig {
	struct uart_softc *this;
	int	sig;
};

# transmit() - move data from the transmit buffer to the transmit FIFO.
# This method is responsible for writing the Tx buffer to the UART and
# additionally should make sure that a transmit interrupt is generated
# when transmission is complete.
METHOD int transmit {
	struct uart_softc *this;
};

# grab() - Up call from the console to the upper layers of the driver when
# the kernel asks to grab the console. This is valid only for console
# drivers. This method is responsible for transitioning the hardware
# from an interrupt driven state to a polled state that works with the
# low-level console interface defined for this device. The kernel
# currently only calls this when it wants to grab input from the
# console. Output can still happen asyncrhonously to these calls.
METHOD void grab {
	struct uart_softc *this;
};

# ungrab() - Undoes the effects of grab().
METHOD void ungrab {
	struct uart_softc *this;
};
OpenPOWER on IntegriCloud