Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/input/joystick/iforce/iforce-main.c
15115 views
1
/*
2
* Copyright (c) 2000-2002 Vojtech Pavlik <[email protected]>
3
* Copyright (c) 2001-2002, 2007 Johann Deneux <[email protected]>
4
*
5
* USB/RS232 I-Force joysticks and wheels.
6
*/
7
8
/*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
*
23
* Should you need to contact me, the author, you can do so either by
24
* e-mail - mail your message to <[email protected]>, or by paper mail:
25
* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
26
*/
27
28
#include "iforce.h"
29
30
MODULE_AUTHOR("Vojtech Pavlik <[email protected]>, Johann Deneux <[email protected]>");
31
MODULE_DESCRIPTION("USB/RS232 I-Force joysticks and wheels driver");
32
MODULE_LICENSE("GPL");
33
34
static signed short btn_joystick[] =
35
{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE,
36
BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_BASE5, BTN_A, BTN_B, BTN_C, -1 };
37
38
static signed short btn_avb_pegasus[] =
39
{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE,
40
BTN_BASE2, BTN_BASE3, BTN_BASE4, -1 };
41
42
static signed short btn_wheel[] =
43
{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE,
44
BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_BASE5, BTN_A, BTN_B, BTN_C, -1 };
45
46
static signed short btn_avb_tw[] =
47
{ BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE,
48
BTN_BASE2, BTN_BASE3, BTN_BASE4, -1 };
49
50
static signed short btn_avb_wheel[] =
51
{ BTN_GEAR_DOWN, BTN_GEAR_UP, BTN_BASE, BTN_BASE2, BTN_BASE3,
52
BTN_BASE4, BTN_BASE5, BTN_BASE6, -1 };
53
54
static signed short abs_joystick[] =
55
{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 };
56
57
static signed short abs_joystick_rudder[] =
58
{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, -1 };
59
60
static signed short abs_avb_pegasus[] =
61
{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y,
62
ABS_HAT1X, ABS_HAT1Y, -1 };
63
64
static signed short abs_wheel[] =
65
{ ABS_WHEEL, ABS_GAS, ABS_BRAKE, ABS_HAT0X, ABS_HAT0Y, -1 };
66
67
static signed short ff_iforce[] =
68
{ FF_PERIODIC, FF_CONSTANT, FF_SPRING, FF_DAMPER,
69
FF_SQUARE, FF_TRIANGLE, FF_SINE, FF_SAW_UP, FF_SAW_DOWN, FF_GAIN,
70
FF_AUTOCENTER, -1 };
71
72
static struct iforce_device iforce_device[] = {
73
{ 0x044f, 0xa01c, "Thrustmaster Motor Sport GT", btn_wheel, abs_wheel, ff_iforce },
74
{ 0x046d, 0xc281, "Logitech WingMan Force", btn_joystick, abs_joystick, ff_iforce },
75
{ 0x046d, 0xc291, "Logitech WingMan Formula Force", btn_wheel, abs_wheel, ff_iforce },
76
{ 0x05ef, 0x020a, "AVB Top Shot Pegasus", btn_avb_pegasus, abs_avb_pegasus, ff_iforce },
77
{ 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_avb_wheel, abs_wheel, ff_iforce },
78
{ 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_avb_tw, abs_wheel, ff_iforce }, //?
79
{ 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //?
80
{ 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce },
81
{ 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //?
82
{ 0x06f8, 0x0001, "Guillemot Jet Leader Force Feedback", btn_joystick, abs_joystick_rudder, ff_iforce },
83
{ 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //?
84
{ 0x06f8, 0xa302, "Guillemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //?
85
{ 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce },
86
{ 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce }
87
};
88
89
static int iforce_playback(struct input_dev *dev, int effect_id, int value)
90
{
91
struct iforce *iforce = input_get_drvdata(dev);
92
struct iforce_core_effect *core_effect = &iforce->core_effects[effect_id];
93
94
if (value > 0)
95
set_bit(FF_CORE_SHOULD_PLAY, core_effect->flags);
96
else
97
clear_bit(FF_CORE_SHOULD_PLAY, core_effect->flags);
98
99
iforce_control_playback(iforce, effect_id, value);
100
return 0;
101
}
102
103
static void iforce_set_gain(struct input_dev *dev, u16 gain)
104
{
105
struct iforce *iforce = input_get_drvdata(dev);
106
unsigned char data[3];
107
108
data[0] = gain >> 9;
109
iforce_send_packet(iforce, FF_CMD_GAIN, data);
110
}
111
112
static void iforce_set_autocenter(struct input_dev *dev, u16 magnitude)
113
{
114
struct iforce *iforce = input_get_drvdata(dev);
115
unsigned char data[3];
116
117
data[0] = 0x03;
118
data[1] = magnitude >> 9;
119
iforce_send_packet(iforce, FF_CMD_AUTOCENTER, data);
120
121
data[0] = 0x04;
122
data[1] = 0x01;
123
iforce_send_packet(iforce, FF_CMD_AUTOCENTER, data);
124
}
125
126
/*
127
* Function called when an ioctl is performed on the event dev entry.
128
* It uploads an effect to the device
129
*/
130
static int iforce_upload_effect(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old)
131
{
132
struct iforce *iforce = input_get_drvdata(dev);
133
struct iforce_core_effect *core_effect = &iforce->core_effects[effect->id];
134
int ret;
135
136
if (__test_and_set_bit(FF_CORE_IS_USED, core_effect->flags)) {
137
/* Check the effect is not already being updated */
138
if (test_bit(FF_CORE_UPDATE, core_effect->flags))
139
return -EAGAIN;
140
}
141
142
/*
143
* Upload the effect
144
*/
145
switch (effect->type) {
146
147
case FF_PERIODIC:
148
ret = iforce_upload_periodic(iforce, effect, old);
149
break;
150
151
case FF_CONSTANT:
152
ret = iforce_upload_constant(iforce, effect, old);
153
break;
154
155
case FF_SPRING:
156
case FF_DAMPER:
157
ret = iforce_upload_condition(iforce, effect, old);
158
break;
159
160
default:
161
return -EINVAL;
162
}
163
164
if (ret == 0) {
165
/* A packet was sent, forbid new updates until we are notified
166
* that the packet was updated
167
*/
168
set_bit(FF_CORE_UPDATE, core_effect->flags);
169
}
170
return ret;
171
}
172
173
/*
174
* Erases an effect: it frees the effect id and mark as unused the memory
175
* allocated for the parameters
176
*/
177
static int iforce_erase_effect(struct input_dev *dev, int effect_id)
178
{
179
struct iforce *iforce = input_get_drvdata(dev);
180
struct iforce_core_effect *core_effect = &iforce->core_effects[effect_id];
181
int err = 0;
182
183
if (test_bit(FF_MOD1_IS_USED, core_effect->flags))
184
err = release_resource(&core_effect->mod1_chunk);
185
186
if (!err && test_bit(FF_MOD2_IS_USED, core_effect->flags))
187
err = release_resource(&core_effect->mod2_chunk);
188
189
/* TODO: remember to change that if more FF_MOD* bits are added */
190
core_effect->flags[0] = 0;
191
192
return err;
193
}
194
195
static int iforce_open(struct input_dev *dev)
196
{
197
struct iforce *iforce = input_get_drvdata(dev);
198
199
switch (iforce->bus) {
200
#ifdef CONFIG_JOYSTICK_IFORCE_USB
201
case IFORCE_USB:
202
iforce->irq->dev = iforce->usbdev;
203
if (usb_submit_urb(iforce->irq, GFP_KERNEL))
204
return -EIO;
205
break;
206
#endif
207
}
208
209
if (test_bit(EV_FF, dev->evbit)) {
210
/* Enable force feedback */
211
iforce_send_packet(iforce, FF_CMD_ENABLE, "\004");
212
}
213
214
return 0;
215
}
216
217
static void iforce_close(struct input_dev *dev)
218
{
219
struct iforce *iforce = input_get_drvdata(dev);
220
int i;
221
222
if (test_bit(EV_FF, dev->evbit)) {
223
/* Check: no effects should be present in memory */
224
for (i = 0; i < dev->ff->max_effects; i++) {
225
if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags)) {
226
dev_warn(&dev->dev,
227
"%s: Device still owns effects\n",
228
__func__);
229
break;
230
}
231
}
232
233
/* Disable force feedback playback */
234
iforce_send_packet(iforce, FF_CMD_ENABLE, "\001");
235
/* Wait for the command to complete */
236
wait_event_interruptible(iforce->wait,
237
!test_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags));
238
}
239
240
switch (iforce->bus) {
241
#ifdef CONFIG_JOYSTICK_IFORCE_USB
242
case IFORCE_USB:
243
usb_kill_urb(iforce->irq);
244
usb_kill_urb(iforce->out);
245
usb_kill_urb(iforce->ctrl);
246
break;
247
#endif
248
#ifdef CONFIG_JOYSTICK_IFORCE_232
249
case IFORCE_232:
250
//TODO: Wait for the last packets to be sent
251
break;
252
#endif
253
}
254
}
255
256
int iforce_init_device(struct iforce *iforce)
257
{
258
struct input_dev *input_dev;
259
struct ff_device *ff;
260
unsigned char c[] = "CEOV";
261
int i, error;
262
int ff_effects = 0;
263
264
input_dev = input_allocate_device();
265
if (!input_dev)
266
return -ENOMEM;
267
268
init_waitqueue_head(&iforce->wait);
269
spin_lock_init(&iforce->xmit_lock);
270
mutex_init(&iforce->mem_mutex);
271
iforce->xmit.buf = iforce->xmit_data;
272
iforce->dev = input_dev;
273
274
/*
275
* Input device fields.
276
*/
277
278
switch (iforce->bus) {
279
#ifdef CONFIG_JOYSTICK_IFORCE_USB
280
case IFORCE_USB:
281
input_dev->id.bustype = BUS_USB;
282
input_dev->dev.parent = &iforce->usbdev->dev;
283
break;
284
#endif
285
#ifdef CONFIG_JOYSTICK_IFORCE_232
286
case IFORCE_232:
287
input_dev->id.bustype = BUS_RS232;
288
input_dev->dev.parent = &iforce->serio->dev;
289
break;
290
#endif
291
}
292
293
input_set_drvdata(input_dev, iforce);
294
295
input_dev->name = "Unknown I-Force device";
296
input_dev->open = iforce_open;
297
input_dev->close = iforce_close;
298
299
/*
300
* On-device memory allocation.
301
*/
302
303
iforce->device_memory.name = "I-Force device effect memory";
304
iforce->device_memory.start = 0;
305
iforce->device_memory.end = 200;
306
iforce->device_memory.flags = IORESOURCE_MEM;
307
iforce->device_memory.parent = NULL;
308
iforce->device_memory.child = NULL;
309
iforce->device_memory.sibling = NULL;
310
311
/*
312
* Wait until device ready - until it sends its first response.
313
*/
314
315
for (i = 0; i < 20; i++)
316
if (!iforce_get_id_packet(iforce, "O"))
317
break;
318
319
if (i == 20) { /* 5 seconds */
320
err("Timeout waiting for response from device.");
321
error = -ENODEV;
322
goto fail;
323
}
324
325
/*
326
* Get device info.
327
*/
328
329
if (!iforce_get_id_packet(iforce, "M"))
330
input_dev->id.vendor = (iforce->edata[2] << 8) | iforce->edata[1];
331
else
332
dev_warn(&iforce->dev->dev, "Device does not respond to id packet M\n");
333
334
if (!iforce_get_id_packet(iforce, "P"))
335
input_dev->id.product = (iforce->edata[2] << 8) | iforce->edata[1];
336
else
337
dev_warn(&iforce->dev->dev, "Device does not respond to id packet P\n");
338
339
if (!iforce_get_id_packet(iforce, "B"))
340
iforce->device_memory.end = (iforce->edata[2] << 8) | iforce->edata[1];
341
else
342
dev_warn(&iforce->dev->dev, "Device does not respond to id packet B\n");
343
344
if (!iforce_get_id_packet(iforce, "N"))
345
ff_effects = iforce->edata[1];
346
else
347
dev_warn(&iforce->dev->dev, "Device does not respond to id packet N\n");
348
349
/* Check if the device can store more effects than the driver can really handle */
350
if (ff_effects > IFORCE_EFFECTS_MAX) {
351
dev_warn(&iforce->dev->dev, "Limiting number of effects to %d (device reports %d)\n",
352
IFORCE_EFFECTS_MAX, ff_effects);
353
ff_effects = IFORCE_EFFECTS_MAX;
354
}
355
356
/*
357
* Display additional info.
358
*/
359
360
for (i = 0; c[i]; i++)
361
if (!iforce_get_id_packet(iforce, c + i))
362
iforce_dump_packet("info", iforce->ecmd, iforce->edata);
363
364
/*
365
* Disable spring, enable force feedback.
366
*/
367
iforce_set_autocenter(input_dev, 0);
368
369
/*
370
* Find appropriate device entry
371
*/
372
373
for (i = 0; iforce_device[i].idvendor; i++)
374
if (iforce_device[i].idvendor == input_dev->id.vendor &&
375
iforce_device[i].idproduct == input_dev->id.product)
376
break;
377
378
iforce->type = iforce_device + i;
379
input_dev->name = iforce->type->name;
380
381
/*
382
* Set input device bitfields and ranges.
383
*/
384
385
input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) |
386
BIT_MASK(EV_FF_STATUS);
387
388
for (i = 0; iforce->type->btn[i] >= 0; i++)
389
set_bit(iforce->type->btn[i], input_dev->keybit);
390
set_bit(BTN_DEAD, input_dev->keybit);
391
392
for (i = 0; iforce->type->abs[i] >= 0; i++) {
393
394
signed short t = iforce->type->abs[i];
395
396
switch (t) {
397
398
case ABS_X:
399
case ABS_Y:
400
case ABS_WHEEL:
401
402
input_set_abs_params(input_dev, t, -1920, 1920, 16, 128);
403
set_bit(t, input_dev->ffbit);
404
break;
405
406
case ABS_THROTTLE:
407
case ABS_GAS:
408
case ABS_BRAKE:
409
410
input_set_abs_params(input_dev, t, 0, 255, 0, 0);
411
break;
412
413
case ABS_RUDDER:
414
415
input_set_abs_params(input_dev, t, -128, 127, 0, 0);
416
break;
417
418
case ABS_HAT0X:
419
case ABS_HAT0Y:
420
case ABS_HAT1X:
421
case ABS_HAT1Y:
422
423
input_set_abs_params(input_dev, t, -1, 1, 0, 0);
424
break;
425
}
426
}
427
428
if (ff_effects) {
429
430
for (i = 0; iforce->type->ff[i] >= 0; i++)
431
set_bit(iforce->type->ff[i], input_dev->ffbit);
432
433
error = input_ff_create(input_dev, ff_effects);
434
if (error)
435
goto fail;
436
437
ff = input_dev->ff;
438
ff->upload = iforce_upload_effect;
439
ff->erase = iforce_erase_effect;
440
ff->set_gain = iforce_set_gain;
441
ff->set_autocenter = iforce_set_autocenter;
442
ff->playback = iforce_playback;
443
}
444
/*
445
* Register input device.
446
*/
447
448
error = input_register_device(iforce->dev);
449
if (error)
450
goto fail;
451
452
return 0;
453
454
fail: input_free_device(input_dev);
455
return error;
456
}
457
458
static int __init iforce_init(void)
459
{
460
int err = 0;
461
462
#ifdef CONFIG_JOYSTICK_IFORCE_USB
463
err = usb_register(&iforce_usb_driver);
464
if (err)
465
return err;
466
#endif
467
#ifdef CONFIG_JOYSTICK_IFORCE_232
468
err = serio_register_driver(&iforce_serio_drv);
469
#ifdef CONFIG_JOYSTICK_IFORCE_USB
470
if (err)
471
usb_deregister(&iforce_usb_driver);
472
#endif
473
#endif
474
return err;
475
}
476
477
static void __exit iforce_exit(void)
478
{
479
#ifdef CONFIG_JOYSTICK_IFORCE_USB
480
usb_deregister(&iforce_usb_driver);
481
#endif
482
#ifdef CONFIG_JOYSTICK_IFORCE_232
483
serio_unregister_driver(&iforce_serio_drv);
484
#endif
485
}
486
487
module_init(iforce_init);
488
module_exit(iforce_exit);
489
490