Date: Mon, 3 Aug 2009 22:43:55 +0200 From: Marc Fonvieille <blackend@freebsd.org> To: Hans Petter Selasky <hselasky@freebsd.org> Cc: freebsd-usb@freebsd.org Subject: Re: uvisor(4) and Palm Z22 under 8.X Message-ID: <20090803204355.GA1996@gothic.blackend.org> In-Reply-To: <200908031332.38041.hselasky@freebsd.org> References: <20090728111131.GA1383@gothic.blackend.org> <200908031138.45877.hselasky@freebsd.org> <20090803110603.GB1230@gothic.blackend.org> <200908031332.38041.hselasky@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Mon, Aug 03, 2009 at 01:32:36PM +0200, Hans Petter Selasky wrote:
> Hi,
>
> I've tried to optimise the device upload path to 1.0 MByte/second. Download
> path is limited to wMaxPacketSize*1000 byte/second, due to the device not
> short terminating its data. Would require a special driver, maybe via libusb.
>
> Could you check upload and download speed?
>
The upload speed is fast and perfect, the download is still slow but
acceptable (in fact same as with my dirty buffer hacks)
I also tried with 2 other PDAs: a SONY Clié NR70V and one Handspring
Visor Platinum. I add to change one line to your patch to make the Sony
work (7.X had the same bug), see the attached patch. The Visor Platinum
refuses to works, well I don't really know how to make it run and I'm
not even sure it worked under 7.X, I used when 4.X was the stable
version...
Thanks a lot for your help (I still have many other USB devices lying
around so you may hear about me in future :)
--
Marc
[-- Attachment #2 --]
Index: uvisor.c
===================================================================
--- uvisor.c (revision 196052)
+++ uvisor.c (working copy)
@@ -95,8 +95,16 @@
#define UVISOR_CONFIG_INDEX 0
#define UVISOR_IFACE_INDEX 0
-#define UVISOR_BUFSIZE 1024 /* bytes */
+/*
+ * The following buffer sizes are hardcoded due to the way the Palm
+ * firmware works. It looks like the device is not short terminating
+ * the data transferred.
+ */
+#define UVISORIBUFSIZE 0 /* Use wMaxPacketSize */
+#define UVISOROBUFSIZE 32 /* bytes */
+#define UVISOROFRAMES 32 /* units */
+
/* From the Linux driver */
/*
* UVISOR_REQUEST_BYTES_AVAILABLE asks the visor for the number of bytes that
@@ -208,7 +216,8 @@
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
- .bufsize = UVISOR_BUFSIZE, /* bytes */
+ .bufsize = UVISOROBUFSIZE * UVISOROFRAMES,
+ .frames = UVISOROFRAMES,
.flags = {.pipe_bof = 1,.force_short_xfer = 1,},
.callback = &uvisor_write_callback,
},
@@ -217,7 +226,7 @@
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
- .bufsize = UVISOR_BUFSIZE, /* bytes */
+ .bufsize = UVISORIBUFSIZE,
.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
.callback = &uvisor_read_callback,
},
@@ -270,7 +279,7 @@
{USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_ZIRE31, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SAMSUNG, USB_PRODUCT_SAMSUNG_I500, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40, 0)},
- {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_41, UVISOR_FLAG_PALM4)},
+ {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_41, 0)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_S360, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_NX60, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_35, UVISOR_FLAG_PALM35)},
@@ -375,7 +384,6 @@
struct uvisor_connection_info coninfo;
struct uvisor_palm_connection_info pconinfo;
uint16_t actlen;
- uWord wAvail;
uint8_t buffer[256];
if (sc->sc_flag & UVISOR_FLAG_VISOR) {
@@ -496,6 +504,9 @@
goto done;
}
}
+#if 0
+ uWord wAvail;
+
DPRINTF("getting available bytes\n");
req.bmRequestType = UT_READ_VENDOR_ENDPOINT;
req.bRequest = UVISOR_REQUEST_BYTES_AVAILABLE;
@@ -507,6 +518,7 @@
goto done;
}
DPRINTF("avail=%d\n", UGETW(wAvail));
+#endif
DPRINTF("done\n");
done:
@@ -579,19 +591,31 @@
struct uvisor_softc *sc = usbd_xfer_softc(xfer);
struct usb_page_cache *pc;
uint32_t actlen;
+ uint8_t x;
switch (USB_GET_STATE(xfer)) {
case USB_ST_SETUP:
case USB_ST_TRANSFERRED:
tr_setup:
- pc = usbd_xfer_get_frame(xfer, 0);
- if (ucom_get_data(&sc->sc_ucom, pc, 0,
- UVISOR_BUFSIZE, &actlen)) {
+ for (x = 0; x != UVISOROFRAMES; x++) {
- usbd_xfer_set_frame_len(xfer, 0, actlen);
+ usbd_xfer_set_frame_offset(xfer,
+ x * UVISOROBUFSIZE, x);
+
+ pc = usbd_xfer_get_frame(xfer, x);
+ if (ucom_get_data(&sc->sc_ucom, pc, 0,
+ UVISOROBUFSIZE, &actlen)) {
+ usbd_xfer_set_frame_len(xfer, x, actlen);
+ } else {
+ break;
+ }
+ }
+ /* check for data */
+ if (x != 0) {
+ usbd_xfer_set_frames(xfer, x);
usbd_transfer_submit(xfer);
}
- return;
+ break;
default: /* Error */
if (error != USB_ERR_CANCELLED) {
@@ -599,7 +623,7 @@
usbd_xfer_set_stall(xfer);
goto tr_setup;
}
- return;
+ break;
}
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090803204355.GA1996>
