X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Finput%2Fjoystick%2Fjoydump.c;h=88ec5a918f2e80ea980f7098075553f5a782f94f;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=9f3bed21b1bb3be80113ee4811a7c7d4434c0a2f;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/input/joystick/joydump.c b/drivers/input/joystick/joydump.c index 9f3bed21b..88ec5a918 100644 --- a/drivers/input/joystick/joydump.c +++ b/drivers/input/joystick/joydump.c @@ -12,18 +12,18 @@ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * 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 , or by paper mail: * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic @@ -34,9 +34,12 @@ #include #include #include +#include + +#define DRIVER_DESC "Gameport data dumper module" MODULE_AUTHOR("Vojtech Pavlik "); -MODULE_DESCRIPTION("Gameport data dumper module"); +MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL"); #define BUF_SIZE 256 @@ -46,38 +49,46 @@ struct joydump { unsigned char data; }; -static void __devinit joydump_connect(struct gameport *gameport, struct gameport_dev *dev) +static int joydump_connect(struct gameport *gameport, struct gameport_driver *drv) { - struct joydump buf[BUF_SIZE]; + struct joydump *buf; /* all entries */ + struct joydump *dump, *prev; /* one entry each */ int axes[4], buttons; int i, j, t, timeout; unsigned long flags; unsigned char u; - printk(KERN_INFO "joydump: ,------------------- START ------------------.\n"); - printk(KERN_INFO "joydump: | Dumping gameport%s.\n", gameport->phys); - printk(KERN_INFO "joydump: | Speed: %4d kHz. |\n", gameport->speed); + printk(KERN_INFO "joydump: ,------------------ START ----------------.\n"); + printk(KERN_INFO "joydump: | Dumping: %30s |\n", gameport->phys); + printk(KERN_INFO "joydump: | Speed: %28d kHz |\n", gameport->speed); - if (gameport_open(gameport, dev, GAMEPORT_MODE_RAW)) { + if (gameport_open(gameport, drv, GAMEPORT_MODE_RAW)) { printk(KERN_INFO "joydump: | Raw mode not available - trying cooked. |\n"); - if (gameport_open(gameport, dev, GAMEPORT_MODE_COOKED)) { - - printk(KERN_INFO "joydump: | Cooked not available either. Failing. |\n"); - printk(KERN_INFO "joydump: `-------------------- END -------------------'\n"); - return; + if (gameport_open(gameport, drv, GAMEPORT_MODE_COOKED)) { + + printk(KERN_INFO "joydump: | Cooked not available either. Failing. |\n"); + printk(KERN_INFO "joydump: `------------------- END -----------------'\n"); + return -ENODEV; } gameport_cooked_read(gameport, axes, &buttons); for (i = 0; i < 4; i++) - printk(KERN_INFO "joydump: | Axis %d: %4d. |\n", i, axes[i]); - printk(KERN_INFO "joydump: | Buttons %02x. |\n", buttons); - printk(KERN_INFO "joydump: `-------------------- END -------------------'\n"); + printk(KERN_INFO "joydump: | Axis %d: %4d. |\n", i, axes[i]); + printk(KERN_INFO "joydump: | Buttons %02x. |\n", buttons); + printk(KERN_INFO "joydump: `------------------- END -----------------'\n"); } timeout = gameport_time(gameport, 10000); /* 10 ms */ + + buf = kmalloc(BUF_SIZE * sizeof(struct joydump), GFP_KERNEL); + if (!buf) { + printk(KERN_INFO "joydump: no memory for testing\n"); + goto jd_end; + } + dump = buf; t = 0; i = 1; @@ -85,19 +96,21 @@ static void __devinit joydump_connect(struct gameport *gameport, struct gameport u = gameport_read(gameport); - buf[0].data = u; - buf[0].time = t; + dump->data = u; + dump->time = t; + dump++; gameport_trigger(gameport); while (i < BUF_SIZE && t < timeout) { - buf[i].data = gameport_read(gameport); + dump->data = gameport_read(gameport); - if (buf[i].data ^ u) { - u = buf[i].data; - buf[i].time = t; + if (dump->data ^ u) { + u = dump->data; + dump->time = t; i++; + dump++; } t++; } @@ -109,42 +122,54 @@ static void __devinit joydump_connect(struct gameport *gameport, struct gameport */ t = i; + dump = buf; + prev = dump; - printk(KERN_INFO "joydump: >------------------- DATA -------------------<\n"); - printk(KERN_INFO "joydump: | index: %3d delta: %3d.%02d us data: ", 0, 0, 0); + printk(KERN_INFO "joydump: >------------------ DATA -----------------<\n"); + printk(KERN_INFO "joydump: | index: %3d delta: %3d us data: ", 0, 0); for (j = 7; j >= 0; j--) - printk("%d",(buf[0].data >> j) & 1); + printk("%d", (dump->data >> j) & 1); printk(" |\n"); - for (i = 1; i < t; i++) { + dump++; + + for (i = 1; i < t; i++, dump++, prev++) { printk(KERN_INFO "joydump: | index: %3d delta: %3d us data: ", - i, buf[i].time - buf[i-1].time); + i, dump->time - prev->time); for (j = 7; j >= 0; j--) - printk("%d",(buf[i].data >> j) & 1); - printk(" |\n"); + printk("%d", (dump->data >> j) & 1); + printk(" |\n"); } + kfree(buf); - printk(KERN_INFO "joydump: `-------------------- END -------------------'\n"); +jd_end: + printk(KERN_INFO "joydump: `------------------- END -----------------'\n"); + + return 0; } -static void __devexit joydump_disconnect(struct gameport *gameport) +static void joydump_disconnect(struct gameport *gameport) { gameport_close(gameport); } -static struct gameport_dev joydump_dev = { - .connect = joydump_connect, - .disconnect = joydump_disconnect, +static struct gameport_driver joydump_drv = { + .driver = { + .name = "joydump", + }, + .description = DRIVER_DESC, + .connect = joydump_connect, + .disconnect = joydump_disconnect, }; static int __init joydump_init(void) { - gameport_register_device(&joydump_dev); + gameport_register_driver(&joydump_drv); return 0; } static void __exit joydump_exit(void) { - gameport_unregister_device(&joydump_dev); + gameport_unregister_driver(&joydump_drv); } module_init(joydump_init);