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