Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/usb support USB-RS232 Converter of Magic Control Tec...
details: https://anonhg.NetBSD.org/src/rev/f4ef49e3d662
branches: trunk
changeset: 507663:f4ef49e3d662
user: ichiro <ichiro%NetBSD.org@localhost>
date: Wed Mar 28 18:42:13 2001 +0000
description:
support USB-RS232 Converter of Magic Control Technology Corp.
More information about this product found at http://www.mct.com.tw
diffstat:
sys/dev/usb/files.usb | 7 +-
sys/dev/usb/umct.c | 620 ++++++++++++++++++++++++++++++++++++++++++++++++++
sys/dev/usb/umct.h | 108 ++++++++
3 files changed, 734 insertions(+), 1 deletions(-)
diffs (truncated from 757 to 300 lines):
diff -r a80da8fa929c -r f4ef49e3d662 sys/dev/usb/files.usb
--- a/sys/dev/usb/files.usb Wed Mar 28 18:36:32 2001 +0000
+++ b/sys/dev/usb/files.usb Wed Mar 28 18:42:13 2001 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.usb,v 1.28 2001/02/24 02:13:34 lukem Exp $
+# $NetBSD: files.usb,v 1.29 2001/03/28 18:42:13 ichiro Exp $
#
# Config file and device description for machine-independent USB code.
# Included by ports that need it. Ports that use it must provide
@@ -139,6 +139,11 @@
attach uplcom at uhub
file dev/usb/uplcom.c uplcom
+# MCT USB-232 serial driver
+device umct: ucombus
+attach umct at uhub
+file dev/usb/umct.c umct
+
# Scanners
# Generic scanner support
device uscanner
diff -r a80da8fa929c -r f4ef49e3d662 sys/dev/usb/umct.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/usb/umct.c Wed Mar 28 18:42:13 2001 +0000
@@ -0,0 +1,620 @@
+/* $NetBSD: umct.c,v 1.1 2001/03/28 18:42:13 ichiro Exp $ */
+/*
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Ichiro FUKUHARA (ichiro%ichiro.org@localhost).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This driver is for the device MCT USB-RS232 Interfact Controller.
+ * http://www.mct.com.tw/p_u232.html
+ * http://www.dlink.com/products/usb/dsbs25
+ *
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/ioctl.h>
+#include <sys/conf.h>
+#include <sys/tty.h>
+#include <sys/file.h>
+#include <sys/select.h>
+#include <sys/proc.h>
+#include <sys/vnode.h>
+#include <sys/device.h>
+#include <sys/poll.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbcdc.h>
+
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdi_util.h>
+#include <dev/usb/usbdevs.h>
+#include <dev/usb/usb_quirks.h>
+
+#include <dev/usb/usbdevs.h>
+#include <dev/usb/ucomvar.h>
+
+#include <dev/usb/umct.h>
+
+#ifdef UMCT_DEBUG
+#define DPRINTFN(n, x) if (umctdebug > (n)) logprintf x
+int umctdebug = 0;
+#else
+#define DPRINTFN(n, x)
+#endif
+#define DPRINTF(x) DPRINTFN(0, x)
+
+#define UMCT_CONFIG_INDEX 0
+#define UMCT_IFACE_INDEX 0
+
+struct umct_softc {
+ USBBASEDEVICE sc_dev; /* base device */
+ usbd_device_handle sc_udev; /* USB device */
+ usbd_interface_handle sc_iface; /* interface */
+ int sc_iface_number; /* interface number */
+
+ int sc_intr_number; /* interrupt number */
+ usbd_pipe_handle sc_intr_pipe; /* interrupt pipe */
+ u_char *sc_intr_buf; /* interrupt buffer */
+ int sc_isize;
+
+ usb_cdc_line_state_t sc_line_state; /* current line state */
+ u_char sc_dtr; /* current DTR state */
+ u_char sc_rts; /* current RTS state */
+ u_char sc_break; /* set break */
+
+ u_char sc_status;
+
+ device_ptr_t sc_subdev; /* ucom device */
+
+ u_char sc_dying; /* disconnecting */
+
+ u_char sc_lsr; /* Local status register */
+ u_char sc_msr; /* umct status register */
+};
+
+/*
+ * These are the maximum number of bytes transferred per frame.
+ * The output buffer size cannot be increased due to the size encoding.
+ */
+#define UMCTIBUFSIZE 256
+#define UMCTOBUFSIZE 256
+
+Static void umct_init(struct umct_softc *);
+Static void umct_set_baudrate(struct umct_softc *, void *);
+Static void umct_set_lcr(struct umct_softc *, void *);
+Static void umct_intr(usbd_xfer_handle, usbd_private_handle, usbd_status);
+
+Static void umct_set(void *, int, int, int);
+Static void umct_dtr(struct umct_softc *, int);
+Static void umct_rts(struct umct_softc *, int);
+Static void umct_break(struct umct_softc *, int);
+Static void umct_set_line_state(struct umct_softc *);
+Static void umct_get_status(void *, int portno, u_char *lsr, u_char *msr);
+Static int umct_param(void *, int, struct termios *);
+Static int umct_open(void *, int);
+Static void umct_close(void *, int);
+
+struct ucom_methods umct_methods = {
+ umct_get_status,
+ umct_set,
+ umct_param,
+ NULL,
+ umct_open,
+ umct_close,
+ NULL,
+ NULL,
+};
+
+static const struct umct_product {
+ uint16_t vendor;
+ uint16_t product;
+} umct_products [] = {
+ /* MCT USB-232 Interface Products */
+ { USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232 },
+ /* Sitecom USB-232 Products */
+ { USB_VENDOR_MCT, USB_PRODUCT_MCT_SITECOM_USB232 },
+ /* D-Link DU-H3SP USB BAY Hub Products */
+ { USB_VENDOR_MCT, USB_PRODUCT_MCT_DU_H3SP_USB232 },
+
+ { 0, 0 }
+};
+
+USB_DECLARE_DRIVER(umct);
+
+USB_MATCH(umct)
+{
+ USB_MATCH_START(umct, uaa);
+ int i;
+
+ if (uaa->iface != NULL)
+ return (UMATCH_NONE);
+
+ for (i = 0; umct_products[i].vendor != 0; i++) {
+ if (umct_products[i].vendor == uaa->vendor &&
+ umct_products[i].product == uaa->product) {
+ return (UMATCH_VENDOR_PRODUCT);
+ }
+ }
+ return (UMATCH_NONE);
+}
+
+USB_ATTACH(umct)
+{
+ USB_ATTACH_START(umct, sc, uaa);
+ usbd_device_handle dev = uaa->device;
+ usb_config_descriptor_t *cdesc;
+ usb_interface_descriptor_t *id;
+ usb_endpoint_descriptor_t *ed;
+
+ char devinfo[1024];
+ char *devname = USBDEVNAME(sc->sc_dev);
+ usbd_status err;
+ int i,found;
+ struct ucom_attach_args uca;
+
+ usbd_devinfo(dev, 0, devinfo);
+ USB_ATTACH_SETUP;
+ printf("%s: %s\n", devname, devinfo);
+
+ sc->sc_udev = dev;
+
+ DPRINTF(("\n\numct attach: sc=%p\n", sc));
+
+ /* initialize endpoints */
+ uca.bulkin = uca.bulkout = -1;
+ sc->sc_intr_number = -1;
+ sc->sc_intr_pipe = NULL;
+
+ /* Move the device into the configured state. */
+ err = usbd_set_config_index(dev, UMCT_CONFIG_INDEX, 1);
+ if (err) {
+ printf("\n%s: failed to set configuration, err=%s\n",
+ devname, usbd_errstr(err));
+ sc->sc_dying = 1;
+ USB_ATTACH_ERROR_RETURN;
+ }
+
+ /* get the config descriptor */
+ cdesc = usbd_get_config_descriptor(sc->sc_udev);
+
+ if (cdesc == NULL) {
+ printf("%s: failed to get configuration descriptor\n",
+ USBDEVNAME(sc->sc_dev));
+ sc->sc_dying = 1;
+ USB_ATTACH_ERROR_RETURN;
+ }
+
+ /* get the interface */
+ err = usbd_device2interface_handle(dev, UMCT_IFACE_INDEX,
+ &sc->sc_iface);
+ if (err) {
+ printf("\n%s: failed to get interface, err=%s\n",
+ devname, usbd_errstr(err));
+ sc->sc_dying = 1;
+ USB_ATTACH_ERROR_RETURN;
+ }
+
+ /* Find the bulk{in,out} and interrupt endpoints */
+
+ id = usbd_get_interface_descriptor(sc->sc_iface);
+ sc->sc_iface_number = id->bInterfaceNumber;
+ found = 0;
+
+ for (i = 0; i < id->bNumEndpoints; i++) {
+ ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
+ if (ed == NULL) {
+ printf("%s: no endpoint descriptor for %d\n",
+ USBDEVNAME(sc->sc_dev), i);
+ sc->sc_dying = 1;
+ USB_ATTACH_ERROR_RETURN;
+ }
+
+ if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
+ UE_GET_XFERTYPE(ed->bmAttributes) == UE_INTERRUPT &&
+ found == 0) {
+ uca.bulkin = ed->bEndpointAddress;
+ found = 1;
+ } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT &&
+ UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
+ uca.bulkout = ed->bEndpointAddress;
+ } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
+ UE_GET_XFERTYPE(ed->bmAttributes) == UE_INTERRUPT) {
+ sc->sc_intr_number = ed->bEndpointAddress;
+ sc->sc_isize = UGETW(ed->wMaxPacketSize);
+ }
+ }
+
+ if (uca.bulkin == -1) {
+ printf("%s: Could not find data bulk in\n",
+ USBDEVNAME(sc->sc_dev));
+ sc->sc_dying = 1;
+ USB_ATTACH_ERROR_RETURN;
+ }
+
+ if (uca.bulkout == -1) {
+ printf("%s: Could not find data bulk out\n",
+ USBDEVNAME(sc->sc_dev));
+ sc->sc_dying = 1;
+ USB_ATTACH_ERROR_RETURN;
+ }
+
+ if (sc->sc_intr_number== -1) {
Home |
Main Index |
Thread Index |
Old Index