Signed-off-by: Frans Klaver <frans.kla...@xsens.com>

---

This is a revision of the xsens_mt module. Since previous one, I've
reduced the allocated buffers, cause there seem to be no problems with
the default size right now.

Filtering the correct interface has been moved to the probe function,
which seems more appropriate. Filtering in attach is slightly easier,
but returning any error will result in EIO.

I'd remove the bNumEndpoints if I could.

That should be all.

Thanks,
Frans
---
 drivers/usb/serial/Kconfig    | 12 ++++++
 drivers/usb/serial/Makefile   |  1 +
 drivers/usb/serial/xsens_mt.c | 86 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 99 insertions(+)
 create mode 100644 drivers/usb/serial/xsens_mt.c

diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
index 76f4622..dad8363 100644
--- a/drivers/usb/serial/Kconfig
+++ b/drivers/usb/serial/Kconfig
@@ -647,6 +647,18 @@ config USB_SERIAL_VIVOPAY_SERIAL
           To compile this driver as a module, choose M here: the
           module will be called vivopay-serial.
 
+config USB_SERIAL_XSENS_MT
+       tristate "Xsens motion tracker serial interface driver"
+       help
+         Say Y here if you want to use Xsens motion trackers.
+
+         This driver supports the new generation of motion trackers
+         by Xsens. Older devices can be accessed using the FTDI_SIO
+         driver.
+
+         To compile this driver as a module, choose M here: the
+         module will be called xsens_mt.
+
 config USB_SERIAL_ZIO
        tristate "ZIO Motherboard USB serial interface driver"
        help
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile
index 3b3e730..eaf5ca1 100644
--- a/drivers/usb/serial/Makefile
+++ b/drivers/usb/serial/Makefile
@@ -61,5 +61,6 @@ obj-$(CONFIG_USB_SERIAL_VISOR)                        += 
visor.o
 obj-$(CONFIG_USB_SERIAL_WHITEHEAT)             += whiteheat.o
 obj-$(CONFIG_USB_SERIAL_XIRCOM)                        += keyspan_pda.o
 obj-$(CONFIG_USB_SERIAL_VIVOPAY_SERIAL)                += vivopay-serial.o
+obj-$(CONFIG_USB_SERIAL_XSENS_MT)              += xsens_mt.o
 obj-$(CONFIG_USB_SERIAL_ZIO)                   += zio.o
 obj-$(CONFIG_USB_SERIAL_ZTE)                   += zte_ev.o
diff --git a/drivers/usb/serial/xsens_mt.c b/drivers/usb/serial/xsens_mt.c
new file mode 100644
index 0000000..1d5798d
--- /dev/null
+++ b/drivers/usb/serial/xsens_mt.c
@@ -0,0 +1,86 @@
+/*
+ * Xsens MT USB driver
+ *
+ * Copyright (C) 2013 Xsens <i...@xsens.com>
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License version
+ *  2 as published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/tty.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+#include <linux/usb/serial.h>
+#include <linux/uaccess.h>
+
+#define XSENS_VID 0x2639
+
+#define MTi_10_IMU_PID         0x0001
+#define MTi_20_VRU_PID         0x0002
+#define MTi_30_AHRS_PID                0x0003
+
+#define MTi_100_IMU_PID                0x0011
+#define MTi_200_VRU_PID                0x0012
+#define MTi_300_AHRS_PID       0x0013
+
+#define MTi_G_700_GPS_INS_PID  0x0017
+
+static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(XSENS_VID, MTi_10_IMU_PID) },
+       { USB_DEVICE(XSENS_VID, MTi_20_VRU_PID) },
+       { USB_DEVICE(XSENS_VID, MTi_30_AHRS_PID) },
+
+       { USB_DEVICE(XSENS_VID, MTi_100_IMU_PID) },
+       { USB_DEVICE(XSENS_VID, MTi_200_VRU_PID) },
+       { USB_DEVICE(XSENS_VID, MTi_300_AHRS_PID) },
+
+       { USB_DEVICE(XSENS_VID, MTi_G_700_GPS_INS_PID) },
+       { },
+};
+MODULE_DEVICE_TABLE(usb, id_table);
+
+static int has_required_endpoints(const struct usb_host_interface *interface)
+{
+       __u8 i;
+       int has_bulk_in = 0;
+       int has_bulk_out = 0;
+
+       for (i = 0; i < interface->desc.bNumEndpoints; ++i) {
+               if (usb_endpoint_is_bulk_in(&interface->endpoint[i].desc))
+                       has_bulk_in = 1;
+               else if (usb_endpoint_is_bulk_out(&interface->endpoint[i].desc))
+                       has_bulk_out = 1;
+       }
+
+       return has_bulk_in && has_bulk_out;
+}
+
+static int xsens_mt_probe(struct usb_serial *serial,
+                                       const struct usb_device_id *id)
+{
+       if (!has_required_endpoints(serial->interface->cur_altsetting))
+               return -ENODEV;
+       return 0;
+}
+
+static struct usb_serial_driver xsens_mt_device = {
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = "xsens_mt",
+       },
+       .id_table = id_table,
+       .num_ports = 1,
+
+       .probe = xsens_mt_probe,
+};
+
+static struct usb_serial_driver * const serial_drivers[] = {
+       &xsens_mt_device, NULL
+};
+
+module_usb_serial_driver(serial_drivers, id_table);
+
+MODULE_LICENSE("GPL");
-- 
1.8.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to