Changeset 70042 in vbox for trunk/src/VBox/Additions
- Timestamp:
- Dec 9, 2017 12:37:58 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 119580
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-netbsd.c
r70011 r70042 55 55 #include <dev/pci/pcidevs.h> 56 56 57 #include <dev/wscons/wsconsio.h> 58 #include <dev/wscons/wsmousevar.h> 59 #include <dev/wscons/tpcalibvar.h> 60 57 61 #ifdef PVM 58 62 # undef PVM … … 100 104 /** Controller features, limits and status. */ 101 105 u_int vboxguest_state; 106 107 device_t sc_wsmousedev; 108 VMMDevReqMouseStatus *sc_vmmmousereq; 109 PVBOXGUESTSESSION sc_session; 110 struct tpcalib_softc sc_tpcalib; 102 111 } vboxguest_softc; 103 112 … … 120 129 static int VBoxGuestNetBSDMatch(device_t parent, cfdata_t match, void *aux); 121 130 static void VBoxGuestNetBSDAttach(device_t parent, device_t self, void *aux); 131 static void VBoxGuestNetBSDWsmAttach(vboxguest_softc *sc); 122 132 static int VBoxGuestNetBSDDetach(device_t self, int flags); 123 133 … … 137 147 static int VBoxGuestNetBSDIOCtlSlow(struct vboxguest_session *session, u_long command, void *data); 138 148 static int VBoxGuestNetBSDPoll(struct file *fp, int events); 149 150 /* 151 * wsmouse(4) accessops 152 */ 153 static int VBoxGuestNetBSDWsmEnable(void *cookie); 154 static void VBoxGuestNetBSDWsmDisable(void *cookie); 155 static int VBoxGuestNetBSDWsmIOCtl(void *cookie, u_long cmd, void *data, int flag, struct lwp *l); 156 157 static int VBoxGuestNetBSDSetMouseStatus(vboxguest_softc *sc, uint32_t fStatus); 139 158 140 159 … … 174 193 }; 175 194 195 196 const struct wsmouse_accessops vboxguest_wsm_accessops = { 197 VBoxGuestNetBSDWsmEnable, 198 VBoxGuestNetBSDWsmIOCtl, 199 VBoxGuestNetBSDWsmDisable, 200 }; 201 202 203 static struct wsmouse_calibcoords vboxguest_wsm_default_calib = { 204 .minx = VMMDEV_MOUSE_RANGE_MIN, 205 .miny = VMMDEV_MOUSE_RANGE_MIN, 206 .maxx = VMMDEV_MOUSE_RANGE_MAX, 207 .maxy = VMMDEV_MOUSE_RANGE_MAX, 208 .samplelen = WSMOUSE_CALIBCOORDS_RESET, 209 }; 210 176 211 /** Device extention & session data association structure. */ 177 212 static VBOXGUESTDEVEXT g_DevExt; 213 214 static vboxguest_softc *g_SC; 215 178 216 /** Reference counter */ 179 217 static volatile uint32_t cUsers; … … 189 227 { 190 228 const struct pci_attach_args *pa = aux; 229 230 if (RT_UNLIKELY(g_SC != NULL)) /* should not happen */ 231 return 0; 191 232 192 233 if ( PCI_VENDOR(pa->pa_id) == VMMDEV_VENDORID … … 210 251 bus_dma_segment_t seg; 211 252 int ioh_valid, memh_valid; 253 254 KASSERT(g_SC == NULL); 212 255 213 256 cUsers = 0; … … 271 314 { 272 315 vboxguest->vboxguest_state |= VBOXGUEST_STATE_INITOK; 316 VBoxGuestNetBSDWsmAttach(vboxguest); 317 318 g_SC = vboxguest; 273 319 return; 274 320 } … … 339 385 340 386 387 /* 388 * Optionally attach wsmouse(4) device as a child. 389 */ 390 static void VBoxGuestNetBSDWsmAttach(vboxguest_softc *sc) 391 { 392 struct wsmousedev_attach_args am = { &vboxguest_wsm_accessops, sc }; 393 394 PVBOXGUESTSESSION session = NULL; 395 VMMDevReqMouseStatus *req = NULL; 396 int rc; 397 398 rc = VGDrvCommonCreateKernelSession(&g_DevExt, &session); 399 if (RT_FAILURE(rc)) 400 goto fail; 401 402 rc = VbglR0GRAlloc((VMMDevRequestHeader **)&req, sizeof(*req), 403 VMMDevReq_GetMouseStatus); 404 if (RT_FAILURE(rc)) 405 goto fail; 406 407 sc->sc_wsmousedev = config_found_ia(sc->sc_dev, "wsmousedev", &am, wsmousedevprint); 408 if (sc->sc_wsmousedev == NULL) 409 goto fail; 410 411 sc->sc_session = session; 412 sc->sc_vmmmousereq = req; 413 414 tpcalib_init(&sc->sc_tpcalib); 415 tpcalib_ioctl(&sc->sc_tpcalib, WSMOUSEIO_SCALIBCOORDS, 416 &vboxguest_wsm_default_calib, 0, 0); 417 return; 418 419 fail: 420 if (session != NULL) 421 VGDrvCommonCloseSession(&g_DevExt, session); 422 if (req != NULL) 423 VbglR0GRFree((VMMDevRequestHeader *)req); 424 } 425 426 341 427 static int VBoxGuestNetBSDDetach(device_t self, int flags) 342 428 { … … 355 441 * Reverse what we did in VBoxGuestNetBSDAttach. 356 442 */ 443 if (vboxguest->sc_vmmmousereq != NULL) 444 VbglR0GRFree((VMMDevRequestHeader *)vboxguest->sc_vmmmousereq); 357 445 358 446 VBoxGuestNetBSDRemoveIRQ(vboxguest); … … 365 453 RTR0Term(); 366 454 367 return 0;455 return config_detach_children(self, flags); 368 456 } 369 457 … … 406 494 void VGDrvNativeISRMousePollEvent(PVBOXGUESTDEVEXT pDevExt) 407 495 { 496 vboxguest_softc *sc = g_SC; 497 408 498 LogFlow((DEVICE_NAME ": %s\n", __func__)); 409 499 … … 412 502 */ 413 503 selnotify(&g_SelInfo, 0, 0); 504 505 if (sc->sc_vmmmousereq != NULL) { 506 int x, y; 507 int rc; 508 509 sc->sc_vmmmousereq->mouseFeatures = 0; 510 sc->sc_vmmmousereq->pointerXPos = 0; 511 sc->sc_vmmmousereq->pointerYPos = 0; 512 513 rc = VbglR0GRPerform(&sc->sc_vmmmousereq->header); 514 if (RT_FAILURE(rc)) 515 return; 516 517 tpcalib_trans(&sc->sc_tpcalib, 518 sc->sc_vmmmousereq->pointerXPos, 519 sc->sc_vmmmousereq->pointerYPos, 520 &x, &y); 521 522 wsmouse_input(sc->sc_wsmousedev, 523 0, /* buttons */ 524 x, y, 525 0, 0, /* z, w */ 526 WSMOUSE_INPUT_ABSOLUTE_X | WSMOUSE_INPUT_ABSOLUTE_Y); 527 } 528 } 529 530 531 static int VBoxGuestNetBSDSetMouseStatus(vboxguest_softc *sc, uint32_t fStatus) 532 { 533 VBGLIOCSETMOUSESTATUS Req; 534 int rc; 535 536 VBGLREQHDR_INIT(&Req.Hdr, SET_MOUSE_STATUS); 537 Req.u.In.fStatus = fStatus; 538 rc = VGDrvCommonIoCtl(VBGL_IOCTL_SET_MOUSE_STATUS, 539 &g_DevExt, 540 sc->sc_session, 541 &Req.Hdr, sizeof(Req)); 542 if (RT_SUCCESS(rc)) 543 rc = Req.Hdr.rc; 544 545 return rc; 546 } 547 548 549 static int 550 VBoxGuestNetBSDWsmEnable(void *cookie) 551 { 552 vboxguest_softc *sc = cookie; 553 int rc; 554 555 rc = VBoxGuestNetBSDSetMouseStatus(sc, VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE 556 | VMMDEV_MOUSE_NEW_PROTOCOL); 557 if (RT_FAILURE(rc)) 558 return RTErrConvertToErrno(rc); 559 560 return 0; 561 } 562 563 564 static void 565 VBoxGuestNetBSDWsmDisable(void *cookie) 566 { 567 vboxguest_softc *sc = cookie; 568 VBoxGuestNetBSDSetMouseStatus(sc, 0); 569 } 570 571 572 static int 573 VBoxGuestNetBSDWsmIOCtl(void *cookie, u_long cmd, void *data, int flag, struct lwp *l) 574 { 575 vboxguest_softc *sc = cookie; 576 577 switch (cmd) { 578 case WSMOUSEIO_GTYPE: 579 *(u_int *)data = WSMOUSE_TYPE_TPANEL; 580 break; 581 582 case WSMOUSEIO_SCALIBCOORDS: 583 case WSMOUSEIO_GCALIBCOORDS: 584 return tpcalib_ioctl(&sc->sc_tpcalib, cmd, data, flag, l); 585 586 default: 587 return EPASSTHROUGH; 588 } 589 return 0; 414 590 } 415 591 … … 693 869 MODULE(MODULE_CLASS_DRIVER, vboxguest, "pci"); 694 870 695 CFDRIVER_DECL(vboxguest, DV_DULL, NULL); 871 static const struct cfiattrdata wsmousedevcf_iattrdata = { 872 "wsmousedev", 1, { 873 { "mux", "0", 0 }, 874 } 875 }; 876 877 /* device vboxguest: wsmousedev */ 878 static const struct cfiattrdata * const vboxguest_attrs[] = { &wsmousedevcf_iattrdata, NULL }; 879 CFDRIVER_DECL(vboxguest, DV_DULL, vboxguest_attrs); 696 880 697 881 static struct cfdriver * const cfdriver_ioconf_vboxguest[] = { … … 699 883 }; 700 884 701 static int loc[2] = { -1, -1 }; 702 703 static const struct cfparent pspec = { 885 886 static const struct cfparent vboxguest_pspec = { 704 887 "pci", "pci", DVUNIT_ANY 705 888 }; 706 707 /* vboxguest0 at pci? dev ? function ? */ 889 static int vboxguest_loc[] = { -1, -1 }; 890 891 892 static const struct cfparent wsmousedev_pspec = { 893 "wsmousedev", "vboxguest", DVUNIT_ANY 894 }; 895 static int wsmousedev_loc[] = { 0 }; 896 897 708 898 static struct cfdata cfdata_ioconf_vboxguest[] = { 899 /* vboxguest0 at pci? dev ? function ? */ 709 900 { 710 901 .cf_name = "vboxguest", … … 712 903 .cf_unit = 0, /* Only unit 0 is ever used */ 713 904 .cf_fstate = FSTATE_NOTFOUND, 714 .cf_loc = loc,905 .cf_loc = vboxguest_loc, 715 906 .cf_flags = 0, 716 .cf_pspec = & pspec,907 .cf_pspec = &vboxguest_pspec, 717 908 }, 909 910 /* wsmouse* at vboxguest? */ 911 { "wsmouse", "wsmouse", 0, FSTATE_STAR, wsmousedev_loc, 0, &wsmousedev_pspec }, 912 718 913 { NULL, NULL, 0, 0, NULL, 0, NULL } 719 914 };
Note:
See TracChangeset
for help on using the changeset viewer.