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: |