VirtualBox

Changeset 73768 in vbox


Ignore:
Timestamp:
Aug 19, 2018 7:07:19 PM (6 years ago)
Author:
vboxsync
Message:

Main,FE/VBoxManage: Allow changing the UART type of the serial ports through the API

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/settings.h

    r72332 r73768  
    596596    com::Utf8Str    strPath;
    597597    bool            fServer;
     598    UartType_T      uartType;
    598599};
    599600
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r73740 r73768  
    608608                     "                                             file <file>|\n"
    609609                     "                                             <devicename>]\n"
     610                     "                            [--uarttype<1-N> 16450|16550A|16750\n"
    610611#if defined(RT_OS_LINUX) || defined(RT_OS_WINDOWS)
    611612                     "                            [--lpt<1-N> off|<I/O base> <IRQ>]\n"
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp

    r72976 r73768  
    14931493                Bstr path;
    14941494                BOOL fServer;
     1495                UartType_T UartType;
    14951496                uart->COMGETTER(IRQ)(&ulIRQ);
    14961497                uart->COMGETTER(IOBase)(&ulIOBase);
     
    14981499                uart->COMGETTER(Server)(&fServer);
    14991500                uart->COMGETTER(HostMode)(&HostMode);
     1501                uart->COMGETTER(UartType)(&UartType);
    15001502
    15011503                if (details == VMINFO_MACHINEREADABLE)
     
    15101512                            RTPrintf("uartmode%d=\"disconnected\"\n", currentUART + 1);
    15111513                        else
    1512                             RTPrintf(", disconnected\n");
     1514                            RTPrintf(", disconnected");
    15131515                        break;
    15141516                    case PortMode_RawFile:
     
    15251527                                     fServer ? "tcpserver" : "tcpclient", path.raw());
    15261528                        else
    1527                             RTPrintf(", attached to tcp (%s) '%ls'\n",
     1529                            RTPrintf(", attached to tcp (%s) '%ls'",
    15281530                                     fServer ? "server" : "client", path.raw());
    15291531                        break;
     
    15331535                                     fServer ? "server" : "client", path.raw());
    15341536                        else
    1535                             RTPrintf(", attached to pipe (%s) '%ls'\n",
     1537                            RTPrintf(", attached to pipe (%s) '%ls'",
    15361538                                     fServer ? "server" : "client", path.raw());
    15371539                        break;
     
    15411543                                     path.raw());
    15421544                        else
    1543                             RTPrintf(", attached to device '%ls'\n", path.raw());
     1545                            RTPrintf(", attached to device '%ls'", path.raw());
     1546                        break;
     1547                }
     1548                switch (UartType)
     1549                {
     1550                    default:
     1551                    case UartType_U16450:
     1552                        if (details == VMINFO_MACHINEREADABLE)
     1553                            RTPrintf("uarttype%d=\"16450\"\n", currentUART + 1);
     1554                        else
     1555                            RTPrintf(", 16450\n");
     1556                        break;
     1557                    case UartType_U16550A:
     1558                        if (details == VMINFO_MACHINEREADABLE)
     1559                            RTPrintf("uarttype%d=\"16550A\"\n", currentUART + 1);
     1560                        else
     1561                            RTPrintf(", 16550A\n");
     1562                        break;
     1563                    case UartType_U16750:
     1564                        if (details == VMINFO_MACHINEREADABLE)
     1565                            RTPrintf("uarttype%d=\"16750\"\n", currentUART + 1);
     1566                        else
     1567                            RTPrintf(", 16750\n");
    15441568                        break;
    15451569                }
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp

    r72919 r73768  
    147147    MODIFYVM_HIDKBD,
    148148    MODIFYVM_UARTMODE,
     149    MODIFYVM_UARTTYPE,
    149150    MODIFYVM_UART,
    150151#if defined(RT_OS_LINUX) || defined(RT_OS_WINDOWS)
     
    334335    { "--keyboard",                 MODIFYVM_HIDKBD,                    RTGETOPT_REQ_STRING },
    335336    { "--uartmode",                 MODIFYVM_UARTMODE,                  RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
     337    { "--uarttype",                 MODIFYVM_UARTTYPE,                  RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
    336338    { "--uart",                     MODIFYVM_UART,                      RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
    337339#if defined(RT_OS_LINUX) || defined(RT_OS_WINDOWS)
     
    21572159            }
    21582160
     2161            case MODIFYVM_UARTTYPE:
     2162            {
     2163                ComPtr<ISerialPort> uart;
     2164
     2165                CHECK_ERROR_BREAK(sessionMachine, GetSerialPort(GetOptState.uIndex - 1, uart.asOutParam()));
     2166                ASSERT(uart);
     2167
     2168                if (!RTStrICmp(ValueUnion.psz, "16450"))
     2169                {
     2170                    CHECK_ERROR(uart, COMSETTER(UartType)(UartType_U16450));
     2171                }
     2172                else if (!RTStrICmp(ValueUnion.psz, "16550A"))
     2173                {
     2174                    CHECK_ERROR(uart, COMSETTER(UartType)(UartType_U16550A));
     2175                }
     2176                else if (!RTStrICmp(ValueUnion.psz, "16750"))
     2177                {
     2178                    CHECK_ERROR(uart, COMSETTER(UartType)(UartType_U16750));
     2179                }
     2180                else
     2181                    return errorSyntax(USAGE_MODIFYVM,
     2182                                       "Invalid argument to '%s'",
     2183                                       GetOptState.pDef->pszLong);
     2184                break;
     2185            }
     2186
    21592187            case MODIFYVM_UART:
    21602188            {
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r73743 r73768  
    593593      <desc>Settings version "1.17", written by VirtualBox 6.0.x.</desc>
    594594      <!--
    595           Machine changes: nested hardware virtualization.
     595          Machine changes: nested hardware virtualization, UART type selection.
    596596      -->
    597597    </const>
     
    1838818388  </enum>
    1838918389
     18390  <enum
     18391    name="UartType"
     18392    uuid="c8899d39-0b90-4265-9d02-1e38bd4d1b39"
     18393    >
     18394    <desc>
     18395      The UART type represents the emulated UART chip for the serial port device.
     18396    </desc>
     18397
     18398    <const name="U16450"            value="0">
     18399      <desc>The most basic emulated UART which doesn't support FIFO operation.</desc>
     18400    </const>
     18401    <const name="U16550A"           value="1">
     18402      <desc>
     18403        The successor of the 16450 UART introducing a 16 byte FIFO to reduce
     18404        operational overhead.
     18405      </desc>
     18406    </const>
     18407    <const name="U16750"            value="2">
     18408      <desc>
     18409        This UART developed by Texas Instruments introduced a 64 byte FIFO
     18410        and hardware flow control.
     18411      </desc>
     18412    </const>
     18413  </enum>
     18414
    1839018415  <interface
    1839118416    name="ISerialPort" extends="$unknown"
    1839218417    uuid="cb0a4a29-43a3-9040-0c25-34845db7b042"
    1839318418    wsmap="managed"
    18394     reservedAttributes="2"
     18419    reservedAttributes="1"
    1839518420    >
    1839618421
     
    1847018495        value is an error. Otherwise, the value of this property is ignored.
    1847118496      </desc>
     18497    </attribute>
     18498
     18499    <attribute name="uartType" type="UartType">
     18500      <desc>Selects the emulated UART implementation.</desc>
    1847218501    </attribute>
    1847318502
  • trunk/src/VBox/Main/include/SerialPortImpl.h

    r69500 r73768  
    7979    HRESULT getPath(com::Utf8Str &aPath);
    8080    HRESULT setPath(const com::Utf8Str &aPath);
     81    HRESULT getUartType(UartType_T *aUartType);
     82    HRESULT setUartType(UartType_T aUartType);
    8183
    8284    struct Data;
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r73629 r73768  
    27062706            hrc = serialPort->COMGETTER(Server)(&fServer);                                  H();
    27072707            hrc = serialPort->COMGETTER(Path)(bstr.asOutParam());                           H();
     2708            UartType_T eUartType;
     2709            const char *pszUartType;
     2710            hrc = serialPort->COMGETTER(UartType)(&eUartType);                              H();
     2711            switch (eUartType)
     2712            {
     2713                case UartType_U16450: pszUartType = "16450"; break;
     2714                case UartType_U16750: pszUartType = "16750"; break;
     2715                default: AssertFailed(); RT_FALL_THRU();
     2716                case UartType_U16550A: pszUartType = "16550A"; break;
     2717            }
     2718            InsertConfigString(pCfg, "UartType", pszUartType);
     2719
    27082720            PortMode_T eHostMode;
    27092721            hrc = serialPort->COMGETTER(HostMode)(&eHostMode);                              H();
  • trunk/src/VBox/Main/src-server/SerialPortImpl.cpp

    r72973 r73768  
    476476        m->bd.backup();
    477477        m->bd->fServer = RT_BOOL(aServer);
     478
     479        m->fModified = true;
     480        // leave the lock before informing callbacks
     481        alock.release();
     482
     483        AutoWriteLock mlock(m->pMachine COMMA_LOCKVAL_SRC_POS);
     484        m->pMachine->i_setModified(Machine::IsModified_SerialPorts);
     485        mlock.release();
     486
     487        m->pMachine->i_onSerialPortChange(this);
     488    }
     489
     490    return S_OK;
     491}
     492
     493HRESULT SerialPort::getUartType(UartType_T *aUartType)
     494{
     495    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     496
     497    *aUartType = m->bd->uartType;
     498
     499    return S_OK;
     500}
     501
     502HRESULT SerialPort::setUartType(UartType_T aUartType)
     503{
     504    /* the machine needs to be mutable */
     505    AutoMutableOrSavedOrRunningStateDependency adep(m->pMachine);
     506    if (FAILED(adep.rc())) return adep.rc();
     507
     508    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     509
     510    if (m->bd->uartType != aUartType)
     511    {
     512        m->bd.backup();
     513        m->bd->uartType = aUartType;
    478514
    479515        m->fModified = true;
  • trunk/src/VBox/Main/xml/Settings.cpp

    r72973 r73768  
    24952495    ulIRQ(4),
    24962496    portMode(PortMode_Disconnected),
    2497     fServer(false)
     2497    fServer(false),
     2498    uartType(UartType_U16550A)
    24982499{
    24992500}
     
    25132514            && portMode          == s.portMode
    25142515            && strPath           == s.strPath
    2515             && fServer           == s.fServer);
     2516            && fServer           == s.fServer
     2517            && uartType          == s.uartType);
    25162518}
    25172519
     
    36373639        pelmPort->getAttributeValue("server", port.fServer);
    36383640
     3641        Utf8Str strUartType;
     3642        if (pelmPort->getAttributeValue("uartType", strUartType))
     3643        {
     3644            if (strUartType == "16450")
     3645                port.uartType = UartType_U16450;
     3646            else if (strUartType == "16550A")
     3647                port.uartType = UartType_U16550A;
     3648            else if (strUartType == "16750")
     3649                port.uartType = UartType_U16750;
     3650            else
     3651                throw ConfigFileError(this, pelmPort, N_("Invalid value '%s' in UART/Port/@uartType attribute"), strUartType.c_str());
     3652        }
     3653
    36393654        ll.push_back(port);
    36403655    }
     
    60116026            }
    60126027            pelmPort->setAttribute("hostMode", pcszHostMode);
     6028
     6029            if (   m->sv >= SettingsVersion_v1_17
     6030                && port.uartType != UartType_U16550A)
     6031            {
     6032                const char *pcszUartType;
     6033
     6034                switch (port.uartType)
     6035                {
     6036                    case UartType_U16450: pcszUartType = "16450"; break;
     6037                    case UartType_U16550A: pcszUartType = "16550A"; break;
     6038                    case UartType_U16750: pcszUartType = "16750"; break;
     6039                    default: pcszUartType = "16550A"; break;
     6040                }
     6041                pelmPort->setAttribute("uartType", pcszUartType);
     6042            }
    60136043        }
    60146044    }
     
    69827012            return;
    69837013        }
     7014
     7015        /*
     7016         * Check if any serial port uses a non 16550A serial port.
     7017         */
     7018        for (SerialPortsList::const_iterator it = hardwareMachine.llSerialPorts.begin();
     7019             it != hardwareMachine.llSerialPorts.end();
     7020             ++it)
     7021        {
     7022            const SerialPort &port = *it;
     7023            if (port.uartType != UartType_U16550A)
     7024            {
     7025                m->sv = SettingsVersion_v1_17;
     7026                return;
     7027            }
     7028        }
    69847029    }
    69857030
Note: See TracChangeset for help on using the changeset viewer.

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