Date: Tue, 17 Dec 2002 19:50:54 +0000 From: Richard Airlie <kaneda@darq.net> To: freebsd-hackers@freebsd.org Subject: joystick driver doesn't allow for anything but joy0 Message-ID: <20021217195054.C10658@phear.darq.net>
next in thread | raw e-mail | index | archive | help
--IS0zKkzwUGydFO0o Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hello, Recently I have spent some time trying to get my 3-axis 4 button joystick working in FreeBSD. My joystick is a standard analogue stick, connected to the game port (ISA 0x201). I came across a few problems with this configuration and had to make some changes to get things to work (patch attached). Essentially I'm looking for any comments on these changes.. is this a reasonable/useful fix? Briefly, the two stumbling blocks I encountered: 1) It is not possible to have both joy0 and joy1 at port IO_GAME, because joy_attach() in joy.c calls bus_alloc_resource with RF_ACTIVE. If I change this to RF_ACTIVE|RF_SHAREABLE then both joy0 and joy1 can share the resource. 2) In joy_attach(), the call to make_dev always uses 0 as the minor device number, meaning that only joy0 ever gets attached. The other thing I changed was to wait for the 4 bits corresponding to the 4 joystick axes to go low before starting timing them.. this seemed to be necessary for me, and I can explain why if anyone is interested. This patch applies to 4.7-STABLE, though the code in current looks much the same. I have no previous experience with the FreeBSD kernel.. so it would be useful to know if these changes are not good :) regards, Richard. --IS0zKkzwUGydFO0o Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="joy.c_patch" --- usr/src/sys/isa/joy.c Tue Dec 17 10:50:50 2002 +++ /home/kaneda/joy_fix.c Tue Dec 17 10:52:44 2002 @@ -134,13 +134,13 @@ struct resource *res; struct joy_softc *joy = device_get_softc(dev); - res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 1, RF_ACTIVE); + res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 1, RF_ACTIVE|RF_SHAREABLE); if (res == NULL) return ENXIO; joy->bt = rman_get_bustag(res); joy->port = rman_get_bushandle(res); joy->timeout[0] = joy->timeout[1] = 0; - make_dev(&joy_cdevsw, 0, 0, 0, 0600, "joy%d", unit); + make_dev(&joy_cdevsw, unit, 0, 0, 0600, "joy%d", unit); return 0; } @@ -198,6 +198,12 @@ #else disable_intr (); #endif + nanotime(&t); + end.tv_sec = 0; + end.tv_nsec = joy->timeout[joypart(dev)] * 1000; + timespecadd(&end, &t); + for( ; timespeccmp(&t, &end, <) && (bus_space_read_1(bt, port, 0) & 0x0f); nanotime(&t) ); + bus_space_write_1 (bt, port, 0, 0xff); nanotime(&start); end.tv_sec = 0; --IS0zKkzwUGydFO0o-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021217195054.C10658>