xref: /qemu/rust/hw/char/pl011/src/registers.rs (revision 959fd759a2a55d90bf18f5b275cf6c7b11b27a79)
1*959fd759SPaolo Bonzini // Copyright 2024, Linaro Limited
2*959fd759SPaolo Bonzini // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
3*959fd759SPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later
4*959fd759SPaolo Bonzini 
5*959fd759SPaolo Bonzini //! Device registers exposed as typed structs which are backed by arbitrary
6*959fd759SPaolo Bonzini //! integer bitmaps. [`Data`], [`Control`], [`LineControl`], etc.
7*959fd759SPaolo Bonzini 
8*959fd759SPaolo Bonzini use bilge::prelude::*;
9*959fd759SPaolo Bonzini use qemu_api::impl_vmstate_bitsized;
10*959fd759SPaolo Bonzini 
11*959fd759SPaolo Bonzini /// Offset of each register from the base memory address of the device.
12*959fd759SPaolo Bonzini ///
13*959fd759SPaolo Bonzini /// # Source
14*959fd759SPaolo Bonzini /// ARM DDI 0183G, Table 3-1 p.3-3
15*959fd759SPaolo Bonzini #[doc(alias = "offset")]
16*959fd759SPaolo Bonzini #[allow(non_camel_case_types)]
17*959fd759SPaolo Bonzini #[repr(u64)]
18*959fd759SPaolo Bonzini #[derive(Debug, Eq, PartialEq, qemu_api_macros::TryInto)]
19*959fd759SPaolo Bonzini pub enum RegisterOffset {
20*959fd759SPaolo Bonzini     /// Data Register
21*959fd759SPaolo Bonzini     ///
22*959fd759SPaolo Bonzini     /// A write to this register initiates the actual data transmission
23*959fd759SPaolo Bonzini     #[doc(alias = "UARTDR")]
24*959fd759SPaolo Bonzini     DR = 0x000,
25*959fd759SPaolo Bonzini     /// Receive Status Register or Error Clear Register
26*959fd759SPaolo Bonzini     #[doc(alias = "UARTRSR")]
27*959fd759SPaolo Bonzini     #[doc(alias = "UARTECR")]
28*959fd759SPaolo Bonzini     RSR = 0x004,
29*959fd759SPaolo Bonzini     /// Flag Register
30*959fd759SPaolo Bonzini     ///
31*959fd759SPaolo Bonzini     /// A read of this register shows if transmission is complete
32*959fd759SPaolo Bonzini     #[doc(alias = "UARTFR")]
33*959fd759SPaolo Bonzini     FR = 0x018,
34*959fd759SPaolo Bonzini     /// Fractional Baud Rate Register
35*959fd759SPaolo Bonzini     ///
36*959fd759SPaolo Bonzini     /// responsible for baud rate speed
37*959fd759SPaolo Bonzini     #[doc(alias = "UARTFBRD")]
38*959fd759SPaolo Bonzini     FBRD = 0x028,
39*959fd759SPaolo Bonzini     /// `IrDA` Low-Power Counter Register
40*959fd759SPaolo Bonzini     #[doc(alias = "UARTILPR")]
41*959fd759SPaolo Bonzini     ILPR = 0x020,
42*959fd759SPaolo Bonzini     /// Integer Baud Rate Register
43*959fd759SPaolo Bonzini     ///
44*959fd759SPaolo Bonzini     /// Responsible for baud rate speed
45*959fd759SPaolo Bonzini     #[doc(alias = "UARTIBRD")]
46*959fd759SPaolo Bonzini     IBRD = 0x024,
47*959fd759SPaolo Bonzini     /// line control register (data frame format)
48*959fd759SPaolo Bonzini     #[doc(alias = "UARTLCR_H")]
49*959fd759SPaolo Bonzini     LCR_H = 0x02C,
50*959fd759SPaolo Bonzini     /// Toggle UART, transmission or reception
51*959fd759SPaolo Bonzini     #[doc(alias = "UARTCR")]
52*959fd759SPaolo Bonzini     CR = 0x030,
53*959fd759SPaolo Bonzini     /// Interrupt FIFO Level Select Register
54*959fd759SPaolo Bonzini     #[doc(alias = "UARTIFLS")]
55*959fd759SPaolo Bonzini     FLS = 0x034,
56*959fd759SPaolo Bonzini     /// Interrupt Mask Set/Clear Register
57*959fd759SPaolo Bonzini     #[doc(alias = "UARTIMSC")]
58*959fd759SPaolo Bonzini     IMSC = 0x038,
59*959fd759SPaolo Bonzini     /// Raw Interrupt Status Register
60*959fd759SPaolo Bonzini     #[doc(alias = "UARTRIS")]
61*959fd759SPaolo Bonzini     RIS = 0x03C,
62*959fd759SPaolo Bonzini     /// Masked Interrupt Status Register
63*959fd759SPaolo Bonzini     #[doc(alias = "UARTMIS")]
64*959fd759SPaolo Bonzini     MIS = 0x040,
65*959fd759SPaolo Bonzini     /// Interrupt Clear Register
66*959fd759SPaolo Bonzini     #[doc(alias = "UARTICR")]
67*959fd759SPaolo Bonzini     ICR = 0x044,
68*959fd759SPaolo Bonzini     /// DMA control Register
69*959fd759SPaolo Bonzini     #[doc(alias = "UARTDMACR")]
70*959fd759SPaolo Bonzini     DMACR = 0x048,
71*959fd759SPaolo Bonzini     ///// Reserved, offsets `0x04C` to `0x07C`.
72*959fd759SPaolo Bonzini     //Reserved = 0x04C,
73*959fd759SPaolo Bonzini }
74*959fd759SPaolo Bonzini 
75*959fd759SPaolo Bonzini /// Receive Status Register / Data Register common error bits
76*959fd759SPaolo Bonzini ///
77*959fd759SPaolo Bonzini /// The `UARTRSR` register is updated only when a read occurs
78*959fd759SPaolo Bonzini /// from the `UARTDR` register with the same status information
79*959fd759SPaolo Bonzini /// that can also be obtained by reading the `UARTDR` register
80*959fd759SPaolo Bonzini #[bitsize(8)]
81*959fd759SPaolo Bonzini #[derive(Clone, Copy, Default, DebugBits, FromBits)]
82*959fd759SPaolo Bonzini pub struct Errors {
83*959fd759SPaolo Bonzini     pub framing_error: bool,
84*959fd759SPaolo Bonzini     pub parity_error: bool,
85*959fd759SPaolo Bonzini     pub break_error: bool,
86*959fd759SPaolo Bonzini     pub overrun_error: bool,
87*959fd759SPaolo Bonzini     _reserved_unpredictable: u4,
88*959fd759SPaolo Bonzini }
89*959fd759SPaolo Bonzini 
90*959fd759SPaolo Bonzini // TODO: FIFO Mode has different semantics
91*959fd759SPaolo Bonzini /// Data Register, `UARTDR`
92*959fd759SPaolo Bonzini ///
93*959fd759SPaolo Bonzini /// The `UARTDR` register is the data register.
94*959fd759SPaolo Bonzini ///
95*959fd759SPaolo Bonzini /// For words to be transmitted:
96*959fd759SPaolo Bonzini ///
97*959fd759SPaolo Bonzini /// - if the FIFOs are enabled, data written to this location is pushed onto the
98*959fd759SPaolo Bonzini ///   transmit
99*959fd759SPaolo Bonzini /// FIFO
100*959fd759SPaolo Bonzini /// - if the FIFOs are not enabled, data is stored in the transmitter holding
101*959fd759SPaolo Bonzini ///   register (the
102*959fd759SPaolo Bonzini /// bottom word of the transmit FIFO).
103*959fd759SPaolo Bonzini ///
104*959fd759SPaolo Bonzini /// The write operation initiates transmission from the UART. The data is
105*959fd759SPaolo Bonzini /// prefixed with a start bit, appended with the appropriate parity bit
106*959fd759SPaolo Bonzini /// (if parity is enabled), and a stop bit. The resultant word is then
107*959fd759SPaolo Bonzini /// transmitted.
108*959fd759SPaolo Bonzini ///
109*959fd759SPaolo Bonzini /// For received words:
110*959fd759SPaolo Bonzini ///
111*959fd759SPaolo Bonzini /// - if the FIFOs are enabled, the data byte and the 4-bit status (break,
112*959fd759SPaolo Bonzini ///   frame, parity,
113*959fd759SPaolo Bonzini /// and overrun) is pushed onto the 12-bit wide receive FIFO
114*959fd759SPaolo Bonzini /// - if the FIFOs are not enabled, the data byte and status are stored in the
115*959fd759SPaolo Bonzini ///   receiving
116*959fd759SPaolo Bonzini /// holding register (the bottom word of the receive FIFO).
117*959fd759SPaolo Bonzini ///
118*959fd759SPaolo Bonzini /// The received data byte is read by performing reads from the `UARTDR`
119*959fd759SPaolo Bonzini /// register along with the corresponding status information. The status
120*959fd759SPaolo Bonzini /// information can also be read by a read of the `UARTRSR/UARTECR`
121*959fd759SPaolo Bonzini /// register.
122*959fd759SPaolo Bonzini ///
123*959fd759SPaolo Bonzini /// # Note
124*959fd759SPaolo Bonzini ///
125*959fd759SPaolo Bonzini /// You must disable the UART before any of the control registers are
126*959fd759SPaolo Bonzini /// reprogrammed. When the UART is disabled in the middle of
127*959fd759SPaolo Bonzini /// transmission or reception, it completes the current character before
128*959fd759SPaolo Bonzini /// stopping.
129*959fd759SPaolo Bonzini ///
130*959fd759SPaolo Bonzini /// # Source
131*959fd759SPaolo Bonzini /// ARM DDI 0183G 3.3.1 Data Register, UARTDR
132*959fd759SPaolo Bonzini #[bitsize(32)]
133*959fd759SPaolo Bonzini #[derive(Clone, Copy, Default, DebugBits, FromBits)]
134*959fd759SPaolo Bonzini #[doc(alias = "UARTDR")]
135*959fd759SPaolo Bonzini pub struct Data {
136*959fd759SPaolo Bonzini     pub data: u8,
137*959fd759SPaolo Bonzini     pub errors: Errors,
138*959fd759SPaolo Bonzini     _reserved: u16,
139*959fd759SPaolo Bonzini }
140*959fd759SPaolo Bonzini impl_vmstate_bitsized!(Data);
141*959fd759SPaolo Bonzini 
142*959fd759SPaolo Bonzini impl Data {
143*959fd759SPaolo Bonzini     // bilge is not very const-friendly, unfortunately
144*959fd759SPaolo Bonzini     pub const BREAK: Self = Self { value: 1 << 10 };
145*959fd759SPaolo Bonzini }
146*959fd759SPaolo Bonzini 
147*959fd759SPaolo Bonzini // TODO: FIFO Mode has different semantics
148*959fd759SPaolo Bonzini /// Receive Status Register / Error Clear Register, `UARTRSR/UARTECR`
149*959fd759SPaolo Bonzini ///
150*959fd759SPaolo Bonzini /// The UARTRSR/UARTECR register is the receive status register/error clear
151*959fd759SPaolo Bonzini /// register. Receive status can also be read from the `UARTRSR`
152*959fd759SPaolo Bonzini /// register. If the status is read from this register, then the status
153*959fd759SPaolo Bonzini /// information for break, framing and parity corresponds to the
154*959fd759SPaolo Bonzini /// data character read from the [Data register](Data), `UARTDR` prior to
155*959fd759SPaolo Bonzini /// reading the UARTRSR register. The status information for overrun is
156*959fd759SPaolo Bonzini /// set immediately when an overrun condition occurs.
157*959fd759SPaolo Bonzini ///
158*959fd759SPaolo Bonzini ///
159*959fd759SPaolo Bonzini /// # Note
160*959fd759SPaolo Bonzini /// The received data character must be read first from the [Data
161*959fd759SPaolo Bonzini /// Register](Data), `UARTDR` before reading the error status associated
162*959fd759SPaolo Bonzini /// with that data character from the `UARTRSR` register. This read
163*959fd759SPaolo Bonzini /// sequence cannot be reversed, because the `UARTRSR` register is
164*959fd759SPaolo Bonzini /// updated only when a read occurs from the `UARTDR` register. However,
165*959fd759SPaolo Bonzini /// the status information can also be obtained by reading the `UARTDR`
166*959fd759SPaolo Bonzini /// register
167*959fd759SPaolo Bonzini ///
168*959fd759SPaolo Bonzini /// # Source
169*959fd759SPaolo Bonzini /// ARM DDI 0183G 3.3.2 Receive Status Register/Error Clear Register,
170*959fd759SPaolo Bonzini /// UARTRSR/UARTECR
171*959fd759SPaolo Bonzini #[bitsize(32)]
172*959fd759SPaolo Bonzini #[derive(Clone, Copy, DebugBits, FromBits)]
173*959fd759SPaolo Bonzini pub struct ReceiveStatusErrorClear {
174*959fd759SPaolo Bonzini     pub errors: Errors,
175*959fd759SPaolo Bonzini     _reserved_unpredictable: u24,
176*959fd759SPaolo Bonzini }
177*959fd759SPaolo Bonzini impl_vmstate_bitsized!(ReceiveStatusErrorClear);
178*959fd759SPaolo Bonzini 
179*959fd759SPaolo Bonzini impl ReceiveStatusErrorClear {
180*959fd759SPaolo Bonzini     pub fn set_from_data(&mut self, data: Data) {
181*959fd759SPaolo Bonzini         self.set_errors(data.errors());
182*959fd759SPaolo Bonzini     }
183*959fd759SPaolo Bonzini 
184*959fd759SPaolo Bonzini     pub fn reset(&mut self) {
185*959fd759SPaolo Bonzini         // All the bits are cleared to 0 on reset.
186*959fd759SPaolo Bonzini         *self = Self::default();
187*959fd759SPaolo Bonzini     }
188*959fd759SPaolo Bonzini }
189*959fd759SPaolo Bonzini 
190*959fd759SPaolo Bonzini impl Default for ReceiveStatusErrorClear {
191*959fd759SPaolo Bonzini     fn default() -> Self {
192*959fd759SPaolo Bonzini         0.into()
193*959fd759SPaolo Bonzini     }
194*959fd759SPaolo Bonzini }
195*959fd759SPaolo Bonzini 
196*959fd759SPaolo Bonzini #[bitsize(32)]
197*959fd759SPaolo Bonzini #[derive(Clone, Copy, DebugBits, FromBits)]
198*959fd759SPaolo Bonzini /// Flag Register, `UARTFR`
199*959fd759SPaolo Bonzini #[doc(alias = "UARTFR")]
200*959fd759SPaolo Bonzini pub struct Flags {
201*959fd759SPaolo Bonzini     /// CTS Clear to send. This bit is the complement of the UART clear to
202*959fd759SPaolo Bonzini     /// send, `nUARTCTS`, modem status input. That is, the bit is 1
203*959fd759SPaolo Bonzini     /// when `nUARTCTS` is LOW.
204*959fd759SPaolo Bonzini     pub clear_to_send: bool,
205*959fd759SPaolo Bonzini     /// DSR Data set ready. This bit is the complement of the UART data set
206*959fd759SPaolo Bonzini     /// ready, `nUARTDSR`, modem status input. That is, the bit is 1 when
207*959fd759SPaolo Bonzini     /// `nUARTDSR` is LOW.
208*959fd759SPaolo Bonzini     pub data_set_ready: bool,
209*959fd759SPaolo Bonzini     /// DCD Data carrier detect. This bit is the complement of the UART data
210*959fd759SPaolo Bonzini     /// carrier detect, `nUARTDCD`, modem status input. That is, the bit is
211*959fd759SPaolo Bonzini     /// 1 when `nUARTDCD` is LOW.
212*959fd759SPaolo Bonzini     pub data_carrier_detect: bool,
213*959fd759SPaolo Bonzini     /// BUSY UART busy. If this bit is set to 1, the UART is busy
214*959fd759SPaolo Bonzini     /// transmitting data. This bit remains set until the complete
215*959fd759SPaolo Bonzini     /// byte, including all the stop bits, has been sent from the
216*959fd759SPaolo Bonzini     /// shift register. This bit is set as soon as the transmit FIFO
217*959fd759SPaolo Bonzini     /// becomes non-empty, regardless of whether the UART is enabled
218*959fd759SPaolo Bonzini     /// or not.
219*959fd759SPaolo Bonzini     pub busy: bool,
220*959fd759SPaolo Bonzini     /// RXFE Receive FIFO empty. The meaning of this bit depends on the
221*959fd759SPaolo Bonzini     /// state of the FEN bit in the UARTLCR_H register. If the FIFO
222*959fd759SPaolo Bonzini     /// is disabled, this bit is set when the receive holding
223*959fd759SPaolo Bonzini     /// register is empty. If the FIFO is enabled, the RXFE bit is
224*959fd759SPaolo Bonzini     /// set when the receive FIFO is empty.
225*959fd759SPaolo Bonzini     pub receive_fifo_empty: bool,
226*959fd759SPaolo Bonzini     /// TXFF Transmit FIFO full. The meaning of this bit depends on the
227*959fd759SPaolo Bonzini     /// state of the FEN bit in the UARTLCR_H register. If the FIFO
228*959fd759SPaolo Bonzini     /// is disabled, this bit is set when the transmit holding
229*959fd759SPaolo Bonzini     /// register is full. If the FIFO is enabled, the TXFF bit is
230*959fd759SPaolo Bonzini     /// set when the transmit FIFO is full.
231*959fd759SPaolo Bonzini     pub transmit_fifo_full: bool,
232*959fd759SPaolo Bonzini     /// RXFF Receive FIFO full. The meaning of this bit depends on the state
233*959fd759SPaolo Bonzini     /// of the FEN bit in the UARTLCR_H register. If the FIFO is
234*959fd759SPaolo Bonzini     /// disabled, this bit is set when the receive holding register
235*959fd759SPaolo Bonzini     /// is full. If the FIFO is enabled, the RXFF bit is set when
236*959fd759SPaolo Bonzini     /// the receive FIFO is full.
237*959fd759SPaolo Bonzini     pub receive_fifo_full: bool,
238*959fd759SPaolo Bonzini     /// Transmit FIFO empty. The meaning of this bit depends on the state of
239*959fd759SPaolo Bonzini     /// the FEN bit in the [Line Control register](LineControl),
240*959fd759SPaolo Bonzini     /// `UARTLCR_H`. If the FIFO is disabled, this bit is set when the
241*959fd759SPaolo Bonzini     /// transmit holding register is empty. If the FIFO is enabled,
242*959fd759SPaolo Bonzini     /// the TXFE bit is set when the transmit FIFO is empty. This
243*959fd759SPaolo Bonzini     /// bit does not indicate if there is data in the transmit shift
244*959fd759SPaolo Bonzini     /// register.
245*959fd759SPaolo Bonzini     pub transmit_fifo_empty: bool,
246*959fd759SPaolo Bonzini     /// `RI`, is `true` when `nUARTRI` is `LOW`.
247*959fd759SPaolo Bonzini     pub ring_indicator: bool,
248*959fd759SPaolo Bonzini     _reserved_zero_no_modify: u23,
249*959fd759SPaolo Bonzini }
250*959fd759SPaolo Bonzini impl_vmstate_bitsized!(Flags);
251*959fd759SPaolo Bonzini 
252*959fd759SPaolo Bonzini impl Flags {
253*959fd759SPaolo Bonzini     pub fn reset(&mut self) {
254*959fd759SPaolo Bonzini         *self = Self::default();
255*959fd759SPaolo Bonzini     }
256*959fd759SPaolo Bonzini }
257*959fd759SPaolo Bonzini 
258*959fd759SPaolo Bonzini impl Default for Flags {
259*959fd759SPaolo Bonzini     fn default() -> Self {
260*959fd759SPaolo Bonzini         let mut ret: Self = 0.into();
261*959fd759SPaolo Bonzini         // After reset TXFF, RXFF, and BUSY are 0, and TXFE and RXFE are 1
262*959fd759SPaolo Bonzini         ret.set_receive_fifo_empty(true);
263*959fd759SPaolo Bonzini         ret.set_transmit_fifo_empty(true);
264*959fd759SPaolo Bonzini         ret
265*959fd759SPaolo Bonzini     }
266*959fd759SPaolo Bonzini }
267*959fd759SPaolo Bonzini 
268*959fd759SPaolo Bonzini #[bitsize(32)]
269*959fd759SPaolo Bonzini #[derive(Clone, Copy, DebugBits, FromBits)]
270*959fd759SPaolo Bonzini /// Line Control Register, `UARTLCR_H`
271*959fd759SPaolo Bonzini #[doc(alias = "UARTLCR_H")]
272*959fd759SPaolo Bonzini pub struct LineControl {
273*959fd759SPaolo Bonzini     /// BRK Send break.
274*959fd759SPaolo Bonzini     ///
275*959fd759SPaolo Bonzini     /// If this bit is set to `1`, a low-level is continually output on the
276*959fd759SPaolo Bonzini     /// `UARTTXD` output, after completing transmission of the
277*959fd759SPaolo Bonzini     /// current character. For the proper execution of the break command,
278*959fd759SPaolo Bonzini     /// the software must set this bit for at least two complete
279*959fd759SPaolo Bonzini     /// frames. For normal use, this bit must be cleared to `0`.
280*959fd759SPaolo Bonzini     pub send_break: bool,
281*959fd759SPaolo Bonzini     /// 1 PEN Parity enable:
282*959fd759SPaolo Bonzini     ///
283*959fd759SPaolo Bonzini     /// - 0 = parity is disabled and no parity bit added to the data frame
284*959fd759SPaolo Bonzini     /// - 1 = parity checking and generation is enabled.
285*959fd759SPaolo Bonzini     ///
286*959fd759SPaolo Bonzini     /// See Table 3-11 on page 3-14 for the parity truth table.
287*959fd759SPaolo Bonzini     pub parity_enabled: bool,
288*959fd759SPaolo Bonzini     /// EPS Even parity select. Controls the type of parity the UART uses
289*959fd759SPaolo Bonzini     /// during transmission and reception:
290*959fd759SPaolo Bonzini     /// - 0 = odd parity. The UART generates or checks for an odd number of 1s
291*959fd759SPaolo Bonzini     ///   in the data and parity bits.
292*959fd759SPaolo Bonzini     /// - 1 = even parity. The UART generates or checks for an even number of 1s
293*959fd759SPaolo Bonzini     ///   in the data and parity bits.
294*959fd759SPaolo Bonzini     /// This bit has no effect when the `PEN` bit disables parity checking
295*959fd759SPaolo Bonzini     /// and generation. See Table 3-11 on page 3-14 for the parity
296*959fd759SPaolo Bonzini     /// truth table.
297*959fd759SPaolo Bonzini     pub parity: Parity,
298*959fd759SPaolo Bonzini     /// 3 STP2 Two stop bits select. If this bit is set to 1, two stop bits
299*959fd759SPaolo Bonzini     /// are transmitted at the end of the frame. The receive
300*959fd759SPaolo Bonzini     /// logic does not check for two stop bits being received.
301*959fd759SPaolo Bonzini     pub two_stops_bits: bool,
302*959fd759SPaolo Bonzini     /// FEN Enable FIFOs:
303*959fd759SPaolo Bonzini     /// 0 = FIFOs are disabled (character mode) that is, the FIFOs become
304*959fd759SPaolo Bonzini     /// 1-byte-deep holding registers 1 = transmit and receive FIFO
305*959fd759SPaolo Bonzini     /// buffers are enabled (FIFO mode).
306*959fd759SPaolo Bonzini     pub fifos_enabled: Mode,
307*959fd759SPaolo Bonzini     /// WLEN Word length. These bits indicate the number of data bits
308*959fd759SPaolo Bonzini     /// transmitted or received in a frame as follows: b11 = 8 bits
309*959fd759SPaolo Bonzini     /// b10 = 7 bits
310*959fd759SPaolo Bonzini     /// b01 = 6 bits
311*959fd759SPaolo Bonzini     /// b00 = 5 bits.
312*959fd759SPaolo Bonzini     pub word_length: WordLength,
313*959fd759SPaolo Bonzini     /// 7 SPS Stick parity select.
314*959fd759SPaolo Bonzini     /// 0 = stick parity is disabled
315*959fd759SPaolo Bonzini     /// 1 = either:
316*959fd759SPaolo Bonzini     /// • if the EPS bit is 0 then the parity bit is transmitted and checked
317*959fd759SPaolo Bonzini     /// as a 1 • if the EPS bit is 1 then the parity bit is
318*959fd759SPaolo Bonzini     /// transmitted and checked as a 0. This bit has no effect when
319*959fd759SPaolo Bonzini     /// the PEN bit disables parity checking and generation. See Table 3-11
320*959fd759SPaolo Bonzini     /// on page 3-14 for the parity truth table.
321*959fd759SPaolo Bonzini     pub sticky_parity: bool,
322*959fd759SPaolo Bonzini     /// 31:8 - Reserved, do not modify, read as zero.
323*959fd759SPaolo Bonzini     _reserved_zero_no_modify: u24,
324*959fd759SPaolo Bonzini }
325*959fd759SPaolo Bonzini impl_vmstate_bitsized!(LineControl);
326*959fd759SPaolo Bonzini 
327*959fd759SPaolo Bonzini impl LineControl {
328*959fd759SPaolo Bonzini     pub fn reset(&mut self) {
329*959fd759SPaolo Bonzini         // All the bits are cleared to 0 when reset.
330*959fd759SPaolo Bonzini         *self = 0.into();
331*959fd759SPaolo Bonzini     }
332*959fd759SPaolo Bonzini }
333*959fd759SPaolo Bonzini 
334*959fd759SPaolo Bonzini impl Default for LineControl {
335*959fd759SPaolo Bonzini     fn default() -> Self {
336*959fd759SPaolo Bonzini         0.into()
337*959fd759SPaolo Bonzini     }
338*959fd759SPaolo Bonzini }
339*959fd759SPaolo Bonzini 
340*959fd759SPaolo Bonzini #[bitsize(1)]
341*959fd759SPaolo Bonzini #[derive(Clone, Copy, Debug, Eq, FromBits, PartialEq)]
342*959fd759SPaolo Bonzini /// `EPS` "Even parity select", field of [Line Control
343*959fd759SPaolo Bonzini /// register](LineControl).
344*959fd759SPaolo Bonzini pub enum Parity {
345*959fd759SPaolo Bonzini     /// - 0 = odd parity. The UART generates or checks for an odd number of 1s
346*959fd759SPaolo Bonzini     ///   in the data and parity bits.
347*959fd759SPaolo Bonzini     Odd = 0,
348*959fd759SPaolo Bonzini     /// - 1 = even parity. The UART generates or checks for an even number of 1s
349*959fd759SPaolo Bonzini     ///   in the data and parity bits.
350*959fd759SPaolo Bonzini     Even = 1,
351*959fd759SPaolo Bonzini }
352*959fd759SPaolo Bonzini 
353*959fd759SPaolo Bonzini #[bitsize(1)]
354*959fd759SPaolo Bonzini #[derive(Clone, Copy, Debug, Eq, FromBits, PartialEq)]
355*959fd759SPaolo Bonzini /// `FEN` "Enable FIFOs" or Device mode, field of [Line Control
356*959fd759SPaolo Bonzini /// register](LineControl).
357*959fd759SPaolo Bonzini pub enum Mode {
358*959fd759SPaolo Bonzini     /// 0 = FIFOs are disabled (character mode) that is, the FIFOs become
359*959fd759SPaolo Bonzini     /// 1-byte-deep holding registers
360*959fd759SPaolo Bonzini     Character = 0,
361*959fd759SPaolo Bonzini     /// 1 = transmit and receive FIFO buffers are enabled (FIFO mode).
362*959fd759SPaolo Bonzini     FIFO = 1,
363*959fd759SPaolo Bonzini }
364*959fd759SPaolo Bonzini 
365*959fd759SPaolo Bonzini #[bitsize(2)]
366*959fd759SPaolo Bonzini #[derive(Clone, Copy, Debug, Eq, FromBits, PartialEq)]
367*959fd759SPaolo Bonzini /// `WLEN` Word length, field of [Line Control register](LineControl).
368*959fd759SPaolo Bonzini ///
369*959fd759SPaolo Bonzini /// These bits indicate the number of data bits transmitted or received in a
370*959fd759SPaolo Bonzini /// frame as follows:
371*959fd759SPaolo Bonzini pub enum WordLength {
372*959fd759SPaolo Bonzini     /// b11 = 8 bits
373*959fd759SPaolo Bonzini     _8Bits = 0b11,
374*959fd759SPaolo Bonzini     /// b10 = 7 bits
375*959fd759SPaolo Bonzini     _7Bits = 0b10,
376*959fd759SPaolo Bonzini     /// b01 = 6 bits
377*959fd759SPaolo Bonzini     _6Bits = 0b01,
378*959fd759SPaolo Bonzini     /// b00 = 5 bits.
379*959fd759SPaolo Bonzini     _5Bits = 0b00,
380*959fd759SPaolo Bonzini }
381*959fd759SPaolo Bonzini 
382*959fd759SPaolo Bonzini /// Control Register, `UARTCR`
383*959fd759SPaolo Bonzini ///
384*959fd759SPaolo Bonzini /// The `UARTCR` register is the control register. All the bits are cleared
385*959fd759SPaolo Bonzini /// to `0` on reset except for bits `9` and `8` that are set to `1`.
386*959fd759SPaolo Bonzini ///
387*959fd759SPaolo Bonzini /// # Source
388*959fd759SPaolo Bonzini /// ARM DDI 0183G, 3.3.8 Control Register, `UARTCR`, Table 3-12
389*959fd759SPaolo Bonzini #[bitsize(32)]
390*959fd759SPaolo Bonzini #[doc(alias = "UARTCR")]
391*959fd759SPaolo Bonzini #[derive(Clone, Copy, DebugBits, FromBits)]
392*959fd759SPaolo Bonzini pub struct Control {
393*959fd759SPaolo Bonzini     /// `UARTEN` UART enable: 0 = UART is disabled. If the UART is disabled
394*959fd759SPaolo Bonzini     /// in the middle of transmission or reception, it completes the current
395*959fd759SPaolo Bonzini     /// character before stopping. 1 = the UART is enabled. Data
396*959fd759SPaolo Bonzini     /// transmission and reception occurs for either UART signals or SIR
397*959fd759SPaolo Bonzini     /// signals depending on the setting of the SIREN bit.
398*959fd759SPaolo Bonzini     pub enable_uart: bool,
399*959fd759SPaolo Bonzini     /// `SIREN` `SIR` enable: 0 = IrDA SIR ENDEC is disabled. `nSIROUT`
400*959fd759SPaolo Bonzini     /// remains LOW (no light pulse generated), and signal transitions on
401*959fd759SPaolo Bonzini     /// SIRIN have no effect. 1 = IrDA SIR ENDEC is enabled. Data is
402*959fd759SPaolo Bonzini     /// transmitted and received on nSIROUT and SIRIN. UARTTXD remains HIGH,
403*959fd759SPaolo Bonzini     /// in the marking state. Signal transitions on UARTRXD or modem status
404*959fd759SPaolo Bonzini     /// inputs have no effect. This bit has no effect if the UARTEN bit
405*959fd759SPaolo Bonzini     /// disables the UART.
406*959fd759SPaolo Bonzini     pub enable_sir: bool,
407*959fd759SPaolo Bonzini     /// `SIRLP` SIR low-power IrDA mode. This bit selects the IrDA encoding
408*959fd759SPaolo Bonzini     /// mode. If this bit is cleared to 0, low-level bits are transmitted as
409*959fd759SPaolo Bonzini     /// an active high pulse with a width of 3/ 16th of the bit period. If
410*959fd759SPaolo Bonzini     /// this bit is set to 1, low-level bits are transmitted with a pulse
411*959fd759SPaolo Bonzini     /// width that is 3 times the period of the IrLPBaud16 input signal,
412*959fd759SPaolo Bonzini     /// regardless of the selected bit rate. Setting this bit uses less
413*959fd759SPaolo Bonzini     /// power, but might reduce transmission distances.
414*959fd759SPaolo Bonzini     pub sir_lowpower_irda_mode: u1,
415*959fd759SPaolo Bonzini     /// Reserved, do not modify, read as zero.
416*959fd759SPaolo Bonzini     _reserved_zero_no_modify: u4,
417*959fd759SPaolo Bonzini     /// `LBE` Loopback enable. If this bit is set to 1 and the SIREN bit is
418*959fd759SPaolo Bonzini     /// set to 1 and the SIRTEST bit in the Test Control register, UARTTCR
419*959fd759SPaolo Bonzini     /// on page 4-5 is set to 1, then the nSIROUT path is inverted, and fed
420*959fd759SPaolo Bonzini     /// through to the SIRIN path. The SIRTEST bit in the test register must
421*959fd759SPaolo Bonzini     /// be set to 1 to override the normal half-duplex SIR operation. This
422*959fd759SPaolo Bonzini     /// must be the requirement for accessing the test registers during
423*959fd759SPaolo Bonzini     /// normal operation, and SIRTEST must be cleared to 0 when loopback
424*959fd759SPaolo Bonzini     /// testing is finished. This feature reduces the amount of external
425*959fd759SPaolo Bonzini     /// coupling required during system test. If this bit is set to 1, and
426*959fd759SPaolo Bonzini     /// the SIRTEST bit is set to 0, the UARTTXD path is fed through to the
427*959fd759SPaolo Bonzini     /// UARTRXD path. In either SIR mode or UART mode, when this bit is set,
428*959fd759SPaolo Bonzini     /// the modem outputs are also fed through to the modem inputs. This bit
429*959fd759SPaolo Bonzini     /// is cleared to 0 on reset, to disable loopback.
430*959fd759SPaolo Bonzini     pub enable_loopback: bool,
431*959fd759SPaolo Bonzini     /// `TXE` Transmit enable. If this bit is set to 1, the transmit section
432*959fd759SPaolo Bonzini     /// of the UART is enabled. Data transmission occurs for either UART
433*959fd759SPaolo Bonzini     /// signals, or SIR signals depending on the setting of the SIREN bit.
434*959fd759SPaolo Bonzini     /// When the UART is disabled in the middle of transmission, it
435*959fd759SPaolo Bonzini     /// completes the current character before stopping.
436*959fd759SPaolo Bonzini     pub enable_transmit: bool,
437*959fd759SPaolo Bonzini     /// `RXE` Receive enable. If this bit is set to 1, the receive section
438*959fd759SPaolo Bonzini     /// of the UART is enabled. Data reception occurs for either UART
439*959fd759SPaolo Bonzini     /// signals or SIR signals depending on the setting of the SIREN bit.
440*959fd759SPaolo Bonzini     /// When the UART is disabled in the middle of reception, it completes
441*959fd759SPaolo Bonzini     /// the current character before stopping.
442*959fd759SPaolo Bonzini     pub enable_receive: bool,
443*959fd759SPaolo Bonzini     /// `DTR` Data transmit ready. This bit is the complement of the UART
444*959fd759SPaolo Bonzini     /// data transmit ready, `nUARTDTR`, modem status output. That is, when
445*959fd759SPaolo Bonzini     /// the bit is programmed to a 1 then `nUARTDTR` is LOW.
446*959fd759SPaolo Bonzini     pub data_transmit_ready: bool,
447*959fd759SPaolo Bonzini     /// `RTS` Request to send. This bit is the complement of the UART
448*959fd759SPaolo Bonzini     /// request to send, `nUARTRTS`, modem status output. That is, when the
449*959fd759SPaolo Bonzini     /// bit is programmed to a 1 then `nUARTRTS` is LOW.
450*959fd759SPaolo Bonzini     pub request_to_send: bool,
451*959fd759SPaolo Bonzini     /// `Out1` This bit is the complement of the UART Out1 (`nUARTOut1`)
452*959fd759SPaolo Bonzini     /// modem status output. That is, when the bit is programmed to a 1 the
453*959fd759SPaolo Bonzini     /// output is 0. For DTE this can be used as Data Carrier Detect (DCD).
454*959fd759SPaolo Bonzini     pub out_1: bool,
455*959fd759SPaolo Bonzini     /// `Out2` This bit is the complement of the UART Out2 (`nUARTOut2`)
456*959fd759SPaolo Bonzini     /// modem status output. That is, when the bit is programmed to a 1, the
457*959fd759SPaolo Bonzini     /// output is 0. For DTE this can be used as Ring Indicator (RI).
458*959fd759SPaolo Bonzini     pub out_2: bool,
459*959fd759SPaolo Bonzini     /// `RTSEn` RTS hardware flow control enable. If this bit is set to 1,
460*959fd759SPaolo Bonzini     /// RTS hardware flow control is enabled. Data is only requested when
461*959fd759SPaolo Bonzini     /// there is space in the receive FIFO for it to be received.
462*959fd759SPaolo Bonzini     pub rts_hardware_flow_control_enable: bool,
463*959fd759SPaolo Bonzini     /// `CTSEn` CTS hardware flow control enable. If this bit is set to 1,
464*959fd759SPaolo Bonzini     /// CTS hardware flow control is enabled. Data is only transmitted when
465*959fd759SPaolo Bonzini     /// the `nUARTCTS` signal is asserted.
466*959fd759SPaolo Bonzini     pub cts_hardware_flow_control_enable: bool,
467*959fd759SPaolo Bonzini     /// 31:16 - Reserved, do not modify, read as zero.
468*959fd759SPaolo Bonzini     _reserved_zero_no_modify2: u16,
469*959fd759SPaolo Bonzini }
470*959fd759SPaolo Bonzini impl_vmstate_bitsized!(Control);
471*959fd759SPaolo Bonzini 
472*959fd759SPaolo Bonzini impl Control {
473*959fd759SPaolo Bonzini     pub fn reset(&mut self) {
474*959fd759SPaolo Bonzini         *self = 0.into();
475*959fd759SPaolo Bonzini         self.set_enable_receive(true);
476*959fd759SPaolo Bonzini         self.set_enable_transmit(true);
477*959fd759SPaolo Bonzini     }
478*959fd759SPaolo Bonzini }
479*959fd759SPaolo Bonzini 
480*959fd759SPaolo Bonzini impl Default for Control {
481*959fd759SPaolo Bonzini     fn default() -> Self {
482*959fd759SPaolo Bonzini         let mut ret: Self = 0.into();
483*959fd759SPaolo Bonzini         ret.reset();
484*959fd759SPaolo Bonzini         ret
485*959fd759SPaolo Bonzini     }
486*959fd759SPaolo Bonzini }
487*959fd759SPaolo Bonzini 
488*959fd759SPaolo Bonzini /// Interrupt status bits in UARTRIS, UARTMIS, UARTIMSC
489*959fd759SPaolo Bonzini pub struct Interrupt(pub u32);
490*959fd759SPaolo Bonzini 
491*959fd759SPaolo Bonzini impl Interrupt {
492*959fd759SPaolo Bonzini     pub const OE: Self = Self(1 << 10);
493*959fd759SPaolo Bonzini     pub const BE: Self = Self(1 << 9);
494*959fd759SPaolo Bonzini     pub const PE: Self = Self(1 << 8);
495*959fd759SPaolo Bonzini     pub const FE: Self = Self(1 << 7);
496*959fd759SPaolo Bonzini     pub const RT: Self = Self(1 << 6);
497*959fd759SPaolo Bonzini     pub const TX: Self = Self(1 << 5);
498*959fd759SPaolo Bonzini     pub const RX: Self = Self(1 << 4);
499*959fd759SPaolo Bonzini     pub const DSR: Self = Self(1 << 3);
500*959fd759SPaolo Bonzini     pub const DCD: Self = Self(1 << 2);
501*959fd759SPaolo Bonzini     pub const CTS: Self = Self(1 << 1);
502*959fd759SPaolo Bonzini     pub const RI: Self = Self(1 << 0);
503*959fd759SPaolo Bonzini 
504*959fd759SPaolo Bonzini     pub const E: Self = Self(Self::OE.0 | Self::BE.0 | Self::PE.0 | Self::FE.0);
505*959fd759SPaolo Bonzini     pub const MS: Self = Self(Self::RI.0 | Self::DSR.0 | Self::DCD.0 | Self::CTS.0);
506*959fd759SPaolo Bonzini }
507