summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRomain Liévin <lkml@lievin.net>2004-10-20 02:13:46 -0700
committerGreg Kroah-Hartman <greg@kroah.com>2004-10-20 02:13:46 -0700
commitbbb093304b783304ee77ea9b9edc2784ca24a5ee (patch)
tree70fbce08f5be7e9997a82777a402a8d19592a3a0
parent5260bb1c0c5fc15f3a3576eac48d44c4b4b7fceb (diff)
[PATCH] USB: tiglusb.c: add direct USB support on some new TI handhelds
I have extended my driver to add support of the embedded USB port provided by some new Texas Instruments' handhelds. Things are the same except for the maximum packet size. Description: add support of the USB port embedded on some new TI handhelds (TI84+ and TI89 Titanium). Thanks, Romain. Signed-off-by: Romain Lievin <lkml@lievin.net> Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
-rw-r--r--Documentation/usb/silverlink.txt6
-rw-r--r--drivers/usb/misc/tiglusb.c58
-rw-r--r--drivers/usb/misc/tiglusb.h8
-rw-r--r--include/linux/ticable.h2
4 files changed, 50 insertions, 24 deletions
diff --git a/Documentation/usb/silverlink.txt b/Documentation/usb/silverlink.txt
index d720415ebb34..81cbb52dc1b0 100644
--- a/Documentation/usb/silverlink.txt
+++ b/Documentation/usb/silverlink.txt
@@ -1,5 +1,6 @@
-------------------------------------------------------------------------
Readme for Linux device driver for the Texas Instruments SilverLink cable
+and direct USB cable provided by some TI's handhelds.
-------------------------------------------------------------------------
Author: Romain Liévin & Julien Blache
@@ -9,7 +10,8 @@ INTRODUCTION:
This is a driver for the TI-GRAPH LINK USB (aka SilverLink) cable, a cable
designed by TI for connecting their TI8x/9x calculators to a computer
-(PC or Mac usually).
+(PC or Mac usually). It has been extended to support the USB port offered by
+some latest TI handhelds (TI84+ and TI89 Titanium).
If you need more information, please visit the 'SilverLink drivers' homepage
at the above URL.
@@ -73,4 +75,4 @@ this driver but he better knows the Mac OS-X driver.
CREDITS:
The code is based on dabusb.c, printer.c and scanner.c !
-The driver has been developed independently of Texas Instruments.
+The driver has been developed independently of Texas Instruments Inc.
diff --git a/drivers/usb/misc/tiglusb.c b/drivers/usb/misc/tiglusb.c
index f902884a7bbb..971a825aa1f4 100644
--- a/drivers/usb/misc/tiglusb.c
+++ b/drivers/usb/misc/tiglusb.c
@@ -4,7 +4,7 @@
* Target: Texas Instruments graphing calculators (http://lpg.ticalc.org).
*
* Copyright (C) 2001-2004:
- * Romain Lievin <roms@lpg.ticalc.org>
+ * Romain Lievin <roms@tilp.info>
* Julien BLACHE <jb@technologeek.org>
* under the terms of the GNU General Public License.
*
@@ -14,7 +14,7 @@
* and the website at: http://lpg.ticalc.org/prj_usb/
* for more info.
*
- * History :
+ * History:
* 1.0x, Romain & Julien: initial submit.
* 1.03, Greg Kroah: modifications.
* 1.04, Julien: clean-up & fixes; Romain: 2.4 backport.
@@ -22,6 +22,7 @@
* 1.06, Romain: synched with 2.5, version/firmware changed (confusing).
* 1.07, Romain: fixed bad use of usb_clear_halt (invalid argument);
* timeout argument checked in ioctl + clean-up.
+ * 1.08, Romain: added support of USB port embedded on some TI's handhelds.
*/
#include <linux/module.h>
@@ -41,7 +42,7 @@
/*
* Version Information
*/
-#define DRIVER_VERSION "1.07"
+#define DRIVER_VERSION "1.08"
#define DRIVER_AUTHOR "Romain Lievin <roms@tilp.info> & Julien Blache <jb@jblache.org>"
#define DRIVER_DESC "TI-GRAPH LINK USB (aka SilverLink) driver"
#define DRIVER_LICENSE "GPL"
@@ -178,11 +179,11 @@ tiglusb_read (struct file *filp, char __user *buf, size_t count, loff_t * f_pos)
if (!s->dev)
return -EIO;
- buffer = kmalloc(BULK_RCV_MAX, GFP_KERNEL);
+ buffer = kmalloc (s->max_ps, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
- bytes_to_read = (count >= BULK_RCV_MAX) ? BULK_RCV_MAX : count;
+ bytes_to_read = (count >= s->max_ps) ? s->max_ps : count;
pipe = usb_rcvbulkpipe (s->dev, 1);
result = usb_bulk_msg (s->dev, pipe, buffer, bytes_to_read,
@@ -235,11 +236,11 @@ tiglusb_write (struct file *filp, const char __user *buf, size_t count, loff_t *
if (!s->dev)
return -EIO;
- buffer = kmalloc(BULK_SND_MAX, GFP_KERNEL);
+ buffer = kmalloc (s->max_ps, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
- bytes_to_write = (count >= BULK_SND_MAX) ? BULK_SND_MAX : count;
+ bytes_to_write = (count >= s->max_ps) ? s->max_ps : count;
if (copy_from_user (buffer, buf, bytes_to_write)) {
ret = -EFAULT;
goto out;
@@ -309,6 +310,15 @@ tiglusb_ioctl (struct inode *inode, struct file *filp,
if (clear_pipes (s->dev))
ret = -EIO;
break;
+ case IOCTL_TIUSB_GET_MAXPS:
+ if (copy_to_user((int *) arg, &s->max_ps, sizeof(int)))
+ return -EFAULT;
+ break;
+ case IOCTL_TIUSB_GET_DEVID:
+ if (copy_to_user((int *) arg, &s->dev->descriptor.idProduct,
+ sizeof(int)))
+ return -EFAULT;
+ break;
default:
ret = -ENOTTY;
break;
@@ -341,6 +351,9 @@ tiglusb_probe (struct usb_interface *intf,
int minor = -1;
int i, err = 0;
ptiglusb_t s;
+ struct usb_host_config *conf;
+ struct usb_host_interface *ifdata = NULL;
+ int max_ps;
dbg ("probing vendor id 0x%x, device id 0x%x",
dev->descriptor.idVendor, dev->descriptor.idProduct);
@@ -355,19 +368,31 @@ tiglusb_probe (struct usb_interface *intf,
goto out;
}
- if ((dev->descriptor.idProduct != 0xe001)
- && (dev->descriptor.idVendor != 0x451)) {
+ if (dev->descriptor.idVendor != 0x451) {
err = -ENODEV;
goto out;
}
- // NOTE: it's already in this config, this shouldn't be needed.
- // is this working around some hardware bug?
- if (usb_reset_configuration (dev) < 0) {
- err ("tiglusb_probe: reset_configuration failed");
- err = -ENODEV;
- goto out;
- }
+ if ((dev->descriptor.idProduct != 0xe001) &&
+ (dev->descriptor.idProduct != 0xe004) &&
+ (dev->descriptor.idProduct != 0xe008)) {
+ err = -ENODEV;
+ goto out;
+ }
+
+ /*
+ * TI introduced some new handhelds with embedded USB port.
+ * Port advertises same config as SilverLink cable but with a
+ * different maximum packet size (64 rather than 32).
+ */
+
+ conf = dev->actconfig;
+ ifdata = conf->interface[0]->cur_altsetting;
+ max_ps = ifdata->endpoint[0].desc.wMaxPacketSize;
+
+ info("max packet size of %d/%d bytes\n",
+ ifdata->endpoint[0].desc.wMaxPacketSize,
+ ifdata->endpoint[1].desc.wMaxPacketSize);
/*
* Find a tiglusb struct
@@ -390,6 +415,7 @@ tiglusb_probe (struct usb_interface *intf,
down (&s->mutex);
s->remove_pending = 0;
s->dev = dev;
+ s->max_ps = max_ps;
up (&s->mutex);
dbg ("bound to interface");
diff --git a/drivers/usb/misc/tiglusb.h b/drivers/usb/misc/tiglusb.h
index 627a3728de52..0c90cb2901e9 100644
--- a/drivers/usb/misc/tiglusb.h
+++ b/drivers/usb/misc/tiglusb.h
@@ -18,12 +18,6 @@
#define MAXTIGL 16
/*
- * Max. packetsize for IN and OUT pipes
- */
-#define BULK_RCV_MAX 32
-#define BULK_SND_MAX 32
-
-/*
* The driver context...
*/
@@ -42,6 +36,8 @@ typedef struct
driver_state_t state; /* started/stopped */
int opened; /* tru if open */
int remove_pending;
+
+ int max_ps; /* max packet size */
} tiglusb_t, *ptiglusb_t;
#endif
diff --git a/include/linux/ticable.h b/include/linux/ticable.h
index 5aa24b451fba..8c2212086dcd 100644
--- a/include/linux/ticable.h
+++ b/include/linux/ticable.h
@@ -38,5 +38,7 @@
#define IOCTL_TIUSB_TIMEOUT _IOW('N', 0x20, int) /* set timeout */
#define IOCTL_TIUSB_RESET_DEVICE _IOW('N', 0x21, int) /* reset device */
#define IOCTL_TIUSB_RESET_PIPES _IOW('N', 0x22, int) /* reset both pipes*/
+#define IOCTL_TIUSB_GET_MAXPS _IOR('N', 0x23, int) /* max packet size */
+#define IOCTL_TIUSB_GET_DEVID _IOR('N', 0x24, int) /* get device type */
#endif /* TICABLE_H */