Skip site navigation (1)Skip section navigation (2)
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>