···7070config LOGITECH_FF7171 bool "Logitech WingMan *3D support"7272 depends on HID_FF7373+ select INPUT_FF_MEMLESS if USB_HID7374 help7475 Say Y here if you have one of these devices:7576 - Logitech WingMan Cordless RumblePad···8281config THRUSTMASTER_FF8382 bool "ThrustMaster FireStorm Dual Power 2 support (EXPERIMENTAL)"8483 depends on HID_FF && EXPERIMENTAL8484+ select INPUT_FF_MEMLESS if USB_HID8585 help8686 Say Y here if you have a THRUSTMASTER FireStore Dual Power 2,8787 and want to enable force feedback support for it.
-2
drivers/usb/input/hid-core.c
···543543{544544 unsigned i,j;545545546546- hid_ff_exit(device);547547-548546 for (i = 0; i < HID_REPORT_TYPES; i++) {549547 struct hid_report_enum *report_enum = device->report_enum + i;550548
+1-1
drivers/usb/input/hid-input.c
···729729 int offset;730730731731 if (type == EV_FF)732732- return hid_ff_event(hid, dev, type, code, value);732732+ return input_ff_event(dev, type, code, value);733733734734 if (type != EV_LED)735735 return -1;
+72-451
drivers/usb/input/hid-lgff.c
···11/*22- * $$33- *42 * Force feedback support for hid-compliant for some of the devices from53 * Logitech, namely:64 * - WingMan Cordless RumblePad75 * - WingMan Force 3D86 *97 * Copyright (c) 2002-2004 Johann Deneux88+ * Copyright (c) 2006 Anssi Hannula <anssi.hannula@gmail.com>109 */11101211/*···2829 */29303031#include <linux/input.h>3131-#include <linux/sched.h>3232-3333-//#define DEBUG3432#include <linux/usb.h>3535-3636-#include <linux/circ_buf.h>3737-3833#include "hid.h"3939-#include "../../input/fixp-arith.h"4040-4141-4242-/* Periodicity of the update */4343-#define PERIOD (HZ/10)4444-4545-#define RUN_AT(t) (jiffies + (t))4646-4747-/* Effect status */4848-#define EFFECT_STARTED 0 /* Effect is going to play after some time4949- (ff_replay.delay) */5050-#define EFFECT_PLAYING 1 /* Effect is being played */5151-#define EFFECT_USED 25252-5353-// For lgff_device::flags5454-#define DEVICE_CLOSING 0 /* The driver is being unitialised */5555-5656-/* Check that the current process can access an effect */5757-#define CHECK_OWNERSHIP(effect) (current->pid == 0 \5858- || effect.owner == current->pid)5959-6060-#define LGFF_CHECK_OWNERSHIP(i, l) \6161- (i>=0 && i<LGFF_EFFECTS \6262- && test_bit(EFFECT_USED, l->effects[i].flags) \6363- && CHECK_OWNERSHIP(l->effects[i]))6464-6565-#define LGFF_EFFECTS 866346735struct device_type {6836 u16 idVendor;6937 u16 idProduct;7070- signed short *ff;3838+ const signed short *ff;7139};72407373-struct lgff_effect {7474- pid_t owner;7575-7676- struct ff_effect effect;7777-7878- unsigned long flags[1];7979- unsigned int count; /* Number of times left to play */8080- unsigned long started_at; /* When the effect started to play */8181-};8282-8383-struct lgff_device {8484- struct hid_device* hid;8585-8686- struct hid_report* constant;8787- struct hid_report* rumble;8888- struct hid_report* condition;8989-9090- struct lgff_effect effects[LGFF_EFFECTS];9191- spinlock_t lock; /* device-level lock. Having locks on9292- a per-effect basis could be nice, but9393- isn't really necessary */9494-9595- unsigned long flags[1]; /* Contains various information about the9696- state of the driver for this device */9797-9898- struct timer_list timer;9999-};100100-101101-/* Callbacks */102102-static void hid_lgff_exit(struct hid_device* hid);103103-static int hid_lgff_event(struct hid_device *hid, struct input_dev *input,104104- unsigned int type, unsigned int code, int value);105105-static int hid_lgff_flush(struct input_dev *input, struct file *file);106106-static int hid_lgff_upload_effect(struct input_dev *input,107107- struct ff_effect *effect);108108-static int hid_lgff_erase(struct input_dev *input, int id);109109-110110-/* Local functions */111111-static void hid_lgff_input_init(struct hid_device* hid);112112-static void hid_lgff_timer(unsigned long timer_data);113113-static struct hid_report* hid_lgff_duplicate_report(struct hid_report*);114114-static void hid_lgff_delete_report(struct hid_report*);115115-116116-static signed short ff_rumble[] = {4141+static const signed short ff_rumble[] = {11742 FF_RUMBLE,11843 -111944};12045121121-static signed short ff_joystick[] = {4646+static const signed short ff_joystick[] = {12247 FF_CONSTANT,12348 -112449};12550126126-static struct device_type devices[] = {127127- {0x046d, 0xc211, ff_rumble},128128- {0x046d, 0xc219, ff_rumble},129129- {0x046d, 0xc283, ff_joystick},130130- {0x0000, 0x0000, ff_joystick}5151+static const struct device_type devices[] = {5252+ { 0x046d, 0xc211, ff_rumble },5353+ { 0x046d, 0xc219, ff_rumble },5454+ { 0x046d, 0xc283, ff_joystick },5555+ { 0x0000, 0x0000, ff_joystick }13156};5757+5858+static int hid_lgff_play(struct input_dev *dev, void *data, struct ff_effect *effect)5959+{6060+ struct hid_device *hid = dev->private;6161+ struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;6262+ struct hid_report *report = list_entry(report_list->next, struct hid_report, list);6363+ int x, y;6464+ unsigned int left, right;6565+6666+#define CLAMP(x) if (x < 0) x = 0; if (x > 0xff) x = 0xff6767+6868+ switch (effect->type) {6969+ case FF_CONSTANT:7070+ x = effect->u.ramp.start_level + 0x7f; /* 0x7f is center */7171+ y = effect->u.ramp.end_level + 0x7f;7272+ CLAMP(x);7373+ CLAMP(y);7474+ report->field[0]->value[0] = 0x51;7575+ report->field[0]->value[1] = 0x08;7676+ report->field[0]->value[2] = x;7777+ report->field[0]->value[3] = y;7878+ dbg("(x, y)=(%04x, %04x)", x, y);7979+ hid_submit_report(hid, report, USB_DIR_OUT);8080+ break;8181+8282+ case FF_RUMBLE:8383+ right = effect->u.rumble.strong_magnitude;8484+ left = effect->u.rumble.weak_magnitude;8585+ right = right * 0xff / 0xffff;8686+ left = left * 0xff / 0xffff;8787+ CLAMP(left);8888+ CLAMP(right);8989+ report->field[0]->value[0] = 0x42;9090+ report->field[0]->value[1] = 0x00;9191+ report->field[0]->value[2] = left;9292+ report->field[0]->value[3] = right;9393+ dbg("(left, right)=(%04x, %04x)", left, right);9494+ hid_submit_report(hid, report, USB_DIR_OUT);9595+ break;9696+ }9797+ return 0;9898+}13299133100int hid_lgff_init(struct hid_device* hid)134101{135135- struct lgff_device *private;136136- struct hid_report* report;137137- struct hid_field* field;102102+ struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);103103+ struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;104104+ struct input_dev *dev = hidinput->input;105105+ struct hid_report *report;106106+ struct hid_field *field;107107+ int error;108108+ int i, j;138109139110 /* Find the report to use */140140- if (list_empty(&hid->report_enum[HID_OUTPUT_REPORT].report_list)) {111111+ if (list_empty(report_list)) {141112 err("No output report found");142113 return -1;143114 }115115+144116 /* Check that the report looks ok */145145- report = (struct hid_report*)hid->report_enum[HID_OUTPUT_REPORT].report_list.next;117117+ report = list_entry(report_list->next, struct hid_report, list);146118 if (!report) {147119 err("NULL output report");148120 return -1;149121 }122122+150123 field = report->field[0];151124 if (!field) {152125 err("NULL field");153126 return -1;154127 }155128156156- private = kzalloc(sizeof(struct lgff_device), GFP_KERNEL);157157- if (!private)158158- return -1;159159- hid->ff_private = private;160160-161161- /* Input init */162162- hid_lgff_input_init(hid);163163-164164-165165- private->constant = hid_lgff_duplicate_report(report);166166- if (!private->constant) {167167- kfree(private);168168- return -1;169169- }170170- private->constant->field[0]->value[0] = 0x51;171171- private->constant->field[0]->value[1] = 0x08;172172- private->constant->field[0]->value[2] = 0x7f;173173- private->constant->field[0]->value[3] = 0x7f;174174-175175- private->rumble = hid_lgff_duplicate_report(report);176176- if (!private->rumble) {177177- hid_lgff_delete_report(private->constant);178178- kfree(private);179179- return -1;180180- }181181- private->rumble->field[0]->value[0] = 0x42;182182-183183-184184- private->condition = hid_lgff_duplicate_report(report);185185- if (!private->condition) {186186- hid_lgff_delete_report(private->rumble);187187- hid_lgff_delete_report(private->constant);188188- kfree(private);189189- return -1;129129+ for (i = 0; i < ARRAY_SIZE(devices); i++) {130130+ if (dev->id.vendor == devices[i].idVendor &&131131+ dev->id.product == devices[i].idProduct) {132132+ for (j = 0; devices[i].ff[j] >= 0; j++)133133+ set_bit(devices[i].ff[j], dev->ffbit);134134+ break;135135+ }190136 }191137192192- private->hid = hid;193193-194194- spin_lock_init(&private->lock);195195- init_timer(&private->timer);196196- private->timer.data = (unsigned long)private;197197- private->timer.function = hid_lgff_timer;198198-199199- /* Event and exit callbacks */200200- hid->ff_exit = hid_lgff_exit;201201- hid->ff_event = hid_lgff_event;202202-203203- /* Start the update task */204204- private->timer.expires = RUN_AT(PERIOD);205205- add_timer(&private->timer); /*TODO: only run the timer when at least206206- one effect is playing */138138+ error = input_ff_create_memless(dev, NULL, hid_lgff_play);139139+ if (error)140140+ return error;207141208142 printk(KERN_INFO "Force feedback for Logitech force feedback devices by Johann Deneux <johann.deneux@it.uu.se>\n");209143210144 return 0;211211-}212212-213213-static struct hid_report* hid_lgff_duplicate_report(struct hid_report* report)214214-{215215- struct hid_report* ret;216216-217217- ret = kmalloc(sizeof(struct lgff_device), GFP_KERNEL);218218- if (!ret)219219- return NULL;220220- *ret = *report;221221-222222- ret->field[0] = kmalloc(sizeof(struct hid_field), GFP_KERNEL);223223- if (!ret->field[0]) {224224- kfree(ret);225225- return NULL;226226- }227227- *ret->field[0] = *report->field[0];228228-229229- ret->field[0]->value = kzalloc(sizeof(s32[8]), GFP_KERNEL);230230- if (!ret->field[0]->value) {231231- kfree(ret->field[0]);232232- kfree(ret);233233- return NULL;234234- }235235-236236- return ret;237237-}238238-239239-static void hid_lgff_delete_report(struct hid_report* report)240240-{241241- if (report) {242242- kfree(report->field[0]->value);243243- kfree(report->field[0]);244244- kfree(report);245245- }246246-}247247-248248-static void hid_lgff_input_init(struct hid_device* hid)249249-{250250- struct device_type* dev = devices;251251- signed short* ff;252252- u16 idVendor = le16_to_cpu(hid->dev->descriptor.idVendor);253253- u16 idProduct = le16_to_cpu(hid->dev->descriptor.idProduct);254254- struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);255255- struct input_dev *input_dev = hidinput->input;256256-257257- while (dev->idVendor && (idVendor != dev->idVendor || idProduct != dev->idProduct))258258- dev++;259259-260260- for (ff = dev->ff; *ff >= 0; ff++)261261- set_bit(*ff, input_dev->ffbit);262262-263263- input_dev->upload_effect = hid_lgff_upload_effect;264264- input_dev->flush = hid_lgff_flush;265265-266266- set_bit(EV_FF, input_dev->evbit);267267- input_dev->ff_effects_max = LGFF_EFFECTS;268268-}269269-270270-static void hid_lgff_exit(struct hid_device* hid)271271-{272272- struct lgff_device *lgff = hid->ff_private;273273-274274- set_bit(DEVICE_CLOSING, lgff->flags);275275- del_timer_sync(&lgff->timer);276276-277277- hid_lgff_delete_report(lgff->condition);278278- hid_lgff_delete_report(lgff->rumble);279279- hid_lgff_delete_report(lgff->constant);280280-281281- kfree(lgff);282282-}283283-284284-static int hid_lgff_event(struct hid_device *hid, struct input_dev* input,285285- unsigned int type, unsigned int code, int value)286286-{287287- struct lgff_device *lgff = hid->ff_private;288288- struct lgff_effect *effect = lgff->effects + code;289289- unsigned long flags;290290-291291- if (type != EV_FF) return -EINVAL;292292- if (!LGFF_CHECK_OWNERSHIP(code, lgff)) return -EACCES;293293- if (value < 0) return -EINVAL;294294-295295- spin_lock_irqsave(&lgff->lock, flags);296296-297297- if (value > 0) {298298- if (test_bit(EFFECT_STARTED, effect->flags)) {299299- spin_unlock_irqrestore(&lgff->lock, flags);300300- return -EBUSY;301301- }302302- if (test_bit(EFFECT_PLAYING, effect->flags)) {303303- spin_unlock_irqrestore(&lgff->lock, flags);304304- return -EBUSY;305305- }306306-307307- effect->count = value;308308-309309- if (effect->effect.replay.delay) {310310- set_bit(EFFECT_STARTED, effect->flags);311311- } else {312312- set_bit(EFFECT_PLAYING, effect->flags);313313- }314314- effect->started_at = jiffies;315315- }316316- else { /* value == 0 */317317- clear_bit(EFFECT_STARTED, effect->flags);318318- clear_bit(EFFECT_PLAYING, effect->flags);319319- }320320-321321- spin_unlock_irqrestore(&lgff->lock, flags);322322-323323- return 0;324324-325325-}326326-327327-/* Erase all effects this process owns */328328-static int hid_lgff_flush(struct input_dev *dev, struct file *file)329329-{330330- struct hid_device *hid = dev->private;331331- struct lgff_device *lgff = hid->ff_private;332332- int i;333333-334334- for (i=0; i<dev->ff_effects_max; ++i) {335335-336336- /*NOTE: no need to lock here. The only times EFFECT_USED is337337- modified is when effects are uploaded or when an effect is338338- erased. But a process cannot close its dev/input/eventX fd339339- and perform ioctls on the same fd all at the same time */340340- if ( current->pid == lgff->effects[i].owner341341- && test_bit(EFFECT_USED, lgff->effects[i].flags)) {342342-343343- if (hid_lgff_erase(dev, i))344344- warn("erase effect %d failed", i);345345- }346346-347347- }348348-349349- return 0;350350-}351351-352352-static int hid_lgff_erase(struct input_dev *dev, int id)353353-{354354- struct hid_device *hid = dev->private;355355- struct lgff_device *lgff = hid->ff_private;356356- unsigned long flags;357357-358358- if (!LGFF_CHECK_OWNERSHIP(id, lgff)) return -EACCES;359359-360360- spin_lock_irqsave(&lgff->lock, flags);361361- lgff->effects[id].flags[0] = 0;362362- spin_unlock_irqrestore(&lgff->lock, flags);363363-364364- return 0;365365-}366366-367367-static int hid_lgff_upload_effect(struct input_dev* input,368368- struct ff_effect* effect)369369-{370370- struct hid_device *hid = input->private;371371- struct lgff_device *lgff = hid->ff_private;372372- struct lgff_effect new;373373- int id;374374- unsigned long flags;375375-376376- dbg("ioctl rumble");377377-378378- if (!test_bit(effect->type, input->ffbit)) return -EINVAL;379379-380380- spin_lock_irqsave(&lgff->lock, flags);381381-382382- if (effect->id == -1) {383383- int i;384384-385385- for (i=0; i<LGFF_EFFECTS && test_bit(EFFECT_USED, lgff->effects[i].flags); ++i);386386- if (i >= LGFF_EFFECTS) {387387- spin_unlock_irqrestore(&lgff->lock, flags);388388- return -ENOSPC;389389- }390390-391391- effect->id = i;392392- lgff->effects[i].owner = current->pid;393393- lgff->effects[i].flags[0] = 0;394394- set_bit(EFFECT_USED, lgff->effects[i].flags);395395- }396396- else if (!LGFF_CHECK_OWNERSHIP(effect->id, lgff)) {397397- spin_unlock_irqrestore(&lgff->lock, flags);398398- return -EACCES;399399- }400400-401401- id = effect->id;402402- new = lgff->effects[id];403403-404404- new.effect = *effect;405405-406406- if (test_bit(EFFECT_STARTED, lgff->effects[id].flags)407407- || test_bit(EFFECT_STARTED, lgff->effects[id].flags)) {408408-409409- /* Changing replay parameters is not allowed (for the time410410- being) */411411- if (new.effect.replay.delay != lgff->effects[id].effect.replay.delay412412- || new.effect.replay.length != lgff->effects[id].effect.replay.length) {413413- spin_unlock_irqrestore(&lgff->lock, flags);414414- return -ENOSYS;415415- }416416-417417- lgff->effects[id] = new;418418-419419- } else {420420- lgff->effects[id] = new;421421- }422422-423423- spin_unlock_irqrestore(&lgff->lock, flags);424424- return 0;425425-}426426-427427-static void hid_lgff_timer(unsigned long timer_data)428428-{429429- struct lgff_device *lgff = (struct lgff_device*)timer_data;430430- struct hid_device *hid = lgff->hid;431431- unsigned long flags;432432- int x = 0x7f, y = 0x7f; // Coordinates of constant effects433433- unsigned int left = 0, right = 0; // Rumbling434434- int i;435435-436436- spin_lock_irqsave(&lgff->lock, flags);437437-438438- for (i=0; i<LGFF_EFFECTS; ++i) {439439- struct lgff_effect* effect = lgff->effects +i;440440-441441- if (test_bit(EFFECT_PLAYING, effect->flags)) {442442-443443- switch (effect->effect.type) {444444- case FF_CONSTANT: {445445- //TODO: handle envelopes446446- int degrees = effect->effect.direction * 360 >> 16;447447- x += fixp_mult(fixp_sin(degrees),448448- fixp_new16(effect->effect.u.constant.level));449449- y += fixp_mult(-fixp_cos(degrees),450450- fixp_new16(effect->effect.u.constant.level));451451- } break;452452- case FF_RUMBLE:453453- right += effect->effect.u.rumble.strong_magnitude;454454- left += effect->effect.u.rumble.weak_magnitude;455455- break;456456- };457457-458458- /* One run of the effect is finished playing */459459- if (time_after(jiffies,460460- effect->started_at461461- + effect->effect.replay.delay*HZ/1000462462- + effect->effect.replay.length*HZ/1000)) {463463- dbg("Finished playing once %d", i);464464- if (--effect->count <= 0) {465465- dbg("Stopped %d", i);466466- clear_bit(EFFECT_PLAYING, effect->flags);467467- }468468- else {469469- dbg("Start again %d", i);470470- if (effect->effect.replay.length != 0) {471471- clear_bit(EFFECT_PLAYING, effect->flags);472472- set_bit(EFFECT_STARTED, effect->flags);473473- }474474- effect->started_at = jiffies;475475- }476476- }477477-478478- } else if (test_bit(EFFECT_STARTED, lgff->effects[i].flags)) {479479- /* Check if we should start playing the effect */480480- if (time_after(jiffies,481481- lgff->effects[i].started_at482482- + lgff->effects[i].effect.replay.delay*HZ/1000)) {483483- dbg("Now playing %d", i);484484- clear_bit(EFFECT_STARTED, lgff->effects[i].flags);485485- set_bit(EFFECT_PLAYING, lgff->effects[i].flags);486486- }487487- }488488- }489489-490490-#define CLAMP(x) if (x < 0) x = 0; if (x > 0xff) x = 0xff491491-492492- // Clamp values493493- CLAMP(x);494494- CLAMP(y);495495- CLAMP(left);496496- CLAMP(right);497497-498498-#undef CLAMP499499-500500- if (x != lgff->constant->field[0]->value[2]501501- || y != lgff->constant->field[0]->value[3]) {502502- lgff->constant->field[0]->value[2] = x;503503- lgff->constant->field[0]->value[3] = y;504504- dbg("(x,y)=(%04x, %04x)", x, y);505505- hid_submit_report(hid, lgff->constant, USB_DIR_OUT);506506- }507507-508508- if (left != lgff->rumble->field[0]->value[2]509509- || right != lgff->rumble->field[0]->value[3]) {510510- lgff->rumble->field[0]->value[2] = left;511511- lgff->rumble->field[0]->value[3] = right;512512- dbg("(left,right)=(%04x, %04x)", left, right);513513- hid_submit_report(hid, lgff->rumble, USB_DIR_OUT);514514- }515515-516516- if (!test_bit(DEVICE_CLOSING, lgff->flags)) {517517- lgff->timer.expires = RUN_AT(PERIOD);518518- add_timer(&lgff->timer);519519- }520520-521521- spin_unlock_irqrestore(&lgff->lock, flags);522145}
+43-360
drivers/usb/input/hid-tmff.c
···2828 */29293030#include <linux/input.h>3131-#include <linux/sched.h>32313332#undef DEBUG3433#include <linux/usb.h>35343636-#include <linux/circ_buf.h>3737-3835#include "hid.h"3939-#include "../../input/fixp-arith.h"40364137/* Usages for thrustmaster devices I know about */4238#define THRUSTMASTER_USAGE_RUMBLE_LR (HID_UP_GENDESK | 0xbb)4343-#define DELAY_CALC(t,delay) ((t) + (delay)*HZ/1000)44394545-/* Effect status */4646-#define EFFECT_STARTED 0 /* Effect is going to play after some time */4747-#define EFFECT_PLAYING 1 /* Effect is playing */4848-#define EFFECT_USED 24949-5050-/* For tmff_device::flags */5151-#define DEVICE_CLOSING 0 /* The driver is being unitialised */5252-5353-/* Check that the current process can access an effect */5454-#define CHECK_OWNERSHIP(effect) (current->pid == 0 \5555- || effect.owner == current->pid)5656-5757-#define TMFF_CHECK_ID(id) ((id) >= 0 && (id) < TMFF_EFFECTS)5858-5959-#define TMFF_CHECK_OWNERSHIP(i, l) \6060- (test_bit(EFFECT_USED, l->effects[i].flags) \6161- && CHECK_OWNERSHIP(l->effects[i]))6262-6363-#define TMFF_EFFECTS 86464-6565-struct tmff_effect {6666- pid_t owner;6767-6868- struct ff_effect effect;6969-7070- unsigned long flags[1];7171- unsigned int count; /* Number of times left to play */7272-7373- unsigned long play_at; /* When the effect starts to play */7474- unsigned long stop_at; /* When the effect ends */7575-};76407741struct tmff_device {7878- struct hid_device *hid;7979-8042 struct hid_report *report;8181-8243 struct hid_field *rumble;8383-8484- unsigned int effects_playing;8585- struct tmff_effect effects[TMFF_EFFECTS];8686- spinlock_t lock; /* device-level lock. Having locks on8787- a per-effect basis could be nice, but8888- isn't really necessary */8989-9090- unsigned long flags[1]; /* Contains various information about the9191- state of the driver for this device */9292-9393- struct timer_list timer;9444};95459696-/* Callbacks */9797-static void hid_tmff_exit(struct hid_device *hid);9898-static int hid_tmff_event(struct hid_device *hid, struct input_dev *input,9999- unsigned int type, unsigned int code, int value);100100-static int hid_tmff_flush(struct input_dev *input, struct file *file);101101-static int hid_tmff_upload_effect(struct input_dev *input,102102- struct ff_effect *effect);103103-static int hid_tmff_erase(struct input_dev *input, int id);4646+/* Changes values from 0 to 0xffff into values from minimum to maximum */4747+static inline int hid_tmff_scale(unsigned int in, int minimum, int maximum)4848+{4949+ int ret;10450105105-/* Local functions */106106-static void hid_tmff_recalculate_timer(struct tmff_device *tmff);107107-static void hid_tmff_timer(unsigned long timer_data);5151+ ret = (in * (maximum - minimum) / 0xffff) + minimum;5252+ if (ret < minimum)5353+ return minimum;5454+ if (ret > maximum)5555+ return maximum;5656+ return ret;5757+}5858+5959+static int hid_tmff_play(struct input_dev *dev, void *data, struct ff_effect *effect)6060+{6161+ struct hid_device *hid = dev->private;6262+ struct tmff_device *tmff = data;6363+ int left, right; /* Rumbling */6464+6565+ left = hid_tmff_scale(effect->u.rumble.weak_magnitude,6666+ tmff->rumble->logical_minimum, tmff->rumble->logical_maximum);6767+ right = hid_tmff_scale(effect->u.rumble.strong_magnitude,6868+ tmff->rumble->logical_minimum, tmff->rumble->logical_maximum);6969+7070+ tmff->rumble->value[0] = left;7171+ tmff->rumble->value[1] = right;7272+ dbg("(left,right)=(%08x, %08x)", left, right);7373+ hid_submit_report(hid, tmff->report, USB_DIR_OUT);7474+7575+ return 0;7676+}1087710978int hid_tmff_init(struct hid_device *hid)11079{111111- struct tmff_device *private;8080+ struct tmff_device *tmff;11281 struct list_head *pos;11382 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);11483 struct input_dev *input_dev = hidinput->input;8484+ int error;11585116116- private = kzalloc(sizeof(struct tmff_device), GFP_KERNEL);117117- if (!private)8686+ tmff = kzalloc(sizeof(struct tmff_device), GFP_KERNEL);8787+ if (!tmff)11888 return -ENOMEM;119119-120120- hid->ff_private = private;1218912290 /* Find the report to use */12391 __list_for_each(pos, &hid->report_enum[HID_OUTPUT_REPORT].report_list) {···110142 continue;111143 }112144113113- if (private->report && private->report != report) {145145+ if (tmff->report && tmff->report != report) {114146 warn("ignoring THRUSTMASTER_USAGE_RUMBLE_LR in other report");115147 continue;116148 }117149118118- if (private->rumble && private->rumble != field) {150150+ if (tmff->rumble && tmff->rumble != field) {119151 warn("ignoring duplicate THRUSTMASTER_USAGE_RUMBLE_LR");120152 continue;121153 }122154123123- private->report = report;124124- private->rumble = field;155155+ tmff->report = report;156156+ tmff->rumble = field;125157126158 set_bit(FF_RUMBLE, input_dev->ffbit);127159 break;···130162 warn("ignoring unknown output usage %08x", field->usage[0].hid);131163 continue;132164 }133133-134134- /* Fallthrough to here only when a valid usage is found */135135- input_dev->upload_effect = hid_tmff_upload_effect;136136- input_dev->flush = hid_tmff_flush;137137-138138- set_bit(EV_FF, input_dev->evbit);139139- input_dev->ff_effects_max = TMFF_EFFECTS;140165 }141166 }142167143143- private->hid = hid;144144-145145- spin_lock_init(&private->lock);146146- init_timer(&private->timer);147147- private->timer.data = (unsigned long)private;148148- private->timer.function = hid_tmff_timer;149149-150150- /* Event and exit callbacks */151151- hid->ff_exit = hid_tmff_exit;152152- hid->ff_event = hid_tmff_event;168168+ error = input_ff_create_memless(input_dev, tmff, hid_tmff_play);169169+ if (error) {170170+ kfree(tmff);171171+ return error;172172+ }153173154174 info("Force feedback for ThrustMaster rumble pad devices by Zinx Verituse <zinx@epicsol.org>");155175156176 return 0;157177}158178159159-static void hid_tmff_exit(struct hid_device *hid)160160-{161161- struct tmff_device *tmff = hid->ff_private;162162- unsigned long flags;163163-164164- spin_lock_irqsave(&tmff->lock, flags);165165-166166- set_bit(DEVICE_CLOSING, tmff->flags);167167- del_timer_sync(&tmff->timer);168168-169169- spin_unlock_irqrestore(&tmff->lock, flags);170170-171171- kfree(tmff);172172-}173173-174174-static int hid_tmff_event(struct hid_device *hid, struct input_dev *input,175175- unsigned int type, unsigned int code, int value)176176-{177177- struct tmff_device *tmff = hid->ff_private;178178- struct tmff_effect *effect = &tmff->effects[code];179179- unsigned long flags;180180-181181- if (type != EV_FF)182182- return -EINVAL;183183- if (!TMFF_CHECK_ID(code))184184- return -EINVAL;185185- if (!TMFF_CHECK_OWNERSHIP(code, tmff))186186- return -EACCES;187187- if (value < 0)188188- return -EINVAL;189189-190190- spin_lock_irqsave(&tmff->lock, flags);191191-192192- if (value > 0) {193193- set_bit(EFFECT_STARTED, effect->flags);194194- clear_bit(EFFECT_PLAYING, effect->flags);195195- effect->count = value;196196- effect->play_at = DELAY_CALC(jiffies, effect->effect.replay.delay);197197- } else {198198- clear_bit(EFFECT_STARTED, effect->flags);199199- clear_bit(EFFECT_PLAYING, effect->flags);200200- }201201-202202- hid_tmff_recalculate_timer(tmff);203203-204204- spin_unlock_irqrestore(&tmff->lock, flags);205205-206206- return 0;207207-208208-}209209-210210-/* Erase all effects this process owns */211211-212212-static int hid_tmff_flush(struct input_dev *dev, struct file *file)213213-{214214- struct hid_device *hid = dev->private;215215- struct tmff_device *tmff = hid->ff_private;216216- int i;217217-218218- for (i=0; i<dev->ff_effects_max; ++i)219219-220220- /* NOTE: no need to lock here. The only times EFFECT_USED is221221- modified is when effects are uploaded or when an effect is222222- erased. But a process cannot close its dev/input/eventX fd223223- and perform ioctls on the same fd all at the same time */224224-225225- if (current->pid == tmff->effects[i].owner226226- && test_bit(EFFECT_USED, tmff->effects[i].flags))227227- if (hid_tmff_erase(dev, i))228228- warn("erase effect %d failed", i);229229-230230-231231- return 0;232232-}233233-234234-static int hid_tmff_erase(struct input_dev *dev, int id)235235-{236236- struct hid_device *hid = dev->private;237237- struct tmff_device *tmff = hid->ff_private;238238- unsigned long flags;239239-240240- if (!TMFF_CHECK_ID(id))241241- return -EINVAL;242242- if (!TMFF_CHECK_OWNERSHIP(id, tmff))243243- return -EACCES;244244-245245- spin_lock_irqsave(&tmff->lock, flags);246246-247247- tmff->effects[id].flags[0] = 0;248248- hid_tmff_recalculate_timer(tmff);249249-250250- spin_unlock_irqrestore(&tmff->lock, flags);251251-252252- return 0;253253-}254254-255255-static int hid_tmff_upload_effect(struct input_dev *input,256256- struct ff_effect *effect)257257-{258258- struct hid_device *hid = input->private;259259- struct tmff_device *tmff = hid->ff_private;260260- int id;261261- unsigned long flags;262262-263263- if (!test_bit(effect->type, input->ffbit))264264- return -EINVAL;265265- if (effect->id != -1 && !TMFF_CHECK_ID(effect->id))266266- return -EINVAL;267267-268268- spin_lock_irqsave(&tmff->lock, flags);269269-270270- if (effect->id == -1) {271271- /* Find a free effect */272272- for (id = 0; id < TMFF_EFFECTS && test_bit(EFFECT_USED, tmff->effects[id].flags); ++id);273273-274274- if (id >= TMFF_EFFECTS) {275275- spin_unlock_irqrestore(&tmff->lock, flags);276276- return -ENOSPC;277277- }278278-279279- effect->id = id;280280- tmff->effects[id].owner = current->pid;281281- tmff->effects[id].flags[0] = 0;282282- set_bit(EFFECT_USED, tmff->effects[id].flags);283283-284284- } else {285285- /* Re-uploading an owned effect, to change parameters */286286- id = effect->id;287287- clear_bit(EFFECT_PLAYING, tmff->effects[id].flags);288288- }289289-290290- tmff->effects[id].effect = *effect;291291-292292- hid_tmff_recalculate_timer(tmff);293293-294294- spin_unlock_irqrestore(&tmff->lock, flags);295295- return 0;296296-}297297-298298-/* Start the timer for the next start/stop/delay */299299-/* Always call this while tmff->lock is locked */300300-301301-static void hid_tmff_recalculate_timer(struct tmff_device *tmff)302302-{303303- int i;304304- int events = 0;305305- unsigned long next_time;306306-307307- next_time = 0; /* Shut up compiler's incorrect warning */308308-309309- /* Find the next change in an effect's status */310310- for (i = 0; i < TMFF_EFFECTS; ++i) {311311- struct tmff_effect *effect = &tmff->effects[i];312312- unsigned long play_time;313313-314314- if (!test_bit(EFFECT_STARTED, effect->flags))315315- continue;316316-317317- effect->stop_at = DELAY_CALC(effect->play_at, effect->effect.replay.length);318318-319319- if (!test_bit(EFFECT_PLAYING, effect->flags))320320- play_time = effect->play_at;321321- else322322- play_time = effect->stop_at;323323-324324- events++;325325-326326- if (time_after(jiffies, play_time))327327- play_time = jiffies;328328-329329- if (events == 1)330330- next_time = play_time;331331- else {332332- if (time_after(next_time, play_time))333333- next_time = play_time;334334- }335335- }336336-337337- if (!events && tmff->effects_playing) {338338- /* Treat all effects turning off as an event */339339- events = 1;340340- next_time = jiffies;341341- }342342-343343- if (!events) {344344- /* No events, no time, no need for a timer. */345345- del_timer_sync(&tmff->timer);346346- return;347347- }348348-349349- mod_timer(&tmff->timer, next_time);350350-}351351-352352-/* Changes values from 0 to 0xffff into values from minimum to maximum */353353-static inline int hid_tmff_scale(unsigned int in, int minimum, int maximum)354354-{355355- int ret;356356-357357- ret = (in * (maximum - minimum) / 0xffff) + minimum;358358- if (ret < minimum)359359- return minimum;360360- if (ret > maximum)361361- return maximum;362362- return ret;363363-}364364-365365-static void hid_tmff_timer(unsigned long timer_data)366366-{367367- struct tmff_device *tmff = (struct tmff_device *) timer_data;368368- struct hid_device *hid = tmff->hid;369369- unsigned long flags;370370- int left = 0, right = 0; /* Rumbling */371371- int i;372372-373373- spin_lock_irqsave(&tmff->lock, flags);374374-375375- tmff->effects_playing = 0;376376-377377- for (i = 0; i < TMFF_EFFECTS; ++i) {378378- struct tmff_effect *effect = &tmff->effects[i];379379-380380- if (!test_bit(EFFECT_STARTED, effect->flags))381381- continue;382382-383383- if (!time_after(jiffies, effect->play_at))384384- continue;385385-386386- if (time_after(jiffies, effect->stop_at)) {387387-388388- dbg("Finished playing once %d", i);389389- clear_bit(EFFECT_PLAYING, effect->flags);390390-391391- if (--effect->count <= 0) {392392- dbg("Stopped %d", i);393393- clear_bit(EFFECT_STARTED, effect->flags);394394- continue;395395- } else {396396- dbg("Start again %d", i);397397- effect->play_at = DELAY_CALC(jiffies, effect->effect.replay.delay);398398- continue;399399- }400400- }401401-402402- ++tmff->effects_playing;403403-404404- set_bit(EFFECT_PLAYING, effect->flags);405405-406406- switch (effect->effect.type) {407407- case FF_RUMBLE:408408- right += effect->effect.u.rumble.strong_magnitude;409409- left += effect->effect.u.rumble.weak_magnitude;410410- break;411411- default:412412- BUG();413413- break;414414- }415415- }416416-417417- left = hid_tmff_scale(left, tmff->rumble->logical_minimum, tmff->rumble->logical_maximum);418418- right = hid_tmff_scale(right, tmff->rumble->logical_minimum, tmff->rumble->logical_maximum);419419-420420- if (left != tmff->rumble->value[0] || right != tmff->rumble->value[1]) {421421- tmff->rumble->value[0] = left;422422- tmff->rumble->value[1] = right;423423- dbg("(left,right)=(%08x, %08x)", left, right);424424- hid_submit_report(hid, tmff->report, USB_DIR_OUT);425425- }426426-427427- if (!test_bit(DEVICE_CLOSING, tmff->flags))428428- hid_tmff_recalculate_timer(tmff);429429-430430- spin_unlock_irqrestore(&tmff->lock, flags);431431-}
-19
drivers/usb/input/hid.h
···449449 char phys[64]; /* Device physical location */450450 char uniq[64]; /* Device unique identifier (serial #) */451451452452- void *ff_private; /* Private data for the force-feedback driver */453453- void (*ff_exit)(struct hid_device*); /* Called by hid_exit_ff(hid) */454454- int (*ff_event)(struct hid_device *hid, struct input_dev *input,455455- unsigned int type, unsigned int code, int value);456456-457452#ifdef CONFIG_USB_HIDINPUT_POWERBOOK458453 unsigned long pb_pressed_fn[NBITS(KEY_MAX)];459454 unsigned long pb_pressed_numlock[NBITS(KEY_MAX)];···534539#else535540static inline int hid_ff_init(struct hid_device *hid) { return -1; }536541#endif537537-538538-static inline void hid_ff_exit(struct hid_device *hid)539539-{540540- if (hid->ff_exit)541541- hid->ff_exit(hid);542542-}543543-544544-static inline int hid_ff_event(struct hid_device *hid, struct input_dev *input,545545- unsigned int type, unsigned int code, int value)546546-{547547- if (hid->ff_event)548548- return hid->ff_event(hid, input, type, code, value);549549- return -ENOSYS;550550-}551542