Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Jun 2012 21:16:19 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r237102 - in head/sys/dev/usb: . serial
Message-ID:  <201206142116.q5ELGJ15021321@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Thu Jun 14 21:16:19 2012
New Revision: 237102
URL: http://svn.freebsd.org/changeset/base/237102

Log:
  - Add support for the FT2232 based egnite Turtelizer 2 JTAG/RS232 Adapter.
    This includes adding support for skipping FTDI interfaces used for JTAG
    leaving them for userland and just attaching to the RS232 half, similarly
    to how the corresponding Linux drivers handles these kind of adapters.
    While at it, sort uftdi_devs and return BUS_PROBE_SPECIFIC (because
    uftdi_probe() alters the instance variables for better or worse as do
    other probe routines of USB drivers) instead of 0.
  - Remove duplicated entries for BeagleBone.
  - Use DEVMETHOD_END.
  - Use NULL instead of 0 for pointers.
  - Remove some stray lines.
  
  MFC after:	3 days

Modified:
  head/sys/dev/usb/serial/uftdi.c
  head/sys/dev/usb/serial/uftdi_reg.h
  head/sys/dev/usb/usbdevs

Modified: head/sys/dev/usb/serial/uftdi.c
==============================================================================
--- head/sys/dev/usb/serial/uftdi.c	Thu Jun 14 20:49:22 2012	(r237101)
+++ head/sys/dev/usb/serial/uftdi.c	Thu Jun 14 21:16:19 2012	(r237102)
@@ -81,7 +81,7 @@ SYSCTL_INT(_hw_usb_uftdi, OID_AUTO, debu
 #endif
 
 #define	UFTDI_CONFIG_INDEX	0
-#define	UFTDI_IFACE_INDEX	0
+#define	UFTDI_IFACE_INDEX_JTAG	0
 
 #define	UFTDI_OBUFSIZE 64		/* bytes, cannot be increased due to
 					 * do size encoding */
@@ -102,10 +102,10 @@ struct uftdi_softc {
 	struct mtx sc_mtx;
 
 	uint32_t sc_unit;
-	enum uftdi_type sc_type;
 
 	uint16_t sc_last_lcr;
 
+	uint8_t sc_type;
 	uint8_t	sc_iface_index;
 	uint8_t	sc_hdrlen;
 	uint8_t	sc_msr;
@@ -190,7 +190,7 @@ static device_method_t uftdi_methods[] =
 	DEVMETHOD(device_attach, uftdi_attach),
 	DEVMETHOD(device_detach, uftdi_detach),
 
-	{0, 0}
+	DEVMETHOD_END
 };
 
 static devclass_t uftdi_devclass;
@@ -201,59 +201,61 @@ static driver_t uftdi_driver = {
 	.size = sizeof(struct uftdi_softc),
 };
 
-DRIVER_MODULE(uftdi, uhub, uftdi_driver, uftdi_devclass, NULL, 0);
+DRIVER_MODULE(uftdi, uhub, uftdi_driver, uftdi_devclass, NULL, NULL);
 MODULE_DEPEND(uftdi, ucom, 1, 1, 1);
 MODULE_DEPEND(uftdi, usb, 1, 1, 1);
 MODULE_VERSION(uftdi, 1);
 
-static STRUCT_USB_HOST_ID uftdi_devs[] = {
-#define	UFTDI_DEV(v,p,t) \
-  { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, UFTDI_TYPE_##t) }
-	UFTDI_DEV(ATMEL, STK541, 8U232AM),
-	UFTDI_DEV(DRESDENELEKTRONIK, SENSORTERMINALBOARD, 8U232AM),
-	UFTDI_DEV(DRESDENELEKTRONIK, WIRELESSHANDHELDTERMINAL, 8U232AM),
-	UFTDI_DEV(FALCOM, TWIST, 8U232AM),
-	UFTDI_DEV(FTDI, GAMMASCOUT, 8U232AM),
-	UFTDI_DEV(FTDI, SERIAL_8U100AX, SIO),
-	UFTDI_DEV(FTDI, SERIAL_2232C, 8U232AM),
-	UFTDI_DEV(FTDI, SERIAL_2232D, 8U232AM),
-	UFTDI_DEV(FTDI, BEAGLEBONE, 8U232AM),
-	UFTDI_DEV(FTDI, SERIAL_4232H, 8U232AM),
-	UFTDI_DEV(FTDI, SERIAL_8U232AM, 8U232AM),
-	UFTDI_DEV(FTDI, SERIAL_8U232AM4, 8U232AM),
-	UFTDI_DEV(FTDI, SERIAL_BEAGLEBONE, 8U232AM),
-	UFTDI_DEV(FTDI, SEMC_DSS20, 8U232AM),
-	UFTDI_DEV(FTDI, CFA_631, 8U232AM),
-	UFTDI_DEV(FTDI, CFA_632, 8U232AM),
-	UFTDI_DEV(FTDI, CFA_633, 8U232AM),
-	UFTDI_DEV(FTDI, CFA_634, 8U232AM),
-	UFTDI_DEV(FTDI, CFA_635, 8U232AM),
-	UFTDI_DEV(FTDI, USB_UIRT, 8U232AM),
-	UFTDI_DEV(FTDI, USBSERIAL, 8U232AM),
-	UFTDI_DEV(FTDI, KBS, 8U232AM),
-	UFTDI_DEV(FTDI, MX2_3, 8U232AM),
-	UFTDI_DEV(FTDI, MX4_5, 8U232AM),
-	UFTDI_DEV(FTDI, LK202, 8U232AM),
-	UFTDI_DEV(FTDI, LK204, 8U232AM),
-	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13M, 8U232AM),
-	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13S, 8U232AM),
-	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13U, 8U232AM),
-	UFTDI_DEV(FTDI, EISCOU, 8U232AM),
-	UFTDI_DEV(FTDI, UOPTBR, 8U232AM),
-	UFTDI_DEV(FTDI, EMCU2D, 8U232AM),
-	UFTDI_DEV(FTDI, PCMSFU, 8U232AM),
-	UFTDI_DEV(FTDI, EMCU2H, 8U232AM),
-	UFTDI_DEV(FTDI, MAXSTREAM, 8U232AM),
-	UFTDI_DEV(FTDI, CTI_USB_NANO_485, 8U232AM),
-	UFTDI_DEV(FTDI, CTI_USB_MINI_485, 8U232AM),
-	UFTDI_DEV(SIIG2, US2308, 8U232AM),
-	UFTDI_DEV(INTREPIDCS, VALUECAN, 8U232AM),
-	UFTDI_DEV(INTREPIDCS, NEOVI, 8U232AM),
-	UFTDI_DEV(BBELECTRONICS, USOTL4, 8U232AM),
-	UFTDI_DEV(MATRIXORBITAL, MOUA, 8U232AM),
-	UFTDI_DEV(MARVELL, SHEEVAPLUG, 8U232AM),
-	UFTDI_DEV(MELCO, PCOPRS1, 8U232AM),
-	UFTDI_DEV(RATOC, REXUSB60F, 8U232AM),
+static const STRUCT_USB_HOST_ID uftdi_devs[] = {
+#define	UFTDI_DEV(v, p, i) \
+  { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) }
+	UFTDI_DEV(ATMEL, STK541, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(BBELECTRONICS, USOTL4, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(DRESDENELEKTRONIK, SENSORTERMINALBOARD,
+	    UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(DRESDENELEKTRONIK, WIRELESSHANDHELDTERMINAL,
+	    UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FALCOM, TWIST, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, BEAGLEBONE, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, CFA_631, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, CFA_632, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, CFA_633, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, CFA_634, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, CFA_635, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, CTI_USB_MINI_485, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, CTI_USB_NANO_485, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, EISCOU, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, EMCU2D, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, EMCU2H, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, GAMMASCOUT, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, KBS, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, LK202, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, LK204, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, MAXSTREAM, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, MX2_3, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, MX4_5, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, PCMSFU, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, SEMC_DSS20, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, SERIAL_2232C, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, SERIAL_2232D, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, SERIAL_4232H, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, SERIAL_8U100AX, UFTDI_TYPE_SIO),
+	UFTDI_DEV(FTDI, SERIAL_8U232AM, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, SERIAL_8U232AM4, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13M, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13S, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13U, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, TURTELIZER2, UFTDI_TYPE_8U232AM | UFTDI_FLAG_JTAG),
+	UFTDI_DEV(FTDI, UOPTBR, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, USBSERIAL, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(FTDI, USB_UIRT, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(INTREPIDCS, NEOVI, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(INTREPIDCS, VALUECAN, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(MARVELL, SHEEVAPLUG, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(MATRIXORBITAL, MOUA, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(MELCO, PCOPRS1, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(RATOC, REXUSB60F, UFTDI_TYPE_8U232AM),
+	UFTDI_DEV(SIIG2, US2308, UFTDI_TYPE_8U232AM)
 #undef UFTDI_DEV
 };
 
@@ -261,6 +263,7 @@ static int
 uftdi_probe(device_t dev)
 {
 	struct usb_attach_arg *uaa = device_get_ivars(dev);
+	const struct usb_device_id *id;
 
 	if (uaa->usb_mode != USB_MODE_HOST) {
 		return (ENXIO);
@@ -268,9 +271,18 @@ uftdi_probe(device_t dev)
 	if (uaa->info.bConfigIndex != UFTDI_CONFIG_INDEX) {
 		return (ENXIO);
 	}
-	/* attach to all present interfaces */
 
-	return (usbd_lookup_id_by_uaa(uftdi_devs, sizeof(uftdi_devs), uaa));
+	/*
+	 * Attach to all present interfaces unless this is a JTAG one, which
+	 * we leave for userland.
+	 */
+	id = usbd_lookup_id_by_info(uftdi_devs, sizeof(uftdi_devs),
+	    &uaa->info);
+	if (id == NULL || ((id->driver_info & UFTDI_FLAG_JTAG) != 0 &&
+	    uaa->info.bIfaceIndex == UFTDI_IFACE_INDEX_JTAG))
+		return (ENXIO);
+	uaa->driver_info = id->driver_info;
+	return (BUS_PROBE_SPECIFIC);
 }
 
 static int
@@ -293,7 +305,7 @@ uftdi_attach(device_t dev)
 	DPRINTF("\n");
 
 	sc->sc_iface_index = uaa->info.bIfaceIndex;
-	sc->sc_type = USB_GET_DRIVER_INFO(uaa);
+	sc->sc_type = USB_GET_DRIVER_INFO(uaa) & UFTDI_TYPE_MASK;
 
 	switch (sc->sc_type) {
 	case UFTDI_TYPE_SIO:
@@ -562,6 +574,7 @@ static int
 uftdi_set_parm_soft(struct termios *t,
     struct uftdi_param_config *cfg, uint8_t type)
 {
+
 	memset(cfg, 0, sizeof(*cfg));
 
 	switch (type) {
@@ -824,5 +837,6 @@ static void
 uftdi_poll(struct ucom_softc *ucom)
 {
 	struct uftdi_softc *sc = ucom->sc_parent;
+
 	usbd_transfer_poll(sc->sc_xfer, UFTDI_N_TRANSFER);
 }

Modified: head/sys/dev/usb/serial/uftdi_reg.h
==============================================================================
--- head/sys/dev/usb/serial/uftdi_reg.h	Thu Jun 14 20:49:22 2012	(r237101)
+++ head/sys/dev/usb/serial/uftdi_reg.h	Thu Jun 14 21:16:19 2012	(r237102)
@@ -35,10 +35,12 @@
 #define	FTDI_PIT_SIOB		2	/* SIOB */
 #define	FTDI_PIT_PARALLEL	3	/* Parallel */
 
-enum uftdi_type {
-	UFTDI_TYPE_SIO,
-	UFTDI_TYPE_8U232AM
-};
+/* Values for driver_info */
+#define	UFTDI_TYPE_MASK		0x000000ff
+#define	UFTDI_TYPE_SIO		0x00000001
+#define	UFTDI_TYPE_8U232AM	0x00000002
+#define	UFTDI_FLAG_MASK		0x0000ff00
+#define	UFTDI_FLAG_JTAG		0x00000100
 
 /*
  * BmRequestType:  0100 0000B
@@ -63,14 +65,11 @@ enum uftdi_type {
  *    baud and data format not reset
  *
  * The Purge RX and TX buffer commands affect nothing except the buffers
- *
  */
 /* FTDI_SIO_RESET */
 #define	FTDI_SIO_RESET_SIO 0
 #define	FTDI_SIO_RESET_PURGE_RX 1
 #define	FTDI_SIO_RESET_PURGE_TX 2
-
-
 /*
  * BmRequestType:  0100 0000B
  * bRequest:       FTDI_SIO_SET_BAUDRATE
@@ -134,8 +133,6 @@ enum {
 #define	FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11)
 #define	FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11)
 #define	FTDI_SIO_SET_BREAK (0x1 << 14)
-
-
 /*
  * BmRequestType:   0100 0000B
  * bRequest:        FTDI_SIO_MODEM_CTRL
@@ -171,8 +168,6 @@ enum {
 #define	FTDI_SIO_SET_RTS_MASK 0x2
 #define	FTDI_SIO_SET_RTS_HIGH (2 | ( FTDI_SIO_SET_RTS_MASK << 8))
 #define	FTDI_SIO_SET_RTS_LOW (0 | ( FTDI_SIO_SET_RTS_MASK << 8))
-
-
 /*
  *   BmRequestType:  0100 0000b
  *   bRequest:       FTDI_SIO_SET_FLOW_CTRL
@@ -202,8 +197,6 @@ enum {
 #define	FTDI_SIO_RTS_CTS_HS 0x1
 #define	FTDI_SIO_DTR_DSR_HS 0x2
 #define	FTDI_SIO_XON_XOFF_HS 0x4
-
-
 /*
  *  BmRequestType:   0100 0000b
  *  bRequest:        FTDI_SIO_SET_EVENT_CHAR
@@ -226,9 +219,6 @@ enum {
  * data read so far - rather than wait 40ms or until 62 bytes are read
  * which is what normally happens.
  */
-
-
-
 /*
  *  BmRequestType:  0100 0000b
  *  bRequest:       FTDI_SIO_SET_ERROR_CHAR
@@ -243,14 +233,10 @@ enum {
  *           0 = disabled
  *           1 = enabled
  *  B9..15 Reserved
- *
- *
  * FTDI_SIO_SET_ERROR_CHAR
  * Set the parity error replacement character for the specified communications
  * port.
  */
-
-
 /*
  *   BmRequestType:   1100 0000b
  *   bRequest:        FTDI_SIO_GET_MODEM_STATUS
@@ -281,9 +267,6 @@ enum {
 #define	FTDI_SIO_DSR_MASK 0x20
 #define	FTDI_SIO_RI_MASK  0x40
 #define	FTDI_SIO_RLSD_MASK 0x80
-
-
-
 /*
  *
  * DATA FORMAT
@@ -317,8 +300,6 @@ enum {
  * B5	Transmitter Holding Register (THRE)
  * B6	Transmitter Empty (TEMT)
  * B7	Error in RCVR FIFO
- *
- *
  * OUT Endpoint
  *
  * This device reserves the first bytes of data on this endpoint contain the
@@ -330,7 +311,6 @@ enum {
  * Offset	Description
  * B0..1	Port
  * B2..7	Length of message - (not including Byte 0)
- *
  */
 #define	FTDI_PORT_MASK 0x0f
 #define	FTDI_MSR_MASK 0xf0

Modified: head/sys/dev/usb/usbdevs
==============================================================================
--- head/sys/dev/usb/usbdevs	Thu Jun 14 20:49:22 2012	(r237101)
+++ head/sys/dev/usb/usbdevs	Thu Jun 14 21:16:19 2012	(r237102)
@@ -1612,9 +1612,9 @@ product FTDI SERIAL_8U232AM	0x6001	8U232
 product FTDI SERIAL_8U232AM4	0x6004	8U232AM Serial
 product FTDI SERIAL_2232C	0x6010	FT2232C Dual port Serial
 product FTDI SERIAL_2232D	0x9e90	FT2232D Dual port Serial
-product FTDI BEAGLEBONE		0xA6D0  BeagleBone
 product FTDI SERIAL_4232H	0x6011	FT4232H Quad port Serial
-product FTDI SERIAL_BEAGLEBONE	0xa6d0	BeagleBone FTDI Serial
+product FTDI BEAGLEBONE		0xa6d0	BeagleBone
+product FTDI TURTELIZER2	0xbdc8	egnite Turtelizer 2 JTAG/RS232 Adapter
 /* Gude Analog- und Digitalsysteme products also uses FTDI's id: */
 product FTDI TACTRIX_OPENPORT_13M 0xcc48 OpenPort 1.3 Mitsubishi
 product FTDI TACTRIX_OPENPORT_13S 0xcc49 OpenPort 1.3 Subaru



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206142116.q5ELGJ15021321>