On Tue, 10 May 2005, Dmitri Kostioukov wrote:

>> You could add debugging to the Linux kernel to see if it's getting the 
>
>Can you tell me where to add those? I could simply work around this issue but I
>really want to get it fixed. 

By far, the easiest way is the USB trace machine, of course.  As far as 
the kernel, the layers are:

javax.usb (Java)
     |
     V
javax.usb JNI (C)
     |              user-space
_____|_________________________
     |             kernel-space
     V
usbfs interface (core/devio.c)
     |
     V
usb core subsystem (core/usb.c I think)
     |
     V
Host Controller generic layer (core/hcd.c)
     |
     V
Host Controller specific layer (host/* depending on specific HC hardware)
     |
     |             Host System
__(USB wire)____________________
     |             USB Device
     V
USB device firmware


The USB trace machine hook inline with the actual USB wire, so you see
exactly everything your device and the host see.  The best place to put
kernel debugging (to get the most info) is in the Host Controller specific
layer.  In there, there are max-packet-sized buffers called (I think...)
"td" (Transfer Descriptors, in UHCI) or "ed" (Endpoint Descriptors, in
OHCI and EHCI).  Debugging each of these "td"s or "ed"s will clearly tell 
you whether or not your device is sending a response.  Adding the 
debugging code will probably not be easy, as you need to know something 
about the protocols of the HCs and the design of the HC drivers.  And, 
there are a LOT (!) of "td"s or "ed"s that happen in normal operation.  I 
mean, a lot.

The HC generic layer might be an easier place to put the deubgging, but 
I'm not sure if you would miss anything that got "lost" in the HCD 
specific layer.  I mean, theoretically, nothing should be lost :)
Either the data flows up, or an error happens and that flows up.  Losing 
data is really bad of course.

If you put debugging higher than that, you might as well put it in the 
usbfs layer.  In that layer, the file you want is 
"drivers/usb/core/devio.c" and the specific methods you want are 
"proc_submiturb" (which takes your buffer and sends it to lower levels) 
and "async_completed" (which is the callback - in interrupt - that the 
lower levels call when the device returned data for your buffer).

I'd start with the usbfs layer, and see if it is getting the response you 
are missing.  If it's missing the response too, you may want to try the 
lower levels, but chances are, the device really isn't sending the 
response...



-- 
Dan Streetman
[EMAIL PROTECTED]
---------------------
186,272 miles per second:
It isn't just a good idea, it's the law!


-------------------------------------------------------
This SF.Net email is sponsored by Oracle Space Sweepstakes
Want to be the first software developer in space?
Enter now for the Oracle Space Sweepstakes!
http://ads.osdn.com/?ad_id=7393&alloc_id=16281&op=click
_______________________________________________
javax-usb-devel mailing list
javax-usb-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/javax-usb-devel

Reply via email to