xref: /inferno-os/appl/lib/usb/usbmouse.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1#
2# Copyright © 2002 Vita Nuova Holdings Limited.
3#
4implement UsbDriver;
5
6include "sys.m";
7	sys: Sys;
8include "usb.m";
9	usb: Usb;
10
11readerpid: int;
12
13kill(pid: int): int
14{
15	fd := sys->open("/prog/"+string pid+"/ctl", Sys->OWRITE);
16	if (fd == nil)
17		return -1;
18	if (sys->write(fd, array of byte "kill", 4) != 4)
19		return -1;
20	return 0;
21}
22
23reader(pidc: chan of int, fd: ref Sys->FD)
24{
25	pid := sys->pctl(0, nil);
26	pidc <-= pid;
27	buf := array [4] of byte;
28	while ((n := sys->read(fd, buf, len buf)) >= 0)
29		sys->print("%d: %d\n", sys->millisec(), n);
30	readerpid = -1;
31}
32
33init(usbmod: Usb, setupfd, ctlfd: ref Sys->FD,
34	nil: ref Usb->Device,
35	conf: array of ref Usb->Configuration, path: string): int
36{
37	usb = usbmod;
38	sys = load Sys Sys->PATH;
39	rv := usb->set_configuration(setupfd, conf[0].id);
40	if (rv < 0)
41		return rv;
42	ep := (hd conf[0].iface[0].altiface).ep[0];
43	sys->print("maxpkt %d interval %d\n", ep.maxpkt, ep.interval);
44	rv = sys->fprint(ctlfd, "ep 1 %d r %d 32", ep.maxpkt, ep.interval);
45	if (rv < 0)
46		return rv;
47	datafd := sys->open(path + "ep1data", Sys->OREAD);
48	if (datafd == nil)
49		return -1;
50	pidc := chan of int;
51	spawn reader(pidc, datafd);
52	readerpid = <- pidc;
53	return 0;
54}
55
56shutdown()
57{
58	if (readerpid >= 0)
59		kill(readerpid);
60}
61