Changeset 28909 in vbox
- Timestamp:
- Apr 29, 2010 4:34:17 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 60857
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmifs.h
r28800 r28909 415 415 DECLR3CALLBACKMEMBER(void, pfnLedStatusChange,(PPDMIKEYBOARDCONNECTOR pInterface, PDMKEYBLEDS enmLeds)); 416 416 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 417 425 } PDMIKEYBOARDCONNECTOR; 418 426 /** PDMIKEYBOARDCONNECTOR interface ID. */ -
trunk/src/VBox/Devices/Input/DevPS2.cpp
r28800 r28909 1483 1483 static DECLCALLBACK(void) kbdReset(PPDMDEVINS pDevIns) 1484 1484 { 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); 1486 1490 } 1487 1491 -
trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp
r28800 r28909 138 138 } 139 139 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 */ 146 static DECLCALLBACK(void) drvKbdPassThruSetActive(PPDMIKEYBOARDCONNECTOR pInterface, bool fActive) 147 { 148 PDRVKBDQUEUE pDrv = PPDMIKEYBOARDCONNECTOR_2_DRVKBDQUEUE(pInterface); 149 pDrv->pDownConnector->pfnSetActive(pDrv->pDownConnector, fActive); 150 } 140 151 141 152 … … 250 261 /* IKeyboardConnector. */ 251 262 pDrv->IConnector.pfnLedStatusChange = drvKbdPassThruLedsChange; 263 pDrv->IConnector.pfnSetActive = drvKbdPassThruSetActive; 252 264 /* IKeyboardPort. */ 253 265 pDrv->IPort.pfnPutEvent = drvKbdQueuePutEvent; -
trunk/src/VBox/Devices/Input/UsbKbd.cpp
r28800 r28909 608 608 static int usbHidResetWorker(PUSBHID pThis, PVUSBURB pUrb, bool fSetConfig) 609 609 { 610 /* 611 * Deactivate the keyboard. 612 */ 613 pThis->Lun0.pDrv->pfnSetActive(pThis->Lun0.pDrv, false); 614 610 615 /* 611 616 * Reset the device state. … … 1212 1217 pThis->bConfigurationValue = bConfigurationValue; 1213 1218 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 1214 1225 RTCritSectLeave(&pThis->CritSect); 1215 1226 return VINF_SUCCESS; … … 1308 1319 if (RT_FAILURE(rc)) 1309 1320 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")); 1310 1325 1311 1326 return VINF_SUCCESS; -
trunk/src/VBox/Main/KeyboardImpl.cpp
r28800 r28909 32 32 //////////////////////////////////////////////////////////////////////////////// 33 33 34 /** @name Keyboard device capabilities bitfield 35 * @{ */ 36 enum 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 34 44 /** 35 45 * Keyboard driver instance data. … … 43 53 /** Pointer to the keyboard port interface of the driver/device above us. */ 44 54 PPDMIKEYBOARDPORT pUpPort; 45 /** Our mouseconnector interface. */55 /** Our keyboard connector interface. */ 46 56 PDMIKEYBOARDCONNECTOR IConnector; 57 /** The capabilities of this device. */ 58 uint32_t u32DevCaps; 47 59 } DRVMAINKEYBOARD, *PDRVMAINKEYBOARD; 48 60 … … 65 77 HRESULT Keyboard::FinalConstruct() 66 78 { 67 mpDrv = NULL;79 RT_ZERO(mpDrv); 68 80 mpVMMDev = NULL; 69 81 mfVMMDevInited = false; … … 116 128 return; 117 129 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 122 137 mpVMMDev = NULL; 123 138 mfVMMDevInited = true; … … 141 156 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 142 157 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); 146 174 147 175 if (RT_FAILURE(vrc)) … … 176 204 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 177 205 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; 179 223 180 224 com::SafeArray<LONG> keys (ComSafeArrayInArg (scancodes)); … … 182 226 183 227 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]); 185 229 186 230 if (RT_FAILURE(vrc)) … … 250 294 { 251 295 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 } 253 302 pData->pKeyboard->mpVMMDev = NULL; 254 303 } … … 261 310 !!(enmLeds & PDMKEYBLEDS_CAPSLOCK), 262 311 !!(enmLeds & PDMKEYBLEDS_SCROLLLOCK)); 312 } 313 314 /** 315 * @interface_method_impl{PDMIKEYBOARDCONNECTOR,pfnSetActive} 316 */ 317 DECLCALLBACK(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; 263 324 } 264 325 … … 289 350 290 351 pData->IConnector.pfnLedStatusChange = keyboardLedStatusChange; 352 pData->IConnector.pfnSetActive = keyboardSetActive; 291 353 292 354 /* … … 311 373 } 312 374 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; 314 384 315 385 return VINF_SUCCESS; -
trunk/src/VBox/Main/include/KeyboardImpl.h
r28800 r28909 23 23 24 24 #include <VBox/pdmdrv.h> 25 26 /** Limit of simultaneously attached devices (just USB and/or PS/2). */ 27 enum { KEYBOARD_MAX_DEVICES = 2 }; 25 28 26 29 /** Simple keyboard event class. */ … … 89 92 90 93 static DECLCALLBACK(void *) drvQueryInterface(PPDMIBASE pInterface, const char *pszIID); 94 static DECLCALLBACK(void) keyboardSetActive(PPDMIKEYBOARDCONNECTOR pInterface, bool fActive); 91 95 static DECLCALLBACK(int) drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags); 92 96 static DECLCALLBACK(void) drvDestruct(PPDMDRVINS pDrvIns); 93 97 94 98 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]; 97 101 /** Pointer to the device instance for the VMM Device. */ 98 102 PPDMDEVINS mpVMMDev;
Note:
See TracChangeset
for help on using the changeset viewer.