[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

usb uvisor diff (PALM4 support)



If you use the uvisor driver for the handspring visor, or if you have a
Palm4 device and would like to try the uvisor driver, please test this
diff.

  Nathan

Index: dev/usb/uvisor.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uvisor.c,v
retrieving revision 1.3
diff -u -r1.3 uvisor.c
--- dev/usb/uvisor.c	3 May 2001 02:20:35 -0000	1.3
+++ dev/usb/uvisor.c	6 May 2002 05:52:46 -0000
@@ -1,5 +1,5 @@
 /*	$OpenBSD: uvisor.c,v 1.3 2001/05/03 02:20:35 aaron Exp $	*/
-/*	$NetBSD: uvisor.c,v 1.11 2001/01/23 21:56:17 augustss Exp $	*/
+/*	$NetBSD: uvisor.c,v 1.14 2002/02/27 23:00:03 augustss Exp $	*/

 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -104,7 +104,6 @@
 };
 #define UVISOR_CONNECTION_INFO_SIZE 18

-
 /* struct uvisor_connection_info.connection[x].port_function_id defines: */
 #define UVISOR_FUNCTION_GENERIC		0x00
 #define UVISOR_FUNCTION_DEBUGGER	0x01
@@ -112,6 +111,12 @@
 #define UVISOR_FUNCTION_CONSOLE		0x03
 #define UVISOR_FUNCTION_REMOTE_FILE_SYS	0x04

+/*
+ * Unknown PalmOS stuff.
+ */
+#define UVISOR_GET_PALM_INFORMATION		0x04
+#define UVISOR_GET_PALM_INFORMATION_LEN		0x14
+

 #define UVISORIBUFSIZE 1024
 #define UVISOROBUFSIZE 1024
@@ -124,6 +129,8 @@
 	device_ptr_t		sc_subdevs[UVISOR_MAX_CONN];
 	int			sc_numcon;

+	u_int16_t		sc_flags;
+
 	u_char			sc_dying;
 };

@@ -144,6 +151,21 @@
 	NULL,
 };

+struct uvisor_type {
+	struct usb_devno	uv_dev;
+	u_int16_t		uv_flags;
+#define PALM4	0x0001
+};
+static const struct uvisor_type uvisor_devs[] = {
+	{{ USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_VISOR }, 0 },
+	{{ USB_VENDOR_PALM, USB_PRODUCT_PALM_M500 }, PALM4 },
+	{{ USB_VENDOR_PALM, USB_PRODUCT_PALM_M505 }, PALM4 },
+	{{ USB_VENDOR_PALM, USB_PRODUCT_PALM_M125 }, PALM4 },
+	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40 }, PALM4 },
+/*	{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_25 }, PALM4 },*/
+};
+#define uvisor_lookup(v, p) ((struct uvisor_type *)usb_lookup(uvisor_devs, v, p))
+
 USB_DECLARE_DRIVER(uvisor);

 USB_MATCH(uvisor)
@@ -156,11 +178,8 @@
 	DPRINTFN(20,("uvisor: vendor=0x%x, product=0x%x\n",
 		     uaa->vendor, uaa->product));

-	if (uaa->vendor == USB_VENDOR_HANDSPRING &&
-	    uaa->product == USB_PRODUCT_HANDSPRING_VISOR)
-		return (UMATCH_VENDOR_PRODUCT);
-
-	return (UMATCH_NONE);
+	return (uvisor_lookup(uaa->vendor, uaa->product) != NULL ?
+		UMATCH_VENDOR_PRODUCT : UMATCH_NONE);
 }

 USB_ATTACH(uvisor)
@@ -198,6 +217,8 @@
 	USB_ATTACH_SETUP;
 	printf("%s: %s\n", devname, devinfo);

+	sc->sc_flags = uvisor_lookup(uaa->vendor, uaa->product)->uv_flags;
+
 	id = usbd_get_interface_descriptor(iface);

 	sc->sc_udev = dev;
@@ -330,6 +351,7 @@
 	usb_device_request_t req;
 	int actlen;
 	uWord avail;
+	char buffer[256];

 	DPRINTF(("uvisor_init: getting connection info\n"));
 	req.bmRequestType = UT_READ_VENDOR_ENDPOINT;
@@ -341,6 +363,26 @@
 				    USBD_SHORT_XFER_OK, &actlen);
 	if (err)
 		return (err);
+
+	if (sc->sc_flags & PALM4) {
+		/* Palm OS 4.0 Hack */
+		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_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_udev, &req, buffer);
+		if (err)
+			return (err);
+	}

 	DPRINTF(("uvisor_init: getting available bytes\n"));
 	req.bmRequestType = UT_READ_VENDOR_ENDPOINT;