There is a solution for Usb hotplug issue? thanks
Il giorno domenica 12 maggio 2013 18:08:32 UTC+2, Andrew Henderson ha scritto: > > Hello all. I have been working on porting a project of mine ( > http://www.beaglesnes.org) from the BeagleBoard-xM over to the BeagleBone > Black. I am running a Linux kernel based on the am33x-v3.8 branch of > Robert Nelson's linux-dev GitHub project. It is similar to the kernel > built directly by the branch's build_kernel.sh script, but I've removed a > number of modules, unused file systems, etc. in order to make the kernel a > bit smaller. I use the toolchain fetched by the build_kernel.sh script to > build the kernel. The Linux distro underneath is an Ubuntu Quantal 12.10 > armhf. I'm using the v2013.04 u-boot release that I've built using an > arm-cortex_a8-linux-gnueabi cross-compiler toolchain (GCC 4.4.6) that I > built using crosstool-NG (v1.18.0). > > USB ERRORS: > > I have most of the issues worked out, but I'm still seeing some issues > with the USB subsystem on the board. I picked back through several > thousand messages in the Google group, but I did not see my particular > issue addressed. I will occasionally see the BBB refuse to enumerate an > HID gamepad plugged into the USB1 Host port with the following error: > > usb 1-1: device descriptor read/64, error -110 > > My research has shown that a 110 error refers to being unable to enumerate > the USB device because power is exceeded. I'm not sure why this would be > the case, since I am using a 5V power supply, rather than supplying power > via USB. The gamepad being plugged into the Host port should not be > drawing a lot of power. The odd thing is that the -110 error will occur > after multiple power cycles in a row, but then disappear. At that point, > plugging in the gamepad will work fine for several more power cycles (the > USB device will enumerate and be properly identified). There doesn't seem > to be any rhyme or reason to it. It doesn't matter if the board is hot or > cold, if the reset button is pressed or not at the last power cycle, etc. > I'll just get a string of either "working" or "not working" for the USB > device enumeration. > > I have tried playing with the kernel configuration a bit to see if I might > be able to remove this problem. I tried removing EHCI support to force the > gamepad to be enumerated as a USB 1.1 device, since my research has shown > that going from USB 2.0 to 1.1 will reduce power usage for some devices. > No luck there. I also reviewed the patches currently in the GitHub > repository, but the closest one that I could see that might effect this is > the patch usb/0011-ARM-OMAP-am335x-musb-use-250-for-power.patch. I didn't > see anything in the AM3359A errata that relates to this, either. > > Any suggestions? Has anyone seen something similar? Are there any known > work-arounds? > > HOTPLUG WORK-AROUND: > > Some of you might have already seen something similar to this, but I > figure that it wouldn't hurt to share my approach on it. My application > (BeagleSNES) supports the hotplugging of USB gamepads on the BB-xM, so I've > added support for this in userspace in my BBB port. My review of > the usb/0009-MUSB-Hack-around-to-make-host-port-to-work.patch showed a > comment of "After removing the device, issue lsusb to cause it to scan > the bus again." Using lsusb doesn't work for me, but "cat > /dev/bus/usb/001/001 > /dev/null" does. If I unplug the gamepad, plug it > back in, and then issue that shell command, an ls of "/dev/bus/usb/001" > will show that the gamepad has been enumerated again. I do this > programmatically in my code using the following process: > > 1. I perform a "cat /dev/bus/usb/001/001 > /dev/null" in the launch script > for my app (called from rc.local) to scan the bus prior to start. > 2. In my application, I poll once per second or so via readlink() on the > file /dev/input/by-path/platform-musb-hdrc.1.auto-usb-0:1:1.0-joystick to > see if the gamepad is plugged in. > 3. If it is plugged in, I make a note of it, open the proper /dev/jsX > file, and interact with the gamepad. > 4. If the gamepad has been unplugged (i.e. readlink() fails), I do the > following: > > int usbFD, usbCount; > char buffer[1024]; > sleep(2); /* Give the kernel time to sync up (a sync() also works here, > but is overkill) */ > /* Force a read of the USB bus to emulate hotplugging */ > usbFD = open("/dev/bus/usb/001/001", O_RDONLY); > while((usbCount = read(usbFD, buffer, 1024)) > 0); > close(usbFD); > > > 5. After this, I go back to the regular readlink() polling. If a gamepad > poll now has a successful readlink(), a gamepad has been plugged back in. > Open it via /dev/jsX (whatever device the readlink() points to) and > continue on. > > This addresses the hotplugging issue for me, but I happen to know the > exact USB file to look for and I know which bus to force a rescan on. > There is also the 2 second delay that occurs when a gamepad is unplugged, > but this is a relatively rare occurrence, so the delay is acceptable for my > purposes (better than having no gamepad at all after it gets unplugged, > anyway). > > Andrew > > -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.