Lines Matching +full:report +full:- +full:rate +full:- +full:hz

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
120 #define UMS_FLAG_REVZ 0x0020 /* Z-axis is reversed */
209 mtx_assert(&sc->sc_mtx, MA_OWNED); in ums_put_queue_timeout()
221 struct ums_info *info = &sc->sc_info[0]; in ums_intr_callback()
223 uint8_t *buf = sc->sc_temp; in ums_intr_callback()
244 if (len > (int)sizeof(sc->sc_temp)) { in ums_intr_callback()
246 sizeof(sc->sc_temp)); in ums_intr_callback()
247 len = sizeof(sc->sc_temp); in ums_intr_callback()
262 if (sc->sc_iid) { in ums_intr_callback()
265 len--; in ums_intr_callback()
270 if (sc->sc_info[0].sc_flags & UMS_FLAG_SBU) { in ums_intr_callback()
278 if ((info->sc_flags & UMS_FLAG_W_AXIS) && in ums_intr_callback()
279 (id == info->sc_iid_w)) in ums_intr_callback()
280 dw += hid_get_data(buf, len, &info->sc_loc_w); in ums_intr_callback()
282 if ((info->sc_flags & UMS_FLAG_X_AXIS) && in ums_intr_callback()
283 (id == info->sc_iid_x)) in ums_intr_callback()
284 dx += hid_get_data(buf, len, &info->sc_loc_x); in ums_intr_callback()
286 if ((info->sc_flags & UMS_FLAG_Y_AXIS) && in ums_intr_callback()
287 (id == info->sc_iid_y)) in ums_intr_callback()
288 dy -= hid_get_data(buf, len, &info->sc_loc_y); in ums_intr_callback()
290 if ((info->sc_flags & UMS_FLAG_Z_AXIS) && in ums_intr_callback()
291 (id == info->sc_iid_z)) { in ums_intr_callback()
293 temp = hid_get_data(buf, len, &info->sc_loc_z); in ums_intr_callback()
294 if (info->sc_flags & UMS_FLAG_REVZ) in ums_intr_callback()
295 temp = -temp; in ums_intr_callback()
296 dz -= temp; in ums_intr_callback()
299 if ((info->sc_flags & UMS_FLAG_T_AXIS) && in ums_intr_callback()
300 (id == info->sc_iid_t)) { in ums_intr_callback()
301 dt += hid_get_data(buf, len, &info->sc_loc_t); in ums_intr_callback()
302 /* T-axis is translated into button presses */ in ums_intr_callback()
306 for (i = 0; i < info->sc_buttons; i++) { in ums_intr_callback()
310 if (id != info->sc_iid_btn[i]) in ums_intr_callback()
313 if (hid_get_data(buf, len, &info->sc_loc_btn[i])) in ums_intr_callback()
319 if (++info != &sc->sc_info[UMS_INFO_MAX]) in ums_intr_callback()
322 /* keep old button value(s) for non-detected buttons */ in ums_intr_callback()
323 buttons |= sc->sc_status.button & ~buttons_found; in ums_intr_callback()
330 (buttons != sc->sc_status.button)) { in ums_intr_callback()
334 /* translate T-axis into button presses until further */ in ums_intr_callback()
343 sc->sc_status.button = buttons; in ums_intr_callback()
344 sc->sc_status.dx += dx; in ums_intr_callback()
345 sc->sc_status.dy += dy; in ums_intr_callback()
346 sc->sc_status.dz += dz; in ums_intr_callback()
348 * sc->sc_status.dt += dt; in ums_intr_callback()
362 if ((sc->sc_info[0].sc_flags & UMS_FLAG_SBU) && in ums_intr_callback()
365 usb_callout_reset(&sc->sc_callout, hz / 20, in ums_intr_callback()
368 usb_callout_stop(&sc->sc_callout); in ums_intr_callback()
380 if (usb_fifo_put_bytes_max(sc->sc_fifo.fp[USB_FIFO_RX]) == 0) { in ums_intr_callback()
382 if ((sc->sc_evflags & UMS_EVDEV_OPENED) == 0) in ums_intr_callback()
431 if (uaa->usb_mode != USB_MODE_HOST) in ums_probe()
434 if (uaa->info.bInterfaceClass != UICLASS_HID) in ums_probe()
440 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) && in ums_probe()
441 (uaa->info.bInterfaceProtocol == UIPROTO_MOUSE)) in ums_probe()
444 error = usbd_req_get_hid_desc(uaa->device, NULL, in ums_probe()
445 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex); in ums_probe()
463 struct ums_info *info = &sc->sc_info[index]; in ums_hid_parse()
469 hid_input, index, &info->sc_loc_x, &flags, &info->sc_iid_x)) { in ums_hid_parse()
471 info->sc_flags |= UMS_FLAG_X_AXIS; in ums_hid_parse()
475 hid_input, index, &info->sc_loc_y, &flags, &info->sc_iid_y)) { in ums_hid_parse()
477 info->sc_flags |= UMS_FLAG_Y_AXIS; in ums_hid_parse()
482 HUG_WHEEL), hid_input, index, &info->sc_loc_z, &flags, in ums_hid_parse()
483 &info->sc_iid_z) || in ums_hid_parse()
485 HUG_TWHEEL), hid_input, index, &info->sc_loc_z, &flags, in ums_hid_parse()
486 &info->sc_iid_z)) { in ums_hid_parse()
488 info->sc_flags |= UMS_FLAG_Z_AXIS; in ums_hid_parse()
495 HUG_Z), hid_input, index, &info->sc_loc_w, &flags, in ums_hid_parse()
496 &info->sc_iid_w)) { in ums_hid_parse()
498 info->sc_flags |= UMS_FLAG_W_AXIS; in ums_hid_parse()
502 HUG_Z), hid_input, index, &info->sc_loc_z, &flags, in ums_hid_parse()
503 &info->sc_iid_z)) { in ums_hid_parse()
505 info->sc_flags |= UMS_FLAG_Z_AXIS; in ums_hid_parse()
516 HUG_TWHEEL), hid_input, index, &info->sc_loc_t, in ums_hid_parse()
517 &flags, &info->sc_iid_t)) { in ums_hid_parse()
518 info->sc_loc_t.pos += 8; in ums_hid_parse()
521 info->sc_flags |= UMS_FLAG_T_AXIS; in ums_hid_parse()
524 HUC_AC_PAN), hid_input, index, &info->sc_loc_t, in ums_hid_parse()
525 &flags, &info->sc_iid_t)) { in ums_hid_parse()
527 info->sc_flags |= UMS_FLAG_T_AXIS; in ums_hid_parse()
533 hid_input, index, &info->sc_loc_btn[i], NULL, in ums_hid_parse()
534 &info->sc_iid_btn[i])) { in ums_hid_parse()
540 if (info->sc_flags & UMS_FLAG_VBTN) { in ums_hid_parse()
543 (j + 1)), hid_input, index, &info->sc_loc_btn[i], in ums_hid_parse()
544 NULL, &info->sc_iid_btn[i])) { in ums_hid_parse()
550 info->sc_buttons = i; in ums_hid_parse()
552 if (i > sc->sc_buttons) in ums_hid_parse()
553 sc->sc_buttons = i; in ums_hid_parse()
555 if (info->sc_flags == 0) in ums_hid_parse()
560 (info->sc_buttons), in ums_hid_parse()
561 (info->sc_flags & UMS_FLAG_X_AXIS) ? "X" : "", in ums_hid_parse()
562 (info->sc_flags & UMS_FLAG_Y_AXIS) ? "Y" : "", in ums_hid_parse()
563 (info->sc_flags & UMS_FLAG_Z_AXIS) ? "Z" : "", in ums_hid_parse()
564 (info->sc_flags & UMS_FLAG_T_AXIS) ? "T" : "", in ums_hid_parse()
565 (info->sc_flags & UMS_FLAG_W_AXIS) ? "W" : "", in ums_hid_parse()
566 info->sc_iid_x); in ums_hid_parse()
588 mtx_init(&sc->sc_mtx, "ums lock", NULL, MTX_DEF | MTX_RECURSE); in ums_attach()
590 usb_callout_init_mtx(&sc->sc_callout, &sc->sc_mtx, 0); in ums_attach()
593 * Force the report (non-boot) protocol. in ums_attach()
598 err = usbd_req_set_protocol(uaa->device, NULL, in ums_attach()
599 uaa->info.bIfaceIndex, 1); in ums_attach()
601 err = usbd_transfer_setup(uaa->device, in ums_attach()
602 &uaa->info.bIfaceIndex, sc->sc_xfer, ums_config, in ums_attach()
603 UMS_N_TRANSFER, sc, &sc->sc_mtx); in ums_attach()
611 err = usbd_req_get_hid_desc(uaa->device, NULL, &d_ptr, in ums_attach()
612 &d_len, M_TEMP, uaa->info.bIfaceIndex); in ums_attach()
615 device_printf(dev, "error reading report description\n"); in ums_attach()
619 isize = hid_report_size_max(d_ptr, d_len, hid_input, &sc->sc_iid); in ums_attach()
623 sc->sc_info[i].sc_flags |= UMS_FLAG_VBTN; in ums_attach()
632 sc->sc_iid = 0; in ums_attach()
634 info = &sc->sc_info[0]; in ums_attach()
635 info->sc_flags = (UMS_FLAG_X_AXIS | in ums_attach()
639 info->sc_buttons = 3; in ums_attach()
641 /* 1st byte of descriptor report contains garbage */ in ums_attach()
642 info->sc_loc_x.pos = 16; in ums_attach()
643 info->sc_loc_x.size = 8; in ums_attach()
644 info->sc_loc_y.pos = 24; in ums_attach()
645 info->sc_loc_y.size = 8; in ums_attach()
646 info->sc_loc_z.pos = 32; in ums_attach()
647 info->sc_loc_z.size = 8; in ums_attach()
648 info->sc_loc_btn[0].pos = 8; in ums_attach()
649 info->sc_loc_btn[0].size = 1; in ums_attach()
650 info->sc_loc_btn[1].pos = 9; in ums_attach()
651 info->sc_loc_btn[1].size = 1; in ums_attach()
652 info->sc_loc_btn[2].pos = 10; in ums_attach()
653 info->sc_loc_btn[2].size = 1; in ums_attach()
667 info = &sc->sc_info[0]; in ums_attach()
669 info->sc_flags |= UMS_FLAG_REVZ; in ums_attach()
671 if (isize > (int)usbd_xfer_max_framelen(sc->sc_xfer[UMS_INTR_DT])) { in ums_attach()
672 DPRINTF("WARNING: report size, %d bytes, is larger " in ums_attach()
674 usbd_xfer_max_framelen(sc->sc_xfer[UMS_INTR_DT])); in ums_attach()
681 info = &sc->sc_info[j]; in ums_attach()
684 DPRINTF("X\t%d/%d id=%d\n", info->sc_loc_x.pos, in ums_attach()
685 info->sc_loc_x.size, info->sc_iid_x); in ums_attach()
686 DPRINTF("Y\t%d/%d id=%d\n", info->sc_loc_y.pos, in ums_attach()
687 info->sc_loc_y.size, info->sc_iid_y); in ums_attach()
688 DPRINTF("Z\t%d/%d id=%d\n", info->sc_loc_z.pos, in ums_attach()
689 info->sc_loc_z.size, info->sc_iid_z); in ums_attach()
690 DPRINTF("T\t%d/%d id=%d\n", info->sc_loc_t.pos, in ums_attach()
691 info->sc_loc_t.size, info->sc_iid_t); in ums_attach()
692 DPRINTF("W\t%d/%d id=%d\n", info->sc_loc_w.pos, in ums_attach()
693 info->sc_loc_w.size, info->sc_iid_w); in ums_attach()
695 for (i = 0; i < info->sc_buttons; i++) { in ums_attach()
697 i + 1, info->sc_loc_btn[i].pos, in ums_attach()
698 info->sc_loc_btn[i].size, info->sc_iid_btn[i]); in ums_attach()
701 DPRINTF("size=%d, id=%d\n", isize, sc->sc_iid); in ums_attach()
704 err = usb_fifo_attach(uaa->device, sc, &sc->sc_mtx, in ums_attach()
705 &ums_fifo_methods, &sc->sc_fifo, in ums_attach()
706 device_get_unit(dev), -1, uaa->info.bIfaceIndex, in ums_attach()
712 sc->sc_evdev = evdev_alloc(); in ums_attach()
713 evdev_set_name(sc->sc_evdev, device_get_desc(dev)); in ums_attach()
714 evdev_set_phys(sc->sc_evdev, device_get_nameunit(dev)); in ums_attach()
715 evdev_set_id(sc->sc_evdev, BUS_USB, uaa->info.idVendor, in ums_attach()
716 uaa->info.idProduct, 0); in ums_attach()
717 evdev_set_serial(sc->sc_evdev, usb_get_serial(uaa->device)); in ums_attach()
718 evdev_set_methods(sc->sc_evdev, sc, &ums_evdev_methods); in ums_attach()
719 evdev_support_prop(sc->sc_evdev, INPUT_PROP_POINTER); in ums_attach()
720 evdev_support_event(sc->sc_evdev, EV_SYN); in ums_attach()
721 evdev_support_event(sc->sc_evdev, EV_REL); in ums_attach()
722 evdev_support_event(sc->sc_evdev, EV_KEY); in ums_attach()
724 info = &sc->sc_info[0]; in ums_attach()
726 if (info->sc_flags & UMS_FLAG_X_AXIS) in ums_attach()
727 evdev_support_rel(sc->sc_evdev, REL_X); in ums_attach()
729 if (info->sc_flags & UMS_FLAG_Y_AXIS) in ums_attach()
730 evdev_support_rel(sc->sc_evdev, REL_Y); in ums_attach()
732 if (info->sc_flags & UMS_FLAG_Z_AXIS) in ums_attach()
733 evdev_support_rel(sc->sc_evdev, REL_WHEEL); in ums_attach()
735 if (info->sc_flags & UMS_FLAG_T_AXIS) in ums_attach()
736 evdev_support_rel(sc->sc_evdev, REL_HWHEEL); in ums_attach()
738 for (i = 0; i < info->sc_buttons; i++) in ums_attach()
739 evdev_support_key(sc->sc_evdev, BTN_MOUSE + i); in ums_attach()
741 err = evdev_register_mtx(sc->sc_evdev, &sc->sc_mtx); in ums_attach()
751 "Dump of parsed HID report descriptor"); in ums_attach()
770 usb_fifo_detach(&sc->sc_fifo); in ums_detach()
773 evdev_free(sc->sc_evdev); in ums_detach()
776 usbd_transfer_unsetup(sc->sc_xfer, UMS_N_TRANSFER); in ums_detach()
778 usb_callout_drain(&sc->sc_callout); in ums_detach()
780 mtx_destroy(&sc->sc_mtx); in ums_detach()
791 if (sc->sc_buttons > MOUSE_MSC_MAXBUTTON) in ums_reset()
792 sc->sc_hw.buttons = MOUSE_MSC_MAXBUTTON; in ums_reset()
794 sc->sc_hw.buttons = sc->sc_buttons; in ums_reset()
796 sc->sc_hw.iftype = MOUSE_IF_USB; in ums_reset()
797 sc->sc_hw.type = MOUSE_MOUSE; in ums_reset()
798 sc->sc_hw.model = MOUSE_MODEL_GENERIC; in ums_reset()
799 sc->sc_hw.hwid = 0; in ums_reset()
801 sc->sc_mode.protocol = MOUSE_PROTO_MSC; in ums_reset()
802 sc->sc_mode.rate = -1; in ums_reset()
803 sc->sc_mode.resolution = MOUSE_RES_UNKNOWN; in ums_reset()
804 sc->sc_mode.accelfactor = 0; in ums_reset()
805 sc->sc_mode.level = 0; in ums_reset()
806 sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; in ums_reset()
807 sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; in ums_reset()
808 sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; in ums_reset()
812 sc->sc_status.flags = 0; in ums_reset()
813 sc->sc_status.button = 0; in ums_reset()
814 sc->sc_status.obutton = 0; in ums_reset()
815 sc->sc_status.dx = 0; in ums_reset()
816 sc->sc_status.dy = 0; in ums_reset()
817 sc->sc_status.dz = 0; in ums_reset()
818 /* sc->sc_status.dt = 0; */ in ums_reset()
824 int rate; in ums_start_rx() local
827 rate = sc->sc_pollrate; in ums_start_rx()
828 /* Range check rate */ in ums_start_rx()
829 if (rate > 1000) in ums_start_rx()
830 rate = 1000; in ums_start_rx()
831 /* Check for set rate */ in ums_start_rx()
832 if ((rate > 0) && (sc->sc_xfer[UMS_INTR_DT] != NULL)) { in ums_start_rx()
833 DPRINTF("Setting pollrate = %d\n", rate); in ums_start_rx()
835 usbd_transfer_stop(sc->sc_xfer[UMS_INTR_DT]); in ums_start_rx()
837 usbd_xfer_set_interval(sc->sc_xfer[UMS_INTR_DT], 1000 / rate); in ums_start_rx()
839 sc->sc_pollrate = 0; in ums_start_rx()
842 usbd_transfer_start(sc->sc_xfer[UMS_INTR_DT]); in ums_start_rx()
848 usbd_transfer_stop(sc->sc_xfer[UMS_INTR_DT]); in ums_stop_rx()
849 usb_callout_stop(&sc->sc_callout); in ums_stop_rx()
866 if ((sc->sc_evflags & UMS_EVDEV_OPENED) == 0) in ums_fifo_stop_read()
883 if (evdev_is_grabbed(sc->sc_evdev)) in ums_put_queue()
889 if (dx < -256) in ums_put_queue()
890 dx = -256; in ums_put_queue()
893 if (dy < -256) in ums_put_queue()
894 dy = -256; in ums_put_queue()
897 if (dz < -128) in ums_put_queue()
898 dz = -128; in ums_put_queue()
901 if (dt < -128) in ums_put_queue()
902 dt = -128; in ums_put_queue()
904 buf[0] = sc->sc_mode.syncmask[1]; in ums_put_queue()
908 buf[3] = dx - (dx >> 1); in ums_put_queue()
909 buf[4] = dy - (dy >> 1); in ums_put_queue()
911 if (sc->sc_mode.level == 1) { in ums_put_queue()
913 buf[6] = dz - (dz >> 1); in ums_put_queue()
916 usb_fifo_put_data_linear(sc->sc_fifo.fp[USB_FIFO_RX], buf, in ums_put_queue()
917 sc->sc_mode.packetsize, 1); in ums_put_queue()
930 evdev_push_rel(sc->sc_evdev, REL_X, dx); in ums_evdev_push()
931 evdev_push_rel(sc->sc_evdev, REL_Y, -dy); in ums_evdev_push()
932 evdev_push_rel(sc->sc_evdev, REL_WHEEL, -dz); in ums_evdev_push()
933 evdev_push_rel(sc->sc_evdev, REL_HWHEEL, dt); in ums_evdev_push()
934 evdev_push_mouse_btn(sc->sc_evdev, in ums_evdev_push()
939 evdev_sync(sc->sc_evdev); in ums_evdev_push()
948 usb_fifo_reset(sc->sc_fifo.fp[USB_FIFO_RX]); in ums_reset_buf()
957 mtx_assert(&sc->sc_mtx, MA_OWNED); in ums_ev_open()
959 sc->sc_evflags |= UMS_EVDEV_OPENED; in ums_ev_open()
961 if (sc->sc_fflags == 0) { in ums_ev_open()
974 mtx_assert(&sc->sc_mtx, MA_OWNED); in ums_ev_close()
976 sc->sc_evflags &= ~UMS_EVDEV_OPENED; in ums_ev_close()
978 if (sc->sc_fflags == 0) in ums_ev_close()
993 if (sc->sc_fflags & fflags) in ums_fifo_open()
998 if (sc->sc_fflags == 0 && (sc->sc_evflags & UMS_EVDEV_OPENED) == 0) in ums_fifo_open()
1001 if (sc->sc_fflags == 0) in ums_fifo_open()
1013 sc->sc_fflags |= fflags & (FREAD | FWRITE); in ums_fifo_open()
1027 sc->sc_fflags &= ~(fflags & (FREAD | FWRITE)); in ums_fifo_close()
1039 mtx_lock(&sc->sc_mtx); in ums_fifo_ioctl()
1043 *(mousehw_t *)addr = sc->sc_hw; in ums_fifo_ioctl()
1047 *(mousemode_t *)addr = sc->sc_mode; in ums_fifo_ioctl()
1053 if (mode.level == -1) { in ums_fifo_ioctl()
1059 sc->sc_mode.level = mode.level; in ums_fifo_ioctl()
1062 /* store polling rate */ in ums_fifo_ioctl()
1063 sc->sc_pollrate = mode.rate; in ums_fifo_ioctl()
1065 if (sc->sc_mode.level == 0) { in ums_fifo_ioctl()
1066 if (sc->sc_buttons > MOUSE_MSC_MAXBUTTON) in ums_fifo_ioctl()
1067 sc->sc_hw.buttons = MOUSE_MSC_MAXBUTTON; in ums_fifo_ioctl()
1069 sc->sc_hw.buttons = sc->sc_buttons; in ums_fifo_ioctl()
1070 sc->sc_mode.protocol = MOUSE_PROTO_MSC; in ums_fifo_ioctl()
1071 sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; in ums_fifo_ioctl()
1072 sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; in ums_fifo_ioctl()
1073 sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; in ums_fifo_ioctl()
1074 } else if (sc->sc_mode.level == 1) { in ums_fifo_ioctl()
1075 if (sc->sc_buttons > MOUSE_SYS_MAXBUTTON) in ums_fifo_ioctl()
1076 sc->sc_hw.buttons = MOUSE_SYS_MAXBUTTON; in ums_fifo_ioctl()
1078 sc->sc_hw.buttons = sc->sc_buttons; in ums_fifo_ioctl()
1079 sc->sc_mode.protocol = MOUSE_PROTO_SYSMOUSE; in ums_fifo_ioctl()
1080 sc->sc_mode.packetsize = MOUSE_SYS_PACKETSIZE; in ums_fifo_ioctl()
1081 sc->sc_mode.syncmask[0] = MOUSE_SYS_SYNCMASK; in ums_fifo_ioctl()
1082 sc->sc_mode.syncmask[1] = MOUSE_SYS_SYNC; in ums_fifo_ioctl()
1088 *(int *)addr = sc->sc_mode.level; in ums_fifo_ioctl()
1096 sc->sc_mode.level = *(int *)addr; in ums_fifo_ioctl()
1098 if (sc->sc_mode.level == 0) { in ums_fifo_ioctl()
1099 if (sc->sc_buttons > MOUSE_MSC_MAXBUTTON) in ums_fifo_ioctl()
1100 sc->sc_hw.buttons = MOUSE_MSC_MAXBUTTON; in ums_fifo_ioctl()
1102 sc->sc_hw.buttons = sc->sc_buttons; in ums_fifo_ioctl()
1103 sc->sc_mode.protocol = MOUSE_PROTO_MSC; in ums_fifo_ioctl()
1104 sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; in ums_fifo_ioctl()
1105 sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; in ums_fifo_ioctl()
1106 sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; in ums_fifo_ioctl()
1107 } else if (sc->sc_mode.level == 1) { in ums_fifo_ioctl()
1108 if (sc->sc_buttons > MOUSE_SYS_MAXBUTTON) in ums_fifo_ioctl()
1109 sc->sc_hw.buttons = MOUSE_SYS_MAXBUTTON; in ums_fifo_ioctl()
1111 sc->sc_hw.buttons = sc->sc_buttons; in ums_fifo_ioctl()
1112 sc->sc_mode.protocol = MOUSE_PROTO_SYSMOUSE; in ums_fifo_ioctl()
1113 sc->sc_mode.packetsize = MOUSE_SYS_PACKETSIZE; in ums_fifo_ioctl()
1114 sc->sc_mode.syncmask[0] = MOUSE_SYS_SYNCMASK; in ums_fifo_ioctl()
1115 sc->sc_mode.syncmask[1] = MOUSE_SYS_SYNC; in ums_fifo_ioctl()
1123 *status = sc->sc_status; in ums_fifo_ioctl()
1124 sc->sc_status.obutton = sc->sc_status.button; in ums_fifo_ioctl()
1125 sc->sc_status.button = 0; in ums_fifo_ioctl()
1126 sc->sc_status.dx = 0; in ums_fifo_ioctl()
1127 sc->sc_status.dy = 0; in ums_fifo_ioctl()
1128 sc->sc_status.dz = 0; in ums_fifo_ioctl()
1129 /* sc->sc_status.dt = 0; */ in ums_fifo_ioctl()
1131 if (status->dx || status->dy || status->dz /* || status->dt */ ) { in ums_fifo_ioctl()
1132 status->flags |= MOUSE_POSCHANGED; in ums_fifo_ioctl()
1134 if (status->button != status->obutton) { in ums_fifo_ioctl()
1135 status->flags |= MOUSE_BUTTONSCHANGED; in ums_fifo_ioctl()
1144 mtx_unlock(&sc->sc_mtx); in ums_fifo_ioctl()
1158 info = &sc->sc_info[i]; in ums_sysctl_handler_parseinfo()
1161 if ((info->sc_flags & in ums_sysctl_handler_parseinfo()
1164 info->sc_buttons == 0) in ums_sysctl_handler_parseinfo()
1171 if (info->sc_flags & UMS_FLAG_X_AXIS) in ums_sysctl_handler_parseinfo()
1173 (int)info->sc_iid_x, in ums_sysctl_handler_parseinfo()
1174 (int)info->sc_loc_x.pos, in ums_sysctl_handler_parseinfo()
1175 (int)info->sc_loc_x.size); in ums_sysctl_handler_parseinfo()
1176 if (info->sc_flags & UMS_FLAG_Y_AXIS) in ums_sysctl_handler_parseinfo()
1178 (int)info->sc_iid_y, in ums_sysctl_handler_parseinfo()
1179 (int)info->sc_loc_y.pos, in ums_sysctl_handler_parseinfo()
1180 (int)info->sc_loc_y.size); in ums_sysctl_handler_parseinfo()
1181 if (info->sc_flags & UMS_FLAG_Z_AXIS) in ums_sysctl_handler_parseinfo()
1183 (int)info->sc_iid_z, in ums_sysctl_handler_parseinfo()
1184 (int)info->sc_loc_z.pos, in ums_sysctl_handler_parseinfo()
1185 (int)info->sc_loc_z.size); in ums_sysctl_handler_parseinfo()
1186 if (info->sc_flags & UMS_FLAG_T_AXIS) in ums_sysctl_handler_parseinfo()
1188 (int)info->sc_iid_t, in ums_sysctl_handler_parseinfo()
1189 (int)info->sc_loc_t.pos, in ums_sysctl_handler_parseinfo()
1190 (int)info->sc_loc_t.size); in ums_sysctl_handler_parseinfo()
1191 if (info->sc_flags & UMS_FLAG_W_AXIS) in ums_sysctl_handler_parseinfo()
1193 (int)info->sc_iid_w, in ums_sysctl_handler_parseinfo()
1194 (int)info->sc_loc_w.pos, in ums_sysctl_handler_parseinfo()
1195 (int)info->sc_loc_w.size); in ums_sysctl_handler_parseinfo()
1197 for (j = 0; j < info->sc_buttons; j++) { in ums_sysctl_handler_parseinfo()
1199 (int)info->sc_iid_btn[j], in ums_sysctl_handler_parseinfo()
1200 (int)info->sc_loc_btn[j].pos, in ums_sysctl_handler_parseinfo()
1201 (int)info->sc_loc_btn[j].size); in ums_sysctl_handler_parseinfo()