static void g19_raw_event_process_input(struct hid_device *hdev, struct gcore_data *gdata, u8 *raw_data) { int scancode, value; int i, mask; raw_data[3] &= 0xBF; /* bit 6 is always on */ for (i = 0, mask = 0x01; i < 8; i++, mask <<= 1) { /* Keys G1 through G8 */ scancode = i; value = raw_data[1] & mask; gcore_input_report_key(gdata, scancode, value); /* Keys G9 through G12, M1 through MR */ scancode = i + 8; value = raw_data[2] & mask; gcore_input_report_key(gdata, scancode, value); /* Keys G17 through G22 */ scancode = i + 16; value = raw_data[3] & mask; gcore_input_report_key(gdata, scancode, value); } input_sync(gdata->input_dev); }
static void g15v2_raw_event_process_input(struct hid_device *hdev, struct gcore_data *gdata, u8 *raw_data) { struct input_dev *idev = gdata->input_dev; int scancode; int value; int i; int mask; for (i = 0, mask = 0x01; i < 8; i++, mask <<= 1) { scancode = i; value = raw_data[1] & mask; gcore_input_report_key(gdata, scancode, value); scancode = i + 8; value = raw_data[2] & mask; gcore_input_report_key(gdata, scancode, value); } input_sync(idev); }
static void g510_raw_event_process_input(struct hid_device *hdev, struct gcore_data *gdata, u8 *raw_data) { struct input_dev *idev = gdata->input_dev; int scancode; int value; int i; int mask; /* * This bit turns on and off at random. * G510: does it do this? seems safe to leave here in case */ raw_data[4] &= 0xFE; for (i = 0, mask = 0x01; i < 8; i++, mask <<= 1) { scancode = i; value = raw_data[1] & mask; gcore_input_report_key(gdata, scancode, value); scancode = i + 8; value = raw_data[2] & mask; gcore_input_report_key(gdata, scancode, value); scancode = i + 16; value = raw_data[3] & mask; gcore_input_report_key(gdata, scancode, value); scancode = i + 24; value = raw_data[4] & mask; gcore_input_report_key(gdata, scancode, value); } input_sync(idev); }
static void g19_ep1_urb_completion(struct urb *urb) { /* don't process unlinked or failed urbs */ if (likely(urb->status == 0)) { struct hid_device *hdev = urb->context; struct gcore_data *gdata = hid_get_gdata(hdev); struct g19_data *g19data = gdata->data; int i; for (i = 0; i < 8; i++) gcore_input_report_key(gdata, 24+i, g19data->ep1keys[0]&(1<<i)); input_sync(gdata->input_dev); usb_submit_urb(urb, GFP_ATOMIC); } }