|
@@ -2,8 +2,6 @@
|
|
|
|
|
|
GTCO digitizer USB driver
|
|
GTCO digitizer USB driver
|
|
|
|
|
|
-Use the err() and dbg() macros from usb.h for system logging
|
|
|
|
-
|
|
|
|
TO CHECK: Is pressure done right on report 5?
|
|
TO CHECK: Is pressure done right on report 5?
|
|
|
|
|
|
Copyright (C) 2006 GTCO CalComp
|
|
Copyright (C) 2006 GTCO CalComp
|
|
@@ -108,6 +106,7 @@ struct gtco {
|
|
|
|
|
|
struct input_dev *inputdevice; /* input device struct pointer */
|
|
struct input_dev *inputdevice; /* input device struct pointer */
|
|
struct usb_device *usbdev; /* the usb device for this device */
|
|
struct usb_device *usbdev; /* the usb device for this device */
|
|
|
|
+ struct usb_interface *intf; /* the usb interface for this device */
|
|
struct urb *urbinfo; /* urb for incoming reports */
|
|
struct urb *urbinfo; /* urb for incoming reports */
|
|
dma_addr_t buf_dma; /* dma addr of the data buffer*/
|
|
dma_addr_t buf_dma; /* dma addr of the data buffer*/
|
|
unsigned char * buffer; /* databuffer for reports */
|
|
unsigned char * buffer; /* databuffer for reports */
|
|
@@ -202,6 +201,7 @@ struct hid_descriptor
|
|
static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
int length)
|
|
int length)
|
|
{
|
|
{
|
|
|
|
+ struct device *ddev = &device->intf->dev;
|
|
int x, i = 0;
|
|
int x, i = 0;
|
|
|
|
|
|
/* Tag primitive vars */
|
|
/* Tag primitive vars */
|
|
@@ -228,7 +228,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
char indentstr[10] = "";
|
|
char indentstr[10] = "";
|
|
|
|
|
|
|
|
|
|
- dbg("======>>>>>>PARSE<<<<<<======");
|
|
|
|
|
|
+ dev_dbg(ddev, "======>>>>>>PARSE<<<<<<======\n");
|
|
|
|
|
|
/* Walk this report and pull out the info we need */
|
|
/* Walk this report and pull out the info we need */
|
|
while (i < length) {
|
|
while (i < length) {
|
|
@@ -277,11 +277,11 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
else if (data == 3)
|
|
else if (data == 3)
|
|
strcpy(globtype, "Var|Const");
|
|
strcpy(globtype, "Var|Const");
|
|
|
|
|
|
- dbg("::::: Saving Report: %d input #%d Max: 0x%X(%d) Min:0x%X(%d) of %d bits",
|
|
|
|
- globalval[TAG_GLOB_REPORT_ID], inputnum,
|
|
|
|
- globalval[TAG_GLOB_LOG_MAX], globalval[TAG_GLOB_LOG_MAX],
|
|
|
|
- globalval[TAG_GLOB_LOG_MIN], globalval[TAG_GLOB_LOG_MIN],
|
|
|
|
- globalval[TAG_GLOB_REPORT_SZ] * globalval[TAG_GLOB_REPORT_CNT]);
|
|
|
|
|
|
+ dev_dbg(ddev, "::::: Saving Report: %d input #%d Max: 0x%X(%d) Min:0x%X(%d) of %d bits\n",
|
|
|
|
+ globalval[TAG_GLOB_REPORT_ID], inputnum,
|
|
|
|
+ globalval[TAG_GLOB_LOG_MAX], globalval[TAG_GLOB_LOG_MAX],
|
|
|
|
+ globalval[TAG_GLOB_LOG_MIN], globalval[TAG_GLOB_LOG_MIN],
|
|
|
|
+ globalval[TAG_GLOB_REPORT_SZ] * globalval[TAG_GLOB_REPORT_CNT]);
|
|
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -292,7 +292,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
*/
|
|
*/
|
|
switch (inputnum) {
|
|
switch (inputnum) {
|
|
case 0: /* X coord */
|
|
case 0: /* X coord */
|
|
- dbg("GER: X Usage: 0x%x", usage);
|
|
|
|
|
|
+ dev_dbg(ddev, "GER: X Usage: 0x%x\n", usage);
|
|
if (device->max_X == 0) {
|
|
if (device->max_X == 0) {
|
|
device->max_X = globalval[TAG_GLOB_LOG_MAX];
|
|
device->max_X = globalval[TAG_GLOB_LOG_MAX];
|
|
device->min_X = globalval[TAG_GLOB_LOG_MIN];
|
|
device->min_X = globalval[TAG_GLOB_LOG_MIN];
|
|
@@ -300,7 +300,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
break;
|
|
break;
|
|
|
|
|
|
case 1: /* Y coord */
|
|
case 1: /* Y coord */
|
|
- dbg("GER: Y Usage: 0x%x", usage);
|
|
|
|
|
|
+ dev_dbg(ddev, "GER: Y Usage: 0x%x\n", usage);
|
|
if (device->max_Y == 0) {
|
|
if (device->max_Y == 0) {
|
|
device->max_Y = globalval[TAG_GLOB_LOG_MAX];
|
|
device->max_Y = globalval[TAG_GLOB_LOG_MAX];
|
|
device->min_Y = globalval[TAG_GLOB_LOG_MIN];
|
|
device->min_Y = globalval[TAG_GLOB_LOG_MIN];
|
|
@@ -350,10 +350,10 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
maintype = 'S';
|
|
maintype = 'S';
|
|
|
|
|
|
if (data == 0) {
|
|
if (data == 0) {
|
|
- dbg("======>>>>>> Physical");
|
|
|
|
|
|
+ dev_dbg(ddev, "======>>>>>> Physical\n");
|
|
strcpy(globtype, "Physical");
|
|
strcpy(globtype, "Physical");
|
|
} else
|
|
} else
|
|
- dbg("======>>>>>>");
|
|
|
|
|
|
+ dev_dbg(ddev, "======>>>>>>\n");
|
|
|
|
|
|
/* Indent the debug output */
|
|
/* Indent the debug output */
|
|
indent++;
|
|
indent++;
|
|
@@ -368,7 +368,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
break;
|
|
break;
|
|
|
|
|
|
case TAG_MAIN_COL_END:
|
|
case TAG_MAIN_COL_END:
|
|
- dbg("<<<<<<======");
|
|
|
|
|
|
+ dev_dbg(ddev, "<<<<<<======\n");
|
|
maintype = 'E';
|
|
maintype = 'E';
|
|
indent--;
|
|
indent--;
|
|
for (x = 0; x < indent; x++)
|
|
for (x = 0; x < indent; x++)
|
|
@@ -384,18 +384,18 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
|
|
|
|
switch (size) {
|
|
switch (size) {
|
|
case 1:
|
|
case 1:
|
|
- dbg("%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x",
|
|
|
|
- indentstr, tag, maintype, size, globtype, data);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n",
|
|
|
|
+ indentstr, tag, maintype, size, globtype, data);
|
|
break;
|
|
break;
|
|
|
|
|
|
case 2:
|
|
case 2:
|
|
- dbg("%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x",
|
|
|
|
- indentstr, tag, maintype, size, globtype, data16);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n",
|
|
|
|
+ indentstr, tag, maintype, size, globtype, data16);
|
|
break;
|
|
break;
|
|
|
|
|
|
case 4:
|
|
case 4:
|
|
- dbg("%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x",
|
|
|
|
- indentstr, tag, maintype, size, globtype, data32);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n",
|
|
|
|
+ indentstr, tag, maintype, size, globtype, data32);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -465,26 +465,26 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
if (tag < TAG_GLOB_MAX) {
|
|
if (tag < TAG_GLOB_MAX) {
|
|
switch (size) {
|
|
switch (size) {
|
|
case 1:
|
|
case 1:
|
|
- dbg("%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x",
|
|
|
|
- indentstr, globtype, tag, size, data);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n",
|
|
|
|
+ indentstr, globtype, tag, size, data);
|
|
globalval[tag] = data;
|
|
globalval[tag] = data;
|
|
break;
|
|
break;
|
|
|
|
|
|
case 2:
|
|
case 2:
|
|
- dbg("%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x",
|
|
|
|
- indentstr, globtype, tag, size, data16);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n",
|
|
|
|
+ indentstr, globtype, tag, size, data16);
|
|
globalval[tag] = data16;
|
|
globalval[tag] = data16;
|
|
break;
|
|
break;
|
|
|
|
|
|
case 4:
|
|
case 4:
|
|
- dbg("%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x",
|
|
|
|
- indentstr, globtype, tag, size, data32);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n",
|
|
|
|
+ indentstr, globtype, tag, size, data32);
|
|
globalval[tag] = data32;
|
|
globalval[tag] = data32;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- dbg("%sGLOBALTAG: ILLEGAL TAG:%d SIZE: %d ",
|
|
|
|
- indentstr, tag, size);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sGLOBALTAG: ILLEGAL TAG:%d SIZE: %d\n",
|
|
|
|
+ indentstr, tag, size);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -511,18 +511,18 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
|
|
|
|
|
|
switch (size) {
|
|
switch (size) {
|
|
case 1:
|
|
case 1:
|
|
- dbg("%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x",
|
|
|
|
- indentstr, tag, globtype, size, data);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n",
|
|
|
|
+ indentstr, tag, globtype, size, data);
|
|
break;
|
|
break;
|
|
|
|
|
|
case 2:
|
|
case 2:
|
|
- dbg("%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x",
|
|
|
|
- indentstr, tag, globtype, size, data16);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n",
|
|
|
|
+ indentstr, tag, globtype, size, data16);
|
|
break;
|
|
break;
|
|
|
|
|
|
case 4:
|
|
case 4:
|
|
- dbg("%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x",
|
|
|
|
- indentstr, tag, globtype, size, data32);
|
|
|
|
|
|
+ dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n",
|
|
|
|
+ indentstr, tag, globtype, size, data32);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -714,8 +714,9 @@ static void gtco_urb_callback(struct urb *urbinfo)
|
|
* the rest as 0
|
|
* the rest as 0
|
|
*/
|
|
*/
|
|
val = device->buffer[5] & MASK_BUTTON;
|
|
val = device->buffer[5] & MASK_BUTTON;
|
|
- dbg("======>>>>>>REPORT 1: val 0x%X(%d)",
|
|
|
|
- val, val);
|
|
|
|
|
|
+ dev_dbg(&device->intf->dev,
|
|
|
|
+ "======>>>>>>REPORT 1: val 0x%X(%d)\n",
|
|
|
|
+ val, val);
|
|
|
|
|
|
/*
|
|
/*
|
|
* We don't apply any meaning to the button
|
|
* We don't apply any meaning to the button
|
|
@@ -808,7 +809,8 @@ static void gtco_urb_callback(struct urb *urbinfo)
|
|
resubmit:
|
|
resubmit:
|
|
rc = usb_submit_urb(urbinfo, GFP_ATOMIC);
|
|
rc = usb_submit_urb(urbinfo, GFP_ATOMIC);
|
|
if (rc != 0)
|
|
if (rc != 0)
|
|
- err("usb_submit_urb failed rc=0x%x", rc);
|
|
|
|
|
|
+ dev_err(&device->intf->dev,
|
|
|
|
+ "usb_submit_urb failed rc=0x%x\n", rc);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -838,7 +840,7 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
|
gtco = kzalloc(sizeof(struct gtco), GFP_KERNEL);
|
|
gtco = kzalloc(sizeof(struct gtco), GFP_KERNEL);
|
|
input_dev = input_allocate_device();
|
|
input_dev = input_allocate_device();
|
|
if (!gtco || !input_dev) {
|
|
if (!gtco || !input_dev) {
|
|
- err("No more memory");
|
|
|
|
|
|
+ dev_err(&usbinterface->dev, "No more memory\n");
|
|
error = -ENOMEM;
|
|
error = -ENOMEM;
|
|
goto err_free_devs;
|
|
goto err_free_devs;
|
|
}
|
|
}
|
|
@@ -848,12 +850,13 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
|
|
|
|
|
/* Save interface information */
|
|
/* Save interface information */
|
|
gtco->usbdev = usb_get_dev(interface_to_usbdev(usbinterface));
|
|
gtco->usbdev = usb_get_dev(interface_to_usbdev(usbinterface));
|
|
|
|
+ gtco->intf = usbinterface;
|
|
|
|
|
|
/* Allocate some data for incoming reports */
|
|
/* Allocate some data for incoming reports */
|
|
gtco->buffer = usb_alloc_coherent(gtco->usbdev, REPORT_MAX_SIZE,
|
|
gtco->buffer = usb_alloc_coherent(gtco->usbdev, REPORT_MAX_SIZE,
|
|
GFP_KERNEL, >co->buf_dma);
|
|
GFP_KERNEL, >co->buf_dma);
|
|
if (!gtco->buffer) {
|
|
if (!gtco->buffer) {
|
|
- err("No more memory for us buffers");
|
|
|
|
|
|
+ dev_err(&usbinterface->dev, "No more memory for us buffers\n");
|
|
error = -ENOMEM;
|
|
error = -ENOMEM;
|
|
goto err_free_devs;
|
|
goto err_free_devs;
|
|
}
|
|
}
|
|
@@ -861,7 +864,7 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
|
/* Allocate URB for reports */
|
|
/* Allocate URB for reports */
|
|
gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL);
|
|
gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL);
|
|
if (!gtco->urbinfo) {
|
|
if (!gtco->urbinfo) {
|
|
- err("Failed to allocate URB");
|
|
|
|
|
|
+ dev_err(&usbinterface->dev, "Failed to allocate URB\n");
|
|
error = -ENOMEM;
|
|
error = -ENOMEM;
|
|
goto err_free_buf;
|
|
goto err_free_buf;
|
|
}
|
|
}
|
|
@@ -873,14 +876,14 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
|
endpoint = &usbinterface->altsetting[0].endpoint[0].desc;
|
|
endpoint = &usbinterface->altsetting[0].endpoint[0].desc;
|
|
|
|
|
|
/* Some debug */
|
|
/* Some debug */
|
|
- dbg("gtco # interfaces: %d", usbinterface->num_altsetting);
|
|
|
|
- dbg("num endpoints: %d", usbinterface->cur_altsetting->desc.bNumEndpoints);
|
|
|
|
- dbg("interface class: %d", usbinterface->cur_altsetting->desc.bInterfaceClass);
|
|
|
|
- dbg("endpoint: attribute:0x%x type:0x%x", endpoint->bmAttributes, endpoint->bDescriptorType);
|
|
|
|
|
|
+ dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting);
|
|
|
|
+ dev_dbg(&usbinterface->dev, "num endpoints: %d\n", usbinterface->cur_altsetting->desc.bNumEndpoints);
|
|
|
|
+ dev_dbg(&usbinterface->dev, "interface class: %d\n", usbinterface->cur_altsetting->desc.bInterfaceClass);
|
|
|
|
+ dev_dbg(&usbinterface->dev, "endpoint: attribute:0x%x type:0x%x\n", endpoint->bmAttributes, endpoint->bDescriptorType);
|
|
if (usb_endpoint_xfer_int(endpoint))
|
|
if (usb_endpoint_xfer_int(endpoint))
|
|
- dbg("endpoint: we have interrupt endpoint\n");
|
|
|
|
|
|
+ dev_dbg(&usbinterface->dev, "endpoint: we have interrupt endpoint\n");
|
|
|
|
|
|
- dbg("endpoint extra len:%d ", usbinterface->altsetting[0].extralen);
|
|
|
|
|
|
+ dev_dbg(&usbinterface->dev, "endpoint extra len:%d\n", usbinterface->altsetting[0].extralen);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Find the HID descriptor so we can find out the size of the
|
|
* Find the HID descriptor so we can find out the size of the
|
|
@@ -888,17 +891,19 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
|
*/
|
|
*/
|
|
if (usb_get_extra_descriptor(usbinterface->cur_altsetting,
|
|
if (usb_get_extra_descriptor(usbinterface->cur_altsetting,
|
|
HID_DEVICE_TYPE, &hid_desc) != 0){
|
|
HID_DEVICE_TYPE, &hid_desc) != 0){
|
|
- err("Can't retrieve exta USB descriptor to get hid report descriptor length");
|
|
|
|
|
|
+ dev_err(&usbinterface->dev,
|
|
|
|
+ "Can't retrieve exta USB descriptor to get hid report descriptor length\n");
|
|
error = -EIO;
|
|
error = -EIO;
|
|
goto err_free_urb;
|
|
goto err_free_urb;
|
|
}
|
|
}
|
|
|
|
|
|
- dbg("Extra descriptor success: type:%d len:%d",
|
|
|
|
- hid_desc->bDescriptorType, hid_desc->wDescriptorLength);
|
|
|
|
|
|
+ dev_dbg(&usbinterface->dev,
|
|
|
|
+ "Extra descriptor success: type:%d len:%d\n",
|
|
|
|
+ hid_desc->bDescriptorType, hid_desc->wDescriptorLength);
|
|
|
|
|
|
report = kzalloc(le16_to_cpu(hid_desc->wDescriptorLength), GFP_KERNEL);
|
|
report = kzalloc(le16_to_cpu(hid_desc->wDescriptorLength), GFP_KERNEL);
|
|
if (!report) {
|
|
if (!report) {
|
|
- err("No more memory for report");
|
|
|
|
|
|
+ dev_err(&usbinterface->dev, "No more memory for report\n");
|
|
error = -ENOMEM;
|
|
error = -ENOMEM;
|
|
goto err_free_urb;
|
|
goto err_free_urb;
|
|
}
|
|
}
|
|
@@ -915,7 +920,7 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
|
le16_to_cpu(hid_desc->wDescriptorLength),
|
|
le16_to_cpu(hid_desc->wDescriptorLength),
|
|
5000); /* 5 secs */
|
|
5000); /* 5 secs */
|
|
|
|
|
|
- dbg("usb_control_msg result: %d", result);
|
|
|
|
|
|
+ dev_dbg(&usbinterface->dev, "usb_control_msg result: %d\n", result);
|
|
if (result == le16_to_cpu(hid_desc->wDescriptorLength)) {
|
|
if (result == le16_to_cpu(hid_desc->wDescriptorLength)) {
|
|
parse_hid_report_descriptor(gtco, report, result);
|
|
parse_hid_report_descriptor(gtco, report, result);
|
|
break;
|
|
break;
|
|
@@ -926,8 +931,9 @@ static int gtco_probe(struct usb_interface *usbinterface,
|
|
|
|
|
|
/* If we didn't get the report, fail */
|
|
/* If we didn't get the report, fail */
|
|
if (result != le16_to_cpu(hid_desc->wDescriptorLength)) {
|
|
if (result != le16_to_cpu(hid_desc->wDescriptorLength)) {
|
|
- err("Failed to get HID Report Descriptor of size: %d",
|
|
|
|
- hid_desc->wDescriptorLength);
|
|
|
|
|
|
+ dev_err(&usbinterface->dev,
|
|
|
|
+ "Failed to get HID Report Descriptor of size: %d\n",
|
|
|
|
+ hid_desc->wDescriptorLength);
|
|
error = -EIO;
|
|
error = -EIO;
|
|
goto err_free_urb;
|
|
goto err_free_urb;
|
|
}
|
|
}
|