VirtualBox

Changeset 72078 in vbox for trunk/src/VBox/Devices/Serial


Ignore:
Timestamp:
May 1, 2018 10:59:15 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
122469
Message:

DevSerialNew.cpp: Register definitions taken from the spec

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Serial/DevSerialNew.cpp

    r72074 r72078  
    1717 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
    1818 */
     19
    1920
    2021/*********************************************************************************************************************************
     
    3233#include "VBoxDD.h"
    3334
     35
    3436/*********************************************************************************************************************************
    3537*   Defined Constants And Macros                                                                                                 *
    3638*********************************************************************************************************************************/
     39
     40/** The RBR/DLL register index (from the base of the port range). */
     41#define UART_REG_RBR_DLL_INDEX               0
     42
     43/** The THR/DLL register index (from the base of the port range). */
     44#define UART_REG_THR_DLL_INDEX               0
     45
     46/** The IER/DLM register index (from the base of the port range). */
     47#define UART_REG_IER_DLM_INDEX               1
     48/** Enable received data available interrupt */
     49# define UART_REG_IER_ERBFI                  RT_BIT(0)
     50/** Enable transmitter holding register empty interrupt */
     51# define UART_REG_IER_ETBEI                  RT_BIT(1)
     52/** Enable receiver line status interrupt */
     53# define UART_REG_IER_ELSI                   RT_BIT(2)
     54/** Enable modem status interrupt. */
     55# define UART_REG_IER_EDSSI                  RT_BIT(3)
     56/** Mask of writeable bits. */
     57# define UART_REG_IER_MASK_WR                0x0f
     58
     59/** The IIR register index (from the base of the port range). */
     60#define UART_REG_IIR_INDEX                   2
     61/** Interrupt Pending - high means no interrupt pending. */
     62# define UART_REG_IIR_IP_NO_INT              RT_BIT(0)
     63/** Interrupt identification mask. */
     64# define UART_REG_IIR_ID_MASK                0x0e
     65/** Sets the interrupt identification to the given value. */
     66# define UART_REG_IIR_ID_SET(a_Val)          (((a_Val) & UART_REG_IIR_ID_MASK) << 1)
     67/** Receiver Line Status interrupt. */
     68#  define UART_REG_IIR_ID_RCL                0x3
     69/** Received Data Avalable interrupt. */
     70#  define UART_REG_IIR_ID_RDA                0x2
     71/** Character Timeou Indicator interrupt. */
     72#  define UART_REG_IIR_ID_CTI                0x6
     73/** Transmitter Holding Register Empty interrupt. */
     74#  define UART_REG_IIR_ID_THRE               0x1
     75/** Modem Status interrupt. */
     76#  define UART_REG_IIR_ID_MS                 0x0
     77/** FIFOs enabled. */
     78# define UART_REG_IIR_FIFOS_EN               0xc0
     79
     80/** The FCR register index (from the base of the port range). */
     81#define UART_REG_FCR_INDEX                   2
     82/** Enable the TX/RX FIFOs. */
     83# define UART_REG_FCR_FIFO_EN                RT_BIT(0)
     84/** Reset the receive FIFO. */
     85# define UART_REG_FCR_RCV_FIFO_RST           RT_BIT(1)
     86/** Reset the transmit FIFO. */
     87# define UART_REG_FCR_XMIT_FIFO_RST          RT_BIT(2)
     88/** DMA Mode Select. */
     89# define UART_REG_FCR_DMA_MODE_SEL           RT_BIT(3)
     90/** Receiver level interrupt trigger. */
     91# define UART_REG_FCR_RCV_LVL_IRQ_MASK       0xc0
     92/** Returns the receive level trigger value from the given FCR register. */
     93# define UART_REG_FCR_RCV_LVL_IRQ_GET(a_Fcr) (((a_Fcr) & UART_REG_FCR_RCV_LVL_IRQ_MASK) >> 6)
     94/** Mask of writeable bits. */
     95# define UART_REG_FCR_MASK_WR                0xcf
     96
     97/** The LCR register index (from the base of the port range). */
     98#define UART_REG_LCR_INDEX                   3
     99/** Word Length Select Mask. */
     100# define UART_REG_LCR_WLS_MASK               0x3
     101/** Returns the WLS value form the given LCR register value. */
     102# define UART_REG_LCR_WLS_GET(a_Lcr)         ((a_Lcr) & UART_REG_LCR_WLS_MASK)
     103/** Number of stop bits. */
     104# define UART_REG_LCR_STB                    RT_BIT(2)
     105/** Parity Enable. */
     106# define UART_REG_LCR_PEN                    RT_BIT(3)
     107/** Even Parity. */
     108# define UART_REG_LCR_EPS                    RT_BIT(4)
     109/** Stick parity. */
     110# define UART_REG_LCR_PAR_STICK              RT_BIT(5)
     111/** Set Break. */
     112# define UART_REG_LCR_BRK_SET                RT_BIT(6)
     113/** Divisor Latch Access Bit. */
     114# define UART_REG_LCR_DLAB                   RT_BIT(7)
     115
     116/** The MCR register index (from the base of the port range). */
     117#define UART_REG_MCR_INDEX                   4
     118/** Data Terminal Ready. */
     119# define UART_REG_MCR_DTR                    RT_BIT(0)
     120/** Request To Send. */
     121# define UART_REG_MCR_RTS                    RT_BIT(1)
     122/** Out1. */
     123# define UART_REG_MCR_OUT1                   RT_BIT(2)
     124/** Out2. */
     125# define UART_REG_MCR_OUT2                   RT_BIT(3)
     126/** Loopback connection. */
     127# define UART_REG_MCR_LOOP                   RT_BIT(4)
     128/** Mask of writeable bits. */
     129# define UART_REG_MCR_MASK_WR                0x1f
     130
     131/** The LSR register index (from the base of the port range). */
     132#define UART_REG_LSR_INDEX                   5
     133/** Data Ready. */
     134# define UART_REG_LSR_DR                     RT_BIT(0)
     135/** Overrun Error. */
     136# define UART_REG_LSR_OE                     RT_BIT(1)
     137/** Parity Error. */
     138# define UART_REG_LSR_PE                     RT_BIT(2)
     139/** Framing Error. */
     140# define UART_REG_LSR_FE                     RT_BIT(3)
     141/** Break Interrupt. */
     142# define UART_REG_LSR_BI                     RT_BIT(4)
     143/** Transmitter Holding Register. */
     144# define UART_REG_LSR_THRE                   RT_BIT(5)
     145/** Transmitter Empty. */
     146# define UART_REG_LSR_TEMT                   RT_BIT(6)
     147/** Error in receiver FIFO. */
     148# define UART_REG_LSR_RCV_FIFO_ERR           RT_BIT(7)
     149
     150/** The MSR register index (from the base of the port range). */
     151#define UART_REG_MSR_INDEX                   6
     152/** Delta Clear to Send. */
     153# define UART_REG_MSR_DCTS                   RT_BIT(0)
     154/** Delta Data Set Ready. */
     155# define UART_REG_MSR_DDSR                   RT_BIT(1)
     156/** Trailing Edge Ring Indicator. */
     157# define UART_REG_MSR_TERI                   RT_BIT(2)
     158/** Delta Data Carrier Detect. */
     159# define UART_REG_MSR_DDCD                   RT_BIT(3)
     160/** Clear to Send. */
     161# define UART_REG_MSR_CTS                    RT_BIT(4)
     162/** Data Set Ready. */
     163# define UART_REG_MSR_DSR                    RT_BIT(5)
     164/** Ring Indicator. */
     165# define UART_REG_MSR_RI                     RT_BIT(6)
     166/** Data Carrier Detect. */
     167# define UART_REG_MSSR_DCD                   RT_BIT(7)
     168
     169/** The SCR register index (from the base of the port range). */
     170#define UART_REG_SCR_INDEX                   7
    37171
    38172
     
    80214    RTIOPORT                        PortBase;
    81215
     216    /** The divisor register (DLAB = 1). */
     217    uint16_t                        uRegDivisor;
     218    /** The Receiver Buffer Register (RBR, DLAB = 0). */
     219    uint8_t                         uRegRbr;
     220    /** The Transmitter Holding Register (THR, DLAB = 0). */
     221    uint8_t                         uRegThr;
     222    /** The Interrupt Enable Register (IER). */
     223    uint8_t                         uRegIer;
     224    /** The Interrupt Identification Register (IIR). */
     225    uint8_t                         uRegIir;
     226    /** The FIFO Control Register (FCR). */
     227    uint8_t                         uRegFcr;
     228    /** The Line Control Register (LCR). */
     229    uint8_t                         uRegLcr;
     230    /** The Modem Control Register (MCR). */
     231    uint8_t                         uRegMcr;
     232    /** The Line Status Register (LSR). */
     233    uint8_t                         uRegLsr;
     234    /** The Modem Status Register (MSR). */
     235    uint8_t                         uRegMsr;
     236    /** The Scratch Register (SCR). */
     237    uint8_t                         uRegScr;
     238
    82239} DEVSERIAL;
    83240/** Pointer to the serial device state. */
     
    96253    Assert(PDMCritSectIsOwner(&pThis->CritSect));
    97254    RT_NOREF_PV(pvUser);
    98     RT_NOREF(u32);
    99255
    100256    AssertMsgReturn(cb == 1, ("uPort=%#x cb=%d u32=%#x\n", uPort, cb, u32), VINF_SUCCESS);
     
    103259    switch (uPort & 0x7)
    104260    {
     261        case UART_REG_THR_DLL_INDEX:
     262            break;
     263        case UART_REG_IER_DLM_INDEX:
     264            break;
     265        case UART_REG_FCR_INDEX:
     266            break;
     267        case UART_REG_LCR_INDEX:
     268            break;
     269        case UART_REG_MCR_INDEX:
     270            break;
     271        case UART_REG_SCR_INDEX:
     272            pThis->uRegScr = u32;
     273            break;
    105274        default:
    106275            break;
     
    119288    Assert(PDMCritSectIsOwner(&pThis->CritSect));
    120289    RT_NOREF_PV(pvUser);
    121     RT_NOREF(pu32);
    122290
    123291    if (cb != 1)
     
    127295    switch (uPort & 0x7)
    128296    {
     297        case UART_REG_RBR_DLL_INDEX:
     298            break;
     299        case UART_REG_IER_DLM_INDEX:
     300            break;
     301        case UART_REG_IIR_INDEX:
     302            break;
     303        case UART_REG_LCR_INDEX:
     304            break;
     305        case UART_REG_MCR_INDEX:
     306            break;
     307        case UART_REG_LSR_INDEX:
     308            break;
     309        case UART_REG_MSR_INDEX:
     310            break;
     311        case UART_REG_SCR_INDEX:
     312            *pu32 = pThis->uRegScr;
     313            break;
    129314        default:
    130315            rc = VERR_IOM_IOPORT_UNUSED;
     
    419604    }
    420605
    421 #if 0 /** @todo: Later */
     606#if 0 /** @todo Later */
    422607    /*
    423608     * Saved state.
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette