Re: Sony Clie PEG-TJ37 vs. FreeBSD CURRENT (long)

From: Brian Fundakowski Feldman <green_at_freebsd.org>
Date: Fri, 2 Jul 2004 15:22:49 -0400
Alright, wanna try these changes which I would potentially commit?

cvs diff: Diffing .
Index: usbdevs
===================================================================
RCS file: /usr/ncvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.185
diff -u -r1.185 usbdevs
--- usbdevs	1 Jul 2004 05:14:12 -0000	1.185
+++ usbdevs	2 Jul 2004 18:01:19 -0000
_at__at_ -1230,6 +1230,7 _at__at_
 product SONY CLIE_41_MS		0x0099	Sony Clie v4.1 Memory Stick slot
 product SONY CLIE_41		0x009a	Sony Clie v4.1
 product SONY CLIE_NX60		0x00da	Sony Clie nx60
+product SONY CLIE_TJ37		0x0169	Sony Clie tj37
 
 /* SOURCENEXT products */
 product SOURCENEXT KEIKAI8	0x039f	KeikaiDenwa 8
Index: uvisor.c
===================================================================
RCS file: /usr/ncvs/src/sys/dev/usb/uvisor.c,v
retrieving revision 1.22
diff -u -r1.22 uvisor.c
--- uvisor.c	27 Jun 2004 12:41:44 -0000	1.22
+++ uvisor.c	2 Jul 2004 17:59:57 -0000
_at__at_ -142,8 +142,24 _at__at_
  * Unknown PalmOS stuff.
  */
 #define UVISOR_GET_PALM_INFORMATION		0x04
-#define UVISOR_GET_PALM_INFORMATION_LEN		0x14
+#define UVISOR_GET_PALM_INFORMATION_LEN		0x44
 
+struct uvisor_palm_connection_info {
+	uByte	num_ports;
+	uByte	endpoint_numbers_different;
+	uWord	reserved1;
+	struct {
+		uDWord	port_function_id;
+		uByte	port;
+		uByte	end_point_info;
+		uWord	reserved;
+	} connections[UVISOR_MAX_CONN];
+};
+
+union connection_info {
+	struct uvisor_connection_info ci_visor;
+	struct uvisor_palm_connection_info ci_palm;
+};
 
 /*
  * Crank down UVISORBUFSIZE from 1024 to 64 to avoid a problem where
_at__at_ -163,9 +179,7 _at__at_
 	u_int16_t		sc_flags;
 };
 
-Static usbd_status uvisor_init(struct uvisor_softc *);
-
-Static usbd_status clie_3_5_init(struct uvisor_softc *);
+Static usbd_status uvisor_init(struct uvisor_softc *, union connection_info *);
 
 Static void uvisor_close(void *, int);
 
_at__at_ -207,9 +221,10 _at__at_
 	struct usb_devno	uv_dev;
 	u_int16_t		uv_flags;
 #define PALM4	0x0001
+#define VISOR	0x0002
 };
 static const struct uvisor_type uvisor_devs[] = {
-	{{ USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_VISOR }, 0 },
+	{{ USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_VISOR }, VISOR },
 	{{ USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_TREO }, PALM4 },
 	{{ USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_TREO600 }, PALM4 },
 	{{ USB_VENDOR_PALM, USB_PRODUCT_PALM_M500 }, PALM4 },
_at__at_ -222,12 +237,13 _at__at_
 	{{ USB_VENDOR_PALM, USB_PRODUCT_PALM_TUNGSTEN_T }, PALM4 },
 	{{ USB_VENDOR_PALM, USB_PRODUCT_PALM_ZIRE }, PALM4 },
 	{{ USB_VENDOR_PALM, USB_PRODUCT_PALM_ZIRE31 }, PALM4 },
-	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40 }, 0 },
+	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40 }, PALM4 },
 	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_41 }, PALM4 },
 	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_S360 }, PALM4 },
 	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_NX60 }, PALM4 },
 	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_35 }, 0 },
 /*	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_25 }, PALM4 },*/
+	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_TJ37 }, PALM4 },
 };
 #define uvisor_lookup(v, p) ((const struct uvisor_type *)usb_lookup(uvisor_devs, v, p))
 
_at__at_ -252,6 +268,7 _at__at_
 	usbd_device_handle dev = uaa->device;
 	usbd_interface_handle iface;
 	usb_interface_descriptor_t *id;
+	union connection_info coninfo;
 	usb_endpoint_descriptor_t *ed;
 	char *devinfo;
 	const char *devname;
_at__at_ -295,33 +312,87 _at__at_
 
 	sc->sc_flags = uvisor_lookup(uaa->vendor, uaa->product)->uv_flags;
 
+	if ((sc->sc_flags & (VISOR | PALM4)) == 0) {
+		printf("%s: init failed, device type is not visor/palm\n", 
+		    devname);
+		goto bad;
+	}
+
 	id = usbd_get_interface_descriptor(iface);
 
 	ucom->sc_udev = dev;
 	ucom->sc_iface = iface;
 
 	ucom->sc_bulkin_no = ucom->sc_bulkout_no = -1;
-	for (i = 0; i < id->bNumEndpoints; i++) {
-		int addr, dir, attr;
-		ed = usbd_interface2endpoint_descriptor(iface, i);
-		if (ed == NULL) {
-			printf("%s: could not read endpoint descriptor"
-			       ": %s\n", devname, usbd_errstr(err));
-			goto bad;
+	ucom->sc_parent = sc;
+	ucom->sc_portno = UCOM_UNK_PORTNO;
+	ucom->sc_ibufsize = UVISORIBUFSIZE;
+	ucom->sc_obufsize = UVISOROBUFSIZE;
+	ucom->sc_ibufsizepad = UVISORIBUFSIZE;
+	ucom->sc_opkthdrlen = 0;
+	ucom->sc_callback = &uvisor_callback;
+
+	err = uvisor_init(sc, &coninfo);
+	if (err) {
+		printf("%s: init failed, %s\n", USBDEVNAME(ucom->sc_dev),
+		       usbd_errstr(err));
+		goto bad;
+	}
+
+	if (sc->sc_flags & VISOR) {
+		for (i = 0; i < id->bNumEndpoints; i++) {
+			int addr, dir, attr;
+			ed = usbd_interface2endpoint_descriptor(iface, i);
+			if (ed == NULL) {
+				printf("%s: could not read endpoint descriptor"
+				       ": %s\n", devname, usbd_errstr(err));
+				goto bad;
+			}
+
+			addr = ed->bEndpointAddress;
+			dir = UE_GET_DIR(ed->bEndpointAddress);
+			attr = ed->bmAttributes & UE_XFERTYPE;
+			if (dir == UE_DIR_IN && attr == UE_BULK)
+				ucom->sc_bulkin_no = addr;
+			else if (dir == UE_DIR_OUT && attr == UE_BULK)
+				ucom->sc_bulkout_no = addr;
+			else {
+				printf("%s: unexpected endpoint\n", devname);
+				goto bad;
+			}
 		}
+	} else {
+		int nc = coninfo.ci_palm.num_ports;
+		int port;
 
-		addr = ed->bEndpointAddress;
-		dir = UE_GET_DIR(ed->bEndpointAddress);
-		attr = ed->bmAttributes & UE_XFERTYPE;
-		if (dir == UE_DIR_IN && attr == UE_BULK)
-			ucom->sc_bulkin_no = addr;
-		else if (dir == UE_DIR_OUT && attr == UE_BULK)
-			ucom->sc_bulkout_no = addr;
-		else {
-			printf("%s: unexpected endpoint\n", devname);
-			goto bad;
+		if (nc > UVISOR_MAX_CONN)
+			nc = UVISOR_MAX_CONN;
+
+#if 0
+		/* XXX Should attach a ucom for each connection. */
+		for (i = 0; i < nc; ++i)
+			/* port_function_id: "cnys", "_ppp", ... */;
+		if (i == nc)
+			i = nc - 1;
+#else
+		i = 0;
+#endif
+		ucom->sc_portno = i;
+		/* 
+		 * XXX this should copy out 4-char string from the 
+		 * XXX port_function_id, but where would the string go?
+		 */
+		if (coninfo.ci_palm.endpoint_numbers_different) {
+			port = coninfo.ci_palm.connections[i].end_point_info;
+			ucom->sc_bulkin_no = (port >> 4) | UE_DIR_IN;
+			ucom->sc_bulkout_no = (port & 0xf) | UE_DIR_OUT;
+		} else {
+			port = coninfo.ci_palm.connections[i].port;
+			ucom->sc_bulkin_no = port | UE_DIR_IN;
+			ucom->sc_bulkout_no = port | UE_DIR_OUT;
 		}
 	}
+
 	if (ucom->sc_bulkin_no == -1) {
 		printf("%s: Could not find data bulk in\n",
 		       USBDEVNAME(ucom->sc_dev));
_at__at_ -333,27 +404,6 _at__at_
 		goto bad;
 	}
 
-	ucom->sc_parent = sc;
-	ucom->sc_portno = UCOM_UNK_PORTNO;
-	/* bulkin, bulkout set above */
-	ucom->sc_ibufsize = UVISORIBUFSIZE;
-	ucom->sc_obufsize = UVISOROBUFSIZE;
-	ucom->sc_ibufsizepad = UVISORIBUFSIZE;
-	ucom->sc_opkthdrlen = 0;
-	ucom->sc_callback = &uvisor_callback;
-
-	if (uaa->vendor == USB_VENDOR_SONY &&
-	    uaa->product == USB_PRODUCT_SONY_CLIE_35)
-		err = clie_3_5_init(sc);
-	else
-		err = uvisor_init(sc);
-
-	if (err) {
-		printf("%s: init failed, %s\n", USBDEVNAME(ucom->sc_dev),
-		       usbd_errstr(err));
-		goto bad;
-	}
-
 	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, ucom->sc_udev,
 			   USBDEV(ucom->sc_dev));
 
_at__at_ -408,36 +458,41 _at__at_
 }
 
 usbd_status
-uvisor_init(struct uvisor_softc *sc)
+uvisor_init(struct uvisor_softc *sc, union connection_info *ci)
 {
 	usbd_status err;
 	usb_device_request_t req;
-	struct uvisor_connection_info coninfo;
 	int actlen;
 	uWord avail;
-	char buffer[256];
 
 	DPRINTF(("uvisor_init: getting connection info\n"));
-	req.bmRequestType = UT_READ_VENDOR_ENDPOINT;
-	req.bRequest = UVISOR_GET_CONNECTION_INFORMATION;
-	USETW(req.wValue, 0);
-	USETW(req.wIndex, 0);
-	USETW(req.wLength, UVISOR_CONNECTION_INFO_SIZE);
-	err = usbd_do_request_flags(sc->sc_ucom.sc_udev, &req, &coninfo,
-				    USBD_SHORT_XFER_OK, &actlen,
-				    USBD_DEFAULT_TIMEOUT);
-	if (err)
-		return (err);
 
+	/*
+	 * XXX
+	 * For Visor, we should be attaching every port, or at least what
+	 * we know is the HotSync port.
+	 */
+	if (sc->sc_flags & VISOR) {
 #ifdef USB_DEBUG
-	{
 		int i, np;
 		char *string;
+#endif
 
-		np = UGETW(coninfo.num_ports);
+		req.bmRequestType = UT_READ_VENDOR_ENDPOINT;
+		req.bRequest = UVISOR_GET_CONNECTION_INFORMATION;
+		USETW(req.wValue, 0);
+		USETW(req.wIndex, 0);
+		USETW(req.wLength, UVISOR_CONNECTION_INFO_SIZE);
+		err = usbd_do_request_flags(sc->sc_ucom.sc_udev, &req,
+		    &ci->ci_visor, USBD_SHORT_XFER_OK, &actlen,
+		    USBD_DEFAULT_TIMEOUT);
+		if (err)
+			return (err);
+#ifdef USB_DEBUG
+		np = UGETW(ci->ci_visor.num_ports);
 		printf("%s: Number of ports: %d\n", USBDEVNAME(sc->sc_ucom.sc_dev), np);
 		for (i = 0; i < np; ++i) {
-			switch (coninfo.connections[i].port_function_id) {
+			switch (ci->ci_visor.connections[i].port_function_id) {
 			case UVISOR_FUNCTION_GENERIC:
 				string = "Generic";
 				break;
_at__at_ -455,28 +510,19 _at__at_
 				break;
 			}
 			printf("%s: port %d, is for %s\n",
-			    USBDEVNAME(sc->sc_ucom.sc_dev), coninfo.connections[i].port,
+			    USBDEVNAME(sc->sc_ucom.sc_dev), ci->ci_visor.connections[i].port,
 			    string);
 		}
-	}
 #endif
-
-	if (sc->sc_flags & PALM4) {
-		/* Palm OS 4.0 Hack */
+	} else {
 		req.bmRequestType = UT_READ_VENDOR_ENDPOINT;
 		req.bRequest = UVISOR_GET_PALM_INFORMATION;
 		USETW(req.wValue, 0);
 		USETW(req.wIndex, 0);
 		USETW(req.wLength, UVISOR_GET_PALM_INFORMATION_LEN);
-		err = usbd_do_request(sc->sc_ucom.sc_udev, &req, buffer);
-		if (err)
-			return (err);
-		req.bmRequestType = UT_READ_VENDOR_ENDPOINT;
-		req.bRequest = UVISOR_GET_PALM_INFORMATION;
-		USETW(req.wValue, 0);
-		USETW(req.wIndex, 0);
-		USETW(req.wLength, UVISOR_GET_PALM_INFORMATION_LEN);
-		err = usbd_do_request(sc->sc_ucom.sc_udev, &req, buffer);
+		err = usbd_do_request_flags(sc->sc_ucom.sc_udev, &req,
+		    &ci->ci_palm, USBD_SHORT_XFER_OK, &actlen,
+		    USBD_DEFAULT_TIMEOUT);
 		if (err)
 			return (err);
 	}
_at__at_ -496,76 +542,6 _at__at_
 	return (err);
 }
 
-usbd_status
-clie_3_5_init(struct uvisor_softc *sc)
-{
-	usbd_status err;
-	usb_device_request_t req;
-	char buffer[256];
-
-	/*
-	 * Note that PEG-300 series devices expect the following two calls.
-	 */
-
-	/* get the config number */
-	DPRINTF(("clie_3_5_init: getting config info\n"));
-	req.bmRequestType = UT_READ;
-	req.bRequest = UR_GET_CONFIG;
-	USETW(req.wValue, 0);
-	USETW(req.wIndex, 0);
-	USETW(req.wLength, 1);
-	err = usbd_do_request(sc->sc_ucom.sc_udev, &req, buffer);
-	if (err)
-		return (err);
-
-	/* get the interface number */
-	DPRINTF(("clie_3_5_init: get the interface number\n"));
-	req.bmRequestType = UT_READ_DEVICE;
-	req.bRequest = UR_GET_INTERFACE;
-	USETW(req.wValue, 0);
-	USETW(req.wIndex, 0);
-	USETW(req.wLength, 1);
-	err = usbd_do_request(sc->sc_ucom.sc_udev, &req, buffer);
-	if (err)
-		return (err);
-
-#ifdef USB_DEBUG
-	{
-		struct uvisor_connection_info coninfo;
-		int i, np;
-		char *string;
-
-		np = UGETW(coninfo.num_ports);
-		DPRINTF(("%s: Number of ports: %d\n", USBDEVNAME(sc->sc_ucom.sc_dev), np));
-		for (i = 0; i < np; ++i) {
-			switch (coninfo.connections[i].port_function_id) {
-			case UVISOR_FUNCTION_GENERIC:
-				string = "Generic";
-				break;
-			case UVISOR_FUNCTION_DEBUGGER:
-				string = "Debugger";
-				break;
-			case UVISOR_FUNCTION_HOTSYNC:
-				string = "HotSync";
-				break;
-			case UVISOR_FUNCTION_REMOTE_FILE_SYS:
-				string = "Remote File System";
-				break;
-			default:
-				string = "unknown";
-				break;	
-			}
-			DPRINTF(("%s: port %d, is for %s\n",
-			    USBDEVNAME(sc->sc_ucom.sc_dev), coninfo.connections[i].port,
-			    string));
-		}
-	}
-#endif
-
-	DPRINTF(("clie_3_5_init: done\n"));
-	return (err);
-}
-
 void
 uvisor_close(void *addr, int portno)
 {

-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green_at_FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\
Received on Fri Jul 02 2004 - 17:22:51 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:00 UTC