Subject: USB OHCI device port on Alchemy

From: Jeff Baitis <[email-masked]>
Date: Wed, 7 May 2003 20:31:27 -0700

Out of curiousity:

Has anyone played with the AU1X00 USB device port yet? If not, what would you
guys suggest that the AU1X00 appear as? USB over Ethernet? Or maybe a simple
dummy device that will perform bulk transfers?

Thanks!

-Jeff

-- 
         Jeffrey Baitis - Associate Software Engineer

                    Evolution Robotics, Inc.
                     130 West Union Street
                       Pasadena CA 91103

 tel: 626.535.2776  |  fax: 626.535.2777  |  [email-masked]

---

From: Yasushi SHOJI <[email-masked]>
Date: Thu, 08 May 2003 15:53:34 +0900

At Wed, 7 May 2003 20:31:27 -0700,
> dummy device that will perform bulk transfers?

there are au1000_usbraw.c and au1000_usbtty.c in linux-mips.org's CVS
under drivers/char.

I'd be excited to see usb storage driver for usb device.

as a related topic, does anyone know how usb gadget api is coming? I'm
assuming that once usb gadget stabilized and people start using it,
we'll be converting au1's usb dev driver to gadget api, no?

or people already working on it?
--
      yashi

---

From: Pete Popov <[email-masked]>
Date: 08 May 2003 10:40:29 -0700

> dummy device that will perform bulk transfers?

Steve wrote it, tried, knows all about it :)

Pete

---

From: Jeff Baitis <[email-masked]>
Date: Thu, 8 May 2003 14:14:58 -0700

Ah, thanks Yashi, I didn't notice this since I was looking in the USB driver
directories ;)

Steve:

The option seems to be inactive in the kernel config; maybe this patch should
be applied? Or is there a reason why this option is inaccessible?

Thanks,

Jeff

Index: Config.in
===================================================================
RCS file: /home/cvs/linux/drivers/char/Attic/Config.in,v
retrieving revision 1.72.2.28
diff -u -r1.72.2.28 Config.in
--- Config.in   23 Apr 2003 00:23:24 -0000     1.72.2.28
+++ Config.in   8 May 2003 21:13:05 -0000
@@ -91,10 +91,11 @@
         if [ "$CONFIG_AU1X00_UART" = "y" ]; then
            bool '        Enable Au1x00 serial console' CONFIG_AU1X00_SERIAL_CONSOLE
          fi
+     bool '  Enable Au1x00 USB Device Support' CONFIG_AU1X00_USB_DEVICE
         if [ "$CONFIG_AU1X00_USB_DEVICE" = "y" ]; then
-           dep_tristate '  Au1x00 USB TTY Device support' CONFIG_AU1X00_USB_TTY $CONFIG_AU1X00_USB_DEVICE
+           dep_tristate '        Au1x00 USB TTY Device support' CONFIG_AU1X00_USB_TTY $CONFIG_AU1X00_USB_DEVICE
            if [ "$CONFIG_AU1000_USB_TTY" != "y" ]; then
-              dep_tristate '  Au1x00 USB Raw Device support' CONFIG_AU1X00_USB_RAW $CONFIG_AU1X00_USB_DEVICE
+              dep_tristate '        Au1x00 USB Raw Device support' CONFIG_AU1X00_USB_RAW $CONFIG_AU1X00_USB_DEVICE
            fi
          fi
       fi

                    Evolution Robotics, Inc.
                     130 West Union Street
                       Pasadena CA 91103

---

From: Steve Longerbeam <[email-masked]>
Date: Thu, 08 May 2003 14:21:28 -0700

>Steve wrote it, tried, knows all about it :)

Hi Jeff,

Ok, so there's more interest in this driver than I expected, so I guess
it's high time I write some docs for it under Documentation/mips
somewhere.

In the meantime, attached are some instructions on how to use the TTY
function driver.

In answer to your questions, there is no USB over ethernet function
driver. But I did write a "raw" function driver that simply presents
a bulk IN and bulk OUT endpoint for raw bulk data transfer. I will
write up some instructions on that as well.

Steve

-- 
Steve Longerbeam
MontaVista Software, Inc.
office:408-328-9008, fax:408-328-3875
http://www.mvista.com

Instructions for using the Au1x00 USB TTY Function driver
---------------------------------------------------------

Note: These instructions assume the use of a Pb1500 reference board
(Au1500) but should work with the Pb1000, Pb1100, and Db1x00
boards as well (but is untested on these boards).

Follow these steps:

1.   cp arch/mips/configs/defconfig-pb1500 .config
     make oldconfig
     make menuconfig
     (enable 'Au1000 USB TTY Device support' under char devices as built-in).
     make dep; make
     mips_fp_le-objcopy -O srec vmlinux /tftpboot/vmlinux.s3

2. Now you have a kernel with the Au1x00 USB device TTY driver
   support built-in. Boot a Pb1500 with this kernel.

3. Now you have a choice, you can use a PC as the USB host,
   or a Pb1x00. I have used both a PC and two Pb1500s side-by-side,
   one as the USB host and one as the TTY device. Remember that
   if you use another Pb1000/Pb1500 as the USB host, you'll need
   seperate NFS servers to provide two completely seperate root
   filesystems.

4. On the USB host, enable usbserial generic support as a module. Under
   "USB support -->", go to "USB Serial Converter support  --->" and
   enable "USB Serial Converter support" as a module, then enable
   "USB Generic Serial Driver".
   
5. Install the usbserial module on the host:

     insmod usbserial vendor=0x6d04 product=0x0bc0

6. Make sure you've got the usb TTY nodes on your host:

     mknod /dev/ttyUSB0 c 188 0
     mknod /dev/ttyUSB1 c 188 1

7. On the USB device, make the usb TTY device nodes:

     mknod /dev/ttyUSBdev0 c 189 0
     mknod /dev/ttyUSBdev1 c 189 1

8. Now you should be ready to connect host to device. You can
    tail -f /var/log/kern.log on both sides to watch the progress of
    communication on the control endpoint 0. When the device is
    configured, you should see something about "usbserial attached"
    on the host, and:

Jan  1 00:01:31 10 kernel: usbdev.c: do_setup: req 9 SET_CONFIGURATION
Jan  1 00:01:31 10 kernel: usbdev.c: set config, config=1

    on the device.

9. Now you can try actually communicating over the TTY ports. Try
    running minicom on both sides, the host minicom opens
    /dev/ttyUSB0, the device minicom opens /dev/ttyUSBdev0. Type
    into either minicom window and you should see the characters
    appear on the other side.

10. Try starting a getty login process on either side. On the host:

     getty ttyUSB0 &

     and on the device:

     getty ttyUSBdev0 &

     You should then see a login prompt in minicom on the opposite
     sides.

11. Try echoing strings to the other side:

     echo hello world > /dev/ttyUSB0    # hello world should appear in minicom on device-side

     echo hello world > /dev/ttyUSBdev0    # hello world should appear in minicom on host-side

12. You can try the above minicom/getty/echo tests on port 1, but last
    I checked, endpoints 4 and 5 (which make up port 1) were still
    having problems.

---

From: Steve Longerbeam <[email-masked]>
Date: Thu, 08 May 2003 14:31:16 -0700

>be applied? Or is there a reason why this option is inaccessible?

Jeff, Yashi:

I wrote a similar patch to Yashi's. I've attached it.

Pete: have you applied this to linux-mips yet?

>>we'll be converting au1's usb dev driver to gadget api, no?

This is the first time I've heard of the gadget api, but I'd love to 
port the
au1x00 usb dev driver to a full-featured device-side protocol stack, as soon
as the community agrees on one.

When I wrote this driver, I implemented my own, very limited, device and
function api, as there still wasn't an accepted device-side api. But 
sounds like
maybe that will finally happen.

Steve

Index: arch/mips/config.in
===================================================================
RCS file: /cvsdev/mvl-kernel/linux/arch/mips/config.in,v
retrieving revision 1.20.2.15
diff -u -r1.20.2.15 config.in
--- arch/mips/config.in	19 Feb 2003 11:34:46 -0000	1.20.2.15
+++ arch/mips/config.in	29 Apr 2003 21:56:12 -0000
@@ -391,7 +391,6 @@
    define_bool CONFIG_NONCOHERENT_IO y
    define_bool CONFIG_PC_KEYB y
    define_bool CONFIG_SWAP_IO_SPACE y
-   define_bool CONFIG_AU1000_USB_DEVICE y
 fi
 if [ "$CONFIG_MIPS_PB1500" = "y" ]; then
    define_bool CONFIG_MIPS_AU1000 y
Index: drivers/char/Config.in
===================================================================
RCS file: /cvsdev/mvl-kernel/linux/drivers/char/Config.in,v
retrieving revision 1.14.4.11
diff -u -r1.14.4.11 Config.in
--- drivers/char/Config.in	26 Mar 2003 03:51:58 -0000	1.14.4.11
+++ drivers/char/Config.in	29 Apr 2003 21:56:23 -0000
@@ -71,9 +71,13 @@
      if [ "$CONFIG_AU1000_UART" = "y" ]; then
          bool '        Enable Au1000 serial console' CONFIG_AU1000_SERIAL_CONSOLE
      fi
-     dep_tristate '  Au1000 USB TTY Device support' CONFIG_AU1000_USB_TTY $CONFIG_AU1000_USB_DEVICE
+     dep_tristate '  Au1000 USB TTY Device support' CONFIG_AU1000_USB_TTY $CONFIG_MIPS_AU1000
      if [ "$CONFIG_AU1000_USB_TTY" != "y" ]; then
-        dep_tristate '  Au1000 USB Raw Device support' CONFIG_AU1000_USB_RAW $CONFIG_AU1000_USB_DEVICE
+        dep_tristate '  Au1000 USB Raw Device support' CONFIG_AU1000_USB_RAW $CONFIG_MIPS_AU1000
+     fi
+     if [ "$CONFIG_AU1000_USB_TTY" != "n" -o \
+          "$CONFIG_AU1000_USB_RAW" != "n" ]; then
+	define_bool CONFIG_AU1000_USB_DEVICE y
      fi
      bool 'TXx927 SIO support' CONFIG_TXX927_SERIAL 
      if [ "$CONFIG_TXX927_SERIAL" = "y" ]; then

---

From: Jeff Baitis <[email-masked]>
Date: Thu, 8 May 2003 16:41:34 -0700

All:

Steve's patch includes some configuration options that I missed. Make sure you
use his, not mine.

Sorry to cause confusion. I put his down below.

Thanks!

-Jeff

                    Evolution Robotics, Inc.
                     130 West Union Street
                       Pasadena CA 91103

---

From: Pete Popov <[email-masked]>
Date: 08 May 2003 16:43:46 -0700

I'll check it in later.

Pete

---

From: Brad Parker <[email-masked]>
Date: Fri, 09 May 2003 09:37:14 -0400

>> dummy device that will perform bulk transfers?

I'm surprised no one has mentioned all the bugs :-)

Just so you know, the function side controller (i.e. "device") on the
au1100 is/was seriously buggy.  The folks at AMD are (or were) working
on a fix.  It was possible to get it to work, but it was very painful.

I don't remember the details of the chip revs, but as I recall all of
the au1100 parts which had been released as of the end of last year had
these bugs.

[fyi: the folks at Belcarra have done a lot of work on this problem and
know it well]

The ohci controller (i.e. "host") works fine, as far as I know, for all
modes (interrupt, bulk, isochronous).

-brad