0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/errno.h>
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/slab.h>
0013 #include <linux/input.h>
0014 #include <linux/serio.h>
0015
0016 #define DRIVER_DESC "Fujitsu serial touchscreen driver"
0017
0018 MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>");
0019 MODULE_DESCRIPTION(DRIVER_DESC);
0020 MODULE_LICENSE("GPL");
0021
0022 #define FUJITSU_LENGTH 5
0023
0024
0025
0026
0027 struct fujitsu {
0028 struct input_dev *dev;
0029 struct serio *serio;
0030 int idx;
0031 unsigned char data[FUJITSU_LENGTH];
0032 char phys[32];
0033 };
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 static irqreturn_t fujitsu_interrupt(struct serio *serio,
0044 unsigned char data, unsigned int flags)
0045 {
0046 struct fujitsu *fujitsu = serio_get_drvdata(serio);
0047 struct input_dev *dev = fujitsu->dev;
0048
0049 if (fujitsu->idx == 0) {
0050
0051 if ((data & 0xf0) != 0x80)
0052 return IRQ_HANDLED;
0053 } else {
0054
0055 if (data & 0x80) {
0056 fujitsu->idx = 0;
0057 return IRQ_HANDLED;
0058 }
0059 }
0060
0061 fujitsu->data[fujitsu->idx++] = data;
0062 if (fujitsu->idx == FUJITSU_LENGTH) {
0063 input_report_abs(dev, ABS_X,
0064 (fujitsu->data[2] << 7) | fujitsu->data[1]);
0065 input_report_abs(dev, ABS_Y,
0066 (fujitsu->data[4] << 7) | fujitsu->data[3]);
0067 input_report_key(dev, BTN_TOUCH,
0068 (fujitsu->data[0] & 0x03) != 2);
0069 input_sync(dev);
0070 fujitsu->idx = 0;
0071 }
0072
0073 return IRQ_HANDLED;
0074 }
0075
0076
0077
0078
0079 static void fujitsu_disconnect(struct serio *serio)
0080 {
0081 struct fujitsu *fujitsu = serio_get_drvdata(serio);
0082
0083 input_get_device(fujitsu->dev);
0084 input_unregister_device(fujitsu->dev);
0085 serio_close(serio);
0086 serio_set_drvdata(serio, NULL);
0087 input_put_device(fujitsu->dev);
0088 kfree(fujitsu);
0089 }
0090
0091
0092
0093
0094
0095
0096 static int fujitsu_connect(struct serio *serio, struct serio_driver *drv)
0097 {
0098 struct fujitsu *fujitsu;
0099 struct input_dev *input_dev;
0100 int err;
0101
0102 fujitsu = kzalloc(sizeof(struct fujitsu), GFP_KERNEL);
0103 input_dev = input_allocate_device();
0104 if (!fujitsu || !input_dev) {
0105 err = -ENOMEM;
0106 goto fail1;
0107 }
0108
0109 fujitsu->serio = serio;
0110 fujitsu->dev = input_dev;
0111 snprintf(fujitsu->phys, sizeof(fujitsu->phys),
0112 "%s/input0", serio->phys);
0113
0114 input_dev->name = "Fujitsu Serial Touchscreen";
0115 input_dev->phys = fujitsu->phys;
0116 input_dev->id.bustype = BUS_RS232;
0117 input_dev->id.vendor = SERIO_FUJITSU;
0118 input_dev->id.product = 0;
0119 input_dev->id.version = 0x0100;
0120 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
0121 input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
0122
0123 input_set_abs_params(input_dev, ABS_X, 0, 4096, 0, 0);
0124 input_set_abs_params(input_dev, ABS_Y, 0, 4096, 0, 0);
0125 serio_set_drvdata(serio, fujitsu);
0126
0127 err = serio_open(serio, drv);
0128 if (err)
0129 goto fail2;
0130
0131 err = input_register_device(fujitsu->dev);
0132 if (err)
0133 goto fail3;
0134
0135 return 0;
0136
0137 fail3:
0138 serio_close(serio);
0139 fail2:
0140 serio_set_drvdata(serio, NULL);
0141 fail1:
0142 input_free_device(input_dev);
0143 kfree(fujitsu);
0144 return err;
0145 }
0146
0147
0148
0149
0150 static const struct serio_device_id fujitsu_serio_ids[] = {
0151 {
0152 .type = SERIO_RS232,
0153 .proto = SERIO_FUJITSU,
0154 .id = SERIO_ANY,
0155 .extra = SERIO_ANY,
0156 },
0157 { 0 }
0158 };
0159
0160 MODULE_DEVICE_TABLE(serio, fujitsu_serio_ids);
0161
0162 static struct serio_driver fujitsu_drv = {
0163 .driver = {
0164 .name = "fujitsu_ts",
0165 },
0166 .description = DRIVER_DESC,
0167 .id_table = fujitsu_serio_ids,
0168 .interrupt = fujitsu_interrupt,
0169 .connect = fujitsu_connect,
0170 .disconnect = fujitsu_disconnect,
0171 };
0172
0173 module_serio_driver(fujitsu_drv);