mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-08-24 11:58:18 +00:00

Add serial support for OWON HDS200 series oscilloscopes and likely many other pieces of OWON test equipment. OWON HDS200 series devices host two USB endpoints, designed to facilitate bidirectional SCPI. SCPI is a predominately ASCII text protocol for test/measurement equipment. Having a serial/tty interface for these devices lowers the barrier to entry for anyone trying to write programs to communicate with them. The following shows the USB descriptor for the OWON HDS272S running firmware V5.7.1: Bus 001 Device 068: ID 5345:1234 Owon PDS6062T Oscilloscope Negotiated speed: Full Speed (12Mbps) Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 [unknown] bDeviceSubClass 0 [unknown] bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x5345 Owon idProduct 0x1234 PDS6062T Oscilloscope bcdDevice 1.00 iManufacturer 1 oscilloscope iProduct 2 oscilloscope iSerial 3 oscilloscope bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0029 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 5 Physical Interface Device bInterfaceSubClass 0 [unknown] bInterfaceProtocol 0 iInterface 0 ** UNRECOGNIZED: 09 21 11 01 00 01 22 5f 00 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 32 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 32 Device Status: 0x0000 (Bus Powered) OWON appears to be using the same USB Vendor and Product ID for many of their oscilloscopes. Looking at the discussion about the USB vendor/product ID, in the link bellow, suggests that this VID/PID is shared with VDS, SDS, PDS, and now the HDS series oscilloscopes. Available documentation for these devices seems to indicate that all use a similar SCPI protocol, some with RS232 options. It is likely that this same simple serial setup would work correctly for them all. Link: https://usb-ids.gowdy.us/read/UD/5345/1234 Signed-off-by: Craig Hesling <craig@hesling.com> Cc: stable@vger.kernel.org Signed-off-by: Johan Hovold <johan@kernel.org>
174 lines
4.7 KiB
C
174 lines
4.7 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* USB Serial "Simple" driver
|
|
*
|
|
* Copyright (C) 2001-2006,2008,2013 Greg Kroah-Hartman <greg@kroah.com>
|
|
* Copyright (C) 2005 Arthur Huillet (ahuillet@users.sf.net)
|
|
* Copyright (C) 2005 Thomas Hergenhahn <thomas.hergenhahn@suse.de>
|
|
* Copyright (C) 2009 Outpost Embedded, LLC
|
|
* Copyright (C) 2010 Zilogic Systems <code@zilogic.com>
|
|
* Copyright (C) 2013 Wei Shuai <cpuwolf@gmail.com>
|
|
* Copyright (C) 2013 Linux Foundation
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/tty.h>
|
|
#include <linux/module.h>
|
|
#include <linux/usb.h>
|
|
#include <linux/usb/serial.h>
|
|
|
|
#define DEVICE_N(vendor, IDS, nport) \
|
|
static const struct usb_device_id vendor##_id_table[] = { \
|
|
IDS(), \
|
|
{ }, \
|
|
}; \
|
|
static struct usb_serial_driver vendor##_device = { \
|
|
.driver = { \
|
|
.name = #vendor, \
|
|
}, \
|
|
.id_table = vendor##_id_table, \
|
|
.num_ports = nport, \
|
|
};
|
|
|
|
#define DEVICE(vendor, IDS) DEVICE_N(vendor, IDS, 1)
|
|
|
|
/* Medtronic CareLink USB driver */
|
|
#define CARELINK_IDS() \
|
|
{ USB_DEVICE(0x0a21, 0x8001) } /* MMT-7305WW */
|
|
DEVICE(carelink, CARELINK_IDS);
|
|
|
|
/* Infineon Flashloader driver */
|
|
#define FLASHLOADER_IDS() \
|
|
{ USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \
|
|
{ USB_DEVICE(0x8087, 0x0716) }, \
|
|
{ USB_DEVICE(0x8087, 0x0801) }
|
|
DEVICE(flashloader, FLASHLOADER_IDS);
|
|
|
|
/* Funsoft Serial USB driver */
|
|
#define FUNSOFT_IDS() \
|
|
{ USB_DEVICE(0x1404, 0xcddc) }
|
|
DEVICE(funsoft, FUNSOFT_IDS);
|
|
|
|
/* Google Serial USB SubClass */
|
|
#define GOOGLE_IDS() \
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(0x18d1, \
|
|
USB_CLASS_VENDOR_SPEC, \
|
|
0x50, \
|
|
0x01) }
|
|
DEVICE(google, GOOGLE_IDS);
|
|
|
|
/* HP4x (48/49) Generic Serial driver */
|
|
#define HP4X_IDS() \
|
|
{ USB_DEVICE(0x03f0, 0x0121) }
|
|
DEVICE(hp4x, HP4X_IDS);
|
|
|
|
/* KAUFMANN RKS+CAN VCP */
|
|
#define KAUFMANN_IDS() \
|
|
{ USB_DEVICE(0x16d0, 0x0870) }
|
|
DEVICE(kaufmann, KAUFMANN_IDS);
|
|
|
|
/* Libtransistor USB console */
|
|
#define LIBTRANSISTOR_IDS() \
|
|
{ USB_DEVICE(0x1209, 0x8b00) }
|
|
DEVICE(libtransistor, LIBTRANSISTOR_IDS);
|
|
|
|
/* Motorola USB Phone driver */
|
|
#define MOTO_IDS() \
|
|
{ USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ \
|
|
{ USB_DEVICE(0x0c44, 0x0022) }, /* unknown Motorola phone */ \
|
|
{ USB_DEVICE(0x22b8, 0x2a64) }, /* Motorola KRZR K1m */ \
|
|
{ USB_DEVICE(0x22b8, 0x2c84) }, /* Motorola VE240 phone */ \
|
|
{ USB_DEVICE(0x22b8, 0x2c64) } /* Motorola V950 phone */
|
|
DEVICE(moto_modem, MOTO_IDS);
|
|
|
|
/* Motorola Tetra driver */
|
|
#define MOTOROLA_TETRA_IDS() \
|
|
{ USB_DEVICE(0x0cad, 0x9011) }, /* Motorola Solutions TETRA PEI */ \
|
|
{ USB_DEVICE(0x0cad, 0x9012) }, /* MTP6550 */ \
|
|
{ USB_DEVICE(0x0cad, 0x9013) }, /* MTP3xxx */ \
|
|
{ USB_DEVICE(0x0cad, 0x9015) }, /* MTP85xx */ \
|
|
{ USB_DEVICE(0x0cad, 0x9016) } /* TPG2200 */
|
|
DEVICE(motorola_tetra, MOTOROLA_TETRA_IDS);
|
|
|
|
/* Nokia mobile phone driver */
|
|
#define NOKIA_IDS() \
|
|
{ USB_DEVICE(0x0421, 0x069a) } /* Nokia 130 (RM-1035) */
|
|
DEVICE(nokia, NOKIA_IDS);
|
|
|
|
/* Novatel Wireless GPS driver */
|
|
#define NOVATEL_IDS() \
|
|
{ USB_DEVICE(0x09d7, 0x0100) } /* NovAtel FlexPack GPS */
|
|
DEVICE_N(novatel_gps, NOVATEL_IDS, 3);
|
|
|
|
/* OWON electronic test and measurement equipment driver */
|
|
#define OWON_IDS() \
|
|
{ USB_DEVICE(0x5345, 0x1234) } /* HDS200 oscilloscopes and others */
|
|
DEVICE(owon, OWON_IDS);
|
|
|
|
/* Siemens USB/MPI adapter */
|
|
#define SIEMENS_IDS() \
|
|
{ USB_DEVICE(0x908, 0x0004) }
|
|
DEVICE(siemens_mpi, SIEMENS_IDS);
|
|
|
|
/* Suunto ANT+ USB Driver */
|
|
#define SUUNTO_IDS() \
|
|
{ USB_DEVICE(0x0fcf, 0x1008) }, \
|
|
{ USB_DEVICE(0x0fcf, 0x1009) } /* Dynastream ANT USB-m Stick */
|
|
DEVICE(suunto, SUUNTO_IDS);
|
|
|
|
/* ViVOpay USB Serial Driver */
|
|
#define VIVOPAY_IDS() \
|
|
{ USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */
|
|
DEVICE(vivopay, VIVOPAY_IDS);
|
|
|
|
/* ZIO Motherboard USB driver */
|
|
#define ZIO_IDS() \
|
|
{ USB_DEVICE(0x1CBE, 0x0103) }
|
|
DEVICE(zio, ZIO_IDS);
|
|
|
|
/* All of the above structures mushed into two lists */
|
|
static struct usb_serial_driver * const serial_drivers[] = {
|
|
&carelink_device,
|
|
&flashloader_device,
|
|
&funsoft_device,
|
|
&google_device,
|
|
&hp4x_device,
|
|
&kaufmann_device,
|
|
&libtransistor_device,
|
|
&moto_modem_device,
|
|
&motorola_tetra_device,
|
|
&nokia_device,
|
|
&novatel_gps_device,
|
|
&owon_device,
|
|
&siemens_mpi_device,
|
|
&suunto_device,
|
|
&vivopay_device,
|
|
&zio_device,
|
|
NULL
|
|
};
|
|
|
|
static const struct usb_device_id id_table[] = {
|
|
CARELINK_IDS(),
|
|
FLASHLOADER_IDS(),
|
|
FUNSOFT_IDS(),
|
|
GOOGLE_IDS(),
|
|
HP4X_IDS(),
|
|
KAUFMANN_IDS(),
|
|
LIBTRANSISTOR_IDS(),
|
|
MOTO_IDS(),
|
|
MOTOROLA_TETRA_IDS(),
|
|
NOKIA_IDS(),
|
|
NOVATEL_IDS(),
|
|
OWON_IDS(),
|
|
SIEMENS_IDS(),
|
|
SUUNTO_IDS(),
|
|
VIVOPAY_IDS(),
|
|
ZIO_IDS(),
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(usb, id_table);
|
|
|
|
module_usb_serial_driver(serial_drivers, id_table);
|
|
MODULE_DESCRIPTION("USB Serial 'Simple' driver");
|
|
MODULE_LICENSE("GPL v2");
|