On Sat, 23 Nov 2002, Mark McClelland wrote: | Duncan Haldane wrote: | | >On 18-Nov-2002 Mark McClelland wrote: | > | > | >>Duncan Haldane wrote: | >> | >> >If two cameras are registered, one on /dev/video0 and one on /dev/video1, | >> >and I use e.g. xawtv or gqcam to monitor them, I cannot open /dev/video1 | >> >when /dev/video0 is open and vice-versa. This happens for two cpia | >> >devices and one cpia + one ov511 device.
This is when both devices are on the same USB host controller, right? Should be OK when they are on different host controllers. | >>That's because both cameras are trying to use nearly all of the USB's | >>bandwidth. Or, more precisely, each is trying to schedule an ISO packet Yes, there's really not enough bandwidth on one host controller for 2 USB cameras unless they are operating at low (video rectangle ?) size or low frame rates. | >Yes, this seems correct: I have now traced the problem to disruption of | >communication of commands to/from the cpia cam (ReadPacket() in cpia_usb.c/ | >cpia_usb_transferCmd()). This eventually causes de/re-registration of | >the camera, leaving a frozen viewer window that needs a reboot to clear | >it.... (incomplete cleanup ?) -- nasty. | > | | OK, that makes sense. I've seen that with ov511 too occasionally, but I | have yet to find the exact cause. | | >Is there any kind of locking that cpia_usb_transferCmd could use to | >temporarily grab the full usb bandwidth for camera control (so this takes | >precedence over data transfer by other devices?) | > | | Not that I know of. This issue was discussed briefly on linux-usb-devel | recently, but nothing came of it. (I'm CCing that list) None that I know of either. Duncan, why do you say "for camera control"? Is this still for isoc video data? | CONFIG_USB_BANDWIDTH might help if it can prevent the second camera from | submitting the ISO URB, but in my experience it causes more problems | than it solves. CONFIG_USB_BANDWIDTH is an incomplete implementation and needs to be reworked, as has been discussed several times. For now, I wouldn't recommend using it. | >At the very least I would hope to prevent hanging that requires a reboot!. | > | Agreed. I'm not sure why that happens, but I suspect the cpia driver is | at fault since lots of drivers have no problem with random disconnects. | It's possibly something to do with the synchronous calls (eg. | usb_control_msg()) being active when disconnect() gets called. There's | no solution to that currently, other than to use the async calls (ie. | usb_submit_urb()) and implement the necessary locking yourself. I'd also | check all of the codepaths that handle signals (eg. interrupted | syscalls), and check for function returns that don't drop all held | locks. I looked it over briefly, and nothing jumps out at me. | | If you can't find anything, put a ton of printks in disconnect() and | close() and see where it hangs :) | | <snip> | | >>Check the descriptors. As long as there's an alternate setting where | >>MxPS <= 1023 / 2 then you should be in business. You can either have the | >>packet size or alternate number be a module param, or you can do a | >>"cams" thing like ov511. Or, you can allow the frame rate to be set | >>somewhere, and have the driver automatically choose the minimum possible | >>packet size that can still sustain that frame rate. Oh yeah, about what I said above, but more precise. | >Mark, I attach a bzipped copy of cpia_usb.c, could you cast your experienced | >eye over it to see where a setting like this could be controlled, and point | >me at it? I gather that your ov511 code originally derived somewhat from | >cpia driver code, maybe you can recognize something? | > | My idea about auto-adjusting the alternate setting based on the | framerate is probably too difficult for a driver this complex, since | features like compression make it difficult to know the minimum | necessary bandwidth. I recommend doing what ov511 does instead (allow | user to input the number of cameras in /proc or as a module param, | determine a packet size based on that, and set the corresponding | alternate setting in cpia_usb_open()). That sounds reasonable. -- ~Randy ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel