linux/drivers/input/tablet/kbtab.c
<<
>>
Prefs
   1#include <linux/kernel.h>
   2#include <linux/slab.h>
   3#include <linux/module.h>
   4#include <linux/init.h>
   5#include <linux/usb/input.h>
   6#include <asm/unaligned.h>
   7
   8/*
   9 * Version Information
  10 * v0.0.1 - Original, extremely basic version, 2.4.xx only
  11 * v0.0.2 - Updated, works with 2.5.62 and 2.4.20;
  12 *           - added pressure-threshold modules param code from
  13 *              Alex Perry <alex.perry@ieee.org>
  14 */
  15
  16#define DRIVER_VERSION "v0.0.2"
  17#define DRIVER_AUTHOR "Josh Myer <josh@joshisanerd.com>"
  18#define DRIVER_DESC "USB KB Gear JamStudio Tablet driver"
  19#define DRIVER_LICENSE "GPL"
  20
  21MODULE_AUTHOR(DRIVER_AUTHOR);
  22MODULE_DESCRIPTION(DRIVER_DESC);
  23MODULE_LICENSE(DRIVER_LICENSE);
  24
  25#define USB_VENDOR_ID_KBGEAR    0x084e
  26
  27static int kb_pressure_click = 0x10;
  28module_param(kb_pressure_click, int, 0);
  29MODULE_PARM_DESC(kb_pressure_click, "pressure threshold for clicks");
  30
  31struct kbtab {
  32        unsigned char *data;
  33        dma_addr_t data_dma;
  34        struct input_dev *dev;
  35        struct usb_device *usbdev;
  36        struct urb *irq;
  37        int x, y;
  38        int button;
  39        int pressure;
  40        __u32 serial[2];
  41        char phys[32];
  42};
  43
  44static void kbtab_irq(struct urb *urb)
  45{
  46        struct kbtab *kbtab = urb->context;
  47        unsigned char *data = kbtab->data;
  48        struct input_dev *dev = kbtab->dev;
  49        int retval;
  50
  51        switch (urb->status) {
  52        case 0:
  53                /* success */
  54                break;
  55        case -ECONNRESET:
  56        case -ENOENT:
  57        case -ESHUTDOWN:
  58                /* this urb is terminated, clean up */
  59                dbg("%s - urb shutting down with status: %d", __func__, urb->status);
  60                return;
  61        default:
  62                dbg("%s - nonzero urb status received: %d", __func__, urb->status);
  63                goto exit;
  64        }
  65
  66        kbtab->x = get_unaligned_le16(&data[1]);
  67        kbtab->y = get_unaligned_le16(&data[3]);
  68
  69        kbtab->pressure = (data[5]);
  70
  71        input_report_key(dev, BTN_TOOL_PEN, 1);
  72
  73        input_report_abs(dev, ABS_X, kbtab->x);
  74        input_report_abs(dev, ABS_Y, kbtab->y);
  75
  76        /*input_report_key(dev, BTN_TOUCH , data[0] & 0x01);*/
  77        input_report_key(dev, BTN_RIGHT, data[0] & 0x02);
  78
  79        if (-1 == kb_pressure_click) {
  80                input_report_abs(dev, ABS_PRESSURE, kbtab->pressure);
  81        } else {
  82                input_report_key(dev, BTN_LEFT, (kbtab->pressure > kb_pressure_click) ? 1 : 0);
  83        };
  84
  85        input_sync(dev);
  86
  87 exit:
  88        retval = usb_submit_urb (urb, GFP_ATOMIC);
  89        if (retval)
  90                err ("%s - usb_submit_urb failed with result %d",
  91                     __func__, retval);
  92}
  93
  94static struct usb_device_id kbtab_ids[] = {
  95        { USB_DEVICE(USB_VENDOR_ID_KBGEAR, 0x1001), .driver_info = 0 },
  96        { }
  97};
  98
  99MODULE_DEVICE_TABLE(usb, kbtab_ids);
 100
 101static int kbtab_open(struct input_dev *dev)
 102{
 103        struct kbtab *kbtab = input_get_drvdata(dev);
 104
 105        kbtab->irq->dev = kbtab->usbdev;
 106        if (usb_submit_urb(kbtab->irq, GFP_KERNEL))
 107                return -EIO;
 108
 109        return 0;
 110}
 111
 112static void kbtab_close(struct input_dev *dev)
 113{
 114        struct kbtab *kbtab = input_get_drvdata(dev);
 115
 116        usb_kill_urb(kbtab->irq);
 117}
 118
 119static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *id)
 120{
 121        struct usb_device *dev = interface_to_usbdev(intf);
 122        struct usb_endpoint_descriptor *endpoint;
 123        struct kbtab *kbtab;
 124        struct input_dev *input_dev;
 125        int error = -ENOMEM;
 126
 127        kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL);
 128        input_dev = input_allocate_device();
 129        if (!kbtab || !input_dev)
 130                goto fail1;
 131
 132        kbtab->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &kbtab->data_dma);
 133        if (!kbtab->data)
 134                goto fail1;
 135
 136        kbtab->irq = usb_alloc_urb(0, GFP_KERNEL);
 137        if (!kbtab->irq)
 138                goto fail2;
 139
 140        kbtab->usbdev = dev;
 141        kbtab->dev = input_dev;
 142
 143        usb_make_path(dev, kbtab->phys, sizeof(kbtab->phys));
 144        strlcat(kbtab->phys, "/input0", sizeof(kbtab->phys));
 145
 146        input_dev->name = "KB Gear Tablet";
 147        input_dev->phys = kbtab->phys;
 148        usb_to_input_id(dev, &input_dev->id);
 149        input_dev->dev.parent = &intf->dev;
 150
 151        input_set_drvdata(input_dev, kbtab);
 152
 153        input_dev->open = kbtab_open;
 154        input_dev->close = kbtab_close;
 155
 156        input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) |
 157                BIT_MASK(EV_MSC);
 158        input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) |
 159                BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
 160        input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) |
 161                BIT_MASK(BTN_TOUCH);
 162        input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL);
 163        input_set_abs_params(input_dev, ABS_X, 0, 0x2000, 4, 0);
 164        input_set_abs_params(input_dev, ABS_Y, 0, 0x1750, 4, 0);
 165        input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xff, 0, 0);
 166
 167        endpoint = &intf->cur_altsetting->endpoint[0].desc;
 168
 169        usb_fill_int_urb(kbtab->irq, dev,
 170                         usb_rcvintpipe(dev, endpoint->bEndpointAddress),
 171                         kbtab->data, 8,
 172                         kbtab_irq, kbtab, endpoint->bInterval);
 173        kbtab->irq->transfer_dma = kbtab->data_dma;
 174        kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 175
 176        error = input_register_device(kbtab->dev);
 177        if (error)
 178                goto fail3;
 179
 180        usb_set_intfdata(intf, kbtab);
 181
 182        return 0;
 183
 184 fail3: usb_free_urb(kbtab->irq);
 185 fail2: usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma);
 186 fail1: input_free_device(input_dev);
 187        kfree(kbtab);
 188        return error;
 189}
 190
 191static void kbtab_disconnect(struct usb_interface *intf)
 192{
 193        struct kbtab *kbtab = usb_get_intfdata(intf);
 194
 195        usb_set_intfdata(intf, NULL);
 196        if (kbtab) {
 197                usb_kill_urb(kbtab->irq);
 198                input_unregister_device(kbtab->dev);
 199                usb_free_urb(kbtab->irq);
 200                usb_buffer_free(interface_to_usbdev(intf), 10, kbtab->data, kbtab->data_dma);
 201                kfree(kbtab);
 202        }
 203}
 204
 205static struct usb_driver kbtab_driver = {
 206        .name =         "kbtab",
 207        .probe =        kbtab_probe,
 208        .disconnect =   kbtab_disconnect,
 209        .id_table =     kbtab_ids,
 210};
 211
 212static int __init kbtab_init(void)
 213{
 214        int retval;
 215        retval = usb_register(&kbtab_driver);
 216        if (retval)
 217                goto out;
 218        printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
 219               DRIVER_DESC "\n");
 220out:
 221        return retval;
 222}
 223
 224static void __exit kbtab_exit(void)
 225{
 226        usb_deregister(&kbtab_driver);
 227}
 228
 229module_init(kbtab_init);
 230module_exit(kbtab_exit);
 231