|
@@ -83,6 +83,7 @@ struct mt_device {
|
|
|
unsigned last_field_index; /* last field index of the report */
|
|
|
unsigned last_slot_field; /* the last field of a slot */
|
|
|
__s8 inputmode; /* InputMode HID feature, -1 if non-existent */
|
|
|
+ __s8 inputmode_index; /* InputMode HID feature index in the report */
|
|
|
__s8 maxcontact_report_id; /* Maximum Contact Number HID feature,
|
|
|
-1 if non-existent */
|
|
|
__u8 num_received; /* how many contacts we received */
|
|
@@ -260,10 +261,20 @@ static void mt_feature_mapping(struct hid_device *hdev,
|
|
|
struct hid_field *field, struct hid_usage *usage)
|
|
|
{
|
|
|
struct mt_device *td = hid_get_drvdata(hdev);
|
|
|
+ int i;
|
|
|
|
|
|
switch (usage->hid) {
|
|
|
case HID_DG_INPUTMODE:
|
|
|
td->inputmode = field->report->id;
|
|
|
+ td->inputmode_index = 0; /* has to be updated below */
|
|
|
+
|
|
|
+ for (i=0; i < field->maxusage; i++) {
|
|
|
+ if (field->usage[i].hid == usage->hid) {
|
|
|
+ td->inputmode_index = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
break;
|
|
|
case HID_DG_CONTACTMAX:
|
|
|
td->maxcontact_report_id = field->report->id;
|
|
@@ -618,7 +629,7 @@ static void mt_set_input_mode(struct hid_device *hdev)
|
|
|
re = &(hdev->report_enum[HID_FEATURE_REPORT]);
|
|
|
r = re->report_id_hash[td->inputmode];
|
|
|
if (r) {
|
|
|
- r->field[0]->value[0] = 0x02;
|
|
|
+ r->field[0]->value[td->inputmode_index] = 0x02;
|
|
|
usbhid_submit_report(hdev, r, USB_DIR_OUT);
|
|
|
}
|
|
|
}
|