Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Jan 2005 23:52:33 +0900
From:      Shunsuke Akiyama <akiyama@jp.FreeBSD.org>
To:        Michal Mertl <mime@traveller.cz>
Cc:        bernd@bwct.de
Subject:   Re: strange ucom (uplcom) error
Message-ID:  <20050122235234K.akiyama@jp.FreeBSD.org>
In-Reply-To: <1106227110.716.11.camel@genius2.i.cz>
References:  <1106134006.1132.12.camel@genius2.i.cz> <1106227110.716.11.camel@genius2.i.cz>

next in thread | previous in thread | raw e-mail | index | archive | help
--Multipart_Sat_Jan_22_23:52:33_2005-1
Content-Type: text/plain; charset=US-ASCII

At Thu, 20 Jan 2005 14:18:30 +0100,
Michal Mertl wrote:
> 
> I wrote:
> > Emanuel Strobl wrote:
> > > Am Dienstag, 18. Januar 2005 16:17 schrieb Andrew L. Neporada:
> > > > On Tue, Jan 18, 2005 at 01:06:43PM +0100, Emanuel Strobl wrote:
> > > > > Dear experts,
> > > > >
> > > > > I have two USB-RS232 Adaptors, both with PL2303 chipset. One is working
> > > > > the other one not (I hate to say it but both are working under win).
> > > > >
> > > > > The not working (more expensive) one gets recognized as ucom0 and I have
> > > > > ucom0, also I can receive signal but not transmit.
> > > >
> > > > [skip]
> > > >
> > > > Take a look at http://gate.intercaf.ru/~lesha/6100/ and try patch
> > > > http://gate.intercaf.ru/~lesha/6100/pl2303x.patch
> > > >
> > > > It can break old (working) PL2303 chip, but it works for me with newer
> > > 
> > > Thanks a lot, this indeed fixes the revision 3.0 adaptor but unfortunately 
> > > also breakes the 2.02 version :(
> > > 
> > > Perhaps there's a goog guy out there who can refurbish the uplcom driver with 
> > > this information (akiyama?)?
> > > 
> > > Thanks a lot,
> > 
> > I've just recently been looking into this too. I used the mentioned
> > patch and also linux driver source and have come with the attached
> > patch. It contains one more change but I don't know if it's correct. It
> > works for both chips on CURRENT for serial console. It detects if the
> > chip is rev 3.00 and aplies the patch only for it.
> > 
> > The author of the patch mentions it isn't binary safe - sometimes the
> > chip stops working. I planned to test it with binary transfers (ppp)
> > today, check if it's working and submit it (with some cleanup) for
> > inclusion in FreeBSD.
> > 
> > Michal Mertl
> 
> I tested my patch for binary safety on CURRENT yesterday (dialed with
> ppp) and didn't notice any problem.
> 
> I'm attaching my patch again because some recipients didn't probably
> receive it yesterday.
> 
> Michal

Good work!

I've updated your patch.  If attached patch works correctly with new
revision chip, I'll commit this.  Please test attached patch, and tell
me the result.

Regards,
-- 
Shunsuke Akiyama
akiyama@jp.FreeBSD.org
akiyama@FreeBSD.org


--Multipart_Sat_Jan_22_23:52:33_2005-1
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="uplcom.c-diff"
Content-Transfer-Encoding: 7bit

Index: uplcom.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/uplcom.c,v
retrieving revision 1.25
diff -u -r1.25 uplcom.c
--- uplcom.c	6 Jan 2005 01:43:29 -0000	1.25
+++ uplcom.c	22 Jan 2005 14:39:45 -0000
@@ -97,10 +97,13 @@
 #include <sys/sysctl.h>
 #include <sys/uio.h>
 
+#include <machine/bus.h>
+
 #include <dev/usb/usb.h>
 #include <dev/usb/usbcdc.h>
 
 #include <dev/usb/usbdi.h>
+#include <dev/usb/usbdivar.h>
 #include <dev/usb/usbdi_util.h>
 #include "usbdevs.h"
 #include <dev/usb/usb_quirks.h>
@@ -138,6 +141,9 @@
 #define RSAQ_STATUS_DSR			0x02
 #define RSAQ_STATUS_DCD			0x01
 
+#define CHIPTYPE_PL2303			0
+#define CHIPTYPE_PL2303X		1
+
 struct	uplcom_softc {
 	struct ucom_softc	sc_ucom;
 
@@ -156,6 +162,8 @@
 
 	u_char			sc_lsr;		/* Local status register */
 	u_char			sc_msr;		/* uplcom status register */
+
+	int			sc_chiptype;	/* Type of chip */
 };
 
 /*
@@ -293,6 +301,7 @@
 	USB_ATTACH_START(uplcom, sc, uaa);
 	usbd_device_handle dev = uaa->device;
 	struct ucom_softc *ucom;
+	usb_device_descriptor_t *udd;
 	usb_config_descriptor_t *cdesc;
 	usb_interface_descriptor_t *id;
 	usb_endpoint_descriptor_t *ed;
@@ -320,6 +329,16 @@
 
 	DPRINTF(("uplcom attach: sc = %p\n", sc));
 
+	/* determine chip type */
+	udd = &dev->ddesc;
+	if (UGETW(udd->bcdDevice) >= 0x300) {
+		DPRINTF(("uplcom_attach: chiptype 2303X\n"));
+		sc->sc_chiptype = CHIPTYPE_PL2303X;
+	} else {
+		DPRINTF(("uplcom_attach: chiptype 2303\n"));
+		sc->sc_chiptype = CHIPTYPE_PL2303;
+	}
+
 	/* initialize endpoints */
 	ucom->sc_bulkin_no = ucom->sc_bulkout_no = -1;
 	sc->sc_intr_number = -1;
@@ -521,6 +540,54 @@
 	return (0);
 }
 
+struct pl2303x_init {
+	uint8_t		req_type;
+	uint8_t		request;
+	uint16_t	value;
+	uint16_t	index;
+	uint16_t	length;
+};
+
+Static const struct pl2303x_init pl2303x[] = {
+	{ UT_READ_VENDOR_DEVICE,  UPLCOM_SET_REQUEST, 0x8484,    0, 0 },
+	{ UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404,    0, 0 },
+	{ UT_READ_VENDOR_DEVICE,  UPLCOM_SET_REQUEST, 0x8484,    0, 0 },
+	{ UT_READ_VENDOR_DEVICE,  UPLCOM_SET_REQUEST, 0x8383,    0, 0 },
+	{ UT_READ_VENDOR_DEVICE,  UPLCOM_SET_REQUEST, 0x8484,    0, 0 },
+	{ UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404,    1, 0 },
+	{ UT_READ_VENDOR_DEVICE,  UPLCOM_SET_REQUEST, 0x8484,    0, 0 },
+	{ UT_READ_VENDOR_DEVICE,  UPLCOM_SET_REQUEST, 0x8383,    0, 0 },
+	{ UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST,      0,    1, 0 },
+	{ UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST,      1,    0, 0 },
+	{ UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST,      2, 0x44, 0 }
+};
+
+Static usbd_status
+uplcom_pl2303x_init(struct uplcom_softc *sc)
+{
+	usb_device_request_t req;
+	usbd_status err;
+	int i;
+
+	for (i = 0; i < 11; i++) {
+		req.bmRequestType = pl2303x[i].req_type;
+		req.bRequest = pl2303x[i].request;
+		USETW(req.wValue, pl2303x[i].value);
+		USETW(req.wIndex, pl2303x[i].index);
+		USETW(req.wLength, pl2303x[i].length);
+
+		err = usbd_do_request(sc->sc_ucom.sc_udev, &req, 0);
+		if (err) {
+			printf("%s: uplcom_pl2303x_init: %d: %s\n",
+				USBDEVNAME(sc->sc_ucom.sc_dev), i,
+				usbd_errstr(err));
+			return (EIO);
+		}
+	}
+
+	return (0);
+}
+
 Static void
 uplcom_set_line_state(struct uplcom_softc *sc)
 {
@@ -617,7 +684,10 @@
 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
 	req.bRequest = UPLCOM_SET_REQUEST;
 	USETW(req.wValue, 0);
-	USETW(req.wIndex, UPLCOM_SET_CRTSCTS);
+	if (sc->sc_chiptype == CHIPTYPE_PL2303X)
+		USETW(req.wIndex, 0x61);
+	else
+		USETW(req.wIndex, UPLCOM_SET_CRTSCTS);
 	USETW(req.wLength, 0);
 
 	err = usbd_do_request(sc->sc_ucom.sc_udev, &req, 0);
@@ -744,6 +814,9 @@
 		}
 	}
 
+	if (sc->sc_chiptype == CHIPTYPE_PL2303X)
+		return (uplcom_pl2303x_init(sc));
+
 	return (0);
 }
 

--Multipart_Sat_Jan_22_23:52:33_2005-1--



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