patch-2.3.31 linux/drivers/char/joystick/joy-db9.c
Next file: linux/drivers/char/joystick/joy-gravis.c
Previous file: linux/drivers/char/joystick/joy-creative.c
Back to the patch index
Back to the overall index
- Lines: 305
- Date:
Tue Dec 7 10:13:11 1999
- Orig file:
v2.3.30/linux/drivers/char/joystick/joy-db9.c
- Orig date:
Thu Jul 1 14:22:57 1999
diff -u --recursive --new-file v2.3.30/linux/drivers/char/joystick/joy-db9.c linux/drivers/char/joystick/joy-db9.c
@@ -1,7 +1,10 @@
/*
- * joy-db9.c Version 0.5V
+ * joy-db9.c Version 0.6V
*
- * Copyright (c) 1998 Andree Borrmann
+ * Copyright (c) 1998 Andree Borrmann
+ * Copyright (c) 1999 Vojtech Pavlik
+ *
+ * Sponsored by SuSE
*/
/*
@@ -24,6 +27,10 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Should you need to contact me, the author, you can do so either by
+ * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
+ * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
*/
#include <asm/io.h>
@@ -35,8 +42,9 @@
#include <linux/module.h>
#include <linux/string.h>
#include <linux/delay.h>
+#include <linux/init.h>
-MODULE_AUTHOR("Andree Borrmann <A.Borrmann@tu-bs.de>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
MODULE_PARM(js_db9, "2i");
MODULE_PARM(js_db9_2, "2i");
MODULE_PARM(js_db9_3, "2i");
@@ -48,7 +56,8 @@
#define JS_GENESIS6_PAD 0x06
#define JS_SATURN_PAD 0x07
#define JS_MULTI_0802 0x08
-#define JS_MAX_PAD 0x09
+#define JS_MULTI_0802_2 0x09
+#define JS_MAX_PAD 0x0A
#define JS_DB9_UP 0x01
#define JS_DB9_DOWN 0x02
@@ -59,8 +68,8 @@
#define JS_DB9_FIRE3 0x40
#define JS_DB9_FIRE4 0x80
-#define JS_DB9_NORMAL 0x22
-#define JS_DB9_NOSELECT 0x20
+#define JS_DB9_NORMAL 0x2a
+#define JS_DB9_NOSELECT 0x28
#define JS_DB9_SATURN0 0x20
#define JS_DB9_SATURN1 0x22
@@ -76,11 +85,7 @@
static int js_db9_3[] __initdata = { -1, 0 };
struct js_db9_info {
-#ifdef USE_PARPORT
struct pardevice *port; /* parport device */
-#else
- int port; /* hw port */
-#endif
int mode; /* pad mode */
};
@@ -95,6 +100,15 @@
switch(info->mode)
{
+ case JS_MULTI_0802_2:
+
+ data = JS_PAR_DATA_IN(info->port) >> 3;
+
+ axes[1][1] = (data&JS_DB9_DOWN ?0:1) - (data&JS_DB9_UP ?0:1);
+ axes[1][0] = (data&JS_DB9_RIGHT?0:1) - (data&JS_DB9_LEFT?0:1);
+
+ buttons[1][0] = (data&JS_DB9_FIRE1?0:1);
+
case JS_MULTI_0802:
data = JS_PAR_STATUS(info->port) >> 3;
@@ -185,11 +199,12 @@
udelay(JS_GENESIS6_DELAY);
JS_PAR_CTRL_OUT(JS_DB9_NOSELECT, info->port); /* 3 */
udelay(JS_GENESIS6_DELAY);
- JS_PAR_CTRL_OUT(JS_DB9_NORMAL, info->port);
data=JS_PAR_DATA_IN(info->port);
- buttons[0][0] |= (data&JS_DB9_LEFT?0:0x10) | (data&JS_DB9_DOWN?0:0x20) | (data&JS_DB9_UP?0:0x40);
+ buttons[0][0] |= (data&JS_DB9_LEFT?0:0x10) | (data&JS_DB9_DOWN ?0:0x20) |
+ (data&JS_DB9_UP ?0:0x40) | (data&JS_DB9_RIGHT?0:0x80);
+ JS_PAR_CTRL_OUT(JS_DB9_NORMAL, info->port);
udelay(JS_GENESIS6_DELAY);
JS_PAR_CTRL_OUT(JS_DB9_NOSELECT, info->port); /* 4 */
udelay(JS_GENESIS6_DELAY);
@@ -236,11 +251,11 @@
struct js_db9_info *info = dev->port->info;
if (!MOD_IN_USE) {
-#ifdef USE_PARPORT
if (parport_claim(info->port)) return -EBUSY;
-#endif
- JS_PAR_ECTRL_OUT(0x35,info->port); /* enable PS/2 mode: */
+ JS_PAR_DATA_OUT(0xff, info->port);
+ if (info->mode != JS_MULTI_0802)
+ JS_PAR_ECTRL_OUT(0x35,info->port); /* enable PS/2 mode: */
JS_PAR_CTRL_OUT(JS_DB9_NORMAL,info->port); /* reverse direction, enable Select signal */
}
@@ -260,12 +275,11 @@
if (!MOD_IN_USE) {
- JS_PAR_CTRL_OUT(0x00,info->port); /* normal direction */
- JS_PAR_ECTRL_OUT(0x15,info->port); /* enable normal mode */
+ JS_PAR_CTRL_OUT(0x00,info->port); /* normal direction */
+ if (info->mode != JS_MULTI_0802)
+ JS_PAR_ECTRL_OUT(0x15,info->port); /* enable normal mode */
-#ifdef USE_PARPORT
parport_release(info->port);
-#endif
}
return 0;
}
@@ -274,16 +288,15 @@
void cleanup_module(void)
{
struct js_db9_info *info;
+ int i;
- while (js_db9_port != NULL) {
- js_unregister_device(js_db9_port->devs[0]);
+ while (js_db9_port) {
info = js_db9_port->info;
-#ifdef USE_PARPORT
+
+ for (i = 0; i < js_db9_port->ndevs; i++)
+ if (js_db9_port->devs[i])
+ js_unregister_device(js_db9_port->devs[i]);
parport_unregister_device(info->port);
-#else
- release_region(info->port, 3);
- release_region(info->port+0x402, 1);
-#endif
js_db9_port = js_unregister_port(js_db9_port);
}
@@ -295,17 +308,17 @@
* db9 gamepads.
*/
-static void __init js_db9_init_corr(struct js_corr **corr)
+static void __init js_db9_init_corr(struct js_corr *corr)
{
int i;
for (i = 0; i < 2; i++) {
- corr[0][i].type = JS_CORR_BROKEN;
- corr[0][i].prec = 0;
- corr[0][i].coef[0] = 0;
- corr[0][i].coef[1] = 0;
- corr[0][i].coef[2] = (1 << 29);
- corr[0][i].coef[3] = (1 << 29);
+ corr[i].type = JS_CORR_BROKEN;
+ corr[i].prec = 0;
+ corr[i].coef[0] = 0;
+ corr[i].coef[1] = 0;
+ corr[i].coef[2] = (1 << 29);
+ corr[i].coef[3] = (1 << 29);
}
}
@@ -316,75 +329,76 @@
static struct js_port __init *js_db9_probe(int *config, struct js_port *port)
{
struct js_db9_info info;
- char buttons[JS_MAX_PAD] = {0,1,2,4,0,6,7,8,1};
+ struct parport *pp;
+ int i;
+ char buttons[JS_MAX_PAD] = {0,1,2,4,0,6,8,8,1,1};
char *name[JS_MAX_PAD] = {NULL, "Multisystem joystick", "Multisystem joystick (2 fire)", "Genesis pad",
- NULL, "Genesis 5 pad", "Genesis 6 pad", "Saturn pad", "Multisystem (0.8.0.2) joystick"};
+ NULL, "Genesis 5 pad", "Genesis 6 pad", "Saturn pad", "Multisystem (0.8.0.2) joystick",
+ "Multisystem (0.8.0.2-dual) joystick"};
if (config[0] < 0) return port;
if (config[1] < 0 || config[1] >= JS_MAX_PAD || !name[config[1]]) return port;
-#ifdef USE_PARPORT
- {
- struct parport *pp;
+ info.mode = config[1];
- if (config[0] > 0x10)
- for (pp=parport_enumerate(); pp != NULL && (pp->base!=config[0]); pp=pp->next);
- else
- for (pp=parport_enumerate(); pp != NULL && (config[0]>0); pp=pp->next) config[0]--;
-
- if (pp == NULL) {
- printk(KERN_ERR "joy-db9: no such parport\n");
- return port;
- }
-
- if (!(pp->modes & PARPORT_MODE_TRISTATE)) {
- printk(KERN_ERR "js-db9: specified parport is not bidirectional\n");
- return port;
- }
-
- info.port = parport_register_device(pp, "joystick (db9)", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
- if (!info.port)
- return port;
+ if (config[0] > 0x10)
+ for (pp=parport_enumerate(); pp && (pp->base!=config[0]); pp=pp->next);
+ else
+ for (pp=parport_enumerate(); pp && (config[0]>0); pp=pp->next) config[0]--;
+
+ if (!pp) {
+ printk(KERN_ERR "joy-db9: no such parport\n");
+ return port;
}
-#else
- info.port = config[0];
- if (check_region(info.port, 3) || check_region(info.port+0x402,1)) return port;
- request_region(info.port, 3, "joystick (db9)");
- request_region(info.port+0x402, 1, "joystick (db9)");
-#endif
- info.mode = config[1];
+ if (!(pp->modes & (PARPORT_MODE_PCPS2 | PARPORT_MODE_PCECPPS2)) && info.mode != JS_MULTI_0802) {
+ printk(KERN_ERR "js-db9: specified parport is not bidirectional\n");
+ return port;
+ }
- port = js_register_port(port, &info, 1, sizeof(struct js_db9_info), js_db9_read);
+ info.port = parport_register_device(pp, "joystick (db9)", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
+ if (!info.port)
+ return port;
+
+ port = js_register_port(port, &info, 1 + (info.mode == JS_MULTI_0802_2), sizeof(struct js_db9_info), js_db9_read);
+
+ for (i = 0; i < 1 + (info.mode == JS_MULTI_0802_2); i++) {
+ printk(KERN_INFO "js%d: %s on %s\n",
+ js_register_device(port, i, 2, buttons[info.mode], name[info.mode], js_db9_open, js_db9_close),
+ name[info.mode], info.port->port->name);
-#ifdef USE_PARPORT
- printk(KERN_INFO "js%d: %s on %s\n",
- js_register_device(port, 0, 2, buttons[info.mode], name[info.mode], js_db9_open, js_db9_close),
- name[info.mode], info.port->port->name);
-#else
- printk(KERN_INFO "js%d: %s at %#x\n",
- js_register_device(port, 0, 2, buttons[info.mode], name[info.mode], js_db9_open, js_db9_close),
- name[info.mode], info.port);
-#endif
+ js_db9_init_corr(port->corr[i]);
+ }
- js_db9_init_corr(port->corr);
return port;
}
#ifndef MODULE
-void __init js_db9_setup(char *str, int *ints)
+int __init js_db9_setup(SETUP_PARAM)
{
int i;
-
- if (!strcmp(str,"js_db9"))
- for (i = 0; i <= ints[0] && i < 2; i++) js_db9[i] = ints[i+1];
- if (!strcmp(str,"js_db9_2"))
- for (i = 0; i <= ints[0] && i < 2; i++) js_db9_2[i] = ints[i+1];
- if (!strcmp(str,"js_db9_3"))
- for (i = 0; i <= ints[0] && i < 2; i++) js_db9_3[i] = ints[i+1];
-
+ SETUP_PARSE(2);
+ for (i = 0; i <= ints[0] && i < 2; i++) js_db9[i] = ints[i+1];
+ return 1;
+}
+int __init js_db9_setup_2(SETUP_PARAM)
+{
+ int i;
+ SETUP_PARSE(2);
+ for (i = 0; i <= ints[0] && i < 2; i++) js_db9_2[i] = ints[i+1];
+ return 1;
+}
+int __init js_db9_setup_3(SETUP_PARAM)
+{
+ int i;
+ SETUP_PARSE(2);
+ for (i = 0; i <= ints[0] && i < 2; i++) js_db9_3[i] = ints[i+1];
+ return 1;
}
+__setup("js_db9=", js_db9_setup);
+__setup("js_db9_2=", js_db9_setup_2);
+__setup("js_db9_3=", js_db9_setup_3);
#endif
#ifdef MODULE
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)