View | Details | Raw Unified | Return to bug 238291 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/dev/atkbdc/psm.c (-14 / +26 lines)
Lines 4629-4635 proc_elantech(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms, Link Here
4629
	case ELANTECH_PKT_TRACKPOINT:
4629
	case ELANTECH_PKT_TRACKPOINT:
4630
		/*               7   6   5   4   3   2   1   0 (LSB)
4630
		/*               7   6   5   4   3   2   1   0 (LSB)
4631
		 * -------------------------------------------
4631
		 * -------------------------------------------
4632
		 * ipacket[0]:   0   0  SX  SY   0   M   R   L
4632
		 * ipacket[0]:   0   0 ~SX ~SY   0   M   R   L
4633
		 * ipacket[1]: ~SX   0   0   0   0   0   0   0
4633
		 * ipacket[1]: ~SX   0   0   0   0   0   0   0
4634
		 * ipacket[2]: ~SY   0   0   0   0   0   0   0
4634
		 * ipacket[2]: ~SY   0   0   0   0   0   0   0
4635
		 * ipacket[3]:   0   0 ~SY ~SX   0   1   1   0
4635
		 * ipacket[3]:   0   0 ~SY ~SX   0   1   1   0
Lines 4640-4661 proc_elantech(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms, Link Here
4640
		 * over 9 bits with SX/SY the relative top bit and
4640
		 * over 9 bits with SX/SY the relative top bit and
4641
		 * X7..X0 and Y7..Y0 the lower bits.
4641
		 * X7..X0 and Y7..Y0 the lower bits.
4642
		 */
4642
		 */
4643
		*x = (pb->ipacket[0] & 0x20) ?
4644
		    pb->ipacket[4] - 256 : pb->ipacket[4];
4645
		*y = (pb->ipacket[0] & 0x10) ?
4646
		    pb->ipacket[5] - 256 : pb->ipacket[5];
4647
4643
4648
		trackpoint_button =
4644
		/* Check zeros for presence and sign bits for equality */
4649
		    ((pb->ipacket[0] & 0x01) ? MOUSE_BUTTON1DOWN : 0) |
4645
		if (!(pb->ipacket[0] & 0xC8) && !(pb->ipacket[1] & 0x7F) &&
4650
		    ((pb->ipacket[0] & 0x02) ? MOUSE_BUTTON3DOWN : 0) |
4646
		    !(pb->ipacket[2] & 0x7F) && !(pb->ipacket[3] & 0xC9) &&
4651
		    ((pb->ipacket[0] & 0x04) ? MOUSE_BUTTON2DOWN : 0);
4647
		    !(pb->ipacket[0] & 0x20) == !(pb->ipacket[1] & 0x80) &&
4648
		    !(pb->ipacket[0] & 0x20) == !(pb->ipacket[3] & 0x10) &&
4649
		    !(pb->ipacket[0] & 0x10) == !(pb->ipacket[2] & 0x80) &&
4650
		    !(pb->ipacket[0] & 0x10) == !(pb->ipacket[3] & 0x20)) {
4651
4652
			*x = (pb->ipacket[0] & 0x20) ?
4653
			    pb->ipacket[4] : pb->ipacket[4] - 256;
4654
			*y = (pb->ipacket[0] & 0x10) ?
4655
			    pb->ipacket[5] : pb->ipacket[5] - 256;
4656
4657
			trackpoint_button =
4658
			    ((pb->ipacket[0] & 0x01) ? MOUSE_BUTTON1DOWN : 0) |
4659
			    ((pb->ipacket[0] & 0x02) ? MOUSE_BUTTON3DOWN : 0) |
4660
			    ((pb->ipacket[0] & 0x04) ? MOUSE_BUTTON2DOWN : 0);
4652
#ifdef EVDEV_SUPPORT
4661
#ifdef EVDEV_SUPPORT
4653
		evdev_push_rel(sc->evdev_r, REL_X, *x);
4662
			evdev_push_rel(sc->evdev_r, REL_X, *x);
4654
		evdev_push_rel(sc->evdev_r, REL_Y, -*y);
4663
			evdev_push_rel(sc->evdev_r, REL_Y, -*y);
4655
		evdev_push_mouse_btn(sc->evdev_r, trackpoint_button);
4664
			evdev_push_mouse_btn(sc->evdev_r, trackpoint_button);
4656
		evdev_sync(sc->evdev_r);
4665
			evdev_sync(sc->evdev_r);
4657
#endif
4666
#endif
4658
		ms->button = touchpad_button | trackpoint_button;
4667
			ms->button = touchpad_button | trackpoint_button;
4668
		} else
4669
			VLOG(3, (LOG_DEBUG, "elantech: "
4670
			    "unexpected trackpoint packet skipped\n"));
4659
		return (0);
4671
		return (0);
4660
4672
4661
	case ELANTECH_PKT_NOP:
4673
	case ELANTECH_PKT_NOP:

Return to bug 238291