summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsanpei <sanpei@FreeBSD.org>2004-01-03 15:30:11 +0000
committersanpei <sanpei@FreeBSD.org>2004-01-03 15:30:11 +0000
commit5f77b81086fc8dd6f6d4c1533330e0e15eb37697 (patch)
tree4373228c443213c4451171e2a64689647284e763
parent527f2194f416d6060af087abe9cb01557aee3b0c (diff)
downloadFreeBSD-src-5f77b81086fc8dd6f6d4c1533330e0e15eb37697.zip
FreeBSD-src-5f77b81086fc8dd6f6d4c1533330e0e15eb37697.tar.gz
Add support Sony CLIE PEG-S500C(Palm OS 3.5)
Submitted by: Hiroaki Satoh <hsato@iwate-u.ac.jp> [FreeBSD-users-jp 76073]
-rw-r--r--sys/dev/usb/uvisor.c80
1 files changed, 79 insertions, 1 deletions
diff --git a/sys/dev/usb/uvisor.c b/sys/dev/usb/uvisor.c
index d82cd54..0913bb2 100644
--- a/sys/dev/usb/uvisor.c
+++ b/sys/dev/usb/uvisor.c
@@ -164,6 +164,8 @@ struct uvisor_softc {
Static usbd_status uvisor_init(struct uvisor_softc *);
+Static usbd_status clie_3_5_init(struct uvisor_softc *);
+
Static void uvisor_close(void *, int);
struct ucom_callback uvisor_callback = {
@@ -221,6 +223,7 @@ static const struct uvisor_type uvisor_devs[] = {
{{ USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_41 }, 0 },
{{ 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 },*/
};
#define uvisor_lookup(v, p) ((const struct uvisor_type *)usb_lookup(uvisor_devs, v, p))
@@ -336,7 +339,12 @@ USB_ATTACH(uvisor)
ucom->sc_opkthdrlen = 0;
ucom->sc_callback = &uvisor_callback;
- err = uvisor_init(sc);
+ 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));
@@ -485,6 +493,76 @@ uvisor_init(struct uvisor_softc *sc)
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)
{
OpenPOWER on IntegriCloud