1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for DEC VSXXX-AA mouse (hockey-puck mouse, ball or two rollers)
4 * DEC VSXXX-GA mouse (rectangular mouse, with ball)
5 * DEC VSXXX-AB tablet (digitizer with hair cross or stylus)
7 * Copyright (C) 2003-2004 by Jan-Benedict Glaw <jbglaw@lug-owl.de>
9 * The packet format was initially taken from a patch to GPM which is (C) 2001
10 * by Karsten Merker <merker@linuxtag.org>
11 * and Maciej W. Rozycki <macro@ds2.pg.gda.pl>
12 * Later on, I had access to the device's documentation (referenced below).
19 * Building an adaptor to DE9 / DB25 RS232
20 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22 * DISCLAIMER: Use this description AT YOUR OWN RISK! I'll not pay for
23 * anything if you break your mouse, your computer or whatever!
25 * In theory, this mouse is a simple RS232 device. In practice, it has got
26 * a quite uncommon plug and the requirement to additionally get a power
27 * supply at +5V and -12V.
29 * If you look at the socket/jack (_not_ at the plug), we use this pin
37 * DEC socket DE9 DB25 Note
41 * 4 (-12V) - - Somewhere from the PSU. At ATX, it's
42 * the thin blue wire at pin 12 of the
43 * ATX power connector. Only required for
45 * 5 (+5V) - - PSU (red wires of ATX power connector
46 * on pin 4, 6, 19 or 20) or HDD power
47 * connector (also red wire).
48 * 6 (+12V) - - HDD power connector, yellow wire. Only
49 * required for VSXXX-AB digitizer.
50 * 7 (dev. avail.) - - The mouse shorts this one to pin 1.
51 * This way, the host computer can detect
52 * the mouse. To use it with the adaptor,
53 * simply don't connect this pin.
55 * So to get a working adaptor, you need to connect the mouse with three
56 * wires to a RS232 port and two or three additional wires for +5V, +12V and
59 * Flow specification for the link is 4800, 8o1.
61 * The mice and tablet are described in "VCB02 Video Subsystem - Technical
62 * Manual", DEC EK-104AA-TM-001. You'll find it at MANX, a search engine
63 * specific for DEC documentation. Try
64 * http://www.vt100.net/manx/details?pn=EK-104AA-TM-001;id=21;cp=1
67 #include <linux/delay.h>
68 #include <linux/module.h>
69 #include <linux/slab.h>
70 #include <linux/interrupt.h>
71 #include <linux/input.h>
72 #include <linux/serio.h>
74 #define DRIVER_DESC "Driver for DEC VSXXX-AA and -GA mice and VSXXX-AB tablet"
76 MODULE_AUTHOR("Jan-Benedict Glaw <jbglaw@lug-owl.de>");
77 MODULE_DESCRIPTION(DRIVER_DESC
);
78 MODULE_LICENSE("GPL");
82 #define DBG(x...) printk(x)
84 #define DBG(x...) do {} while (0)
87 #define VSXXXAA_INTRO_MASK 0x80
88 #define VSXXXAA_INTRO_HEAD 0x80
89 #define IS_HDR_BYTE(x) \
90 (((x) & VSXXXAA_INTRO_MASK) == VSXXXAA_INTRO_HEAD)
92 #define VSXXXAA_PACKET_MASK 0xe0
93 #define VSXXXAA_PACKET_REL 0x80
94 #define VSXXXAA_PACKET_ABS 0xc0
95 #define VSXXXAA_PACKET_POR 0xa0
96 #define MATCH_PACKET_TYPE(data, type) \
97 (((data) & VSXXXAA_PACKET_MASK) == (type))
102 struct input_dev
*dev
;
104 #define BUFLEN 15 /* At least 5 is needed for a full tablet packet */
105 unsigned char buf
[BUFLEN
];
107 unsigned char version
;
108 unsigned char country
;
114 static void vsxxxaa_drop_bytes(struct vsxxxaa
*mouse
, int num
)
116 if (num
>= mouse
->count
) {
119 memmove(mouse
->buf
, mouse
->buf
+ num
, BUFLEN
- num
);
124 static void vsxxxaa_queue_byte(struct vsxxxaa
*mouse
, unsigned char byte
)
126 if (mouse
->count
== BUFLEN
) {
127 printk(KERN_ERR
"%s on %s: Dropping a byte of full buffer.\n",
128 mouse
->name
, mouse
->phys
);
129 vsxxxaa_drop_bytes(mouse
, 1);
132 DBG(KERN_INFO
"Queueing byte 0x%02x\n", byte
);
134 mouse
->buf
[mouse
->count
++] = byte
;
137 static void vsxxxaa_detection_done(struct vsxxxaa
*mouse
)
139 switch (mouse
->type
) {
141 strlcpy(mouse
->name
, "DEC VSXXX-AA/-GA mouse",
142 sizeof(mouse
->name
));
146 strlcpy(mouse
->name
, "DEC VSXXX-AB digitizer",
147 sizeof(mouse
->name
));
151 snprintf(mouse
->name
, sizeof(mouse
->name
),
152 "unknown DEC pointer device (type = 0x%02x)",
158 "Found %s version 0x%02x from country 0x%02x on port %s\n",
159 mouse
->name
, mouse
->version
, mouse
->country
, mouse
->phys
);
163 * Returns number of bytes to be dropped, 0 if packet is okay.
165 static int vsxxxaa_check_packet(struct vsxxxaa
*mouse
, int packet_len
)
169 /* First byte must be a header byte */
170 if (!IS_HDR_BYTE(mouse
->buf
[0])) {
171 DBG("vsck: len=%d, 1st=0x%02x\n", packet_len
, mouse
->buf
[0]);
175 /* Check all following bytes */
176 for (i
= 1; i
< packet_len
; i
++) {
177 if (IS_HDR_BYTE(mouse
->buf
[i
])) {
179 "Need to drop %d bytes of a broken packet.\n",
181 DBG(KERN_INFO
"check: len=%d, b[%d]=0x%02x\n",
182 packet_len
, i
, mouse
->buf
[i
]);
190 static inline int vsxxxaa_smells_like_packet(struct vsxxxaa
*mouse
,
191 unsigned char type
, size_t len
)
193 return mouse
->count
>= len
&& MATCH_PACKET_TYPE(mouse
->buf
[0], type
);
196 static void vsxxxaa_handle_REL_packet(struct vsxxxaa
*mouse
)
198 struct input_dev
*dev
= mouse
->dev
;
199 unsigned char *buf
= mouse
->buf
;
200 int left
, middle
, right
;
204 * Check for normal stream packets. This is three bytes,
205 * with the first byte's 3 MSB set to 100.
207 * [0]: 1 0 0 SignX SignY Left Middle Right
208 * [1]: 0 dx dx dx dx dx dx dx
209 * [2]: 0 dy dy dy dy dy dy dy
213 * Low 7 bit of byte 1 are abs(dx), bit 7 is
214 * 0, bit 4 of byte 0 is direction.
217 dx
*= ((buf
[0] >> 4) & 0x01) ? 1 : -1;
220 * Low 7 bit of byte 2 are abs(dy), bit 7 is
221 * 0, bit 3 of byte 0 is direction.
224 dy
*= ((buf
[0] >> 3) & 0x01) ? -1 : 1;
227 * Get button state. It's the low three bits
228 * (for three buttons) of byte 0.
230 left
= buf
[0] & 0x04;
231 middle
= buf
[0] & 0x02;
232 right
= buf
[0] & 0x01;
234 vsxxxaa_drop_bytes(mouse
, 3);
236 DBG(KERN_INFO
"%s on %s: dx=%d, dy=%d, buttons=%s%s%s\n",
237 mouse
->name
, mouse
->phys
, dx
, dy
,
238 left
? "L" : "l", middle
? "M" : "m", right
? "R" : "r");
241 * Report what we've found so far...
243 input_report_key(dev
, BTN_LEFT
, left
);
244 input_report_key(dev
, BTN_MIDDLE
, middle
);
245 input_report_key(dev
, BTN_RIGHT
, right
);
246 input_report_key(dev
, BTN_TOUCH
, 0);
247 input_report_rel(dev
, REL_X
, dx
);
248 input_report_rel(dev
, REL_Y
, dy
);
252 static void vsxxxaa_handle_ABS_packet(struct vsxxxaa
*mouse
)
254 struct input_dev
*dev
= mouse
->dev
;
255 unsigned char *buf
= mouse
->buf
;
256 int left
, middle
, right
, touch
;
260 * Tablet position / button packet
262 * [0]: 1 1 0 B4 B3 B2 B1 Pr
263 * [1]: 0 0 X5 X4 X3 X2 X1 X0
264 * [2]: 0 0 X11 X10 X9 X8 X7 X6
265 * [3]: 0 0 Y5 Y4 Y3 Y2 Y1 Y0
266 * [4]: 0 0 Y11 Y10 Y9 Y8 Y7 Y6
270 * Get X/Y position. Y axis needs to be inverted since VSXXX-AB
271 * counts down->top while monitor counts top->bottom.
273 x
= ((buf
[2] & 0x3f) << 6) | (buf
[1] & 0x3f);
274 y
= ((buf
[4] & 0x3f) << 6) | (buf
[3] & 0x3f);
278 * Get button state. It's bits <4..1> of byte 0.
280 left
= buf
[0] & 0x02;
281 middle
= buf
[0] & 0x04;
282 right
= buf
[0] & 0x08;
283 touch
= buf
[0] & 0x10;
285 vsxxxaa_drop_bytes(mouse
, 5);
287 DBG(KERN_INFO
"%s on %s: x=%d, y=%d, buttons=%s%s%s%s\n",
288 mouse
->name
, mouse
->phys
, x
, y
,
289 left
? "L" : "l", middle
? "M" : "m",
290 right
? "R" : "r", touch
? "T" : "t");
293 * Report what we've found so far...
295 input_report_key(dev
, BTN_LEFT
, left
);
296 input_report_key(dev
, BTN_MIDDLE
, middle
);
297 input_report_key(dev
, BTN_RIGHT
, right
);
298 input_report_key(dev
, BTN_TOUCH
, touch
);
299 input_report_abs(dev
, ABS_X
, x
);
300 input_report_abs(dev
, ABS_Y
, y
);
304 static void vsxxxaa_handle_POR_packet(struct vsxxxaa
*mouse
)
306 struct input_dev
*dev
= mouse
->dev
;
307 unsigned char *buf
= mouse
->buf
;
308 int left
, middle
, right
;
312 * Check for Power-On-Reset packets. These are sent out
313 * after plugging the mouse in, or when explicitly
314 * requested by sending 'T'.
316 * [0]: 1 0 1 0 R3 R2 R1 R0
317 * [1]: 0 M2 M1 M0 D3 D2 D1 D0
318 * [2]: 0 E6 E5 E4 E3 E2 E1 E0
319 * [3]: 0 0 0 0 0 Left Middle Right
321 * M: manufacturer location code
323 * E: Error code. If it's in the range of 0x00..0x1f, only some
324 * minor problem occurred. Errors >= 0x20 are considered bad
325 * and the device may not work properly...
326 * D: <0010> == mouse, <0100> == tablet
329 mouse
->version
= buf
[0] & 0x0f;
330 mouse
->country
= (buf
[1] >> 4) & 0x07;
331 mouse
->type
= buf
[1] & 0x0f;
332 error
= buf
[2] & 0x7f;
335 * Get button state. It's the low three bits
336 * (for three buttons) of byte 0. Maybe even the bit <3>
337 * has some meaning if a tablet is attached.
339 left
= buf
[0] & 0x04;
340 middle
= buf
[0] & 0x02;
341 right
= buf
[0] & 0x01;
343 vsxxxaa_drop_bytes(mouse
, 4);
344 vsxxxaa_detection_done(mouse
);
347 /* No (serious) error. Report buttons */
348 input_report_key(dev
, BTN_LEFT
, left
);
349 input_report_key(dev
, BTN_MIDDLE
, middle
);
350 input_report_key(dev
, BTN_RIGHT
, right
);
351 input_report_key(dev
, BTN_TOUCH
, 0);
355 printk(KERN_INFO
"Your %s on %s reports error=0x%02x\n",
356 mouse
->name
, mouse
->phys
, error
);
361 * If the mouse was hot-plugged, we need to force differential mode
362 * now... However, give it a second to recover from it's reset.
365 "%s on %s: Forcing standard packet format, "
366 "incremental streaming mode and 72 samples/sec\n",
367 mouse
->name
, mouse
->phys
);
368 serio_write(mouse
->serio
, 'S'); /* Standard format */
370 serio_write(mouse
->serio
, 'R'); /* Incremental */
372 serio_write(mouse
->serio
, 'L'); /* 72 samples/sec */
375 static void vsxxxaa_parse_buffer(struct vsxxxaa
*mouse
)
377 unsigned char *buf
= mouse
->buf
;
381 * Parse buffer to death...
385 * Out of sync? Throw away what we don't understand. Each
386 * packet starts with a byte whose bit 7 is set. Unhandled
387 * packets (ie. which we don't know about or simply b0rk3d
388 * data...) will get shifted out of the buffer after some
389 * activity on the mouse.
391 while (mouse
->count
> 0 && !IS_HDR_BYTE(buf
[0])) {
392 printk(KERN_ERR
"%s on %s: Dropping a byte to regain "
393 "sync with mouse data stream...\n",
394 mouse
->name
, mouse
->phys
);
395 vsxxxaa_drop_bytes(mouse
, 1);
399 * Check for packets we know about.
402 if (vsxxxaa_smells_like_packet(mouse
, VSXXXAA_PACKET_REL
, 3)) {
403 /* Check for broken packet */
404 stray_bytes
= vsxxxaa_check_packet(mouse
, 3);
406 vsxxxaa_handle_REL_packet(mouse
);
408 } else if (vsxxxaa_smells_like_packet(mouse
,
409 VSXXXAA_PACKET_ABS
, 5)) {
410 /* Check for broken packet */
411 stray_bytes
= vsxxxaa_check_packet(mouse
, 5);
413 vsxxxaa_handle_ABS_packet(mouse
);
415 } else if (vsxxxaa_smells_like_packet(mouse
,
416 VSXXXAA_PACKET_POR
, 4)) {
417 /* Check for broken packet */
418 stray_bytes
= vsxxxaa_check_packet(mouse
, 4);
420 vsxxxaa_handle_POR_packet(mouse
);
423 break; /* No REL, ABS or POR packet found */
426 if (stray_bytes
> 0) {
427 printk(KERN_ERR
"Dropping %d bytes now...\n",
429 vsxxxaa_drop_bytes(mouse
, stray_bytes
);
435 static irqreturn_t
vsxxxaa_interrupt(struct serio
*serio
,
436 unsigned char data
, unsigned int flags
)
438 struct vsxxxaa
*mouse
= serio_get_drvdata(serio
);
440 vsxxxaa_queue_byte(mouse
, data
);
441 vsxxxaa_parse_buffer(mouse
);
446 static void vsxxxaa_disconnect(struct serio
*serio
)
448 struct vsxxxaa
*mouse
= serio_get_drvdata(serio
);
451 serio_set_drvdata(serio
, NULL
);
452 input_unregister_device(mouse
->dev
);
456 static int vsxxxaa_connect(struct serio
*serio
, struct serio_driver
*drv
)
458 struct vsxxxaa
*mouse
;
459 struct input_dev
*input_dev
;
462 mouse
= kzalloc(sizeof(struct vsxxxaa
), GFP_KERNEL
);
463 input_dev
= input_allocate_device();
464 if (!mouse
|| !input_dev
)
467 mouse
->dev
= input_dev
;
468 mouse
->serio
= serio
;
469 strlcat(mouse
->name
, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer",
470 sizeof(mouse
->name
));
471 snprintf(mouse
->phys
, sizeof(mouse
->phys
), "%s/input0", serio
->phys
);
473 input_dev
->name
= mouse
->name
;
474 input_dev
->phys
= mouse
->phys
;
475 input_dev
->id
.bustype
= BUS_RS232
;
476 input_dev
->dev
.parent
= &serio
->dev
;
478 __set_bit(EV_KEY
, input_dev
->evbit
); /* We have buttons */
479 __set_bit(EV_REL
, input_dev
->evbit
);
480 __set_bit(EV_ABS
, input_dev
->evbit
);
481 __set_bit(BTN_LEFT
, input_dev
->keybit
); /* We have 3 buttons */
482 __set_bit(BTN_MIDDLE
, input_dev
->keybit
);
483 __set_bit(BTN_RIGHT
, input_dev
->keybit
);
484 __set_bit(BTN_TOUCH
, input_dev
->keybit
); /* ...and Tablet */
485 __set_bit(REL_X
, input_dev
->relbit
);
486 __set_bit(REL_Y
, input_dev
->relbit
);
487 input_set_abs_params(input_dev
, ABS_X
, 0, 1023, 0, 0);
488 input_set_abs_params(input_dev
, ABS_Y
, 0, 1023, 0, 0);
490 serio_set_drvdata(serio
, mouse
);
492 err
= serio_open(serio
, drv
);
497 * Request selftest. Standard packet format and differential
498 * mode will be requested after the device ID'ed successfully.
500 serio_write(serio
, 'T'); /* Test */
502 err
= input_register_device(input_dev
);
508 fail3
: serio_close(serio
);
509 fail2
: serio_set_drvdata(serio
, NULL
);
510 fail1
: input_free_device(input_dev
);
515 static struct serio_device_id vsxxaa_serio_ids
[] = {
518 .proto
= SERIO_VSXXXAA
,
525 MODULE_DEVICE_TABLE(serio
, vsxxaa_serio_ids
);
527 static struct serio_driver vsxxxaa_drv
= {
531 .description
= DRIVER_DESC
,
532 .id_table
= vsxxaa_serio_ids
,
533 .connect
= vsxxxaa_connect
,
534 .interrupt
= vsxxxaa_interrupt
,
535 .disconnect
= vsxxxaa_disconnect
,
538 module_serio_driver(vsxxxaa_drv
);