Lines Matching refs:wacom
168 struct wacom { struct
192 static void wacom_handle_model_response(struct wacom *wacom) in wacom_handle_model_response() argument
197 p = strrchr(wacom->data, 'V'); in wacom_handle_model_response()
203 switch (wacom->data[2] << 8 | wacom->data[3]) { in wacom_handle_model_response()
206 if ((wacom->data[2] << 8 | wacom->data[3]) == MODEL_CINTIQ) { in wacom_handle_model_response()
207 wacom->dev->name = "Wacom Cintiq"; in wacom_handle_model_response()
208 wacom->dev->id.version = MODEL_CINTIQ; in wacom_handle_model_response()
210 wacom->dev->name = "Wacom Cintiq II"; in wacom_handle_model_response()
211 wacom->dev->id.version = MODEL_CINTIQ2; in wacom_handle_model_response()
213 wacom->res_x = 508; in wacom_handle_model_response()
214 wacom->res_y = 508; in wacom_handle_model_response()
216 switch (wacom->data[5] << 8 | wacom->data[6]) { in wacom_handle_model_response()
218 wacom->res_x = 2540; in wacom_handle_model_response()
219 wacom->res_y = 2540; in wacom_handle_model_response()
223 wacom->extra_z_bits = 2; in wacom_handle_model_response()
226 wacom->flags = F_COVERS_SCREEN; in wacom_handle_model_response()
230 wacom->dev->name = "Wacom Penpartner"; in wacom_handle_model_response()
231 wacom->dev->id.version = MODEL_PENPARTNER; in wacom_handle_model_response()
232 wacom->res_x = 1000; in wacom_handle_model_response()
233 wacom->res_y = 1000; in wacom_handle_model_response()
237 wacom->dev->name = "Wacom Graphire"; in wacom_handle_model_response()
238 wacom->dev->id.version = MODEL_GRAPHIRE; in wacom_handle_model_response()
239 wacom->res_x = 1016; in wacom_handle_model_response()
240 wacom->res_y = 1016; in wacom_handle_model_response()
241 wacom->max_x = 5103; in wacom_handle_model_response()
242 wacom->max_y = 3711; in wacom_handle_model_response()
243 wacom->extra_z_bits = 2; in wacom_handle_model_response()
244 wacom->eraser_mask = 0x08; in wacom_handle_model_response()
245 wacom->flags = F_HAS_STYLUS2 | F_HAS_SCROLLWHEEL; in wacom_handle_model_response()
249 wacom->dev->name = "Wacom Digitizer II"; in wacom_handle_model_response()
250 wacom->dev->id.version = MODEL_DIGITIZER_II; in wacom_handle_model_response()
252 wacom->extra_z_bits = 0; /* UNTESTED */ in wacom_handle_model_response()
256 dev_err(&wacom->dev->dev, "Unsupported Wacom model %s\n", in wacom_handle_model_response()
257 wacom->data); in wacom_handle_model_response()
258 wacom->result = -ENODEV; in wacom_handle_model_response()
262 dev_info(&wacom->dev->dev, "%s tablet, version %u.%u\n", in wacom_handle_model_response()
263 wacom->dev->name, major_v, minor_v); in wacom_handle_model_response()
266 static void wacom_handle_configuration_response(struct wacom *wacom) in wacom_handle_configuration_response() argument
270 dev_dbg(&wacom->dev->dev, "Configuration string: %s\n", wacom->data); in wacom_handle_configuration_response()
271 r = sscanf(wacom->data, "~R%x,%u,%u,%u,%u", &skip, &skip, &skip, in wacom_handle_configuration_response()
272 &wacom->res_x, &wacom->res_y); in wacom_handle_configuration_response()
274 dev_warn(&wacom->dev->dev, "could not get resolution\n"); in wacom_handle_configuration_response()
277 static void wacom_handle_coordinates_response(struct wacom *wacom) in wacom_handle_coordinates_response() argument
281 dev_dbg(&wacom->dev->dev, "Coordinates string: %s\n", wacom->data); in wacom_handle_coordinates_response()
282 r = sscanf(wacom->data, "~C%u,%u", &wacom->max_x, &wacom->max_y); in wacom_handle_coordinates_response()
284 dev_warn(&wacom->dev->dev, "could not get max coordinates\n"); in wacom_handle_coordinates_response()
287 static void wacom_handle_response(struct wacom *wacom) in wacom_handle_response() argument
289 if (wacom->data[0] != '~' || wacom->data[1] != wacom->expect) { in wacom_handle_response()
290 dev_err(&wacom->dev->dev, in wacom_handle_response()
291 "Wacom got an unexpected response: %s\n", wacom->data); in wacom_handle_response()
292 wacom->result = -EIO; in wacom_handle_response()
294 wacom->result = 0; in wacom_handle_response()
296 switch (wacom->data[1]) { in wacom_handle_response()
298 wacom_handle_model_response(wacom); in wacom_handle_response()
301 wacom_handle_configuration_response(wacom); in wacom_handle_response()
304 wacom_handle_coordinates_response(wacom); in wacom_handle_response()
309 complete(&wacom->cmd_done); in wacom_handle_response()
312 static void wacom_handle_packet(struct wacom *wacom) in wacom_handle_packet() argument
318 in_proximity_p = wacom->data[0] & 0x40; in wacom_handle_packet()
319 stylus_p = wacom->data[0] & 0x20; in wacom_handle_packet()
320 button = (wacom->data[3] & 0x78) >> 3; in wacom_handle_packet()
321 x = (wacom->data[0] & 3) << 14 | wacom->data[1]<<7 | wacom->data[2]; in wacom_handle_packet()
322 y = (wacom->data[3] & 3) << 14 | wacom->data[4]<<7 | wacom->data[5]; in wacom_handle_packet()
325 z = wacom->data[6] & 0x7f; in wacom_handle_packet()
326 if (wacom->extra_z_bits >= 1) in wacom_handle_packet()
327 z = z << 1 | (wacom->data[3] & 0x4) >> 2; in wacom_handle_packet()
328 if (wacom->extra_z_bits > 1) in wacom_handle_packet()
329 z = z << 1 | (wacom->data[0] & 0x4) >> 2; in wacom_handle_packet()
330 z = z ^ (0x40 << wacom->extra_z_bits); in wacom_handle_packet()
336 tool = (button & wacom->eraser_mask) ? ERASER : STYLUS; in wacom_handle_packet()
340 if (tool != wacom->tool && wacom->tool != 0) { in wacom_handle_packet()
341 input_report_key(wacom->dev, tools[wacom->tool].input_id, 0); in wacom_handle_packet()
342 input_sync(wacom->dev); in wacom_handle_packet()
344 wacom->tool = tool; in wacom_handle_packet()
346 input_report_key(wacom->dev, tools[tool].input_id, in_proximity_p); in wacom_handle_packet()
347 input_report_abs(wacom->dev, ABS_MISC, in wacom_handle_packet()
349 input_report_abs(wacom->dev, ABS_X, x); in wacom_handle_packet()
350 input_report_abs(wacom->dev, ABS_Y, y); in wacom_handle_packet()
351 input_report_abs(wacom->dev, ABS_PRESSURE, z); in wacom_handle_packet()
353 input_report_key(wacom->dev, BTN_TOUCH, button & 1); in wacom_handle_packet()
354 input_report_key(wacom->dev, BTN_STYLUS, button & 2); in wacom_handle_packet()
355 input_report_key(wacom->dev, BTN_STYLUS2, button & 4); in wacom_handle_packet()
357 input_report_key(wacom->dev, BTN_LEFT, button & 1); in wacom_handle_packet()
358 input_report_key(wacom->dev, BTN_RIGHT, button & 2); in wacom_handle_packet()
359 input_report_key(wacom->dev, BTN_MIDDLE, button & 4); in wacom_handle_packet()
361 z = (wacom->data[6] & 0x30) >> 4; in wacom_handle_packet()
362 if (wacom->data[6] & 0x40) in wacom_handle_packet()
364 input_report_rel(wacom->dev, REL_WHEEL, z); in wacom_handle_packet()
366 input_sync(wacom->dev); in wacom_handle_packet()
369 static void wacom_clear_data_buf(struct wacom *wacom) in wacom_clear_data_buf() argument
371 memset(wacom->data, 0, DATA_SIZE); in wacom_clear_data_buf()
372 wacom->idx = 0; in wacom_clear_data_buf()
378 struct wacom *wacom = serio_get_drvdata(serio); in wacom_interrupt() local
381 wacom->idx = 0; in wacom_interrupt()
392 if (data == '\r' && !(wacom->data[0] & 0x80)) { in wacom_interrupt()
393 wacom_handle_response(wacom); in wacom_interrupt()
394 wacom_clear_data_buf(wacom); in wacom_interrupt()
399 if (wacom->idx > (DATA_SIZE - 2)) { in wacom_interrupt()
400 dev_dbg(&wacom->dev->dev, in wacom_interrupt()
401 "throwing away %d bytes of garbage\n", wacom->idx); in wacom_interrupt()
402 wacom_clear_data_buf(wacom); in wacom_interrupt()
404 wacom->data[wacom->idx++] = data; in wacom_interrupt()
406 if (wacom->idx == PACKET_LENGTH && (wacom->data[0] & 0x80)) { in wacom_interrupt()
407 wacom_handle_packet(wacom); in wacom_interrupt()
408 wacom_clear_data_buf(wacom); in wacom_interrupt()
416 struct wacom *wacom = serio_get_drvdata(serio); in wacom_disconnect() local
420 input_unregister_device(wacom->dev); in wacom_disconnect()
421 kfree(wacom); in wacom_disconnect()
434 static int wacom_send_setup_string(struct wacom *wacom, struct serio *serio) in wacom_send_setup_string() argument
438 switch (wacom->dev->id.version) { in wacom_send_setup_string()
467 static int wacom_send_and_wait(struct wacom *wacom, struct serio *serio, in wacom_send_and_wait() argument
473 wacom->expect = cmd[1]; in wacom_send_and_wait()
474 init_completion(&wacom->cmd_done); in wacom_send_and_wait()
480 u = wait_for_completion_timeout(&wacom->cmd_done, HZ); in wacom_send_and_wait()
483 wacom_handle_response(wacom); in wacom_send_and_wait()
486 wacom->expect = 0; in wacom_send_and_wait()
487 return wacom->result; in wacom_send_and_wait()
490 static int wacom_setup(struct wacom *wacom, struct serio *serio) in wacom_setup() argument
497 err = wacom_send_and_wait(wacom, serio, REQUEST_MODEL_AND_ROM_VERSION, in wacom_setup()
502 if (!(wacom->res_x && wacom->res_y)) { in wacom_setup()
503 err = wacom_send_and_wait(wacom, serio, in wacom_setup()
510 if (!(wacom->max_x && wacom->max_y)) { in wacom_setup()
511 err = wacom_send_and_wait(wacom, serio, in wacom_setup()
518 return wacom_send_setup_string(wacom, serio); in wacom_setup()
523 struct wacom *wacom; in wacom_connect() local
527 wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); in wacom_connect()
529 if (!wacom || !input_dev) in wacom_connect()
532 wacom->dev = input_dev; in wacom_connect()
533 wacom->extra_z_bits = 1; in wacom_connect()
534 wacom->eraser_mask = 0x04; in wacom_connect()
535 wacom->tool = wacom->idx = 0; in wacom_connect()
536 snprintf(wacom->phys, sizeof(wacom->phys), "%s/input0", serio->phys); in wacom_connect()
537 input_dev->phys = wacom->phys; in wacom_connect()
555 serio_set_drvdata(serio, wacom); in wacom_connect()
561 err = wacom_setup(wacom, serio); in wacom_connect()
566 if (!(wacom->flags & F_COVERS_SCREEN)) in wacom_connect()
569 if (wacom->flags & F_HAS_STYLUS2) in wacom_connect()
572 if (wacom->flags & F_HAS_SCROLLWHEEL) in wacom_connect()
575 input_abs_set_res(wacom->dev, ABS_X, wacom->res_x); in wacom_connect()
576 input_abs_set_res(wacom->dev, ABS_Y, wacom->res_y); in wacom_connect()
577 input_set_abs_params(wacom->dev, ABS_X, 0, wacom->max_x, 0, 0); in wacom_connect()
578 input_set_abs_params(wacom->dev, ABS_Y, 0, wacom->max_y, 0, 0); in wacom_connect()
579 input_set_abs_params(wacom->dev, ABS_PRESSURE, -1, in wacom_connect()
580 (1 << (7 + wacom->extra_z_bits)) - 1, 0, 0); in wacom_connect()
582 err = input_register_device(wacom->dev); in wacom_connect()
593 kfree(wacom); in wacom_connect()