- 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.
This commit is contained in:
nisimura 2009-05-24 16:24:25 +00:00
parent f55e04e7f7
commit 44dbe1e84c
1 changed files with 30 additions and 26 deletions

View File

@ -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 @@ int uftdidebug = 0;
#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 @@ struct uftdi_softc {
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 @@ struct uftdi_softc {
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(uftdi)
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 @@ USB_ATTACH(uftdi)
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 @@ USB_ATTACH(uftdi)
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,