#define TICK_SIZE tick
spinlock_t i8253_lock = SPIN_LOCK_UNLOCKED;
+EXPORT_SYMBOL(i8253_lock);
extern spinlock_t i8259A_lock;
#define CS461X_FULL_MAP
*/
-#define COOKED_MODE
-
#ifndef PCI_VENDOR_ID_CIRRUS
#define PCI_VENDOR_ID_CIRRUS 0x1013
static unsigned long ba0_addr;
static unsigned int *ba0;
+static char phys[32];
+static char name[] = "CS416x Gameport";
+
#ifdef CS461X_FULL_MAP
static unsigned long ba1_addr;
static union ba1_t {
static int cs461x_gameport_open(struct gameport *gameport, int mode)
{
switch (mode) {
-#ifdef COOKED_MODE
- case GAMEPORT_MODE_COOKED:
- return 0;
-#endif
- case GAMEPORT_MODE_RAW:
- return 0;
- default:
- return -1;
+ case GAMEPORT_MODE_COOKED:
+ case GAMEPORT_MODE_RAW:
+ return 0;
+ default:
+ return -1;
}
return 0;
}
return -ENOMEM;
}
#endif
- printk(KERN_INFO "CS461x PCI: %lx[%d]\n",
- ba0_addr, CS461X_BA0_SIZE);
-
+
if (!(port = kmalloc(sizeof(struct gameport), GFP_KERNEL))) {
printk(KERN_ERR "Memory allocation failed.\n");
cs461x_free(pdev);
pci_set_drvdata(pdev, port);
port->open = cs461x_gameport_open;
- port->read = cs461x_gameport_read;
port->trigger = cs461x_gameport_trigger;
-#ifdef COOKED_MODE
+ port->read = cs461x_gameport_read;
port->cooked_read = cs461x_gameport_cooked_read;
-#endif
+
+ sprintf(phys, "pci%s/gameport0", pdev->slot_name);
+
+ port->name = name;
+ port->phys = phys;
+ port->idbus = BUS_PCI;
+ port->idvendor = pdev->vendor;
+ port->idproduct = pdev->device;
cs461x_pokeBA0(BA0_JSIO, 0xFF); // ?
cs461x_pokeBA0(BA0_JSCTL, JSCTL_SP_MEDIUM_SLOW);
gameport_register_port(port);
- printk(KERN_INFO "gameport%d: CS461x Gameport speed %d kHz\n",
- port->number, port->speed);
+ printk(KERN_INFO "gameport: %s on pci%s speed %d kHz\n",
+ name, pdev->slot_name, port->speed);
return 0;
}
}
static struct pci_driver cs461x_pci_driver = {
- name: "PCI Gameport",
+ name: "CS461x Gameport",
id_table: cs461x_pci_tbl,
probe: cs461x_pci_probe,
remove: cs461x_pci_remove,
};
-int __init js_cs461x_init(void)
+int __init cs461x_init(void)
{
return pci_module_init(&cs461x_pci_driver);
}
-void __exit js_cs461x_exit(void)
+void __exit cs461x_exit(void)
{
pci_unregister_driver(&cs461x_pci_driver);
}
-module_init(js_cs461x_init);
-module_exit(js_cs461x_exit);
+module_init(cs461x_init);
+module_exit(cs461x_exit);
/*
- * $Id: emu10k1-gp.c,v 1.2 2001/04/24 07:48:56 vojtech Exp $
+ * $Id: emu10k1-gp.c,v 1.8 2002/01/22 20:40:46 vojtech Exp $
*
* Copyright (c) 2001 Vojtech Pavlik
- *
- * Sponsored by SuSE
*/
/*
- * EMU10k1 - SB Live! - gameport driver for Linux
+ * EMU10k1 - SB Live / Audigy - gameport driver for Linux
*/
/*
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <asm/io.h>
#include <linux/pci.h>
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("EMU10k1 gameport driver");
MODULE_LICENSE("GPL");
struct emu {
struct emu *next;
struct gameport gameport;
int size;
+ char phys[32];
};
static struct pci_device_id emu_tbl[] __devinitdata = {
- { 0x1102, 0x7002, PCI_ANY_ID, PCI_ANY_ID }, /* SB Live! gameport */
+ { 0x1102, 0x7002, PCI_ANY_ID, PCI_ANY_ID }, /* SB Live gameport */
+ { 0x1102, 0x7003, PCI_ANY_ID, PCI_ANY_ID }, /* Audigy gameport */
{ 0, }
};
static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
int ioport, iolen;
- int rc;
- struct emu *port;
+ struct emu *emu;
- rc = pci_enable_device(pdev);
- if (rc) {
- printk(KERN_ERR "emu10k1-gp: Cannot enable emu10k1 gameport (bus %d, devfn %d) error=%d\n",
- pdev->bus->number, pdev->devfn, rc);
- return rc;
- }
+ if (pci_enable_device(pdev))
+ return -EBUSY;
ioport = pci_resource_start(pdev, 0);
iolen = pci_resource_len(pdev, 0);
if (!request_region(ioport, iolen, "emu10k1-gp"))
return -EBUSY;
- if (!(port = kmalloc(sizeof(struct emu), GFP_KERNEL))) {
+ if (!(emu = kmalloc(sizeof(struct emu), GFP_KERNEL))) {
printk(KERN_ERR "emu10k1-gp: Memory allocation failed.\n");
release_region(ioport, iolen);
return -ENOMEM;
}
- memset(port, 0, sizeof(struct emu));
+ memset(emu, 0, sizeof(struct emu));
+
+ sprintf(emu->phys, "pci%s/gameport0", pdev->slot_name);
+
+ emu->size = iolen;
+ emu->dev = pdev;
+
+ emu->gameport.io = ioport;
+ emu->gameport.name = pdev->name;
+ emu->gameport.phys = emu->phys;
+ emu->gameport.idbus = BUS_PCI;
+ emu->gameport.idvendor = pdev->vendor;
+ emu->gameport.idproduct = pdev->device;
- port->gameport.io = ioport;
- port->size = iolen;
- port->dev = pdev;
- pci_set_drvdata(pdev, port);
+ pci_set_drvdata(pdev, emu);
- gameport_register_port(&port->gameport);
+ gameport_register_port(&emu->gameport);
- printk(KERN_INFO "gameport%d: Emu10k1 Gameport at %#x size %d speed %d kHz\n",
- port->gameport.number, port->gameport.io, iolen, port->gameport.speed);
+ printk(KERN_INFO "gameport: %s at pci%s speed %d kHz\n",
+ pdev->name, pdev->slot_name, emu->gameport.speed);
return 0;
}
static void __devexit emu_remove(struct pci_dev *pdev)
{
- struct emu *port = pci_get_drvdata(pdev);
- gameport_unregister_port(&port->gameport);
- release_region(port->gameport.io, port->size);
- kfree(port);
+ struct emu *emu = pci_get_drvdata(pdev);
+ gameport_unregister_port(&emu->gameport);
+ release_region(emu->gameport.io, emu->size);
+ kfree(emu);
}
static struct pci_driver emu_driver = {
/*
- * $Id: gameport.c,v 1.5 2000/05/29 10:54:53 vojtech Exp $
+ * $Id: gameport.c,v 1.18 2002/01/22 20:41:14 vojtech Exp $
*
- * Copyright (c) 1999-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <asm/io.h>
#include <linux/stddef.h>
#include <linux/delay.h>
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Generic gameport layer");
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(gameport_register_port);
static struct gameport *gameport_list;
static struct gameport_dev *gameport_dev;
-static int gameport_number;
/*
* gameport_measure_speed() measures the gameport i/o speed.
void gameport_register_port(struct gameport *gameport)
{
- gameport->number = gameport_number++;
gameport->next = gameport_list;
gameport_list = gameport;
if (gameport->dev && gameport->dev->disconnect)
gameport->dev->disconnect(gameport);
-
- gameport_number--;
}
void gameport_register_device(struct gameport_dev *dev)
/*
- * $Id: lightning.c,v 1.13 2001/04/26 10:24:46 vojtech Exp $
+ * $Id: lightning.c,v 1.20 2002/01/22 20:41:31 vojtech Exp $
*
* Copyright (c) 1998-2001 Vojtech Pavlik
- *
- * Sponsored by SuSE
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <asm/io.h>
#define L4_BUSY 0x01
#define L4_TIMEOUT 80 /* 80 us */
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("PDPI Lightning 4 gamecard driver");
MODULE_LICENSE("GPL");
struct l4 {
struct gameport gameport;
unsigned char port;
+ char phys[32];
} *l4_port[8];
+char l4_name[] = "PDPI Lightning 4";
+
/*
* l4_wait_ready() waits for the L4 to become ready.
*/
static int l4_cooked_read(struct gameport *gameport, int *axes, int *buttons)
{
- struct l4 *l4 = gameport->private;
+ struct l4 *l4 = gameport->driver;
unsigned char status;
int i, result = -1;
static int l4_open(struct gameport *gameport, int mode)
{
- struct l4 *l4 = gameport->private;
+ struct l4 *l4 = gameport->driver;
if (l4->port != 0 && mode != GAMEPORT_MODE_COOKED)
return -1;
outb(L4_SELECT_ANALOG, L4_PORT);
{
int i, t;
int cal[4];
- struct l4 *l4 = gameport->private;
+ struct l4 *l4 = gameport->driver;
if (l4_getcal(l4->port, cal))
return -1;
l4 = l4_port[i * 4 + j] = l4_port[i * 4] + j;
l4->port = i * 4 + j;
+ sprintf(l4->phys, "isa%04x/gameport%d", L4_PORT, 4 * i + j);
+
gameport = &l4->gameport;
- gameport->private = l4;
+ gameport->driver = l4;
gameport->open = l4_open;
gameport->cooked_read = l4_cooked_read;
gameport->calibrate = l4_calibrate;
+ gameport->name = l4_name;
+ gameport->phys = l4->phys;
+ gameport->idbus = BUS_ISA;
+
if (!i && !j)
gameport->io = L4_PORT;
gameport_register_port(gameport);
}
- printk(KERN_INFO "gameport%d,%d,%d,%d: PDPI Lightning 4 %s card v%d.%d at %#x\n",
- l4_port[i * 4 + 0]->gameport.number, l4_port[i * 4 + 1]->gameport.number,
- l4_port[i * 4 + 2]->gameport.number, l4_port[i * 4 + 3]->gameport.number,
+ printk(KERN_INFO "gameport: PDPI Lightning 4 %s card v%d.%d at %#x\n",
i ? "secondary" : "primary", rev >> 4, rev, L4_PORT);
cards++;
/*
- * $Id: ns558.c,v 1.29 2001/04/24 07:48:56 vojtech Exp $
+ * $Id: ns558.c,v 1.43 2002/01/24 19:23:21 vojtech Exp $
*
* Copyright (c) 1999-2001 Vojtech Pavlik
* Copyright (c) 1999 Brian Gerst
- *
- * Sponsored by SuSE
*/
/*
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <asm/io.h>
#include <linux/isapnp.h>
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Classic gameport (ISA/PnP) driver");
MODULE_LICENSE("GPL");
#define NS558_ISA 1
struct pci_dev *dev;
struct ns558 *next;
struct gameport gameport;
+ char phys[32];
+ char name[32];
};
static struct ns558 *ns558;
port->type = NS558_ISA;
port->size = (1 << i);
port->gameport.io = io & (-1 << i);
+ port->gameport.phys = port->phys;
+ port->gameport.name = port->name;
+ port->gameport.idbus = BUS_ISA;
+
+ sprintf(port->phys, "isa%04x/gameport0", io & (-1 << i));
+ sprintf(port->name, "NS558 ISA");
request_region(port->gameport.io, (1 << i), "ns558-isa");
gameport_register_port(&port->gameport);
- printk(KERN_INFO "gameport%d: NS558 ISA at %#x", port->gameport.number, port->gameport.io);
+ printk(KERN_INFO "gameport: NS558 ISA at %#x", port->gameport.io);
if (port->size > 1) printk(" size %d", port->size);
printk(" speed %d kHz\n", port->gameport.speed);
#ifdef __ISAPNP__
+#define NS558_DEVICE(a,b,c,d)\
+ card_vendor: ISAPNP_ANY_ID, card_device: ISAPNP_ANY_ID,\
+ vendor: ISAPNP_VENDOR(a,b,c), function: ISAPNP_DEVICE(d)
+
static struct isapnp_device_id pnp_devids[] = {
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('@','P','@'), ISAPNP_DEVICE(0x0001), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('@','P','@'), ISAPNP_DEVICE(0x2001), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('C','T','L'), ISAPNP_DEVICE(0x7001), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('C','T','L'), ISAPNP_DEVICE(0x7002), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('C','S','C'), ISAPNP_DEVICE(0x0010), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('C','S','C'), ISAPNP_DEVICE(0x0110), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('C','S','C'), ISAPNP_DEVICE(0x0b35), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('C','S','C'), ISAPNP_DEVICE(0x0010), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('C','S','C'), ISAPNP_DEVICE(0x0110), 0 },
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P','N','P'), ISAPNP_DEVICE(0xb02f), 0 },
+ { NS558_DEVICE('@','P','@',0x0001) }, /* ALS 100 */
+ { NS558_DEVICE('@','P','@',0x0020) }, /* ALS 200 */
+ { NS558_DEVICE('@','P','@',0x1001) }, /* ALS 100+ */
+ { NS558_DEVICE('@','P','@',0x2001) }, /* ALS 120 */
+ { NS558_DEVICE('A','S','B',0x16fd) }, /* AdLib NSC16 */
+ { NS558_DEVICE('A','Z','T',0x3001) }, /* AZT1008 */
+ { NS558_DEVICE('C','D','C',0x0001) }, /* Opl3-SAx */
+ { NS558_DEVICE('C','S','C',0x0001) }, /* CS4232 */
+ { NS558_DEVICE('C','S','C',0x000f) }, /* CS4236 */
+ { NS558_DEVICE('C','S','C',0x0101) }, /* CS4327 */
+ { NS558_DEVICE('C','T','L',0x7001) }, /* SB16 */
+ { NS558_DEVICE('C','T','L',0x7002) }, /* AWE64 */
+ { NS558_DEVICE('C','T','L',0x7005) }, /* Vibra16 */
+ { NS558_DEVICE('E','N','S',0x2020) }, /* SoundscapeVIVO */
+ { NS558_DEVICE('E','S','S',0x0001) }, /* ES1869 */
+ { NS558_DEVICE('E','S','S',0x0005) }, /* ES1878 */
+ { NS558_DEVICE('E','S','S',0x6880) }, /* ES688 */
+ { NS558_DEVICE('I','B','M',0x0012) }, /* CS4232 */
+ { NS558_DEVICE('O','P','T',0x0001) }, /* OPTi Audio16 */
+ { NS558_DEVICE('Y','M','H',0x0006) }, /* Opl3-SA */
+ { NS558_DEVICE('Y','M','H',0x0022) }, /* Opl3-SAx */
+ { NS558_DEVICE('P','N','P',0xb02f) }, /* Generic */
{ 0, },
};
port->next = next;
port->type = NS558_PNP;
- port->gameport.io = ioport;
port->size = iolen;
port->dev = dev;
+ port->gameport.io = ioport;
+ port->gameport.phys = port->phys;
+ port->gameport.name = port->name;
+ port->gameport.idbus = BUS_ISAPNP;
+ port->gameport.idvendor = dev->vendor;
+ port->gameport.idproduct = dev->device;
+ port->gameport.idversion = 0x100;
+
+ sprintf(port->phys, "isapnp%d.%d/gameport0", PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
+ sprintf(port->name, "%s", dev->name[0] ? dev->name : "NS558 PnP Gameport");
+
gameport_register_port(&port->gameport);
- printk(KERN_INFO "gameport%d: NS558 PnP at %#x", port->gameport.number, port->gameport.io);
+ printk(KERN_INFO "gameport: NS558 PnP at isapnp%d.%d io %#x",
+ PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn), port->gameport.io);
if (iolen > 1) printk(" size %d", iolen);
printk(" speed %d kHz\n", port->gameport.speed);
/*
- * $Id: a3d.c,v 1.14 2001/04/26 10:24:46 vojtech Exp $
+ * $Id: a3d.c,v 1.21 2002/01/22 20:11:50 vojtech Exp $
*
* Copyright (c) 1998-2001 Vojtech Pavlik
- *
- * Sponsored by SuSE
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/gameport.h>
#include <linux/input.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("FP-Gaming Assasin 3D joystick driver");
+MODULE_LICENSE("GPL");
+
#define A3D_MAX_START 400 /* 400 us */
#define A3D_MAX_STROBE 60 /* 40 us */
#define A3D_DELAY_READ 3 /* 3 ms */
int used;
int reads;
int bads;
+ char phys[32];
+ char adcphys[32];
};
/*
int a3d_adc_cooked_read(struct gameport *gameport, int *axes, int *buttons)
{
- struct a3d *a3d = gameport->private;
+ struct a3d *a3d = gameport->driver;
int i;
for (i = 0; i < 4; i++)
axes[i] = (a3d->axes[i] < 254) ? a3d->axes[i] : -1;
int a3d_adc_open(struct gameport *gameport, int mode)
{
- struct a3d *a3d = gameport->private;
+ struct a3d *a3d = gameport->driver;
if (mode != GAMEPORT_MODE_COOKED)
return -1;
if (!a3d->used++)
static void a3d_adc_close(struct gameport *gameport)
{
- struct a3d *a3d = gameport->private;
+ struct a3d *a3d = gameport->driver;
if (!--a3d->used)
del_timer(&a3d->timer);
}
if (!a3d->mode || a3d->mode > 5) {
printk(KERN_WARNING "a3d.c: Unknown A3D device detected "
- "(gameport%d, id=%d), contact <vojtech@suse.cz>\n", gameport->number, a3d->mode);
+ "(%s, id=%d), contact <vojtech@ucw.cz>\n", gameport->phys, a3d->mode);
goto fail2;
}
+ sprintf(a3d->phys, "%s/input0", gameport->phys);
+ sprintf(a3d->adcphys, "%s/gameport0", gameport->phys);
if (a3d->mode == A3D_MODE_PXL) {
a3d->dev.relbit[0] |= BIT(REL_X) | BIT(REL_Y);
a3d->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_RIGHT) | BIT(BTN_LEFT) | BIT(BTN_MIDDLE);
- a3d->adc.private = a3d;
+ a3d->adc.driver = a3d;
a3d->adc.open = a3d_adc_open;
a3d->adc.close = a3d_adc_close;
a3d->adc.cooked_read = a3d_adc_cooked_read;
a3d->adc.fuzz = 1;
+ a3d->adc.name = a3d_names[a3d->mode];
+ a3d->adc.phys = a3d->adcphys;
+ a3d->adc.idbus = BUS_GAMEPORT;
+ a3d->adc.idvendor = GAMEPORT_ID_VENDOR_MADCATZ;
+ a3d->adc.idproduct = a3d->mode;
+ a3d->adc.idversion = 0x0100;
+
a3d_read(a3d, data);
gameport_register_port(&a3d->adc);
- printk(KERN_INFO "gameport%d: %s on gameport%d.0\n",
- a3d->adc.number, a3d_names[a3d->mode], gameport->number);
+ printk(KERN_INFO "gameport: %s on %s\n", a3d_names[a3d->mode], gameport->phys);
}
a3d->dev.private = a3d;
a3d->dev.close = a3d_close;
a3d->dev.name = a3d_names[a3d->mode];
+ a3d->dev.phys = a3d->phys;
a3d->dev.idbus = BUS_GAMEPORT;
a3d->dev.idvendor = GAMEPORT_ID_VENDOR_MADCATZ;
a3d->dev.idproduct = a3d->mode;
a3d->dev.idversion = 0x0100;
input_register_device(&a3d->dev);
- printk(KERN_INFO "input%d: %s on gameport%d.0\n",
- a3d->dev.number, a3d_names[a3d->mode], gameport->number);
+ printk(KERN_INFO "input: %s on %s\n", a3d_names[a3d->mode], a3d->phys);
return;
fail2: gameport_close(gameport);
module_init(a3d_init);
module_exit(a3d_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: adi.c,v 1.15 2001/01/09 13:32:39 vojtech Exp $
+ * $Id: adi.c,v 1.23 2002/01/22 20:26:17 vojtech Exp $
*
- * Copyright (c) 1998-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1998-2001 Vojtech Pavlik
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/delay.h>
#include <linux/gameport.h>
#include <linux/init.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Logitech ADI joystick family driver");
+MODULE_LICENSE("GPL");
+
/*
* Times, array sizes, flags, ids.
*/
#define ADI_MIN_ID_LENGTH 66
#define ADI_MAX_NAME_LENGTH 48
#define ADI_MAX_CNAME_LENGTH 16
+#define ADI_MAX_PHYS_LENGTH 32
#define ADI_FLAG_HAT 0x04
#define ADI_FLAG_10BIT 0x08
short *key;
char name[ADI_MAX_NAME_LENGTH];
char cname[ADI_MAX_CNAME_LENGTH];
+ char phys[ADI_MAX_PHYS_LENGTH];
unsigned char data[ADI_MAX_LENGTH];
};
}
}
-static void adi_init_input(struct adi *adi, struct adi_port *port)
+static void adi_init_input(struct adi *adi, struct adi_port *port, int half)
{
int i, t;
char buf[ADI_MAX_NAME_LENGTH];
sprintf(buf, adi_names[t], adi->id);
sprintf(adi->name, "Logitech %s", buf);
+ sprintf(adi->phys, "%s/input%d", port->gameport->phys, half);
adi->abs = adi_abs[t];
adi->key = adi_key[t];
adi->dev.close = adi_close;
adi->dev.name = adi->name;
+ adi->dev.phys = adi->phys;
adi->dev.idbus = BUS_GAMEPORT;
adi->dev.idvendor = GAMEPORT_ID_VENDOR_LOGITECH;
adi->dev.idproduct = adi->id;
adi->dev.private = port;
adi->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
- for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad > 0)) * 2; i++)
+ for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad != -1)) * 2; i++)
set_bit(adi->abs[i], &adi->dev.absbit);
for (i = 0; i < adi->buttons; i++)
if (!adi->length) return;
- for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad > 0)) * 2; i++) {
+ for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad != -1)) * 2; i++) {
t = adi->abs[i];
x = adi->dev.abs[t];
for (i = 0; i < 2; i++) {
adi_id_decode(port->adi + i, port);
- adi_init_input(port->adi + i, port);
+ adi_init_input(port->adi + i, port, i);
}
if (!port->adi[0].length && !port->adi[1].length) {
if (port->adi[i].length > 0) {
adi_init_center(port->adi + i);
input_register_device(&port->adi[i].dev);
- printk(KERN_INFO "input%d: %s [%s] on gameport%d.%d\n",
- port->adi[i].dev.number, port->adi[i].name, port->adi[i].cname, gameport->number, i);
+ printk(KERN_INFO "input: %s [%s] on %s\n",
+ port->adi[i].name, port->adi[i].cname, gameport->phys);
}
}
module_init(adi_init);
module_exit(adi_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: amijoy.c,v 1.5 2000/07/21 22:52:24 vojtech Exp $
+ * $Id: amijoy.c,v 1.13 2002/01/22 20:26:32 vojtech Exp $
*
- * Copyright (c) 1998-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1998-2001 Vojtech Pavlik
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/types.h>
#include <asm/system.h>
#include <asm/amigahw.h>
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Driver for Amiga joysticks");
MODULE_PARM(amijoy, "1-2i");
MODULE_LICENSE("GPL");
static int amijoy[2] = { 0, 1 };
static int amijoy_used[2] = { 0, 0 };
static struct input_dev amijoy_dev[2];
+static char *amijoy_phys[2] = { "amijoy/input0", "amijoy/input1" };
static char *amijoy_name = "Amiga joystick";
input_report_key(amijoy_dev + i, BTN_TRIGGER, button);
- input_report_abs(amijoy_dev + i, ABS_X, ((data >> 1) & 1) - ((data >> 9) & 1);
+ input_report_abs(amijoy_dev + i, ABS_X, ((data >> 1) & 1) - ((data >> 9) & 1));
data = ~(data ^ (data << 1));
- input_report_abs(amijoy_dev + i, ABS_Y, ((data >> 1) & 1) - ((data >> 9) & 1);
+ input_report_abs(amijoy_dev + i, ABS_Y, ((data >> 1) & 1) - ((data >> 9) & 1));
}
}
}
amijoy->dev[i].name = amijoy_name;
+ amijoy->dev[i].phys = amijoy_phys[i];
amijoy->dev[i].idbus = BUS_AMIGA;
amijoy->dev[i].idvendor = 0x0001;
amijoy->dev[i].idproduct = 0x0003;
amijoy_dev[i].private = amijoy_used + i;
input_register_device(amijoy_dev + i);
- printk(KERN_INFO "input%d: %s at joy%ddat\n", amijoy_dev[i].number, amijoy_name, i);
+ printk(KERN_INFO "input: %s at joy%ddat\n", amijoy_name, i);
}
return 0;
}
/*
- * $Id: analog.c,v 1.52 2000/06/07 13:07:06 vojtech Exp $
+ * $Id: analog.c,v 1.68 2002/01/22 20:18:32 vojtech Exp $
*
- * Copyright (c) 1996-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1996-2001 Vojtech Pavlik
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/config.h>
#include <linux/gameport.h>
#include <asm/timex.h>
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
-MODULE_DESCRIPTION("Analog joystick and gamepad driver for Linux");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Analog joystick and gamepad driver");
MODULE_LICENSE("GPL");
/*
#define ANALOG_FUZZ_MAGIC 36 /* 36 u*ms/loop */
#define ANALOG_MAX_NAME_LENGTH 128
+#define ANALOG_MAX_PHYS_LENGTH 32
static short analog_axes[] = { ABS_X, ABS_Y, ABS_RUDDER, ABS_THROTTLE };
static short analog_hats[] = { ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y, ABS_HAT2X, ABS_HAT2Y };
int mask;
short *buttons;
char name[ANALOG_MAX_NAME_LENGTH];
+ char phys[ANALOG_MAX_PHYS_LENGTH];
};
struct analog_port {
#ifdef __i386__
#define TSC_PRESENT (test_bit(X86_FEATURE_TSC, &boot_cpu_data.x86_capability))
-#define GET_TIME(x) do { if (TSC_PRESENT) rdtscl(x); else { outb(0, 0x43); x = inb(0x40); x |= inb(0x40) << 8; } } while (0)
+#define GET_TIME(x) do { if (TSC_PRESENT) rdtscl(x); else x = get_time_pit(); } while (0)
#define DELTA(x,y) (TSC_PRESENT?((y)-(x)):((x)-(y)+((x)<(y)?1193180L/HZ:0)))
#define TIME_NAME (TSC_PRESENT?"TSC":"PIT")
+static unsigned int get_time_pit(void)
+{
+ extern spinlock_t i8253_lock;
+ unsigned long flags;
+ unsigned int count;
+
+ spin_lock_irqsave(&i8253_lock, flags);
+ outb_p(0x00, 0x43);
+ count = inb_p(0x40);
+ count |= inb_p(0x40) << 8;
+ spin_unlock_irqrestore(&i8253_lock, flags);
+
+ return count;
+}
#elif __x86_64__
#define GET_TIME(x) rdtscl(x)
#define DELTA(x,y) ((y)-(x))
#define TIME_NAME "TSC"
#elif __alpha__
-#define GET_TIME(x) ((x) = get_cycles())
+#define GET_TIME(x) do { x = get_cycles(x); } while (0)
#define DELTA(x,y) ((y)-(x))
#define TIME_NAME "PCC"
#else
int i, j, t, v, w, x, y, z;
analog_name(analog);
+ sprintf(analog->phys, "%s/input%d", port->gameport->phys, index);
analog->buttons = (analog->mask & ANALOG_GAMEPAD) ? analog_pad_btn : analog_joy_btn;
analog->dev.name = analog->name;
+ analog->dev.phys = analog->phys;
analog->dev.idbus = BUS_GAMEPORT;
analog->dev.idvendor = GAMEPORT_ID_VENDOR_ANALOG;
analog->dev.idproduct = analog->mask >> 4;
input_register_device(&analog->dev);
- printk(KERN_INFO "input%d: %s at gameport%d.%d",
- analog->dev.number, analog->name, port->gameport->number, index);
+ printk(KERN_INFO "input: %s at %s", analog->name, port->gameport->phys);
if (port->cooked)
printk(" [ADC port]\n");
else
printk(" [%s timer, %d %sHz clock, %d ns res]\n", TIME_NAME,
port->speed > 10000 ? (port->speed + 800) / 1000 : port->speed,
- port->speed > 10000 ? "M" : "k",
+ port->speed > 10000 ? "M" : "k",
port->speed > 10000 ? (port->loop * 1000) / (port->speed / 1000)
: (port->loop * 1000000) / port->speed);
}
if ((port->mask & 3) != 3 && port->mask != 0xc) {
printk(KERN_WARNING "analog.c: Unknown joystick device found "
- "(data=%#x, gameport%d), probably not analog joystick.\n",
- port->mask, port->gameport->number);
+ "(data=%#x, %s), probably not analog joystick.\n",
+ port->mask, port->gameport->phys);
return -1;
}
- i = port->gameport->number < ANALOG_PORTS ? analog_options[port->gameport->number] : 0xff;
+
+ i = analog_options[0]; /* FIXME !!! - need to specify options for different ports */
analog[0].mask = i & 0xfffff;
gameport_trigger(gameport);
while ((gameport_read(port->gameport) & port->mask) && (v < t)) v++;
- if (v < (u >> 1) && port->gameport->number < ANALOG_PORTS) {
- analog_options[port->gameport->number] |=
+ if (v < (u >> 1)) { /* FIXME - more than one port */
+ analog_options[0] |= /* FIXME - more than one port */
ANALOG_SAITEK | ANALOG_BTNS_CHF | ANALOG_HBTN_CHF | ANALOG_HAT1_CHF;
return 0;
}
if (port->analog[i].mask)
input_unregister_device(&port->analog[i].dev);
gameport_close(gameport);
- printk(KERN_INFO "analog.c: %d out of %d reads (%d%%) on gameport%d failed\n",
+ printk(KERN_INFO "analog.c: %d out of %d reads (%d%%) on %s failed\n",
port->bads, port->reads, port->reads ? (port->bads * 100 / port->reads) : 0,
- port->gameport->number);
+ port->gameport->phys);
kfree(port);
}
/*
- * $Id: cobra.c,v 1.10 2000/06/08 10:23:45 vojtech Exp $
+ * $Id: cobra.c,v 1.19 2002/01/22 20:26:52 vojtech Exp $
*
- * Copyright (c) 1999-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*/
/*
- * Creative Labd Blaster GamePad Cobra driver for Linux
+ * Creative Labs Blaster GamePad Cobra driver for Linux
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/gameport.h>
#include <linux/input.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Creative Labs Blaster GamePad Cobra driver");
+MODULE_LICENSE("GPL");
+
#define COBRA_MAX_STROBE 45 /* 45 us max wait for first strobe */
#define COBRA_REFRESH_TIME HZ/50 /* 20 ms between reads */
#define COBRA_LENGTH 36
int reads;
int bads;
unsigned char exists;
+ char phys[2][32];
};
static unsigned char cobra_read_packet(struct gameport *gameport, unsigned int *data)
if ((r = cobra_read_packet(cobra->gameport, data)) != cobra->exists)
cobra->bads++;
+ else
for (i = 0; i < 2; i++)
if (cobra->exists & r & (1 << i)) {
for (i = 0; i < 2; i++)
if ((cobra->exists >> i) & data[i] & 1) {
- printk(KERN_WARNING "cobra.c: Device on gameport%d.%d has the Ext bit set. ID is: %d"
- " Contact vojtech@suse.cz\n", gameport->number, i, (data[i] >> 2) & 7);
+ printk(KERN_WARNING "cobra.c: Device %d on %s has the Ext bit set. ID is: %d"
+ " Contact vojtech@ucw.cz\n", i, gameport->phys, (data[i] >> 2) & 7);
cobra->exists &= ~(1 << i);
}
for (i = 0; i < 2; i++)
if ((cobra->exists >> i) & 1) {
+ sprintf(cobra->phys[i], "%s/input%d", gameport->phys, i);
+
cobra->dev[i].private = cobra;
cobra->dev[i].open = cobra_open;
cobra->dev[i].close = cobra_close;
cobra->dev[i].name = cobra_name;
+ cobra->dev[i].phys = cobra->phys[i];
cobra->dev[i].idbus = BUS_GAMEPORT;
cobra->dev[i].idvendor = GAMEPORT_ID_VENDOR_CREATIVE;
cobra->dev[i].idproduct = 0x0008;
cobra->dev[i].absmin[ABS_Y] = -1; cobra->dev[i].absmax[ABS_Y] = 1;
input_register_device(cobra->dev + i);
- printk(KERN_INFO "input%d: %s on gameport%d.%d\n",
- cobra->dev[i].number, cobra_name, gameport->number, i);
+ printk(KERN_INFO "input: %s on %s\n", cobra_name, gameport->phys);
}
-
return;
fail2: gameport_close(gameport);
fail1: kfree(cobra);
module_init(cobra_init);
module_exit(cobra_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: db9.c,v 1.6 2000/06/25 10:57:50 vojtech Exp $
+ * $Id: db9.c,v 1.12 2002/01/22 20:27:05 vojtech Exp $
*
- * Copyright (c) 1999 Vojtech Pavlik
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*
* Based on the work of:
* Andree Borrmann Mats Sjövall
- *
- * Sponsored by SuSE
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/parport.h>
#include <linux/input.h>
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver");
MODULE_LICENSE("GPL");
+
MODULE_PARM(db9, "2i");
MODULE_PARM(db9_2, "2i");
MODULE_PARM(db9_3, "2i");
struct pardevice *pd;
int mode;
int used;
+ char phys[2][32];
};
static struct db9 *db9_base[3];
for (i = 0; i < 1 + (db9->mode == DB9_MULTI_0802_2); i++) {
+ sprintf(db9->phys[i], "%s/input%d", db9->pd->port->name, i);
+
db9->dev[i].private = db9;
db9->dev[i].open = db9_open;
db9->dev[i].close = db9_close;
db9->dev[i].name = db9_name[db9->mode];
+ db9->dev[i].phys = db9->phys[i];
db9->dev[i].idbus = BUS_PARPORT;
db9->dev[i].idvendor = 0x0002;
db9->dev[i].idproduct = config[1];
db9->dev[i].absmin[ABS_Y] = -1; db9->dev[i].absmax[ABS_Y] = 1;
input_register_device(db9->dev + i);
- printk(KERN_INFO "input%d: %s on %s\n",
- db9->dev[i].number, db9_name[db9->mode], db9->pd->port->name);
+ printk(KERN_INFO "input: %s on %s\n", db9->dev[i].name, db9->pd->port->name);
}
return db9;
/*
- * $Id: gamecon.c,v 1.14 2001/04/29 22:42:14 vojtech Exp $
+ * $Id: gamecon.c,v 1.21 2002/01/22 20:27:27 vojtech Exp $
*
* Copyright (c) 1999-2001 Vojtech Pavlik
*
* Based on the work of:
* Andree Borrmann John Dahlstrom
* David Kuder Nathan Hand
- *
- * Sponsored by SuSE
*/
/*
- * NES, SNES, N64, Multi1, Multi2, PSX gamepad driver for Linux
+ * NES, SNES, N64, MultiSystem, PSX gamepad driver for Linux
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/parport.h>
#include <linux/input.h>
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("NES, SNES, N64, MultiSystem, PSX gamepad driver");
MODULE_LICENSE("GPL");
+
MODULE_PARM(gc, "2-6i");
MODULE_PARM(gc_2,"2-6i");
MODULE_PARM(gc_3,"2-6i");
struct timer_list timer;
unsigned char pads[GC_MAX + 1];
int used;
+ char phys[5][32];
};
static struct gc *gc_base[3];
default:
gc->pads[GC_PSX] &= ~gc_status_bit[i];
printk(KERN_WARNING "gamecon.c: Unsupported PSX controller %#x,"
- " please report to <vojtech@suse.cz>.\n", psx);
+ " please report to <vojtech@ucw.cz>.\n", psx);
}
break;
}
+ sprintf(gc->phys[i], "%s/input%d", gc->pd->port->name, i);
+
gc->dev[i].name = gc_names[config[i + 1]];
+ gc->dev[i].phys = gc->phys[i];
gc->dev[i].idbus = BUS_PARPORT;
gc->dev[i].idvendor = 0x0001;
gc->dev[i].idproduct = config[i + 1];
for (i = 0; i < 5; i++)
if (gc->pads[0] & gc_status_bit[i]) {
input_register_device(gc->dev + i);
- printk(KERN_INFO "input%d: %s on %s\n", gc->dev[i].number, gc->dev[i].name, gc->pd->port->name);
+ printk(KERN_INFO "input: %s on %s\n", gc->dev[i].name, gc->pd->port->name);
}
return gc;
/*
- * $Id: gf2k.c,v 1.12 2000/06/04 14:53:44 vojtech Exp $
+ * $Id: gf2k.c,v 1.19 2002/01/22 20:27:43 vojtech Exp $
*
- * Copyright (c) 1998-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1998-2001 Vojtech Pavlik
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/delay.h>
#include <linux/input.h>
#include <linux/gameport.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Genius Flight 2000 joystick driver");
+MODULE_LICENSE("GPL");
+
#define GF2K_START 400 /* The time we wait for the first bit [400 us] */
#define GF2K_STROBE 40 /* The time we wait for the first bit [40 us] */
#define GF2K_TIMEOUT 4 /* Wait for everything to settle [4 ms] */
int used;
unsigned char id;
unsigned char length;
+ char phys[32];
};
/*
#endif
if (gf2k->id > GF2K_ID_MAX || !gf2k_axes[gf2k->id]) {
- printk(KERN_WARNING "gf2k.c: Not yet supported joystick on gameport%d. [id: %d type:%s]\n",
- gameport->number, gf2k->id, gf2k->id > GF2K_ID_MAX ? "Unknown" : gf2k_names[gf2k->id]);
+ printk(KERN_WARNING "gf2k.c: Not yet supported joystick on %s. [id: %d type:%s]\n",
+ gameport->phys, gf2k->id, gf2k->id > GF2K_ID_MAX ? "Unknown" : gf2k_names[gf2k->id]);
goto fail2;
}
+ sprintf(gf2k->phys, "%s/input0", gameport->phys);
+
gf2k->length = gf2k_lens[gf2k->id];
gf2k->dev.private = gf2k;
gf2k->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
gf2k->dev.name = gf2k_names[gf2k->id];
+ gf2k->dev.phys = gf2k->phys;
gf2k->dev.idbus = BUS_GAMEPORT;
gf2k->dev.idvendor = GAMEPORT_ID_VENDOR_GENIUS;
gf2k->dev.idproduct = gf2k->id;
}
input_register_device(&gf2k->dev);
- printk(KERN_INFO "input%d: %s on gameport%d.0\n",
- gf2k->dev.number, gf2k_names[gf2k->id], gameport->number);
+ printk(KERN_INFO "input: %s on %s\n", gf2k_names[gf2k->id], gameport->phys);
return;
fail2: gameport_close(gameport);
module_init(gf2k_init);
module_exit(gf2k_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: grip.c,v 1.14 2000/06/06 21:13:36 vojtech Exp $
+ * $Id: grip.c,v 1.21 2002/01/22 20:27:57 vojtech Exp $
*
- * Copyright (c) 1998-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1998-2001 Vojtech Pavlik
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/gameport.h>
#include <linux/input.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Gravis GrIP protocol joystick driver");
+MODULE_LICENSE("GPL");
+
#define GRIP_MODE_GPP 1
#define GRIP_MODE_BD 2
#define GRIP_MODE_XT 3
int used;
int reads;
int bads;
+ char phys[2][32];
};
static int grip_btn_gpp[] = { BTN_START, BTN_SELECT, BTN_TR2, BTN_Y, 0, BTN_TL2, BTN_A, BTN_B, BTN_X, 0, BTN_TL, BTN_TR, -1 };
for (i = 0; i < 2; i++)
if (grip->mode[i]) {
+ sprintf(grip->phys[i], "%s/input%d", gameport->phys, i);
+
grip->dev[i].private = grip;
grip->dev[i].open = grip_open;
grip->dev[i].close = grip_close;
grip->dev[i].name = grip_name[grip->mode[i]];
+ grip->dev[i].phys = grip->phys[i];
grip->dev[i].idbus = BUS_GAMEPORT;
grip->dev[i].idvendor = GAMEPORT_ID_VENDOR_GRAVIS;
grip->dev[i].idproduct = grip->mode[i];
input_register_device(grip->dev + i);
- printk(KERN_INFO "input%d: %s on gameport%d.%d\n",
- grip->dev[i].number, grip_name[grip->mode[i]], gameport->number, i);
+ printk(KERN_INFO "input: %s on %s\n",
+ grip_name[grip->mode[i]], gameport->phys);
}
return;
module_init(grip_init);
module_exit(grip_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: interact.c,v 1.8 2000/05/29 11:19:51 vojtech Exp $
+ * $Id: interact.c,v 1.16 2002/01/22 20:28:25 vojtech Exp $
*
- * Copyright (c) 2000 Vojtech Pavlik
+ * Copyright (c) 2001 Vojtech Pavlik
*
* Based on the work of:
* Toby Deshane
- *
- * Sponsored by SuSE
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/gameport.h>
#include <linux/input.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("InterAct digital joystick driver");
+MODULE_LICENSE("GPL");
+
#define INTERACT_MAX_START 400 /* 400 us */
#define INTERACT_MAX_STROBE 40 /* 40 us */
#define INTERACT_MAX_LENGTH 32 /* 32 bits */
int reads;
unsigned char type;
unsigned char length;
+ char phys[32];
};
static short interact_abs_hhfx[] =
if (interact_read_packet(interact->gameport, interact->length, data) < interact->length) {
interact->bads++;
- } else
+ } else {
- for (i = 0; i < 3; i++)
- data[i] <<= INTERACT_MAX_LENGTH - interact->length;
+ for (i = 0; i < 3; i++)
+ data[i] <<= INTERACT_MAX_LENGTH - interact->length;
- switch (interact->type) {
+ switch (interact->type) {
- case INTERACT_TYPE_HHFX:
+ case INTERACT_TYPE_HHFX:
- for (i = 0; i < 4; i++)
- input_report_abs(dev, interact_abs_hhfx[i], (data[i & 1] >> ((i >> 1) << 3)) & 0xff);
+ for (i = 0; i < 4; i++)
+ input_report_abs(dev, interact_abs_hhfx[i], (data[i & 1] >> ((i >> 1) << 3)) & 0xff);
- for (i = 0; i < 2; i++)
- input_report_abs(dev, ABS_HAT0Y - i,
- ((data[1] >> ((i << 1) + 17)) & 1) - ((data[1] >> ((i << 1) + 16)) & 1));
+ for (i = 0; i < 2; i++)
+ input_report_abs(dev, ABS_HAT0Y - i,
+ ((data[1] >> ((i << 1) + 17)) & 1) - ((data[1] >> ((i << 1) + 16)) & 1));
- for (i = 0; i < 8; i++)
- input_report_key(dev, interact_btn_hhfx[i], (data[0] >> (i + 16)) & 1);
+ for (i = 0; i < 8; i++)
+ input_report_key(dev, interact_btn_hhfx[i], (data[0] >> (i + 16)) & 1);
- for (i = 0; i < 4; i++)
- input_report_key(dev, interact_btn_hhfx[i + 8], (data[1] >> (i + 20)) & 1);
+ for (i = 0; i < 4; i++)
+ input_report_key(dev, interact_btn_hhfx[i + 8], (data[1] >> (i + 20)) & 1);
- break;
+ break;
- case INTERACT_TYPE_PP8D:
+ case INTERACT_TYPE_PP8D:
- for (i = 0; i < 2; i++)
- input_report_abs(dev, interact_abs_pp8d[i],
- ((data[0] >> ((i << 1) + 20)) & 1) - ((data[0] >> ((i << 1) + 21)) & 1));
+ for (i = 0; i < 2; i++)
+ input_report_abs(dev, interact_abs_pp8d[i],
+ ((data[0] >> ((i << 1) + 20)) & 1) - ((data[0] >> ((i << 1) + 21)) & 1));
- for (i = 0; i < 8; i++)
- input_report_key(dev, interact_btn_pp8d[i], (data[1] >> (i + 16)) & 1);
+ for (i = 0; i < 8; i++)
+ input_report_key(dev, interact_btn_pp8d[i], (data[1] >> (i + 16)) & 1);
- break;
+ break;
+ }
}
mod_timer(&interact->timer, jiffies + INTERACT_REFRESH_TIME);
break;
if (!interact_type[i].length) {
- printk(KERN_WARNING "interact.c: Unknown joystick on gameport%d. [len %d d0 %08x d1 %08x i2 %08x]\n",
- gameport->number, i, data[0], data[1], data[2]);
+ printk(KERN_WARNING "interact.c: Unknown joystick on %s. [len %d d0 %08x d1 %08x i2 %08x]\n",
+ gameport->phys, i, data[0], data[1], data[2]);
goto fail2;
}
+ sprintf(interact->phys, "%s/input0", gameport->phys);
+
interact->type = i;
interact->length = interact_type[i].length;
interact->dev.close = interact_close;
interact->dev.name = interact_type[i].name;
+ interact->dev.phys = interact->phys;
interact->dev.idbus = BUS_GAMEPORT;
interact->dev.idvendor = GAMEPORT_ID_VENDOR_INTERACT;
interact->dev.idproduct = interact_type[i].id;
set_bit(t, interact->dev.keybit);
input_register_device(&interact->dev);
- printk(KERN_INFO "input%d: %s on gameport%d.0\n",
- interact->dev.number, interact_type[interact->type].name, gameport->number);
+ printk(KERN_INFO "input: %s on %s\n",
+ interact_type[interact->type].name, gameport->phys);
return;
fail2: gameport_close(gameport);
module_init(interact_init);
module_exit(interact_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: magellan.c,v 1.8 2000/05/31 13:17:12 vojtech Exp $
+ * $Id: magellan.c,v 1.16 2002/01/22 20:28:39 vojtech Exp $
*
- * Copyright (c) 1999-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*/
/*
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/serio.h>
#include <linux/init.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Magellan and SpaceMouse 6dof controller driver");
+MODULE_LICENSE("GPL");
+
/*
* Definitions & global arrays.
*/
#define MAGELLAN_MAX_LENGTH 32
-static int magellan_buttons[] = { BTN_0, BTN_1, BTN_2, BTN_3, BTN_4, BTN_5, BTN_6, BTN_7, BTN_8};
-static int magellan_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ};
-static char *magellan_name = "LogiCad3D Magellan";
+static int magellan_buttons[] = { BTN_0, BTN_1, BTN_2, BTN_3, BTN_4, BTN_5, BTN_6, BTN_7, BTN_8 };
+static int magellan_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ };
+static char *magellan_name = "LogiCad3D Magellan / SpaceMouse";
/*
* Per-Magellan data.
struct input_dev dev;
int idx;
unsigned char data[MAGELLAN_MAX_LENGTH];
+ char phys[32];
};
/*
magellan->dev.absmax[t] = 360;
}
+ sprintf(magellan->phys, "%s/input0", serio->phys);
+
magellan->dev.private = magellan;
magellan->dev.name = magellan_name;
+ magellan->dev.phys = magellan->phys;
magellan->dev.idbus = BUS_RS232;
magellan->dev.idvendor = SERIO_MAGELLAN;
magellan->dev.idproduct = 0x0001;
input_register_device(&magellan->dev);
- printk(KERN_INFO "input%d: %s on serio%d\n", magellan->dev.number, magellan_name, serio->number);
+ printk(KERN_INFO "input: %s on %s\n", magellan_name, serio->phys);
}
/*
module_init(magellan_init);
module_exit(magellan_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: sidewinder.c,v 1.20 2001/05/19 08:14:54 vojtech Exp $
+ * $Id: sidewinder.c,v 1.29 2002/01/22 20:28:51 vojtech Exp $
*
* Copyright (c) 1998-2001 Vojtech Pavlik
- *
- * Sponsored by SuSE
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/delay.h>
#include <linux/input.h>
#include <linux/gameport.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Microsoft SideWinder joystick family driver");
+MODULE_LICENSE("GPL");
+
/*
* These are really magic values. Changing them can make a problem go away,
* as well as break everything.
*/
-#undef SW_DEBUG
+#define SW_DEBUG
#define SW_START 400 /* The time we wait for the first bit [400 us] */
#define SW_STROBE 45 /* Max time per bit [45 us] */
struct timer_list timer;
struct input_dev dev[4];
char name[64];
+ char phys[4][32];
int length;
int type;
int bits;
if (sw->type == SW_ID_3DP && sw->length == 66 && i != 66) { /* Broken packet, try to fix */
if (i == 64 && !sw_check(sw_get_bits(buf,0,64,1))) { /* Last init failed, 1 bit mode */
- printk(KERN_WARNING "sidewinder.c: Joystick in wrong mode on gameport%d"
- " - going to reinitialize.\n", sw->gameport->number);
+ printk(KERN_WARNING "sidewinder.c: Joystick in wrong mode on %s"
+ " - going to reinitialize.\n", sw->gameport->phys);
sw->fail = SW_FAIL; /* Reinitialize */
i = 128; /* Bogus value */
}
if (sw->type == SW_ID_3DP && sw->length == 66 /* Many packets OK */
&& sw->ok > SW_OK) {
- printk(KERN_INFO "sidewinder.c: No more trouble on gameport%d"
- " - enabling optimization again.\n", sw->gameport->number);
+ printk(KERN_INFO "sidewinder.c: No more trouble on %s"
+ " - enabling optimization again.\n", sw->gameport->phys);
sw->length = 22;
}
if (sw->type == SW_ID_3DP && sw->length == 22 && sw->fail > SW_BAD) { /* Consecutive bad packets */
- printk(KERN_INFO "sidewinder.c: Many bit errors on gameport%d"
- " - disabling optimization.\n", sw->gameport->number);
+ printk(KERN_INFO "sidewinder.c: Many bit errors on %s"
+ " - disabling optimization.\n", sw->gameport->phys);
sw->length = 66;
}
if (sw->fail < SW_FAIL) return -1; /* Not enough, don't reinitialize yet */
- printk(KERN_WARNING "sidewinder.c: Too many bit errors on gameport%d"
- " - reinitializing joystick.\n", sw->gameport->number);
+ printk(KERN_WARNING "sidewinder.c: Too many bit errors on %s"
+ " - reinitializing joystick.\n", sw->gameport->phys);
if (!i && sw->type == SW_ID_3DP) { /* 3D Pro can be in analog mode */
udelay(3 * SW_TIMEOUT);
if (gameport_open(gameport, dev, GAMEPORT_MODE_RAW))
goto fail1;
- dbg("Init 0: Opened gameport %d, io %#x, speed %d",
- gameport->number, gameport->io, gameport->speed);
+ dbg("Init 0: Opened %s, io %#x, speed %d",
+ gameport->phys, gameport->io, gameport->speed);
i = sw_read_packet(gameport, buf, SW_LENGTH, 0); /* Read normal packet */
m |= sw_guess_mode(buf, i); /* Data packet (1-bit) can carry mode info [FSP] */
if (sw->type == -1) {
printk(KERN_WARNING "sidewinder.c: unknown joystick device detected "
- "on gameport%d, contact <vojtech@suse.cz>\n", gameport->number);
+ "on %s, contact <vojtech@ucw.cz>\n", gameport->phys);
sw_print_packet("ID", j * 3, idbuf, 3);
sw_print_packet("Data", i * m, buf, m);
goto fail2;
int bits, code;
sprintf(sw->name, "Microsoft SideWinder %s", sw_name[sw->type]);
+ sprintf(sw->phys[i], "%s/input%d", gameport->phys, i);
sw->dev[i].private = sw;
sw->dev[i].close = sw_close;
sw->dev[i].name = sw->name;
+ sw->dev[i].phys = sw->phys[i];
sw->dev[i].idbus = BUS_GAMEPORT;
sw->dev[i].idvendor = GAMEPORT_ID_VENDOR_MICROSOFT;
sw->dev[i].idproduct = sw->type;
set_bit(code, sw->dev[i].keybit);
input_register_device(sw->dev + i);
- printk(KERN_INFO "input%d: %s%s on gameport%d.%d [%d-bit id %d data %d]\n",
- sw->dev[i].number, sw->name, comment, gameport->number, i, m, l, k);
+ printk(KERN_INFO "input: %s%s on %s [%d-bit id %d data %d]\n",
+ sw->name, comment, gameport->phys, m, l, k);
}
return;
module_init(sw_init);
module_exit(sw_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: spaceball.c,v 1.8 2000/11/23 11:42:39 vojtech Exp $
+ * $Id: spaceball.c,v 1.17 2002/01/22 20:29:03 vojtech Exp $
*
- * Copyright (c) 1999-2000 Vojtech Pavlik
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*
* Based on the work of:
* David Thompson
* Joseph Krahn
- *
- * Sponsored by SuSE
*/
/*
- * SpaceTec SpaceBall 4000 FLX driver for Linux
+ * SpaceTec SpaceBall 2003/3003/4000 FLX driver for Linux
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/input.h>
#include <linux/serio.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("SpaceTec SpaceBall 2003/3003/4000 FLX driver");
+MODULE_LICENSE("GPL");
+
/*
* Constants.
*/
-#define JS_SBALL_MAX_LENGTH 128
+#define SPACEBALL_MAX_LENGTH 128
+#define SPACEBALL_MAX_ID 8
+
+#define SPACEBALL_1003 1
+#define SPACEBALL_2003B 3
+#define SPACEBALL_2003C 4
+#define SPACEBALL_3003C 7
+#define SPACEBALL_4000FLX 8
+#define SPACEBALL_4000FLX_L 9
+
static int spaceball_axes[] = { ABS_X, ABS_Z, ABS_Y, ABS_RX, ABS_RZ, ABS_RY };
-static char *spaceball_name = "SpaceTec SpaceBall 4000 FLX";
+static char *spaceball_names[] = {
+ "?", "SpaceTec SpaceBall 1003", "SpaceTec SpaceBall 2003", "SpaceTec SpaceBall 2003B",
+ "SpaceTec SpaceBall 2003C", "SpaceTec SpaceBall 3003", "SpaceTec SpaceBall SpaceController",
+ "SpaceTec SpaceBall 3003C", "SpaceTec SpaceBall 4000FLX", "SpaceTec SpaceBall 4000FLX Lefty" };
/*
* Per-Ball data.
struct serio *serio;
int idx;
int escape;
- unsigned char data[JS_SBALL_MAX_LENGTH];
+ unsigned char data[SPACEBALL_MAX_LENGTH];
+ char phys[32];
};
/*
if (spaceball->idx < 2) return;
- printk("%c %d\n", spaceball->data[0], spaceball->idx);
-
switch (spaceball->data[0]) {
- case '@': /* Reset packet */
- spaceball->data[spaceball->idx - 1] = 0;
- for (i = 1; i < spaceball->idx && spaceball->data[i] == ' '; i++);
- printk(KERN_INFO "input%d: %s [%s] on serio%d\n",
- spaceball->dev.number, spaceball_name, spaceball->data + i, spaceball->serio->number);
- break;
-
case 'D': /* Ball data */
if (spaceball->idx != 15) return;
- for (i = 0; i < 6; i++) {
+ for (i = 0; i < 6; i++)
input_report_abs(dev, spaceball_axes[i],
(__s16)((data[2 * i + 3] << 8) | data[2 * i + 2]));
- }
break;
- case '.': /* Button data, part2 */
+ case 'K': /* Button data */
if (spaceball->idx != 3) return;
- input_report_key(dev, BTN_0, data[2] & 1);
- input_report_key(dev, BTN_1, data[2] & 2);
+ input_report_key(dev, BTN_1, (data[2] & 0x01) || (data[2] & 0x20));
+ input_report_key(dev, BTN_2, data[2] & 0x02);
+ input_report_key(dev, BTN_3, data[2] & 0x04);
+ input_report_key(dev, BTN_4, data[2] & 0x08);
+ input_report_key(dev, BTN_5, data[1] & 0x01);
+ input_report_key(dev, BTN_6, data[1] & 0x02);
+ input_report_key(dev, BTN_7, data[1] & 0x04);
+ input_report_key(dev, BTN_8, data[1] & 0x10);
break;
- case '?': /* Error packet */
+ case '.': /* Advanced button data */
+ if (spaceball->idx != 3) return;
+ input_report_key(dev, BTN_1, data[2] & 0x01);
+ input_report_key(dev, BTN_2, data[2] & 0x02);
+ input_report_key(dev, BTN_3, data[2] & 0x04);
+ input_report_key(dev, BTN_4, data[2] & 0x08);
+ input_report_key(dev, BTN_5, data[2] & 0x10);
+ input_report_key(dev, BTN_6, data[2] & 0x20);
+ input_report_key(dev, BTN_7, data[2] & 0x80);
+ input_report_key(dev, BTN_8, data[1] & 0x01);
+ input_report_key(dev, BTN_9, data[1] & 0x02);
+ input_report_key(dev, BTN_A, data[1] & 0x04);
+ input_report_key(dev, BTN_B, data[1] & 0x08);
+ input_report_key(dev, BTN_C, data[1] & 0x10);
+ input_report_key(dev, BTN_MODE, data[1] & 0x20);
+ break;
+
+ case 'E': /* Device error */
spaceball->data[spaceball->idx - 1] = 0;
printk(KERN_ERR "spaceball: Device error. [%s]\n", spaceball->data + 1);
break;
+
+ case '?': /* Bad command packet */
+ spaceball->data[spaceball->idx - 1] = 0;
+ printk(KERN_ERR "spaceball: Bad command. [%s]\n", spaceball->data + 1);
+ break;
}
}
data &= 0x1f;
}
default:
- if (spaceball->escape) {
+ if (spaceball->escape)
spaceball->escape = 0;
- printk(KERN_WARNING "spaceball.c: Unknown escaped character: %#x (%c)\n", data, data);
- }
- if (spaceball->idx < JS_SBALL_MAX_LENGTH)
+ if (spaceball->idx < SPACEBALL_MAX_LENGTH)
spaceball->data[spaceball->idx++] = data;
return;
}
static void spaceball_connect(struct serio *serio, struct serio_dev *dev)
{
struct spaceball *spaceball;
- int i, t;
+ int i, t, id;
- if (serio->type != (SERIO_RS232 | SERIO_SPACEBALL))
+ if ((serio->type & ~SERIO_ID) != (SERIO_RS232 | SERIO_SPACEBALL))
+ return;
+
+ if ((id = (serio->type & SERIO_ID) >> 8) > SPACEBALL_MAX_ID)
return;
if (!(spaceball = kmalloc(sizeof(struct spaceball), GFP_KERNEL)))
memset(spaceball, 0, sizeof(struct spaceball));
spaceball->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
- spaceball->dev.keybit[LONG(BTN_0)] = BIT(BTN_0) | BIT(BTN_1);
+
+ switch (id) {
+ case SPACEBALL_4000FLX:
+ case SPACEBALL_4000FLX_L:
+ spaceball->dev.keybit[LONG(BTN_0)] |= BIT(BTN_9);
+ spaceball->dev.keybit[LONG(BTN_A)] |= BIT(BTN_A) | BIT(BTN_B) | BIT(BTN_C) | BIT(BTN_MODE);
+ default:
+ spaceball->dev.keybit[LONG(BTN_0)] |= BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4)
+ | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7) | BIT(BTN_8);
+ case SPACEBALL_3003C:
+ spaceball->dev.keybit[LONG(BTN_0)] |= BIT(BTN_1) | BIT(BTN_8);
+ }
for (i = 0; i < 6; i++) {
t = spaceball_axes[i];
spaceball->serio = serio;
spaceball->dev.private = spaceball;
- spaceball->dev.name = spaceball_name;
+ sprintf(spaceball->phys, "%s/input0", serio->phys);
+
+ spaceball->dev.name = spaceball_names[id];
+ spaceball->dev.phys = spaceball->phys;
spaceball->dev.idbus = BUS_RS232;
spaceball->dev.idvendor = SERIO_SPACEBALL;
- spaceball->dev.idproduct = 0x0001;
+ spaceball->dev.idproduct = id;
spaceball->dev.idversion = 0x0100;
serio->private = spaceball;
}
input_register_device(&spaceball->dev);
+
+ printk(KERN_INFO "input: %s on serio%s\n",
+ spaceball_names[id], serio->phys);
}
/*
module_init(spaceball_init);
module_exit(spaceball_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: spaceorb.c,v 1.7 2000/05/29 11:19:51 vojtech Exp $
+ * $Id: spaceorb.c,v 1.15 2002/01/22 20:29:19 vojtech Exp $
*
- * Copyright (c) 1999-2000 Vojtech Pavlik
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*
* Based on the work of:
* David Thompson
- *
- * Sponsored by SuSE
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/input.h>
#include <linux/serio.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("SpaceTec SpaceOrb 360 and Avenger 6dof controller driver");
+MODULE_LICENSE("GPL");
+
/*
* Constants.
*/
#define SPACEORB_MAX_LENGTH 64
-static int spaceorb_buttons[] = { BTN_TL, BTN_TR, BTN_Y, BTN_X, BTN_B, BTN_A, BTN_MODE};
-static int spaceorb_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ};
-static char *spaceorb_name = "SpaceTec SpaceOrb 360";
+static int spaceorb_buttons[] = { BTN_TL, BTN_TR, BTN_Y, BTN_X, BTN_B, BTN_A };
+static int spaceorb_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ };
+static char *spaceorb_name = "SpaceTec SpaceOrb 360 / Avenger";
/*
* Per-Orb data.
struct serio *serio;
int idx;
unsigned char data[SPACEORB_MAX_LENGTH];
+ char phys[32];
};
static unsigned char spaceorb_xor[] = "SpaceWare";
case 'R': /* Reset packet */
spaceorb->data[spaceorb->idx - 1] = 0;
for (i = 1; i < spaceorb->idx && spaceorb->data[i] == ' '; i++);
- printk(KERN_INFO "input%d: %s [%s] on serio%d\n",
- spaceorb->dev.number, spaceorb_name, spaceorb->data + i, spaceorb->serio->number);
+ printk(KERN_INFO "input: %s [%s] on %s\n",
+ spaceorb_name, spaceorb->data + i, spaceorb->serio->phys);
break;
case 'D': /* Ball + button data */
axes[5] = ((data[9] & 0x3f) << 4) | (data[10] >> 3);
for (i = 0; i < 6; i++)
input_report_abs(dev, spaceorb_axes[i], axes[i] - ((axes[i] & 0x200) ? 1024 : 0));
- for (i = 0; i < 8; i++)
+ for (i = 0; i < 6; i++)
input_report_key(dev, spaceorb_buttons[i], (data[1] >> i) & 1);
break;
spaceorb->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
- for (i = 0; i < 7; i++)
- set_bit(spaceorb_buttons[i], &spaceorb->dev.keybit);
+ for (i = 0; i < 6; i++)
+ set_bit(spaceorb_buttons[i], spaceorb->dev.keybit);
for (i = 0; i < 6; i++) {
t = spaceorb_axes[i];
spaceorb->serio = serio;
spaceorb->dev.private = spaceorb;
+ sprintf(spaceorb->phys, "%s/input0", serio->phys);
+
spaceorb->dev.name = spaceorb_name;
+ spaceorb->dev.phys = spaceorb->phys;
spaceorb->dev.idbus = BUS_RS232;
spaceorb->dev.idvendor = SERIO_SPACEORB;
spaceorb->dev.idproduct = 0x0001;
module_init(spaceorb_init);
module_exit(spaceorb_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: stinger.c,v 1.4 2001/05/23 09:25:02 vojtech Exp $
+ * $Id: stinger.c,v 1.10 2002/01/22 20:29:31 vojtech Exp $
*
* Copyright (c) 2000-2001 Vojtech Pavlik
* Copyright (c) 2000 Mark Fletcher
- *
- * Sponsored by SuSE
*/
/*
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/serio.h>
#include <linux/init.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Gravis Stinger gamepad driver");
+MODULE_LICENSE("GPL");
+
/*
* Constants.
*/
struct input_dev dev;
int idx;
unsigned char data[STINGER_MAX_LENGTH];
+ char phys[32];
};
/*
BIT(BTN_START) | BIT(BTN_SELECT);
stinger->dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
+ sprintf(stinger->phys, "%s/serio0", serio->phys);
+
stinger->dev.name = stinger_name;
+ stinger->dev.phys = stinger->phys;
stinger->dev.idbus = BUS_RS232;
stinger->dev.idvendor = SERIO_STINGER;
stinger->dev.idproduct = 0x0001;
input_register_device(&stinger->dev);
- printk(KERN_INFO "input%d: %s on serio%d\n", stinger->dev.number, stinger_name, serio->number);
+ printk(KERN_INFO "input: %s on %s\n", stinger_name, serio->phys);
}
/*
module_init(stinger_init);
module_exit(stinger_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: tmdc.c,v 1.23 2000/11/29 19:52:24 vojtech Exp $
+ * $Id: tmdc.c,v 1.31 2002/01/22 20:29:52 vojtech Exp $
*
- * Copyright (c) 1998-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1998-2001 Vojtech Pavlik
*
* Based on the work of:
* Trystan Larey-Williams
- *
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/delay.h>
#include <linux/gameport.h>
#include <linux/input.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("ThrustMaster DirectConnect joystick driver");
+MODULE_LICENSE("GPL");
+
#define TMDC_MAX_START 400 /* 400 us */
#define TMDC_MAX_STROBE 45 /* 45 us */
#define TMDC_MAX_LENGTH 13
struct timer_list timer;
struct input_dev dev[2];
char name[2][64];
+ char phys[2][32];
int mode[2];
signed char *abs[2];
short *btn[2];
if ((r = tmdc_read_packet(tmdc->gameport, data)) != tmdc->exists)
bad = 1;
+ else
for (j = 0; j < 2; j++)
if (r & (1 << j) & tmdc->exists) {
sprintf(tmdc->name[j], models[m].name, models[m].abs,
(data[j][TMDC_BYTE_DEF] & 0xf) << 3, tmdc->mode[j]);
+ sprintf(tmdc->phys[j], "%s/input%d", gameport->phys, j);
+
tmdc->dev[j].private = tmdc;
tmdc->dev[j].open = tmdc_open;
tmdc->dev[j].close = tmdc_close;
tmdc->dev[j].name = tmdc->name[j];
+ tmdc->dev[j].phys = tmdc->phys[j];
tmdc->dev[j].idbus = BUS_GAMEPORT;
tmdc->dev[j].idvendor = GAMEPORT_ID_VENDOR_THRUSTMASTER;
tmdc->dev[j].idproduct = models[m].id;
}
input_register_device(tmdc->dev + j);
- printk(KERN_INFO "input%d: %s on gameport%d.%d\n",
- tmdc->dev[j].number, tmdc->name[j], gameport->number, j);
+ printk(KERN_INFO "input: %s on %s\n", tmdc->name[j], gameport->phys);
}
return;
module_init(tmdc_init);
module_exit(tmdc_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: turbografx.c,v 1.8 2000/05/29 20:39:38 vojtech Exp $
+ * $Id: turbografx.c,v 1.14 2002/01/22 20:30:39 vojtech Exp $
*
- * Copyright (c) 1998-2000 Vojtech Pavlik
+ * Copyright (c) 1998-2001 Vojtech Pavlik
*
* Based on the work of:
* Steffen Schwenke
- *
- * Sponsored by SuSE
*/
/*
* 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
+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
-MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("TurboGraFX parallel port interface driver");
MODULE_LICENSE("GPL");
+
MODULE_PARM(tgfx, "2-8i");
MODULE_PARM(tgfx_2, "2-8i");
MODULE_PARM(tgfx_3, "2-8i");
struct pardevice *pd;
struct timer_list timer;
struct input_dev dev[7];
+ char phys[7][32];
int sticks;
int used;
} *tgfx_base[3];
tgfx->dev[i].open = tgfx_open;
tgfx->dev[i].close = tgfx_close;
+ sprintf(tgfx->phys[i], "%s/input0", tgfx->pd->port->name);
+
tgfx->dev[i].name = tgfx_name;
+ tgfx->dev[i].phys = tgfx->phys[i];
tgfx->dev[i].idbus = BUS_PARPORT;
tgfx->dev[i].idvendor = 0x0003;
tgfx->dev[i].idproduct = config[i+1];
tgfx->dev[i].absmin[ABS_Y] = -1; tgfx->dev[i].absmax[ABS_Y] = 1;
input_register_device(tgfx->dev + i);
- printk(KERN_INFO "input%d: %d-button Multisystem joystick on %s\n",
- tgfx->dev[i].number, config[i+1], tgfx->pd->port->name);
+ printk(KERN_INFO "input: %d-button Multisystem joystick on %s\n",
+ config[i+1], tgfx->pd->port->name);
}
if (!tgfx->sticks) {
/*
- * $Id: warrior.c,v 1.8 2000/05/31 13:17:12 vojtech Exp $
+ * $Id: warrior.c,v 1.14 2002/01/22 20:32:10 vojtech Exp $
*
- * Copyright (c) 1999-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*/
/*
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/kernel.h>
#include <linux/serio.h>
#include <linux/init.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Logitech WingMan Warrior joystick driver");
+MODULE_LICENSE("GPL");
+
/*
* Constants.
*/
struct input_dev dev;
int idx, len;
unsigned char data[WARRIOR_MAX_LENGTH];
+ char phys[32];
};
/*
warrior->dev.relbit[0] = BIT(REL_DIAL);
warrior->dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_THROTTLE) | BIT(ABS_HAT0X) | BIT(ABS_HAT0Y);
+ sprintf(warrior->phys, "%s/input0", serio->phys);
+
warrior->dev.name = warrior_name;
+ warrior->dev.phys = warrior->phys;
warrior->dev.idbus = BUS_RS232;
warrior->dev.idvendor = SERIO_WARRIOR;
warrior->dev.idproduct = 0x0001;
input_register_device(&warrior->dev);
- printk(KERN_INFO "input%d: Logitech WingMan Warrior on serio%d\n", warrior->dev.number, serio->number);
+ printk(KERN_INFO "input: Logitech WingMan Warrior on %s\n", serio->phys);
}
/*
module_init(warrior_init);
module_exit(warrior_exit);
-
-MODULE_LICENSE("GPL");
/*
- * $Id: serio.c,v 1.5 2000/06/04 17:44:59 vojtech Exp $
+ * $Id: serio.c,v 1.15 2002/01/22 21:12:03 vojtech Exp $
*
- * Copyright (c) 1999-2000 Vojtech Pavlik
- *
- * Sponsored by SuSE
+ * Copyright (c) 1999-2001 Vojtech Pavlik
*/
/*
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/stddef.h>
#include <linux/module.h>
#include <linux/serio.h>
+#include <linux/errno.h>
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Serio abstraction core");
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(serio_register_port);
static struct serio *serio_list;
static struct serio_dev *serio_dev;
-static int serio_number;
static void serio_find_dev(struct serio *serio)
{
void serio_register_port(struct serio *serio)
{
- serio->number = serio_number++;
serio->next = serio_list;
serio_list = serio;
serio_find_dev(serio);
if (serio->dev && serio->dev->disconnect)
serio->dev->disconnect(serio);
-
- serio_number--;
}
void serio_register_device(struct serio_dev *dev)
/*
- * $Id: serport.c,v 1.7 2001/05/25 19:00:27 jdeneux Exp $
+ * $Id: serport_old.c,v 1.10 2002/01/24 19:52:57 vojtech Exp $
*
* Copyright (c) 1999-2001 Vojtech Pavlik
- *
- * Sponsored by SuSE
*/
/*
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <asm/uaccess.h>
#include <linux/serio.h>
#include <linux/tty.h>
+MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
+MODULE_DESCRIPTION("Input device TTY line discipline");
+MODULE_LICENSE("GPL");
+
struct serport {
struct tty_struct *tty;
wait_queue_head_t wait;
struct serio serio;
+ char phys[32];
};
+char serport_name[] = "Serial port";
+
/*
* Callback functions from the serio code.
*/
static int serport_ldisc_open(struct tty_struct *tty)
{
struct serport *serport;
+ char ttyname[64];
+ int i;
MOD_INC_USE_COUNT;
memset(serport, 0, sizeof(struct serport));
+ set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
serport->tty = tty;
tty->disc_data = serport;
+ strcpy(ttyname, tty->driver.name);
+ for (i = 0; ttyname[i] != 0 && ttyname[i] != '/'; i++);
+ ttyname[i] = 0;
+
+ sprintf(serport->phys, "%s%d/serio0", ttyname, minor(tty->device) - tty->driver.minor_start);
+
+ serport->serio.name = serport_name;
+ serport->serio.phys = serport->phys;
+
serport->serio.type = SERIO_RS232;
serport->serio.write = serport_serio_write;
serport->serio.open = serport_serio_open;
serio_register_port(&serport->serio);
- printk(KERN_INFO "serio%d: Serial port %s\n", serport->serio.number, name);
+ printk(KERN_INFO "serio: Serial port %s\n", name);
add_wait_queue(&serport->wait, &wait);
- current->state = TASK_INTERRUPTIBLE;
+ set_current_state(TASK_INTERRUPTIBLE);
while(serport->serio.type && !signal_pending(current)) schedule();
- current->state = TASK_RUNNING;
+ set_current_state(TASK_RUNNING);
remove_wait_queue(&serport->wait, &wait);
serio_unregister_port(&serport->serio);
return -EINVAL;
}
+static void serport_ldisc_write_wakeup(struct tty_struct * tty)
+{
+ struct serport *sp = (struct serport *) tty->disc_data;
+
+ serio_dev_write_wakeup(&sp->serio);
+
+}
+
/*
* The line discipline structure.
*/
ioctl: serport_ldisc_ioctl,
receive_buf: serport_ldisc_receive,
receive_room: serport_ldisc_room,
+ write_wakeup: serport_ldisc_write_wakeup
};
/*
module_init(serport_init);
module_exit(serport_exit);
-
-MODULE_LICENSE("GPL");