Sony Clie PEG-TJ37 vs. FreeBSD CURRENT (long)
Brian Fundakowski Feldman
green at freebsd.org
Fri Jul 2 12:22:51 PDT 2004
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
@@ -1230,6 +1230,7 @@
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
@@ -142,8 +142,24 @@
* 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
@@ -163,9 +179,7 @@
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);
@@ -207,9 +221,10 @@
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 },
@@ -222,12 +237,13 @@
{{ 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))
@@ -252,6 +268,7 @@
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;
@@ -295,33 +312,87 @@
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));
@@ -333,27 +404,6 @@
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));
@@ -408,36 +458,41 @@
}
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;
@@ -455,28 +510,19 @@
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);
}
@@ -496,76 +542,6 @@
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. \,,,,,,,,,,,,,,,,,,,,,,\
More information about the freebsd-current
mailing list