[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;