34 static signed short btn_joystick[] =
38 static signed short btn_avb_pegasus[] =
42 static signed short btn_wheel[] =
46 static signed short btn_avb_tw[] =
50 static signed short btn_avb_wheel[] =
54 static signed short abs_joystick[] =
57 static signed short abs_joystick_rudder[] =
60 static signed short abs_avb_pegasus[] =
64 static signed short abs_wheel[] =
67 static signed short ff_iforce[] =
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 }
89 static int iforce_playback(
struct input_dev *
dev,
int effect_id,
int value)
103 static void iforce_set_gain(
struct input_dev *dev,
u16 gain)
105 struct iforce *iforce = input_get_drvdata(dev);
106 unsigned char data[3];
112 static void iforce_set_autocenter(
struct input_dev *dev,
u16 magnitude)
114 struct iforce *iforce = input_get_drvdata(dev);
115 unsigned char data[3];
118 data[1] = magnitude >> 9;
130 static int iforce_upload_effect(
struct input_dev *dev,
struct ff_effect *effect,
struct ff_effect *old)
132 struct iforce *iforce = input_get_drvdata(dev);
145 switch (effect->
type) {
177 static int iforce_erase_effect(
struct input_dev *dev,
int effect_id)
179 struct iforce *iforce = input_get_drvdata(dev);
190 core_effect->
flags[0] = 0;
195 static int iforce_open(
struct input_dev *dev)
197 struct iforce *iforce = input_get_drvdata(dev);
199 switch (iforce->
bus) {
200 #ifdef CONFIG_JOYSTICK_IFORCE_USB
202 iforce->irq->
dev = iforce->usbdev;
217 static void iforce_close(
struct input_dev *dev)
219 struct iforce *iforce = input_get_drvdata(dev);
224 for (i = 0; i < dev->ff->max_effects; i++) {
227 "%s: Device still owns effects\n",
240 switch (iforce->
bus) {
241 #ifdef CONFIG_JOYSTICK_IFORCE_USB
248 #ifdef CONFIG_JOYSTICK_IFORCE_232
258 struct input_dev *input_dev;
259 struct ff_device *ff;
260 unsigned char c[] =
"CEOV";
264 input_dev = input_allocate_device();
272 iforce->
dev = input_dev;
278 switch (iforce->
bus) {
279 #ifdef CONFIG_JOYSTICK_IFORCE_USB
281 input_dev->id.bustype =
BUS_USB;
282 input_dev->dev.parent = &iforce->usbdev->
dev;
285 #ifdef CONFIG_JOYSTICK_IFORCE_232
288 input_dev->dev.parent = &iforce->serio->
dev;
293 input_set_drvdata(input_dev, iforce);
295 input_dev->name =
"Unknown I-Force device";
296 input_dev->open = iforce_open;
297 input_dev->close = iforce_close;
315 for (i = 0; i < 20; i++)
321 "Timeout waiting for response from device.\n");
331 input_dev->id.vendor = (iforce->
edata[2] << 8) | iforce->
edata[1];
333 dev_warn(&iforce->
dev->dev,
"Device does not respond to id packet M\n");
336 input_dev->id.product = (iforce->
edata[2] << 8) | iforce->
edata[1];
338 dev_warn(&iforce->
dev->dev,
"Device does not respond to id packet P\n");
343 dev_warn(&iforce->
dev->dev,
"Device does not respond to id packet B\n");
346 ff_effects = iforce->
edata[1];
348 dev_warn(&iforce->
dev->dev,
"Device does not respond to id packet N\n");
352 dev_warn(&iforce->
dev->dev,
"Limiting number of effects to %d (device reports %d)\n",
361 for (i = 0; c[
i]; i++)
368 iforce_set_autocenter(input_dev, 0);
374 for (i = 0; iforce_device[
i].
idvendor; i++)
375 if (iforce_device[i].idvendor == input_dev->id.vendor &&
376 iforce_device[i].
idproduct == input_dev->id.product)
379 iforce->
type = iforce_device +
i;
380 input_dev->name = iforce->
type->name;
389 for (i = 0; iforce->
type->btn[
i] >= 0; i++)
393 for (i = 0; iforce->
type->abs[
i] >= 0; i++) {
395 signed short t = iforce->
type->abs[
i];
403 input_set_abs_params(input_dev, t, -1920, 1920, 16, 128);
411 input_set_abs_params(input_dev, t, 0, 255, 0, 0);
416 input_set_abs_params(input_dev, t, -128, 127, 0, 0);
424 input_set_abs_params(input_dev, t, -1, 1, 0, 0);
431 for (i = 0; iforce->
type->ff[
i] >= 0; i++)
434 error = input_ff_create(input_dev, ff_effects);
439 ff->upload = iforce_upload_effect;
440 ff->erase = iforce_erase_effect;
441 ff->set_gain = iforce_set_gain;
442 ff->set_autocenter = iforce_set_autocenter;
443 ff->playback = iforce_playback;
449 error = input_register_device(iforce->
dev);
455 fail: input_free_device(input_dev);
459 static int __init iforce_init(
void)
463 #ifdef CONFIG_JOYSTICK_IFORCE_USB
468 #ifdef CONFIG_JOYSTICK_IFORCE_232
470 #ifdef CONFIG_JOYSTICK_IFORCE_USB
478 static void __exit iforce_exit(
void)
480 #ifdef CONFIG_JOYSTICK_IFORCE_USB
483 #ifdef CONFIG_JOYSTICK_IFORCE_232