udraw
struct udraw *udraw = hid_get_drvdata(hdev);
input_report_key(udraw->joy_input_dev, BTN_WEST, data[0] & 1);
input_report_key(udraw->joy_input_dev, BTN_SOUTH, !!(data[0] & 2));
input_report_key(udraw->joy_input_dev, BTN_EAST, !!(data[0] & 4));
input_report_key(udraw->joy_input_dev, BTN_NORTH, !!(data[0] & 8));
input_report_key(udraw->joy_input_dev, BTN_SELECT, !!(data[1] & 1));
input_report_key(udraw->joy_input_dev, BTN_START, !!(data[1] & 2));
input_report_key(udraw->joy_input_dev, BTN_MODE, !!(data[1] & 16));
input_report_abs(udraw->joy_input_dev, ABS_X, x);
input_report_abs(udraw->joy_input_dev, ABS_Y, y);
input_sync(udraw->joy_input_dev);
udraw->last_one_finger_x = x;
udraw->last_one_finger_y = y;
udraw->last_two_finger_x = -1;
udraw->last_two_finger_y = -1;
if (udraw->last_two_finger_x == -1) {
udraw->last_two_finger_x = x;
udraw->last_two_finger_y = y;
x = udraw->last_one_finger_x;
y = udraw->last_one_finger_y;
x = x - (udraw->last_two_finger_x
- udraw->last_one_finger_x);
y = y - (udraw->last_two_finger_y
- udraw->last_one_finger_y);
input_report_key(udraw->touch_input_dev, BTN_TOUCH, 1);
input_report_key(udraw->touch_input_dev, BTN_TOOL_FINGER,
input_report_key(udraw->touch_input_dev, BTN_TOOL_DOUBLETAP,
input_report_abs(udraw->touch_input_dev, ABS_X, x);
input_report_abs(udraw->touch_input_dev, ABS_Y, y);
input_report_key(udraw->touch_input_dev, BTN_TOUCH, 0);
input_report_key(udraw->touch_input_dev, BTN_TOOL_FINGER, 0);
input_report_key(udraw->touch_input_dev, BTN_TOOL_DOUBLETAP, 0);
input_sync(udraw->touch_input_dev);
input_report_key(udraw->pen_input_dev, BTN_TOUCH, (level != 0));
input_report_key(udraw->pen_input_dev, BTN_TOOL_PEN, 1);
input_report_abs(udraw->pen_input_dev, ABS_PRESSURE, level);
input_report_abs(udraw->pen_input_dev, ABS_X, x);
input_report_abs(udraw->pen_input_dev, ABS_Y, y);
input_report_key(udraw->pen_input_dev, BTN_TOUCH, 0);
input_report_key(udraw->pen_input_dev, BTN_TOOL_PEN, 0);
input_report_abs(udraw->pen_input_dev, ABS_PRESSURE, 0);
input_sync(udraw->pen_input_dev);
input_report_abs(udraw->accel_input_dev, ABS_X, x);
input_report_abs(udraw->accel_input_dev, ABS_Y, y);
input_report_abs(udraw->accel_input_dev, ABS_Z, z);
input_sync(udraw->accel_input_dev);
struct udraw *udraw = input_get_drvdata(dev);
return hid_hw_open(udraw->hdev);
struct udraw *udraw = input_get_drvdata(dev);
hid_hw_close(udraw->hdev);
static bool udraw_setup_touch(struct udraw *udraw,
udraw->touch_input_dev = input_dev;
static bool udraw_setup_pen(struct udraw *udraw,
udraw->pen_input_dev = input_dev;
static bool udraw_setup_accel(struct udraw *udraw,
udraw->accel_input_dev = input_dev;
static bool udraw_setup_joypad(struct udraw *udraw,
udraw->joy_input_dev = input_dev;
struct udraw *udraw;
udraw = devm_kzalloc(&hdev->dev, sizeof(struct udraw), GFP_KERNEL);
if (!udraw)
udraw->hdev = hdev;
udraw->last_two_finger_x = -1;
udraw->last_two_finger_y = -1;
hid_set_drvdata(hdev, udraw);
if (!udraw_setup_joypad(udraw, hdev) ||
!udraw_setup_touch(udraw, hdev) ||
!udraw_setup_pen(udraw, hdev) ||
!udraw_setup_accel(udraw, hdev)) {
ret = input_register_device(udraw->joy_input_dev) ||
input_register_device(udraw->touch_input_dev) ||
input_register_device(udraw->pen_input_dev) ||
input_register_device(udraw->accel_input_dev);