Date: Sun, 07 Apr 2013 09:04:27 +0200 From: Hans Petter Selasky <hps@bitfrost.no> To: Oleksandr Tymoshenko <gonzo@bluezbox.com> Cc: arm@freebsd.org, usb@freebsd.org Subject: Re: Beaglebone USB driver (Mentor Graphics OTG) Message-ID: <51611A7B.2010105@bitfrost.no> In-Reply-To: <51608AA4.2020804@bluezbox.com> References: <51608AA4.2020804@bluezbox.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 04/06/13 22:50, Oleksandr Tymoshenko wrote: > Hello, > > This is first iteration of Host Mode support for Mentor Graphics > OTG USB controller. I tested it by building kernel with USB memory > stick mounted as /usr/obj, resulting kernel was bootable and worked fine. > I reused some ideas (mostly for channel-management) from > DWT OTG driver. > > Some pieces are still missing: > - Support for SPLIT transactions, I don not have high speed hub > right now to test it, but implementing it should be really > straighforward. > - Isochronous transfers. I do not have hardware to test this. Does > anybody have any suggestion about simple use case? > - Control Data OUT transaction > - Wrapper for atmel HW has not ben synced with new core logic requirements > yet > > Please review and test. I tested it only with gcc-built kernel/world. > Now when > first iteration is finished I'm going to update all my boards to new > world order > (clang/EABI) and re-test this stuff. > > Patch: > http://people.freebsd.org/~gonzo/arm/patches/beaglebone-musb.diff Hi, Looks like you've got the grasp of the USB controller stuff :-) Some comments: 1) Use DPRINTFN(-1, ...) instead of printf() for all printf() that are not part of boot dmesg. + break; + default: + td->transfer_type = 0; + printf("Invalid USB speed: %d\n", speed); + break; + } 2) You should implement if HOST mode, support for SUSPEND and RESUME. See EHCI driver. Basically what you need is: a) USB transfers are stopped/paused. I know there is a hack you need if the host transfer cancel hangs, and that is to write a dummy device address and wait for the USB transfer to error out after 250 us max. b) switch on USB suspend signalling. At resume: c) do resume signalling, similar to EHCI/UHCI I think. d) switch on channel tokens. case UHF_PORT_SUSPEND: + if (sc->sc_mode == MUSB2_HOST_MODE) + printf("TODO: Set UHF_PORT_SUSPEND\n"); + break; 3) Make sure that channels are not generating tokens if they are aborted / cancelled / timedout. This can not be verified using a USB mass storage device. Verify this by connecting a USB serial adapter. Try to open/close /dev/cuaU0. Make sure it does not loose any bytes and that channel cancel does not hang forever. --HPS
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51611A7B.2010105>