Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Sep 2025 21:08:07 GMT
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 641f525a87c9 - main - cyapa(4): Add support for reporting data with sysmouse protocol
Message-ID:  <202509042108.584L87n2060977@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=641f525a87c9a32635ce51a102ebb5c0aa9ff921

commit 641f525a87c9a32635ce51a102ebb5c0aa9ff921
Author:     Vladimir Kondratyev <wulf@FreeBSD.org>
AuthorDate: 2025-09-04 21:07:25 +0000
Commit:     Vladimir Kondratyev <wulf@FreeBSD.org>
CommitDate: 2025-09-04 21:07:25 +0000

    cyapa(4): Add support for reporting data with sysmouse protocol
    
    Earlier only intellimouse protocol was supported.
---
 sys/dev/cyapa/cyapa.c | 95 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 59 insertions(+), 36 deletions(-)

diff --git a/sys/dev/cyapa/cyapa.c b/sys/dev/cyapa/cyapa.c
index 50fa4faa560a..ed755f992949 100644
--- a/sys/dev/cyapa/cyapa.c
+++ b/sys/dev/cyapa/cyapa.c
@@ -761,42 +761,60 @@ again:
 		/*
 		 * Generate report
 		 */
-		c0 = 0;
-		if (delta_x < 0)
-			c0 |= 0x10;
-		if (delta_y < 0)
-			c0 |= 0x20;
-		c0 |= 0x08;
-		if (but & CYAPA_FNGR_LEFT)
-			c0 |= 0x01;
-		if (but & CYAPA_FNGR_MIDDLE)
-			c0 |= 0x04;
-		if (but & CYAPA_FNGR_RIGHT)
-			c0 |= 0x02;
-
-		fifo_write_char(sc, &sc->rfifo, c0);
-		fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_x);
-		fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_y);
-		switch(sc->zenabled) {
-		case 1:
-			/* Z axis all 8 bits */
-			fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_z);
-			break;
-		case 2:
-			/*
-			 * Z axis low 4 bits + 4th button and 5th button
-			 * (high 2 bits must be left 0).  Auto-scale
-			 * delta_z to fit to avoid a wrong-direction
-			 * overflow (don't try to retain the remainder).
-			 */
-			while (delta_z > 7 || delta_z < -8)
-				delta_z >>= 1;
-			c0 = (uint8_t)delta_z & 0x0F;
+		if (sc->mode.level == 1) {
+			c0 = MOUSE_SYS_SYNC;
+			if (but & CYAPA_FNGR_LEFT)
+				c0 |= MOUSE_SYS_BUTTON1UP;
+			if (but & CYAPA_FNGR_MIDDLE)
+				c0 |= MOUSE_SYS_BUTTON2UP;
+			if (but & CYAPA_FNGR_RIGHT)
+				c0 |= MOUSE_SYS_BUTTON3UP;
 			fifo_write_char(sc, &sc->rfifo, c0);
-			break;
-		default:
-			/* basic PS/2 */
-			break;
+			fifo_write_char(sc, &sc->rfifo, delta_x >> 1);
+			fifo_write_char(sc, &sc->rfifo, delta_y >> 1);
+			fifo_write_char(sc, &sc->rfifo, delta_x - (delta_x >> 1));
+			fifo_write_char(sc, &sc->rfifo, delta_y - (delta_y >> 1));
+			fifo_write_char(sc, &sc->rfifo, delta_z >> 1);
+			fifo_write_char(sc, &sc->rfifo, delta_z - (delta_z >> 1));
+			fifo_write_char(sc, &sc->rfifo, MOUSE_SYS_EXTBUTTONS);
+		} else {
+			c0 = 0;
+			if (delta_x < 0)
+				c0 |= 0x10;
+			if (delta_y < 0)
+				c0 |= 0x20;
+			c0 |= 0x08;
+			if (but & CYAPA_FNGR_LEFT)
+				c0 |= 0x01;
+			if (but & CYAPA_FNGR_MIDDLE)
+				c0 |= 0x04;
+			if (but & CYAPA_FNGR_RIGHT)
+				c0 |= 0x02;
+
+			fifo_write_char(sc, &sc->rfifo, c0);
+			fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_x);
+			fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_y);
+			switch(sc->zenabled) {
+			case 1:
+				/* Z axis all 8 bits */
+				fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_z);
+				break;
+			case 2:
+				/*
+				 * Z axis low 4 bits + 4th button and 5th button
+				 * (high 2 bits must be left 0).  Auto-scale
+				 * delta_z to fit to avoid a wrong-direction
+				 * overflow (don't try to retain the remainder).
+				 */
+				while (delta_z > 7 || delta_z < -8)
+					delta_z >>= 1;
+				c0 = (uint8_t)delta_z & 0x0F;
+				fifo_write_char(sc, &sc->rfifo, c0);
+				break;
+			default:
+				/* basic PS/2 */
+				break;
+			}
 		}
 		cyapa_notify(sc);
 	}
@@ -1205,6 +1223,11 @@ cyapaioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread
 			((mousemode_t *)data)->packetsize =
 			    MOUSE_PS2_PACKETSIZE;
 			break;
+		case 1:
+			((mousemode_t *)data)->protocol = MOUSE_PROTO_SYSMOUSE;
+			((mousemode_t *)data)->packetsize =
+			    MOUSE_SYS_PACKETSIZE;
+			break;
 		case 2:
 			((mousemode_t *)data)->protocol = MOUSE_PROTO_PS2;
 			((mousemode_t *)data)->packetsize =
@@ -1223,7 +1246,7 @@ cyapaioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread
 			error = EINVAL;
 			break;
 		}
-		sc->mode.level = *(int *)data ? 2 : 0;
+		sc->mode.level = *(int *)data;
 		sc->zenabled = sc->mode.level ? 1 : 0;
 		break;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202509042108.584L87n2060977>