aboutsummaryrefslogtreecommitdiffstats
path: root/util/ttusb_dec_reset
diff options
context:
space:
mode:
Diffstat (limited to 'util/ttusb_dec_reset')
-rw-r--r--util/ttusb_dec_reset/Makefile17
-rw-r--r--util/ttusb_dec_reset/README28
-rw-r--r--util/ttusb_dec_reset/ttusb_dec_reset.c53
3 files changed, 98 insertions, 0 deletions
diff --git a/util/ttusb_dec_reset/Makefile b/util/ttusb_dec_reset/Makefile
new file mode 100644
index 0000000..cde7de5
--- /dev/null
+++ b/util/ttusb_dec_reset/Makefile
@@ -0,0 +1,17 @@
+CC = gcc
+RM = rm -f
+CFLAGS = -g -Wall -O2
+LFLAGS = -g -Wall
+LDFLAGS = -lusb
+
+OBJS = ttusb_dec_reset.o
+TARGET = ttusb_dec_reset
+
+$(TARGET): $(OBJS)
+ $(CC) $(LFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS)
+
+.c.o:
+ $(CC) $(CFLAGS) -c $< -o $@
+
+clean:
+ $(RM) *.o $(TARGET)
diff --git a/util/ttusb_dec_reset/README b/util/ttusb_dec_reset/README
new file mode 100644
index 0000000..50db265
--- /dev/null
+++ b/util/ttusb_dec_reset/README
@@ -0,0 +1,28 @@
+Hello,
+
+In theory the driver could be made to send the DEC the reset sequence when
+all devices were closed. However, due to the awkwardness of switching
+between slave and stand-alone mode, I've decided against this. Hence this
+application, which I hope provides the user a nice compromise between
+control and ease-of-use.
+
+ttusb_dec_reset is a small utility for resetting a ttusb-dec device to
+stand-alone mode after use. It requires libusb, which can be found here:
+
+http://libusb.sourceforge.net/
+
+There is probably a package for it included with your linux distribution
+though.
+
+For the utility to reset a device, it must have permission to access the usb
+device, and the device must not be claimed by anything else. That means that
+the ttusb-dec module must be rmmoded before using this utility. You probably
+want to have turned off any hotplug mechanisms before running the utility
+or the device will likely get taken over again once it comes back up. Or you
+could just yank the usb cable out.
+
+The utility takes no arguments, you just run it:
+./ttusb_dec_reset
+
+Cheers,
+Alex
diff --git a/util/ttusb_dec_reset/ttusb_dec_reset.c b/util/ttusb_dec_reset/ttusb_dec_reset.c
new file mode 100644
index 0000000..51ddfc7
--- /dev/null
+++ b/util/ttusb_dec_reset/ttusb_dec_reset.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <usb.h>
+
+void dec_reset(struct usb_device *dev)
+{
+ char message[] = {0xaa, 0x00, 0xf1, 0x01, 0x00};
+ usb_dev_handle *handle = usb_open(dev);
+
+ printf("Device found.\n");
+
+ if (handle) {
+ if (!usb_claim_interface(handle, 0)) {
+ int result;
+ printf("Reseting device.. ");
+ result = usb_bulk_write(handle, 3, message,
+ sizeof(message), 1000);
+ if (result >= 0)
+ printf("succeeded.\n");
+ else
+ printf("failed. (Error code: %d)\n", result);
+ } else {
+ printf("Couldn't claim interface.\n");
+ }
+ usb_close(handle);
+ }
+}
+
+int main()
+{
+ struct usb_bus *busses;
+ struct usb_bus *bus;
+
+ usb_init();
+ usb_find_busses();
+ usb_find_devices();
+
+ busses = usb_get_busses();
+
+ for (bus = busses; bus; bus = bus->next) {
+ struct usb_device *dev;
+
+ for (dev = bus->devices; dev; dev = dev->next) {
+ if (dev->descriptor.idVendor == 0x0b48 &&
+ (dev->descriptor.idProduct == 0x1006 ||
+ dev->descriptor.idProduct == 0x1008 ||
+ dev->descriptor.idProduct == 0x1009)) {
+ dec_reset(dev);
+ }
+ }
+ }
+
+ return 0;
+}