2 * Hampshire serial touchscreen driver
4 * Copyright (c) 2010 Adam Bennett
5 * Based on the dynapro driver (c) Tias Guns
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License version 2 as published by
12 * the Free Software Foundation.
16 * 2010/04/08 Adam Bennett <abennett72@gmail.com>
17 * Copied dynapro.c and edited for Hampshire 4-byte protocol
20 #include <linux/errno.h>
21 #include <linux/kernel.h>
22 #include <linux/module.h>
23 #include <linux/slab.h>
24 #include <linux/input.h>
25 #include <linux/serio.h>
27 #define DRIVER_DESC "Hampshire serial touchscreen driver"
29 MODULE_AUTHOR("Adam Bennett <abennett72@gmail.com>");
30 MODULE_DESCRIPTION(DRIVER_DESC
);
31 MODULE_LICENSE("GPL");
34 * Definitions & global arrays.
37 #define HAMPSHIRE_FORMAT_TOUCH_BIT 0x40
38 #define HAMPSHIRE_FORMAT_LENGTH 4
39 #define HAMPSHIRE_RESPONSE_BEGIN_BYTE 0x80
41 #define HAMPSHIRE_MIN_XC 0
42 #define HAMPSHIRE_MAX_XC 0x1000
43 #define HAMPSHIRE_MIN_YC 0
44 #define HAMPSHIRE_MAX_YC 0x1000
46 #define HAMPSHIRE_GET_XC(data) (((data[3] & 0x0c) >> 2) | (data[1] << 2) | ((data[0] & 0x38) << 6))
47 #define HAMPSHIRE_GET_YC(data) ((data[3] & 0x03) | (data[2] << 2) | ((data[0] & 0x07) << 9))
48 #define HAMPSHIRE_GET_TOUCHED(data) (HAMPSHIRE_FORMAT_TOUCH_BIT & data[0])
51 * Per-touchscreen data.
55 struct input_dev
*dev
;
58 unsigned char data
[HAMPSHIRE_FORMAT_LENGTH
];
62 static void hampshire_process_data(struct hampshire
*phampshire
)
64 struct input_dev
*dev
= phampshire
->dev
;
66 if (HAMPSHIRE_FORMAT_LENGTH
== ++phampshire
->idx
) {
67 input_report_abs(dev
, ABS_X
, HAMPSHIRE_GET_XC(phampshire
->data
));
68 input_report_abs(dev
, ABS_Y
, HAMPSHIRE_GET_YC(phampshire
->data
));
69 input_report_key(dev
, BTN_TOUCH
,
70 HAMPSHIRE_GET_TOUCHED(phampshire
->data
));
77 static irqreturn_t
hampshire_interrupt(struct serio
*serio
,
78 unsigned char data
, unsigned int flags
)
80 struct hampshire
*phampshire
= serio_get_drvdata(serio
);
82 phampshire
->data
[phampshire
->idx
] = data
;
84 if (HAMPSHIRE_RESPONSE_BEGIN_BYTE
& phampshire
->data
[0])
85 hampshire_process_data(phampshire
);
87 dev_dbg(&serio
->dev
, "unknown/unsynchronized data: %x\n",
93 static void hampshire_disconnect(struct serio
*serio
)
95 struct hampshire
*phampshire
= serio_get_drvdata(serio
);
97 input_get_device(phampshire
->dev
);
98 input_unregister_device(phampshire
->dev
);
100 serio_set_drvdata(serio
, NULL
);
101 input_put_device(phampshire
->dev
);
106 * hampshire_connect() is the routine that is called when someone adds a
107 * new serio device that supports hampshire protocol and registers it as
108 * an input device. This is usually accomplished using inputattach.
111 static int hampshire_connect(struct serio
*serio
, struct serio_driver
*drv
)
113 struct hampshire
*phampshire
;
114 struct input_dev
*input_dev
;
117 phampshire
= kzalloc(sizeof(struct hampshire
), GFP_KERNEL
);
118 input_dev
= input_allocate_device();
119 if (!phampshire
|| !input_dev
) {
124 phampshire
->serio
= serio
;
125 phampshire
->dev
= input_dev
;
126 snprintf(phampshire
->phys
, sizeof(phampshire
->phys
),
127 "%s/input0", serio
->phys
);
129 input_dev
->name
= "Hampshire Serial TouchScreen";
130 input_dev
->phys
= phampshire
->phys
;
131 input_dev
->id
.bustype
= BUS_RS232
;
132 input_dev
->id
.vendor
= SERIO_HAMPSHIRE
;
133 input_dev
->id
.product
= 0;
134 input_dev
->id
.version
= 0x0001;
135 input_dev
->dev
.parent
= &serio
->dev
;
136 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_ABS
);
137 input_dev
->keybit
[BIT_WORD(BTN_TOUCH
)] = BIT_MASK(BTN_TOUCH
);
138 input_set_abs_params(phampshire
->dev
, ABS_X
,
139 HAMPSHIRE_MIN_XC
, HAMPSHIRE_MAX_XC
, 0, 0);
140 input_set_abs_params(phampshire
->dev
, ABS_Y
,
141 HAMPSHIRE_MIN_YC
, HAMPSHIRE_MAX_YC
, 0, 0);
143 serio_set_drvdata(serio
, phampshire
);
145 err
= serio_open(serio
, drv
);
149 err
= input_register_device(phampshire
->dev
);
155 fail3
: serio_close(serio
);
156 fail2
: serio_set_drvdata(serio
, NULL
);
157 fail1
: input_free_device(input_dev
);
163 * The serio driver structure.
166 static const struct serio_device_id hampshire_serio_ids
[] = {
169 .proto
= SERIO_HAMPSHIRE
,
176 MODULE_DEVICE_TABLE(serio
, hampshire_serio_ids
);
178 static struct serio_driver hampshire_drv
= {
182 .description
= DRIVER_DESC
,
183 .id_table
= hampshire_serio_ids
,
184 .interrupt
= hampshire_interrupt
,
185 .connect
= hampshire_connect
,
186 .disconnect
= hampshire_disconnect
,
189 module_serio_driver(hampshire_drv
);