Lines Matching refs:wacom
163 struct wacom { struct
188 static void wacom_handle_model_response(struct wacom *wacom) in wacom_handle_model_response() argument
193 p = strrchr(wacom->data, 'V'); in wacom_handle_model_response()
199 switch (wacom->data[2] << 8 | wacom->data[3]) { in wacom_handle_model_response()
202 if ((wacom->data[2] << 8 | wacom->data[3]) == MODEL_CINTIQ) { in wacom_handle_model_response()
203 wacom->dev->name = "Wacom Cintiq"; in wacom_handle_model_response()
204 wacom->dev->id.version = MODEL_CINTIQ; in wacom_handle_model_response()
206 wacom->dev->name = "Wacom Cintiq II"; in wacom_handle_model_response()
207 wacom->dev->id.version = MODEL_CINTIQ2; in wacom_handle_model_response()
209 wacom->res_x = 508; in wacom_handle_model_response()
210 wacom->res_y = 508; in wacom_handle_model_response()
212 switch (wacom->data[5] << 8 | wacom->data[6]) { in wacom_handle_model_response()
214 wacom->res_x = 2540; in wacom_handle_model_response()
215 wacom->res_y = 2540; in wacom_handle_model_response()
219 wacom->extra_z_bits = 2; in wacom_handle_model_response()
222 wacom->flags = F_COVERS_SCREEN; in wacom_handle_model_response()
226 wacom->dev->name = "Wacom Penpartner"; in wacom_handle_model_response()
227 wacom->dev->id.version = MODEL_PENPARTNER; in wacom_handle_model_response()
228 wacom->res_x = 1000; in wacom_handle_model_response()
229 wacom->res_y = 1000; in wacom_handle_model_response()
233 wacom->dev->name = "Wacom Graphire"; in wacom_handle_model_response()
234 wacom->dev->id.version = MODEL_GRAPHIRE; in wacom_handle_model_response()
235 wacom->res_x = 1016; in wacom_handle_model_response()
236 wacom->res_y = 1016; in wacom_handle_model_response()
237 wacom->max_x = 5103; in wacom_handle_model_response()
238 wacom->max_y = 3711; in wacom_handle_model_response()
239 wacom->extra_z_bits = 2; in wacom_handle_model_response()
240 wacom->eraser_mask = 0x08; in wacom_handle_model_response()
241 wacom->flags = F_HAS_STYLUS2 | F_HAS_SCROLLWHEEL; in wacom_handle_model_response()
246 wacom->dev->name = "Wacom Digitizer II"; in wacom_handle_model_response()
247 wacom->dev->id.version = MODEL_DIGITIZER_II; in wacom_handle_model_response()
249 wacom->extra_z_bits = 0; /* UNTESTED */ in wacom_handle_model_response()
253 dev_err(&wacom->dev->dev, "Unsupported Wacom model %s\n", in wacom_handle_model_response()
254 wacom->data); in wacom_handle_model_response()
255 wacom->result = -ENODEV; in wacom_handle_model_response()
259 dev_info(&wacom->dev->dev, "%s tablet, version %u.%u\n", in wacom_handle_model_response()
260 wacom->dev->name, major_v, minor_v); in wacom_handle_model_response()
263 static void wacom_handle_configuration_response(struct wacom *wacom) in wacom_handle_configuration_response() argument
267 dev_dbg(&wacom->dev->dev, "Configuration string: %s\n", wacom->data); in wacom_handle_configuration_response()
268 r = sscanf(wacom->data, "~R%x,%u,%u,%u,%u", &skip, &skip, &skip, in wacom_handle_configuration_response()
269 &wacom->res_x, &wacom->res_y); in wacom_handle_configuration_response()
271 dev_warn(&wacom->dev->dev, "could not get resolution\n"); in wacom_handle_configuration_response()
274 static void wacom_handle_coordinates_response(struct wacom *wacom) in wacom_handle_coordinates_response() argument
278 dev_dbg(&wacom->dev->dev, "Coordinates string: %s\n", wacom->data); in wacom_handle_coordinates_response()
279 r = sscanf(wacom->data, "~C%u,%u", &wacom->max_x, &wacom->max_y); in wacom_handle_coordinates_response()
281 dev_warn(&wacom->dev->dev, "could not get max coordinates\n"); in wacom_handle_coordinates_response()
284 static void wacom_handle_response(struct wacom *wacom) in wacom_handle_response() argument
286 if (wacom->data[0] != '~' || wacom->data[1] != wacom->expect) { in wacom_handle_response()
287 dev_err(&wacom->dev->dev, in wacom_handle_response()
288 "Wacom got an unexpected response: %s\n", wacom->data); in wacom_handle_response()
289 wacom->result = -EIO; in wacom_handle_response()
291 wacom->result = 0; in wacom_handle_response()
293 switch (wacom->data[1]) { in wacom_handle_response()
295 wacom_handle_model_response(wacom); in wacom_handle_response()
298 wacom_handle_configuration_response(wacom); in wacom_handle_response()
301 wacom_handle_coordinates_response(wacom); in wacom_handle_response()
306 complete(&wacom->cmd_done); in wacom_handle_response()
309 static void wacom_handle_packet(struct wacom *wacom) in wacom_handle_packet() argument
315 in_proximity_p = wacom->data[0] & 0x40; in wacom_handle_packet()
316 stylus_p = wacom->data[0] & 0x20; in wacom_handle_packet()
317 button = (wacom->data[3] & 0x78) >> 3; in wacom_handle_packet()
318 x = (wacom->data[0] & 3) << 14 | wacom->data[1]<<7 | wacom->data[2]; in wacom_handle_packet()
319 y = (wacom->data[3] & 3) << 14 | wacom->data[4]<<7 | wacom->data[5]; in wacom_handle_packet()
322 z = wacom->data[6] & 0x7f; in wacom_handle_packet()
323 if (wacom->extra_z_bits >= 1) in wacom_handle_packet()
324 z = z << 1 | (wacom->data[3] & 0x4) >> 2; in wacom_handle_packet()
325 if (wacom->extra_z_bits > 1) in wacom_handle_packet()
326 z = z << 1 | (wacom->data[0] & 0x4) >> 2; in wacom_handle_packet()
327 z = z ^ (0x40 << wacom->extra_z_bits); in wacom_handle_packet()
333 tool = (button & wacom->eraser_mask) ? ERASER : STYLUS; in wacom_handle_packet()
337 if (tool != wacom->tool && wacom->tool != 0) { in wacom_handle_packet()
338 input_report_key(wacom->dev, tools[wacom->tool].input_id, 0); in wacom_handle_packet()
339 input_sync(wacom->dev); in wacom_handle_packet()
341 wacom->tool = tool; in wacom_handle_packet()
343 input_report_key(wacom->dev, tools[tool].input_id, in_proximity_p); in wacom_handle_packet()
344 input_report_abs(wacom->dev, ABS_MISC, in wacom_handle_packet()
346 input_report_abs(wacom->dev, ABS_X, x); in wacom_handle_packet()
347 input_report_abs(wacom->dev, ABS_Y, y); in wacom_handle_packet()
348 input_report_abs(wacom->dev, ABS_PRESSURE, z); in wacom_handle_packet()
350 input_report_key(wacom->dev, BTN_TOUCH, button & 1); in wacom_handle_packet()
351 input_report_key(wacom->dev, BTN_STYLUS, button & 2); in wacom_handle_packet()
352 input_report_key(wacom->dev, BTN_STYLUS2, button & 4); in wacom_handle_packet()
354 input_report_key(wacom->dev, BTN_LEFT, button & 1); in wacom_handle_packet()
355 input_report_key(wacom->dev, BTN_RIGHT, button & 2); in wacom_handle_packet()
356 input_report_key(wacom->dev, BTN_MIDDLE, button & 4); in wacom_handle_packet()
358 z = (wacom->data[6] & 0x30) >> 4; in wacom_handle_packet()
359 if (wacom->data[6] & 0x40) in wacom_handle_packet()
361 input_report_rel(wacom->dev, REL_WHEEL, z); in wacom_handle_packet()
363 input_sync(wacom->dev); in wacom_handle_packet()
366 static void wacom_clear_data_buf(struct wacom *wacom) in wacom_clear_data_buf() argument
368 memset(wacom->data, 0, DATA_SIZE); in wacom_clear_data_buf()
369 wacom->idx = 0; in wacom_clear_data_buf()
375 struct wacom *wacom = serio_get_drvdata(serio); in wacom_interrupt() local
378 wacom->idx = 0; in wacom_interrupt()
389 if (data == '\r' && !(wacom->data[0] & 0x80)) { in wacom_interrupt()
390 wacom_handle_response(wacom); in wacom_interrupt()
391 wacom_clear_data_buf(wacom); in wacom_interrupt()
396 if (wacom->idx > (DATA_SIZE - 2)) { in wacom_interrupt()
397 dev_dbg(&wacom->dev->dev, in wacom_interrupt()
398 "throwing away %d bytes of garbage\n", wacom->idx); in wacom_interrupt()
399 wacom_clear_data_buf(wacom); in wacom_interrupt()
401 wacom->data[wacom->idx++] = data; in wacom_interrupt()
403 if (wacom->idx == PACKET_LENGTH && (wacom->data[0] & 0x80)) { in wacom_interrupt()
404 wacom_handle_packet(wacom); in wacom_interrupt()
405 wacom_clear_data_buf(wacom); in wacom_interrupt()
413 struct wacom *wacom = serio_get_drvdata(serio); in wacom_disconnect() local
417 input_unregister_device(wacom->dev); in wacom_disconnect()
418 kfree(wacom); in wacom_disconnect()
431 static int wacom_send_setup_string(struct wacom *wacom, struct serio *serio) in wacom_send_setup_string() argument
435 switch (wacom->dev->id.version) { in wacom_send_setup_string()
464 static int wacom_send_and_wait(struct wacom *wacom, struct serio *serio, in wacom_send_and_wait() argument
470 wacom->expect = cmd[1]; in wacom_send_and_wait()
471 init_completion(&wacom->cmd_done); in wacom_send_and_wait()
477 u = wait_for_completion_timeout(&wacom->cmd_done, HZ); in wacom_send_and_wait()
480 wacom_handle_response(wacom); in wacom_send_and_wait()
483 wacom->expect = 0; in wacom_send_and_wait()
484 return wacom->result; in wacom_send_and_wait()
487 static int wacom_setup(struct wacom *wacom, struct serio *serio) in wacom_setup() argument
494 err = wacom_send_and_wait(wacom, serio, REQUEST_MODEL_AND_ROM_VERSION, in wacom_setup()
499 if (!(wacom->res_x && wacom->res_y)) { in wacom_setup()
500 err = wacom_send_and_wait(wacom, serio, in wacom_setup()
507 if (!(wacom->max_x && wacom->max_y)) { in wacom_setup()
508 err = wacom_send_and_wait(wacom, serio, in wacom_setup()
515 return wacom_send_setup_string(wacom, serio); in wacom_setup()
520 struct wacom *wacom; in wacom_connect() local
524 wacom = kzalloc(sizeof(*wacom), GFP_KERNEL); in wacom_connect()
526 if (!wacom || !input_dev) in wacom_connect()
529 wacom->dev = input_dev; in wacom_connect()
530 wacom->extra_z_bits = 1; in wacom_connect()
531 wacom->eraser_mask = 0x04; in wacom_connect()
532 wacom->tool = wacom->idx = 0; in wacom_connect()
533 snprintf(wacom->phys, sizeof(wacom->phys), "%s/input0", serio->phys); in wacom_connect()
534 input_dev->phys = wacom->phys; in wacom_connect()
552 serio_set_drvdata(serio, wacom); in wacom_connect()
558 err = wacom_setup(wacom, serio); in wacom_connect()
563 if (!(wacom->flags & F_COVERS_SCREEN)) in wacom_connect()
566 if (wacom->flags & F_HAS_STYLUS2) in wacom_connect()
569 if (wacom->flags & F_HAS_SCROLLWHEEL) in wacom_connect()
572 input_abs_set_res(wacom->dev, ABS_X, wacom->res_x); in wacom_connect()
573 input_abs_set_res(wacom->dev, ABS_Y, wacom->res_y); in wacom_connect()
574 input_set_abs_params(wacom->dev, ABS_X, 0, wacom->max_x, 0, 0); in wacom_connect()
575 input_set_abs_params(wacom->dev, ABS_Y, 0, wacom->max_y, 0, 0); in wacom_connect()
576 input_set_abs_params(wacom->dev, ABS_PRESSURE, -1, in wacom_connect()
577 (1 << (7 + wacom->extra_z_bits)) - 1, 0, 0); in wacom_connect()
579 err = input_register_device(wacom->dev); in wacom_connect()
590 kfree(wacom); in wacom_connect()