VirtualBox

Changeset 28909 in vbox


Ignore:
Timestamp:
Apr 29, 2010 4:34:17 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60857
Message:

Route input to PS/2 keyboard unless USB keyboard was explicitly activated.

Location:
trunk
Files:
6 edited

Legend:

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

    r28800 r28909  
    415415    DECLR3CALLBACKMEMBER(void, pfnLedStatusChange,(PPDMIKEYBOARDCONNECTOR pInterface, PDMKEYBLEDS enmLeds));
    416416
     417    /**
     418     * Notifies the the downstream driver of changes in driver state.
     419     *
     420     * @param   pInterface      Pointer to the this interface.
     421     * @param   fActive         Whether interface wishes to get "focus".
     422     */
     423    DECLR3CALLBACKMEMBER(void, pfnSetActive,(PPDMIKEYBOARDCONNECTOR pInterface, bool fActive));
     424
    417425} PDMIKEYBOARDCONNECTOR;
    418426/** PDMIKEYBOARDCONNECTOR interface ID. */
  • trunk/src/VBox/Devices/Input/DevPS2.cpp

    r28800 r28909  
    14831483static DECLCALLBACK(void)  kbdReset(PPDMDEVINS pDevIns)
    14841484{
    1485     kbd_reset(PDMINS_2_DATA(pDevIns, KBDState *));
     1485    KBDState   *pThis = PDMINS_2_DATA(pDevIns, KBDState *);
     1486
     1487    kbd_reset(pThis);
     1488    /* Activate the PS/2 keyboard by default. */
     1489    pThis->Keyboard.pDrv->pfnSetActive(pThis->Keyboard.pDrv, true);
    14861490}
    14871491
  • trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp

    r28800 r28909  
    138138}
    139139
     140/**
     141 * Pass keyboard state changes from the guest thru to the frontent driver.
     142 *
     143 * @param   pInterface  Pointer to the keyboard connector interface structure.
     144 * @param   fActive     The new active/inactive state.
     145 */
     146static DECLCALLBACK(void) drvKbdPassThruSetActive(PPDMIKEYBOARDCONNECTOR pInterface, bool fActive)
     147{
     148    PDRVKBDQUEUE pDrv = PPDMIKEYBOARDCONNECTOR_2_DRVKBDQUEUE(pInterface);
     149    pDrv->pDownConnector->pfnSetActive(pDrv->pDownConnector, fActive);
     150}
    140151
    141152
     
    250261    /* IKeyboardConnector. */
    251262    pDrv->IConnector.pfnLedStatusChange     = drvKbdPassThruLedsChange;
     263    pDrv->IConnector.pfnSetActive           = drvKbdPassThruSetActive;
    252264    /* IKeyboardPort. */
    253265    pDrv->IPort.pfnPutEvent                 = drvKbdQueuePutEvent;
  • trunk/src/VBox/Devices/Input/UsbKbd.cpp

    r28800 r28909  
    608608static int usbHidResetWorker(PUSBHID pThis, PVUSBURB pUrb, bool fSetConfig)
    609609{
     610    /*
     611     * Deactivate the keyboard.
     612     */
     613    pThis->Lun0.pDrv->pfnSetActive(pThis->Lun0.pDrv, false);
     614
    610615    /*
    611616     * Reset the device state.
     
    12121217    pThis->bConfigurationValue = bConfigurationValue;
    12131218
     1219    /*
     1220     * Tell the other end that the keyboard is now enabled and wants
     1221     * to receive keystrokes.
     1222     */
     1223    pThis->Lun0.pDrv->pfnSetActive(pThis->Lun0.pDrv, true);
     1224
    12141225    RTCritSectLeave(&pThis->CritSect);
    12151226    return VINF_SUCCESS;
     
    13081319    if (RT_FAILURE(rc))
    13091320        return PDMUsbHlpVMSetError(pUsbIns, rc, RT_SRC_POS, N_("HID failed to attach keyboard driver"));
     1321
     1322    pThis->Lun0.pDrv = PDMIBASE_QUERY_INTERFACE(pThis->Lun0.pDrvBase, PDMIKEYBOARDCONNECTOR);
     1323    if (!pThis->Lun0.pDrv)
     1324        return PDMUsbHlpVMSetError(pUsbIns, VERR_PDM_MISSING_INTERFACE, RT_SRC_POS, N_("HID failed to query keyboard interface"));
    13101325
    13111326    return VINF_SUCCESS;
  • trunk/src/VBox/Main/KeyboardImpl.cpp

    r28800 r28909  
    3232////////////////////////////////////////////////////////////////////////////////
    3333
     34/** @name Keyboard device capabilities bitfield
     35 * @{ */
     36enum
     37{
     38    /** The keyboard device does not wish to receive keystrokes. */
     39    KEYBOARD_DEVCAP_DISABLED = 0,
     40    /** The keyboard device does wishes to receive keystrokes. */
     41    KEYBOARD_DEVCAP_ENABLED  = 1
     42};
     43
    3444/**
    3545 * Keyboard driver instance data.
     
    4353    /** Pointer to the keyboard port interface of the driver/device above us. */
    4454    PPDMIKEYBOARDPORT           pUpPort;
    45     /** Our mouse connector interface. */
     55    /** Our keyboard connector interface. */
    4656    PDMIKEYBOARDCONNECTOR       IConnector;
     57    /** The capabilities of this device. */
     58    uint32_t                    u32DevCaps;
    4759} DRVMAINKEYBOARD, *PDRVMAINKEYBOARD;
    4860
     
    6577HRESULT Keyboard::FinalConstruct()
    6678{
    67     mpDrv = NULL;
     79    RT_ZERO(mpDrv);
    6880    mpVMMDev = NULL;
    6981    mfVMMDevInited = false;
     
    116128        return;
    117129
    118     if (mpDrv)
    119         mpDrv->pKeyboard = NULL;
    120 
    121     mpDrv = NULL;
     130    for (unsigned i = 0; i < KEYBOARD_MAX_DEVICES; ++i)
     131    {
     132        if (mpDrv[i])
     133            mpDrv[i]->pKeyboard = NULL;
     134        mpDrv[i] = NULL;
     135    }
     136
    122137    mpVMMDev = NULL;
    123138    mfVMMDevInited = true;
     
    141156    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    142157
    143     CHECK_CONSOLE_DRV(mpDrv);
    144 
    145     int vrc = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, (uint8_t)scancode);
     158    CHECK_CONSOLE_DRV(mpDrv[0]);
     159
     160    PPDMIKEYBOARDPORT pUpPort = NULL;
     161    for (int i = KEYBOARD_MAX_DEVICES - 1; i >= 0 ; --i)
     162    {
     163        if (mpDrv[i] && (mpDrv[i]->u32DevCaps & KEYBOARD_DEVCAP_ENABLED))
     164        {
     165            pUpPort = mpDrv[i]->pUpPort;
     166            break;
     167        }
     168    }
     169    /* No enabled keyboard - throw the input away. */
     170    if (!pUpPort)
     171        return rc;
     172   
     173    int vrc = pUpPort->pfnPutEvent(pUpPort, (uint8_t)scancode);
    146174
    147175    if (RT_FAILURE(vrc))
     
    176204    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    177205
    178     CHECK_CONSOLE_DRV (mpDrv);
     206    CHECK_CONSOLE_DRV(mpDrv[0]);
     207
     208    /* Send input to the last enabled device. Relies on the fact that
     209     * the USB keyboard is always initialized after the PS/2 keyboard.
     210     */
     211    PPDMIKEYBOARDPORT pUpPort = NULL;
     212    for (int i = KEYBOARD_MAX_DEVICES - 1; i >= 0 ; --i)
     213    {
     214        if (mpDrv[i] && (mpDrv[i]->u32DevCaps & KEYBOARD_DEVCAP_ENABLED))
     215        {
     216            pUpPort = mpDrv[i]->pUpPort;
     217            break;
     218        }
     219    }
     220    /* No enabled keyboard - throw the input away. */
     221    if (!pUpPort)
     222        return rc;
    179223
    180224    com::SafeArray<LONG> keys (ComSafeArrayInArg (scancodes));
     
    182226
    183227    for (uint32_t i = 0; (i < keys.size()) && RT_SUCCESS(vrc); i++)
    184         vrc = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, (uint8_t)keys[i]);
     228        vrc = pUpPort->pfnPutEvent(pUpPort, (uint8_t)keys[i]);
    185229
    186230    if (RT_FAILURE(vrc))
     
    250294    {
    251295        AutoWriteLock kbdLock(pData->pKeyboard COMMA_LOCKVAL_SRC_POS);
    252         pData->pKeyboard->mpDrv = NULL;
     296        for (unsigned cDev = 0; cDev < KEYBOARD_MAX_DEVICES; ++cDev)
     297            if (pData->pKeyboard->mpDrv[cDev] == pData)
     298            {
     299                pData->pKeyboard->mpDrv[cDev] = NULL;
     300                break;
     301            }
    253302        pData->pKeyboard->mpVMMDev = NULL;
    254303    }
     
    261310                                                        !!(enmLeds & PDMKEYBLEDS_CAPSLOCK),
    262311                                                        !!(enmLeds & PDMKEYBLEDS_SCROLLLOCK));
     312}
     313
     314/**
     315 * @interface_method_impl{PDMIKEYBOARDCONNECTOR,pfnSetActive}
     316 */
     317DECLCALLBACK(void) Keyboard::keyboardSetActive(PPDMIKEYBOARDCONNECTOR pInterface, bool fActive)
     318{
     319    PDRVMAINKEYBOARD pDrv = PPDMIKEYBOARDCONNECTOR_2_MAINKEYBOARD(pInterface);
     320    if (fActive)
     321        pDrv->u32DevCaps |= KEYBOARD_DEVCAP_ENABLED;
     322    else
     323        pDrv->u32DevCaps &= ~KEYBOARD_DEVCAP_ENABLED;
    263324}
    264325
     
    289350
    290351    pData->IConnector.pfnLedStatusChange    = keyboardLedStatusChange;
     352    pData->IConnector.pfnSetActive          = keyboardSetActive;
    291353
    292354    /*
     
    311373    }
    312374    pData->pKeyboard = (Keyboard *)pv;        /** @todo Check this cast! */
    313     pData->pKeyboard->mpDrv = pData;
     375    unsigned cDev;
     376    for (cDev = 0; cDev < KEYBOARD_MAX_DEVICES; ++cDev)
     377        if (!pData->pKeyboard->mpDrv[cDev])
     378        {
     379            pData->pKeyboard->mpDrv[cDev] = pData;
     380            break;
     381        }
     382    if (cDev == KEYBOARD_MAX_DEVICES)
     383        return VERR_NO_MORE_HANDLES;
    314384
    315385    return VINF_SUCCESS;
  • trunk/src/VBox/Main/include/KeyboardImpl.h

    r28800 r28909  
    2323
    2424#include <VBox/pdmdrv.h>
     25
     26/** Limit of simultaneously attached devices (just USB and/or PS/2). */
     27enum { KEYBOARD_MAX_DEVICES = 2 };
    2528
    2629/** Simple keyboard event class. */
     
    8992
    9093    static DECLCALLBACK(void *) drvQueryInterface(PPDMIBASE pInterface, const char *pszIID);
     94    static DECLCALLBACK(void)   keyboardSetActive(PPDMIKEYBOARDCONNECTOR pInterface, bool fActive);
    9195    static DECLCALLBACK(int)    drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags);
    9296    static DECLCALLBACK(void)   drvDestruct(PPDMDRVINS pDrvIns);
    9397
    9498    Console * const         mParent;
    95     /** Pointer to the associated keyboard driver. */
    96     struct DRVMAINKEYBOARD *mpDrv;
     99    /** Pointer to the associated keyboard driver(s). */
     100    struct DRVMAINKEYBOARD *mpDrv[KEYBOARD_MAX_DEVICES];
    97101    /** Pointer to the device instance for the VMM Device. */
    98102    PPDMDEVINS              mpVMMDev;
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