Module Name:    src
Committed By:   nisimura
Date:           Sun May 24 16:24:26 UTC 2009

Modified Files:
        src/sys/dev/usb: uftdi.c

Log Message:
- detect FTDI chiptype from bcdDevice field to determine the number of
  channels.
- tested on 232BM, 232RL and 2232D chips.
- now capable of quad channel FT4232H.
- minor format nit and legacy title comment removal.
- non UART type bit stream (!= ucom) support is under planning.


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/sys/dev/usb/uftdi.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/uftdi.c
diff -u src/sys/dev/usb/uftdi.c:1.40 src/sys/dev/usb/uftdi.c:1.41
--- src/sys/dev/usb/uftdi.c:1.40	Tue Apr 21 16:26:01 2009
+++ src/sys/dev/usb/uftdi.c	Sun May 24 16:24:25 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: uftdi.c,v 1.40 2009/04/21 16:26:01 taca Exp $	*/
+/*	$NetBSD: uftdi.c,v 1.41 2009/05/24 16:24:25 nisimura Exp $	*/
 
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -29,12 +29,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-/*
- * FTDI FT8U100AX serial adapter driver
- */
-
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uftdi.c,v 1.40 2009/04/21 16:26:01 taca Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uftdi.c,v 1.41 2009/05/24 16:24:25 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -64,7 +60,7 @@
 
 #define UFTDI_CONFIG_INDEX	0
 #define UFTDI_IFACE_INDEX	0
-#define UFTDI_MAX_PORTS		2
+#define UFTDI_MAX_PORTS		4
 
 /*
  * These are the maximum number of bytes transferred per frame.
@@ -81,6 +77,7 @@
 	enum uftdi_type		sc_type;
 	u_int			sc_hdrlen;
 	u_int			sc_numports;
+	u_int			sc_chiptype;
 
 	u_char			sc_msr;
 	u_char			sc_lsr;
@@ -90,6 +87,7 @@
 	u_char			sc_dying;
 
 	u_int			last_lcr;
+
 };
 
 Static void	uftdi_get_status(void *, int portno, u_char *lsr, u_char *msr);
@@ -179,6 +177,7 @@
 	USB_ATTACH_START(uftdi, sc, uaa);
 	usbd_device_handle dev = uaa->device;
 	usbd_interface_handle iface;
+	usb_device_descriptor_t *ddesc;
 	usb_interface_descriptor_t *id;
 	usb_endpoint_descriptor_t *ed;
 	char *devinfop;
@@ -205,24 +204,29 @@
 	sc->sc_dev = self;
 	sc->sc_udev = dev;
 	sc->sc_numports = 1;
-	switch( uaa->vendor ) {
-	case USB_VENDOR_FTDI:
-		switch (uaa->product) {
-		case USB_PRODUCT_FTDI_SERIAL_8U100AX:
-			sc->sc_type = UFTDI_TYPE_SIO;
-			sc->sc_hdrlen = 1;
-			break;
-		case USB_PRODUCT_FTDI_SERIAL_2232C:
-			sc->sc_numports = 2;
-			/* FALLTHROUGH */
-		default:		/* Most uftdi devices are 8U232AM */
-			sc->sc_type = UFTDI_TYPE_8U232AM;
-			sc->sc_hdrlen = 0;
-		}
+	sc->sc_type = UFTDI_TYPE_8U232AM; /* most devices are post-8U232AM */
+	sc->sc_hdrlen = 0;
+	if (uaa->vendor == USB_VENDOR_FTDI
+	    && uaa->product == USB_PRODUCT_FTDI_SERIAL_8U100AX) {
+		sc->sc_type = UFTDI_TYPE_SIO;
+		sc->sc_hdrlen = 1;
+	}
+
+	ddesc = usbd_get_device_descriptor(dev);
+	sc->sc_chiptype = UGETW(ddesc->bcdDevice);
+	switch (sc->sc_chiptype) {
+	case 0x500: /* 2232D */
+	case 0x700: /* 2232H */
+		sc->sc_numports = 2;
+		break;
+	case 0x800: /* 4232H */
+		sc->sc_numports = 4;
+		break;
+	case 0x200: /* 232/245AM */
+	case 0x400: /* 232/245BL */
+	case 0x600: /* 232/245R */
+	default:
 		break;
-	default:		/* Most uftdi devices are 8U232AM */
-		sc->sc_type = UFTDI_TYPE_8U232AM;
-		sc->sc_hdrlen = 0;
 	}
 
 	for (idx = UFTDI_IFACE_INDEX; idx < sc->sc_numports; idx++) {
@@ -286,8 +290,8 @@
 		uca.info = NULL;
 
 		DPRINTF(("uftdi: in=0x%x out=0x%x\n", uca.bulkin, uca.bulkout));
-		sc->sc_subdev[idx] = config_found_sm_loc(self, "ucombus", NULL, &uca,
-											ucomprint, ucomsubmatch);
+		sc->sc_subdev[idx] = config_found_sm_loc(self, "ucombus", NULL,
+		    &uca, ucomprint, ucomsubmatch);
 	}
 
 	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev,

Reply via email to