iforce-main.c 13.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/*
 *  Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz>
3
 *  Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com>
L
Linus Torvalds 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 *  USB/RS232 I-Force joysticks and wheels.
 */

/*
 * 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
 * (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 <vojtech@ucw.cz>, or by paper mail:
 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
 */

#include "iforce.h"

30
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>, Johann Deneux <johann.deneux@gmail.com>");
L
Linus Torvalds 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
MODULE_DESCRIPTION("USB/RS232 I-Force joysticks and wheels driver");
MODULE_LICENSE("GPL");

static signed short btn_joystick[] =
{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE,
  BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_BASE5, BTN_A, BTN_B, BTN_C, -1 };

static signed short btn_avb_pegasus[] =
{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE,
  BTN_BASE2, BTN_BASE3, BTN_BASE4, -1 };

static signed short btn_wheel[] =
{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE,
  BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_BASE5, BTN_A, BTN_B, BTN_C, -1 };

static signed short btn_avb_tw[] =
{ BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE,
  BTN_BASE2, BTN_BASE3, BTN_BASE4, -1 };

static signed short btn_avb_wheel[] =
{ BTN_GEAR_DOWN, BTN_GEAR_UP, BTN_BASE, BTN_BASE2, BTN_BASE3,
  BTN_BASE4, BTN_BASE5, BTN_BASE6, -1 };

static signed short abs_joystick[] =
{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 };

static signed short abs_avb_pegasus[] =
{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y,
  ABS_HAT1X, ABS_HAT1Y, -1 };

static signed short abs_wheel[] =
{ ABS_WHEEL, ABS_GAS, ABS_BRAKE, ABS_HAT0X, ABS_HAT0Y, -1 };

static signed short ff_iforce[] =
{ FF_PERIODIC, FF_CONSTANT, FF_SPRING, FF_DAMPER,
  FF_SQUARE, FF_TRIANGLE, FF_SINE, FF_SAW_UP, FF_SAW_DOWN, FF_GAIN,
  FF_AUTOCENTER, -1 };

static struct iforce_device iforce_device[] = {
	{ 0x044f, 0xa01c, "Thrustmaster Motor Sport GT",		btn_wheel, abs_wheel, ff_iforce },
	{ 0x046d, 0xc281, "Logitech WingMan Force",			btn_joystick, abs_joystick, ff_iforce },
	{ 0x046d, 0xc291, "Logitech WingMan Formula Force",		btn_wheel, abs_wheel, ff_iforce },
	{ 0x05ef, 0x020a, "AVB Top Shot Pegasus",			btn_avb_pegasus, abs_avb_pegasus, ff_iforce },
	{ 0x05ef, 0x8884, "AVB Mag Turbo Force",			btn_avb_wheel, abs_wheel, ff_iforce },
	{ 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel",	btn_avb_tw, abs_wheel, ff_iforce }, //?
	{ 0x061c, 0xc0a4, "ACT LABS Force RS",                          btn_wheel, abs_wheel, ff_iforce }, //?
77
	{ 0x061c, 0xc084, "ACT LABS Force RS",				btn_wheel, abs_wheel, ff_iforce },
L
Linus Torvalds 已提交
78 79
	{ 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback",	btn_wheel, abs_wheel, ff_iforce }, //?
	{ 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel",	btn_wheel, abs_wheel, ff_iforce }, //?
80
	{ 0x06f8, 0x0004, "Gullemot Jet Leader 3D",			btn_joystick, abs_joystick, ff_iforce }, //?
81
	{ 0x06d6, 0x29bc, "Trust Force Feedback Race Master",		btn_wheel, abs_wheel, ff_iforce },
L
Linus Torvalds 已提交
82 83 84
	{ 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]",		btn_joystick, abs_joystick, ff_iforce }
};

85
static int iforce_playback(struct input_dev *dev, int effect_id, int value)
L
Linus Torvalds 已提交
86
{
87
	struct iforce *iforce = input_get_drvdata(dev);
88
	struct iforce_core_effect *core_effect = &iforce->core_effects[effect_id];
L
Linus Torvalds 已提交
89

90 91 92 93
	if (value > 0)
		set_bit(FF_CORE_SHOULD_PLAY, core_effect->flags);
	else
		clear_bit(FF_CORE_SHOULD_PLAY, core_effect->flags);
L
Linus Torvalds 已提交
94

95 96 97
	iforce_control_playback(iforce, effect_id, value);
	return 0;
}
L
Linus Torvalds 已提交
98

99 100
static void iforce_set_gain(struct input_dev *dev, u16 gain)
{
101
	struct iforce *iforce = input_get_drvdata(dev);
102
	unsigned char data[3];
L
Linus Torvalds 已提交
103

104 105 106
	data[0] = gain >> 9;
	iforce_send_packet(iforce, FF_CMD_GAIN, data);
}
L
Linus Torvalds 已提交
107

108 109
static void iforce_set_autocenter(struct input_dev *dev, u16 magnitude)
{
110
	struct iforce *iforce = input_get_drvdata(dev);
111
	unsigned char data[3];
L
Linus Torvalds 已提交
112

113 114 115
	data[0] = 0x03;
	data[1] = magnitude >> 9;
	iforce_send_packet(iforce, FF_CMD_AUTOCENTER, data);
L
Linus Torvalds 已提交
116

117 118 119
	data[0] = 0x04;
	data[1] = 0x01;
	iforce_send_packet(iforce, FF_CMD_AUTOCENTER, data);
L
Linus Torvalds 已提交
120 121 122 123 124 125
}

/*
 * Function called when an ioctl is performed on the event dev entry.
 * It uploads an effect to the device
 */
126
static int iforce_upload_effect(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old)
L
Linus Torvalds 已提交
127
{
128
	struct iforce *iforce = input_get_drvdata(dev);
129
	struct iforce_core_effect *core_effect = &iforce->core_effects[effect->id];
L
Linus Torvalds 已提交
130 131
	int ret;

132
	if (__test_and_set_bit(FF_CORE_IS_USED, core_effect->flags)) {
L
Linus Torvalds 已提交
133
		/* Check the effect is not already being updated */
134
		if (test_bit(FF_CORE_UPDATE, core_effect->flags))
L
Linus Torvalds 已提交
135 136 137 138 139 140 141 142 143
			return -EAGAIN;
	}

/*
 * Upload the effect
 */
	switch (effect->type) {

		case FF_PERIODIC:
144
			ret = iforce_upload_periodic(iforce, effect, old);
L
Linus Torvalds 已提交
145 146 147
			break;

		case FF_CONSTANT:
148
			ret = iforce_upload_constant(iforce, effect, old);
L
Linus Torvalds 已提交
149 150 151 152
			break;

		case FF_SPRING:
		case FF_DAMPER:
153
			ret = iforce_upload_condition(iforce, effect, old);
L
Linus Torvalds 已提交
154 155 156 157 158
			break;

		default:
			return -EINVAL;
	}
159

L
Linus Torvalds 已提交
160 161 162 163
	if (ret == 0) {
		/* A packet was sent, forbid new updates until we are notified
		 * that the packet was updated
		 */
164
		set_bit(FF_CORE_UPDATE, core_effect->flags);
L
Linus Torvalds 已提交
165 166 167 168 169 170 171 172 173 174
	}
	return ret;
}

/*
 * Erases an effect: it frees the effect id and mark as unused the memory
 * allocated for the parameters
 */
static int iforce_erase_effect(struct input_dev *dev, int effect_id)
{
175
	struct iforce *iforce = input_get_drvdata(dev);
176
	struct iforce_core_effect *core_effect = &iforce->core_effects[effect_id];
L
Linus Torvalds 已提交
177 178 179
	int err = 0;

	if (test_bit(FF_MOD1_IS_USED, core_effect->flags))
180
		err = release_resource(&core_effect->mod1_chunk);
L
Linus Torvalds 已提交
181 182

	if (!err && test_bit(FF_MOD2_IS_USED, core_effect->flags))
183
		err = release_resource(&core_effect->mod2_chunk);
L
Linus Torvalds 已提交
184

185
	/* TODO: remember to change that if more FF_MOD* bits are added */
L
Linus Torvalds 已提交
186 187 188 189 190 191 192
	core_effect->flags[0] = 0;

	return err;
}

static int iforce_open(struct input_dev *dev)
{
193
	struct iforce *iforce = input_get_drvdata(dev);
L
Linus Torvalds 已提交
194 195 196 197 198 199 200 201 202 203 204

	switch (iforce->bus) {
#ifdef CONFIG_JOYSTICK_IFORCE_USB
		case IFORCE_USB:
			iforce->irq->dev = iforce->usbdev;
			if (usb_submit_urb(iforce->irq, GFP_KERNEL))
				return -EIO;
			break;
#endif
	}

205 206 207 208
	if (test_bit(EV_FF, dev->evbit)) {
		/* Enable force feedback */
		iforce_send_packet(iforce, FF_CMD_ENABLE, "\004");
	}
L
Linus Torvalds 已提交
209 210 211 212

	return 0;
}

213
static void iforce_release(struct input_dev *dev)
L
Linus Torvalds 已提交
214
{
215
	struct iforce *iforce = input_get_drvdata(dev);
L
Linus Torvalds 已提交
216 217
	int i;

218 219 220 221
	if (test_bit(EV_FF, dev->evbit)) {
		/* Check: no effects should be present in memory */
		for (i = 0; i < dev->ff->max_effects; i++) {
			if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags)) {
222 223 224
				dev_warn(&dev->dev,
					"%s: Device still owns effects\n",
					__func__);
225
				break;
L
Linus Torvalds 已提交
226 227 228
			}
		}

229 230
		/* Disable force feedback playback */
		iforce_send_packet(iforce, FF_CMD_ENABLE, "\001");
L
Linus Torvalds 已提交
231 232 233 234 235
	}

	switch (iforce->bus) {
#ifdef CONFIG_JOYSTICK_IFORCE_USB
		case IFORCE_USB:
236
			usb_kill_urb(iforce->irq);
L
Linus Torvalds 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266

			/* The device was unplugged before the file
			 * was released */
			if (iforce->usbdev == NULL) {
				iforce_delete_device(iforce);
				kfree(iforce);
			}
		break;
#endif
	}
}

void iforce_delete_device(struct iforce *iforce)
{
	switch (iforce->bus) {
#ifdef CONFIG_JOYSTICK_IFORCE_USB
	case IFORCE_USB:
		iforce_usb_delete(iforce);
		break;
#endif
#ifdef CONFIG_JOYSTICK_IFORCE_232
	case IFORCE_232:
		//TODO: Wait for the last packets to be sent
		break;
#endif
	}
}

int iforce_init_device(struct iforce *iforce)
{
267
	struct input_dev *input_dev;
268
	struct ff_device *ff;
L
Linus Torvalds 已提交
269
	unsigned char c[] = "CEOV";
270 271
	int i, error;
	int ff_effects = 0;
L
Linus Torvalds 已提交
272

273
	input_dev = input_allocate_device();
274
	if (!input_dev)
275 276
		return -ENOMEM;

L
Linus Torvalds 已提交
277 278
	init_waitqueue_head(&iforce->wait);
	spin_lock_init(&iforce->xmit_lock);
279
	mutex_init(&iforce->mem_mutex);
L
Linus Torvalds 已提交
280
	iforce->xmit.buf = iforce->xmit_data;
281
	iforce->dev = input_dev;
L
Linus Torvalds 已提交
282 283 284 285 286 287 288 289

/*
 * Input device fields.
 */

	switch (iforce->bus) {
#ifdef CONFIG_JOYSTICK_IFORCE_USB
	case IFORCE_USB:
290
		input_dev->id.bustype = BUS_USB;
291
		input_dev->dev.parent = &iforce->usbdev->dev;
L
Linus Torvalds 已提交
292 293 294 295
		break;
#endif
#ifdef CONFIG_JOYSTICK_IFORCE_232
	case IFORCE_232:
296
		input_dev->id.bustype = BUS_RS232;
297
		input_dev->dev.parent = &iforce->serio->dev;
L
Linus Torvalds 已提交
298 299 300 301
		break;
#endif
	}

302 303
	input_set_drvdata(input_dev, iforce);

304 305 306
	input_dev->name = "Unknown I-Force device";
	input_dev->open = iforce_open;
	input_dev->close = iforce_release;
L
Linus Torvalds 已提交
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328

/*
 * On-device memory allocation.
 */

	iforce->device_memory.name = "I-Force device effect memory";
	iforce->device_memory.start = 0;
	iforce->device_memory.end = 200;
	iforce->device_memory.flags = IORESOURCE_MEM;
	iforce->device_memory.parent = NULL;
	iforce->device_memory.child = NULL;
	iforce->device_memory.sibling = NULL;

/*
 * Wait until device ready - until it sends its first response.
 */

	for (i = 0; i < 20; i++)
		if (!iforce_get_id_packet(iforce, "O"))
			break;

	if (i == 20) { /* 5 seconds */
329
		err("Timeout waiting for response from device.");
330 331
		error = -ENODEV;
		goto fail;
L
Linus Torvalds 已提交
332 333 334 335 336 337 338
	}

/*
 * Get device info.
 */

	if (!iforce_get_id_packet(iforce, "M"))
339
		input_dev->id.vendor = (iforce->edata[2] << 8) | iforce->edata[1];
L
Linus Torvalds 已提交
340
	else
341
		dev_warn(&iforce->dev->dev, "Device does not respond to id packet M\n");
L
Linus Torvalds 已提交
342 343

	if (!iforce_get_id_packet(iforce, "P"))
344
		input_dev->id.product = (iforce->edata[2] << 8) | iforce->edata[1];
L
Linus Torvalds 已提交
345
	else
346
		dev_warn(&iforce->dev->dev, "Device does not respond to id packet P\n");
L
Linus Torvalds 已提交
347 348 349 350

	if (!iforce_get_id_packet(iforce, "B"))
		iforce->device_memory.end = (iforce->edata[2] << 8) | iforce->edata[1];
	else
351
		dev_warn(&iforce->dev->dev, "Device does not respond to id packet B\n");
L
Linus Torvalds 已提交
352 353

	if (!iforce_get_id_packet(iforce, "N"))
354
		ff_effects = iforce->edata[1];
L
Linus Torvalds 已提交
355
	else
356
		dev_warn(&iforce->dev->dev, "Device does not respond to id packet N\n");
L
Linus Torvalds 已提交
357 358

	/* Check if the device can store more effects than the driver can really handle */
359
	if (ff_effects > IFORCE_EFFECTS_MAX) {
360
		dev_warn(&iforce->dev->dev, "Limiting number of effects to %d (device reports %d)\n",
361 362
		       IFORCE_EFFECTS_MAX, ff_effects);
		ff_effects = IFORCE_EFFECTS_MAX;
L
Linus Torvalds 已提交
363 364 365 366 367 368 369 370 371 372 373 374 375
	}

/*
 * Display additional info.
 */

	for (i = 0; c[i]; i++)
		if (!iforce_get_id_packet(iforce, c + i))
			iforce_dump_packet("info", iforce->ecmd, iforce->edata);

/*
 * Disable spring, enable force feedback.
 */
J
Johann Deneux 已提交
376
	iforce_set_autocenter(input_dev, 0);
L
Linus Torvalds 已提交
377 378 379 380 381 382

/*
 * Find appropriate device entry
 */

	for (i = 0; iforce_device[i].idvendor; i++)
383 384
		if (iforce_device[i].idvendor == input_dev->id.vendor &&
		    iforce_device[i].idproduct == input_dev->id.product)
L
Linus Torvalds 已提交
385 386 387
			break;

	iforce->type = iforce_device + i;
388
	input_dev->name = iforce->type->name;
L
Linus Torvalds 已提交
389 390 391 392 393

/*
 * Set input device bitfields and ranges.
 */

394 395
	input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) |
		BIT_MASK(EV_FF_STATUS);
L
Linus Torvalds 已提交
396

397 398
	for (i = 0; iforce->type->btn[i] >= 0; i++)
		set_bit(iforce->type->btn[i], input_dev->keybit);
399
	set_bit(BTN_DEAD, input_dev->keybit);
L
Linus Torvalds 已提交
400 401 402 403 404 405 406 407 408 409 410

	for (i = 0; iforce->type->abs[i] >= 0; i++) {

		signed short t = iforce->type->abs[i];

		switch (t) {

			case ABS_X:
			case ABS_Y:
			case ABS_WHEEL:

411 412
				input_set_abs_params(input_dev, t, -1920, 1920, 16, 128);
				set_bit(t, input_dev->ffbit);
L
Linus Torvalds 已提交
413 414 415 416 417 418
				break;

			case ABS_THROTTLE:
			case ABS_GAS:
			case ABS_BRAKE:

419
				input_set_abs_params(input_dev, t, 0, 255, 0, 0);
L
Linus Torvalds 已提交
420 421 422 423
				break;

			case ABS_RUDDER:

424
				input_set_abs_params(input_dev, t, -128, 127, 0, 0);
L
Linus Torvalds 已提交
425 426 427 428 429 430
				break;

			case ABS_HAT0X:
			case ABS_HAT0Y:
		        case ABS_HAT1X:
		        case ABS_HAT1Y:
431 432

				input_set_abs_params(input_dev, t, -1, 1, 0, 0);
L
Linus Torvalds 已提交
433 434 435 436
				break;
		}
	}

437
	if (ff_effects) {
L
Linus Torvalds 已提交
438

439 440 441 442
		for (i = 0; iforce->type->ff[i] >= 0; i++)
			set_bit(iforce->type->ff[i], input_dev->ffbit);

		error = input_ff_create(input_dev, ff_effects);
443 444
		if (error)
			goto fail;
445 446 447 448 449 450 451 452

		ff = input_dev->ff;
		ff->upload = iforce_upload_effect;
		ff->erase = iforce_erase_effect;
		ff->set_gain = iforce_set_gain;
		ff->set_autocenter = iforce_set_autocenter;
		ff->playback = iforce_playback;
	}
L
Linus Torvalds 已提交
453 454 455 456
/*
 * Register input device.
 */

457 458 459
	error = input_register_device(iforce->dev);
	if (error)
		goto fail;
L
Linus Torvalds 已提交
460 461

	return 0;
462 463 464

 fail:	input_free_device(input_dev);
	return error;
L
Linus Torvalds 已提交
465 466 467 468
}

static int __init iforce_init(void)
{
469 470
	int err = 0;

L
Linus Torvalds 已提交
471
#ifdef CONFIG_JOYSTICK_IFORCE_USB
472 473 474
	err = usb_register(&iforce_usb_driver);
	if (err)
		return err;
L
Linus Torvalds 已提交
475 476
#endif
#ifdef CONFIG_JOYSTICK_IFORCE_232
477 478 479 480
	err = serio_register_driver(&iforce_serio_drv);
#ifdef CONFIG_JOYSTICK_IFORCE_USB
	if (err)
		usb_deregister(&iforce_usb_driver);
L
Linus Torvalds 已提交
481
#endif
482 483
#endif
	return err;
L
Linus Torvalds 已提交
484 485 486 487 488 489 490 491 492 493 494 495 496 497
}

static void __exit iforce_exit(void)
{
#ifdef CONFIG_JOYSTICK_IFORCE_USB
	usb_deregister(&iforce_usb_driver);
#endif
#ifdef CONFIG_JOYSTICK_IFORCE_232
	serio_unregister_driver(&iforce_serio_drv);
#endif
}

module_init(iforce_init);
module_exit(iforce_exit);