Date: Sat, 24 Jan 1998 07:25:57 -0800 (PST) From: ohashi@mickey.ai.kyutech.ac.jp To: freebsd-gnats-submit@FreeBSD.ORG Subject: i386/5559: PC-Card joystick ports were not supported by joy.c. Message-ID: <199801241525.HAA16927@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 5559
>Category: i386
>Synopsis: PC-Card joystick ports were not supported by joy.c.
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Sat Jan 24 07:30:00 PST 1998
>Last-Modified:
>Originator: Takeshi OHASHI
>Organization:
Kyushu Institute of Technology
>Release: FreeBSD-2.2.5-RELEASE + PAO package
>Environment:
FreeBSD atohasi.mickey.ai.kyutech.ac.jp 2.2.5-RELEASE FreeBSD 2.2.5-RELEASE #1: Fri Jan 23 16:59:43 JST 1998 ohashi@atohasi.mickey.ai.kyutech.ac.jp:/usr/src/sys/compile/atohasi i386
>Description:
Please change joy.c as the following patches. This patch can support
PC-Card type joystick/game ports. I tested one of them I-O DATA JOYPC.
I think the patch would be also work for FreeBSD-current.
>How-To-Repeat:
>Fix:
Appending /etc/pccard.conf entory
==============================================================
#-----------------------------------------------------------------------
# Joystick Port Cards
#-----------------------------------------------------------------------
card "IO DATA" "PCJOY"
config default "joy0" pio
# config 0x1 "joy0" pio
# config 0x2 "joy0" pio
insert echo IO DATA PCJOY inserted
remove echo IO DATA PCJOY removed
==============================================================
patch for joy.c
diff -u sys/i386/isa/joy.c.orig sys/i386/isa/joy.c
--- sys/i386/isa/joy.c.orig Tue Sep 10 17:21:59 1996
+++ sys/i386/isa/joy.c Wed Jan 21 13:32:56 1998
@@ -46,6 +46,16 @@
#include <i386/isa/isa_device.h>
#include <i386/isa/timerreg.h>
+/*********************************************************/
+#include "crd.h"
+#if NCRD > 0
+#include <sys/select.h>
+#include <pccard/card.h>
+#include <pccard/driver.h>
+#include <pccard/slot.h>
+#endif
+/*********************************************************/
+
/* The game port can manage 4 buttons and 4 variable resistors (usually 2
* joysticks, each with 2 buttons and 2 pots.) via the port at address 0x201.
* Getting the state of the buttons is done by reading the game port:
@@ -97,6 +107,105 @@
static int get_tick __P((void));
+/*********************************************************/
+#if NCRD > 0
+/*
+ * PC-Card (PCMCIA) specific code.
+ */
+static int joy_card_intr(struct pccard_dev *); /* Interrupt handler */
+static void joy_card_unload(struct pccard_dev *); /* Disable driver */
+static void joy_card_suspend(struct pccard_dev *); /* Suspend driver */
+static int joy_card_init(struct pccard_dev *, int); /* init device */
+
+static struct pccard_drv joy_info = {
+ "joy",
+ joy_card_intr,
+ joy_card_unload,
+ joy_card_suspend,
+ joy_card_init,
+ 0, /* Attributes - presently unused */
+ &bio_imask /* Interrupt mask for device */
+ /* XXX - Should this also include net_imask? */
+};
+
+DATA_SET(pccarddrv_set, joy_info);
+
+static int pccard_mode[NJOY];
+/*
+ * Called when a power down is requested. Shuts down the
+ * device and configures the device as unavailable (but
+ * still loaded...). A resume is done by calling
+ * joyinit with first=0. This is called when the user suspends
+ * the system, or the APM code suspends the system.
+ */
+static void
+joy_card_suspend(struct pccard_dev *dp)
+{
+ printf("joy%d: suspending\n", dp->isahd.id_unit);
+}
+
+/*
+ * Initialize the device - called from Slot manager.
+ * If first is set, then check for the device's existence
+ * before initializing it. Once initialized, the device table may
+ * be set up.
+ */
+int
+joy_card_init(struct pccard_dev *dp, int first)
+{
+ int unit = dp->isahd.id_unit;
+ /* validate unit number. */
+ if (first) {
+ if (unit >= NJOY)
+ return(ENODEV);
+ pccard_mode[unit] = 1;
+ /*
+ * Probe the device. If a value is returned, the
+ * device was found at the location.
+ */
+ if (joyprobe(&dp->isahd)==0)
+ return(ENXIO);
+ if (joyattach(&dp->isahd)==0)
+ return(ENXIO);
+ }
+ /*
+ * XXX TODO:
+ * If it was initialized before, the device structure
+ * should also be initialized. We should
+ * reset (and possibly restart) the hardware, but
+ * I am not sure of the best way to do this...
+ */
+ return(0);
+}
+
+/*
+ * joy_card_unload - unload the driver and clear the table.
+ * XXX TODO:
+ * This is usually called when the card is ejected, but
+ * can be caused by a modunload of a controller driver.
+ * The idea is to reset the driver's view of the device
+ * and ensure that any driver entry points such as
+ * read and write do not hang.
+ */
+static void
+joy_card_unload(struct pccard_dev *dp)
+{
+ int unit = dp->isahd.id_unit;
+
+ pccard_mode[unit] = 0;
+}
+
+/*
+ * card_intr - Shared interrupt called from
+ * front end of PC-Card handler.
+ */
+static int
+joy_card_intr(struct pccard_dev *dp)
+{
+ return(1);
+}
+#endif /* NCRD > 0 */
+/*********************************************************/
static int
joyprobe (struct isa_device *dev)
==============================================================
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199801241525.HAA16927>
