Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Fujitsu serial touchscreen driver
0004  *
0005  * Copyright (c) Dmitry Torokhov <dtor@mail.ru>
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  * Per-touchscreen data.
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  * Decode serial data (5 bytes per packet)
0037  * First byte
0038  * 1 C 0 0 R S S S
0039  * Where C is 1 while in calibration mode (which we don't use)
0040  * R is 1 when no coordinate corection was done.
0041  * S are button state
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         /* resync skip until start of frame */
0051         if ((data & 0xf0) != 0x80)
0052             return IRQ_HANDLED;
0053     } else {
0054         /* resync skip garbage */
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  * fujitsu_disconnect() is the opposite of fujitsu_connect()
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  * fujitsu_connect() is the routine that is called when someone adds a
0093  * new serio device that supports the Fujitsu protocol and registers it
0094  * as input device.
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  * The serio driver structure.
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);