xref: /plan9/sys/src/9/pc/psaux.c (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
1*3ff48bf5SDavid du Colombier /*
2*3ff48bf5SDavid du Colombier  * Interface to raw PS/2 aux port.
3*3ff48bf5SDavid du Colombier  * Used by user-level mouse daemon.
4*3ff48bf5SDavid du Colombier  */
5*3ff48bf5SDavid du Colombier 
6*3ff48bf5SDavid du Colombier #include "u.h"
7*3ff48bf5SDavid du Colombier #include "../port/lib.h"
8*3ff48bf5SDavid du Colombier #include "mem.h"
9*3ff48bf5SDavid du Colombier #include "dat.h"
10*3ff48bf5SDavid du Colombier #include "fns.h"
11*3ff48bf5SDavid du Colombier #include "../port/error.h"
12*3ff48bf5SDavid du Colombier #include "io.h"
13*3ff48bf5SDavid du Colombier 
14*3ff48bf5SDavid du Colombier #define Image	IMAGE
15*3ff48bf5SDavid du Colombier #include <draw.h>
16*3ff48bf5SDavid du Colombier #include <memdraw.h>
17*3ff48bf5SDavid du Colombier #include <cursor.h>
18*3ff48bf5SDavid du Colombier #include "screen.h"
19*3ff48bf5SDavid du Colombier 
20*3ff48bf5SDavid du Colombier /*
21*3ff48bf5SDavid du Colombier  * BUG: we ignore shift here.
22*3ff48bf5SDavid du Colombier  * we need a more general solution,
23*3ff48bf5SDavid du Colombier  * one that will also work for serial mice.
24*3ff48bf5SDavid du Colombier  */
25*3ff48bf5SDavid du Colombier Queue *psauxq;
26*3ff48bf5SDavid du Colombier 
27*3ff48bf5SDavid du Colombier static void
psauxputc(int c,int)28*3ff48bf5SDavid du Colombier psauxputc(int c, int)
29*3ff48bf5SDavid du Colombier {
30*3ff48bf5SDavid du Colombier 	uchar uc;
31*3ff48bf5SDavid du Colombier 
32*3ff48bf5SDavid du Colombier 	uc = c;
33*3ff48bf5SDavid du Colombier 	qproduce(psauxq, &uc, 1);
34*3ff48bf5SDavid du Colombier }
35*3ff48bf5SDavid du Colombier 
36*3ff48bf5SDavid du Colombier static long
psauxread(Chan *,void * a,long n,vlong)37*3ff48bf5SDavid du Colombier psauxread(Chan*, void *a, long n, vlong)
38*3ff48bf5SDavid du Colombier {
39*3ff48bf5SDavid du Colombier 	return qread(psauxq, a, n);
40*3ff48bf5SDavid du Colombier }
41*3ff48bf5SDavid du Colombier 
42*3ff48bf5SDavid du Colombier static long
psauxwrite(Chan *,void * a,long n,vlong)43*3ff48bf5SDavid du Colombier psauxwrite(Chan*, void *a, long n, vlong)
44*3ff48bf5SDavid du Colombier {
45*3ff48bf5SDavid du Colombier 	return i8042auxcmds(a, n);
46*3ff48bf5SDavid du Colombier }
47*3ff48bf5SDavid du Colombier 
48*3ff48bf5SDavid du Colombier void
psauxlink(void)49*3ff48bf5SDavid du Colombier psauxlink(void)
50*3ff48bf5SDavid du Colombier {
51*3ff48bf5SDavid du Colombier 	psauxq = qopen(1024, 0, 0, 0);
52*3ff48bf5SDavid du Colombier 	if(psauxq == nil)
53*3ff48bf5SDavid du Colombier 		panic("psauxlink");
54*3ff48bf5SDavid du Colombier 	qnoblock(psauxq, 1);
55*3ff48bf5SDavid du Colombier 	i8042auxenable(psauxputc);
56*3ff48bf5SDavid du Colombier 	addarchfile("psaux", DMEXCL|0660, psauxread, psauxwrite);
57*3ff48bf5SDavid du Colombier }
58