USB host

From Openmoko

(Difference between revisions)
Jump to: navigation, search
(document power consumption)
(the USB port in host mode)
Line 1: Line 1:
== The Neo1973 as a USB host ==
+
== USB host ==
The Neo1973's mini-USB port can be configured to act as a usb host instead of a usb device. This opens up a range of possibilities, such as USB cameras and usb input devices.
+
The mini-USB port on both the Neo 1973 and the Neo FreeRunner supports both USB host and USB device. This opens up a range of possibilities, such as adding USB cameras and USB input devices.
  
This used to require a kernel patch provided [http://bugzilla.openmoko.org/cgi-bin/bugzilla/show_bug.cgi?id=876 as an attachment in Bugzilla], but that same page now details how to do this <i>without</i> any kernel hacking:
+
By default, the mini-USB port is in device mode. To tell the device that it is logically a host:
  
 +
echo "host" > /sys/devices/platform/s3c2410-ohci/usb_mode
  
Tell the device that it is logically a host:
+
Instruct the device to provide 5 volts (not available on Neo 1973):
  
  echo "host" > /sys/devices/platform/s3c2410-ohci/usb_mode
+
  echo "1" > /sys/devices/platform/neo1973-pm-host.0/hostmode
 +
 
 +
Note: You may want to run <code>ifconfig usb0 down</code> prior to switching to USB host mode, as the Neo's USB networking may not like having its USB port disappear. You'll probably want to ssh into your Neo over WiFi or Bluetooth before starting all of this, alternatively use an on screen keyboard.
 +
 
 +
=== Providing power to connected USB devices while in host mode ===
 +
 
 +
Normally, USB host ports provide power to any connected USB device. In the case of portable handheld devices, this power may be limited. (Usually the battery is sized to power the handheld device alone, and to maximize standby time.)
 +
 
 +
Available power in host mode is limited to 100mA on the Neo FreeRunner, and no power is available in host mode on the Neo 1973. If your USB devices consumes less than 100mA, you may connect it directly to your Neo FreeRunner.
 +
 
 +
If your USB device consumes more than 100mA, or if your Neo is a Neo 1973, you can provide power  by using a powered USB hub (see below), or by manually injecting power into the attached USB device via a modified USB cable (described further below).
 +
 
 +
=== Powered USB hubs known to work with the Neo ===
 +
 
 +
(please add any known to work)
 +
 
 +
=== Providing power to run and charge the Neo while in host mode ===
 +
 
 +
A slightly separate issue is power to run and charge the Neo itself. When the USB port is in device mode, the Neo can be powered and recharged via the USB port, but when in standard host mode, the Neo FreeRunner is set to provide power and does not charge. Fortunately, control of the direction of power (in or out) is independent of the personality of the USB port (host or device):
 +
 
 +
To recap, the direction of power can be controlled:
 +
 
 +
Set to 0 (default), no power is provided at the USB port, charging is enabled, and host 15K pulldowns are removed from D+ and D-:
 +
 
 +
echo "0" > /sys/devices/platform/neo1973-pm-host.0/hostmode
  
Instruct the device to provide 5 volts:
+
Set to 1, provides up to 100mA USB power at the USB port (FreeRunner only), disables charging from USB, and applies 15K pulldowns to USB D+ and D-:
  
 
  echo "1" > /sys/devices/platform/neo1973-pm-host.0/hostmode
 
  echo "1" > /sys/devices/platform/neo1973-pm-host.0/hostmode
  
 +
Next, power must somehow be injected. A powered USB hub only provides power to the connected devices, but not to the connected host, so the only solution here is to create a custom cable which will inject power into the host.
  
Note: You may want to run <code>ifconfig usb0 down</code> prior to switching to usb host mode, as the Neo's usb networking may not like having its USB port disappear. You'll probably want to ssh into your Neo over WiFi or Bluetooth before starting all of this, alternatively use an on screen keyboard.
+
=== Modified USB cable to inject power while in host mode ===
  
=== Three-Headed Cable ===
 
 
Three-headed cables are required if you want to power the FreeRunner / USB device whilst in host mode.  For many uses the FreeRunner provides sufficient power to make such a cable unnecessary. At the moment, you'll have to manufacture this one yourself. You need to make a cable with three ends:
 
Three-headed cables are required if you want to power the FreeRunner / USB device whilst in host mode.  For many uses the FreeRunner provides sufficient power to make such a cable unnecessary. At the moment, you'll have to manufacture this one yourself. You need to make a cable with three ends:
  
* A mini-usb type B cable for the Neo itself
+
* A mini-USB type B cable for the Neo itself
 
* A cable of whatever type to go to your USB device.
 
* A cable of whatever type to go to your USB device.
 
* A cable going to a +5V voltage source with enough power for your device and to charge the Neo. This could be a wall charger or even another USB plug.
 
* A cable going to a +5V voltage source with enough power for your device and to charge the Neo. This could be a wall charger or even another USB plug.
Line 68: Line 93:
 
  red +5V
 
  red +5V
 
when it acts as a host.
 
when it acts as a host.
:#At your own risk, switch freerunner to USB host mode and connect an usb device to a receptable. Here's how the setup should look like:
+
:#At your own risk, switch freerunner to USB host mode and connect an USB device to a receptable. Here's how the setup should look like:
  
 
[[Image:Usb-gender-changer1.jpg]]
 
[[Image:Usb-gender-changer1.jpg]]

Revision as of 20:51, 26 August 2008

Contents

USB host

The mini-USB port on both the Neo 1973 and the Neo FreeRunner supports both USB host and USB device. This opens up a range of possibilities, such as adding USB cameras and USB input devices.

By default, the mini-USB port is in device mode. To tell the device that it is logically a host:

echo "host" > /sys/devices/platform/s3c2410-ohci/usb_mode

Instruct the device to provide 5 volts (not available on Neo 1973):

echo "1" > /sys/devices/platform/neo1973-pm-host.0/hostmode

Note: You may want to run ifconfig usb0 down prior to switching to USB host mode, as the Neo's USB networking may not like having its USB port disappear. You'll probably want to ssh into your Neo over WiFi or Bluetooth before starting all of this, alternatively use an on screen keyboard.

Providing power to connected USB devices while in host mode

Normally, USB host ports provide power to any connected USB device. In the case of portable handheld devices, this power may be limited. (Usually the battery is sized to power the handheld device alone, and to maximize standby time.)

Available power in host mode is limited to 100mA on the Neo FreeRunner, and no power is available in host mode on the Neo 1973. If your USB devices consumes less than 100mA, you may connect it directly to your Neo FreeRunner.

If your USB device consumes more than 100mA, or if your Neo is a Neo 1973, you can provide power by using a powered USB hub (see below), or by manually injecting power into the attached USB device via a modified USB cable (described further below).

Powered USB hubs known to work with the Neo

(please add any known to work)

Providing power to run and charge the Neo while in host mode

A slightly separate issue is power to run and charge the Neo itself. When the USB port is in device mode, the Neo can be powered and recharged via the USB port, but when in standard host mode, the Neo FreeRunner is set to provide power and does not charge. Fortunately, control of the direction of power (in or out) is independent of the personality of the USB port (host or device):

To recap, the direction of power can be controlled:

Set to 0 (default), no power is provided at the USB port, charging is enabled, and host 15K pulldowns are removed from D+ and D-:

echo "0" > /sys/devices/platform/neo1973-pm-host.0/hostmode

Set to 1, provides up to 100mA USB power at the USB port (FreeRunner only), disables charging from USB, and applies 15K pulldowns to USB D+ and D-:

echo "1" > /sys/devices/platform/neo1973-pm-host.0/hostmode

Next, power must somehow be injected. A powered USB hub only provides power to the connected devices, but not to the connected host, so the only solution here is to create a custom cable which will inject power into the host.

Modified USB cable to inject power while in host mode

Three-headed cables are required if you want to power the FreeRunner / USB device whilst in host mode. For many uses the FreeRunner provides sufficient power to make such a cable unnecessary. At the moment, you'll have to manufacture this one yourself. You need to make a cable with three ends:

  • A mini-USB type B cable for the Neo itself
  • A cable of whatever type to go to your USB device.
  • A cable going to a +5V voltage source with enough power for your device and to charge the Neo. This could be a wall charger or even another USB plug.

You connect the Data+ and Data- wires of the Neo and the device, and connect all of the ground wires together and all of the +5V wires together. This powers the Neo and the device, while letting the neo talk to the device. You have to connect 2pcs 15kOhm resistors, one from D+ to ground, and one from D- to ground, to comply with USB-spec for hostmode, as Freerunner is switching off the internal resistors when you enable charging/powering over USB by asserting EN_USBHOST. See schematics, LOCATION:49XX

Just for reference, the USB wires from left to right are:

  • Black: Power -
  • Green: Data -
  • White: Data +
  • Red: Power +

The Mini_USB-B connector has a fifth pin, the ID-pin. This pin is supposed to be short to ground to signal Freerunner to enter hostmode. For the Y-cable and enabling external power while in hostmode, you may connect a 47kOhm resistor from ID-pin to ground. This is the same trick the OM-wallcharger uses to signal to Freerunner it can charge with 1A. Future kernels should switch to hostmode + external power when seeing this 47k resistor.

Power Concerns

You'll need to force the Neo to go into fast charge mode, since it can't do its usual power negotiation over USB.

echo -n "fast_cccv" >  /sys/devices/platform/s3c2410-i2c/i2c-adapter/i2c-0/0-0008/chgmode

DIY USB host adapter

Note that these instructions are provided in the hope that they are useful but without any warranty!

2-usb-receptables.jpg

  1. Find an old motherboard with a set of two USB receptables as shown above.
  2. Desolder this set of receptables from the motherboard. This can be bit tricky but it is doable at least with a desoldering gun.
  3. Each receptable has four pins. Use a multimeter to verify that you have no short circuits between the pins or the shield.
  4. Solder adjacent pins together (GND to GND, D- to D-, D+ to D+, VCC to VCC).
  5. (Optional) Build a test cable. Cut an USB cable with A plug into half, connect it a receptable and again measure that you have no short circuits. Then connect the test cable to PC and verify that you see
black GND
green 0V
white 0V
red +5V
  1. Freerunner is shipped with a mini-B-to-A-plug cable. Connect this to a receptable.
  2. (Optional)Connect test cable to another receptable and verify that you see
black GND
green 0V
white 0V
red 0V

when freerunner acts as a device and

black GND
green 0V
white 0V
red +5V

when it acts as a host.

  1. At your own risk, switch freerunner to USB host mode and connect an USB device to a receptable. Here's how the setup should look like:

Usb-gender-changer1.jpg Usb-gender-changer2.jpg

Compatibility

The adapter works with kingston data traveller 4G memory stick and aiptec pencam webcam. However, for some reason it did not work with any of the tested USB keyboards or mice:

usb 1-2: new full speed USB device using s3c2410-ohci and address 24
usb 1-2: device descriptor read/64, error -62
usb 1-2: device descriptor read/64, error -62
usb 1-2: new full speed USB device using s3c2410-ohci and address 25
usb 1-2: device descriptor read/64, error -62
usb 1-2: device descriptor read/64, error -62
usb 1-2: new full speed USB device using s3c2410-ohci and address 26
usb 1-2: device not accepting address 26, error -62
usb 1-2: new full speed USB device using s3c2410-ohci and address 27
usb 1-2: device not accepting address 27, error -62

However, if I connect neo to small (unpowered) USB hub

usb 1-2: new full speed USB device using s3c2410-ohci and address 61
usb 1-2: configuration #1 chosen from 1 choice
hub 1-2:1.0: USB hub found
hub 1-2:1.0: 4 ports detected

and connect the keyboard to the hub then it is correctly recognized:

usb 1-2.3: new low speed USB device using s3c2410-ohci and address 62
usb 1-2.3: configuration #1 chosen from 1 choice
input:   USB Keyboard as /devices/platform/s3c2410-ohci/usb1/1-2/1-2.3/1-2.3:1.0/input/input13
input: USB HID v1.10 Keyboard [  USB Keyboard] on usb-s3c24xx-2.3
input:   USB Keyboard as /devices/platform/s3c2410-ohci/usb1/1-2/1-2.3/1-2.3:1.1/input/input14
input: USB HID v1.10 Device [  USB Keyboard] on usb-s3c24xx-2.3

With the hub I can also use both keyboard and usb memory stick at the same time.

Power consumption

When I unplug the USB hub (with only keyboard connected to it) the power consumption estimate at /sys/devices/platform/bq2700-battery.0/power_supply/bat/current_now decreases from 175000 to 145000 (are these microamperes?).

Personal tools

The Neo1973 as a USB host

The Neo1973's mini-USB port can be configured to act as a usb host instead of a usb device. This opens up a range of possibilities, such as USB cameras and usb input devices.

This used to require a kernel patch provided as an attachment in Bugzilla, but that same page now details how to do this without any kernel hacking:


Tell the device that it is logically a host:

echo "host" > /sys/devices/platform/s3c2410-ohci/usb_mode

Instruct the device to provide 5 volts:

echo "1" > /sys/devices/platform/neo1973-pm-host.0/hostmode


Note: You may want to run ifconfig usb0 down prior to switching to usb host mode, as the Neo's usb networking may not like having its USB port disappear. You'll probably want to ssh into your Neo over WiFi or Bluetooth before starting all of this, alternatively use an on screen keyboard.

Three-Headed Cable

Three-headed cables are required if you want to power the FreeRunner / USB device whilst in host mode. For many uses the FreeRunner provides sufficient power to make such a cable unnecessary. At the moment, you'll have to manufacture this one yourself. You need to make a cable with three ends:

  • A mini-usb type B cable for the Neo itself
  • A cable of whatever type to go to your USB device.
  • A cable going to a +5V voltage source with enough power for your device and to charge the Neo. This could be a wall charger or even another USB plug.

You connect the Data+ and Data- wires of the Neo and the device, and connect all of the ground wires together and all of the +5V wires together. This powers the Neo and the device, while letting the neo talk to the device. You have to connect 2pcs 15kOhm resistors, one from D+ to ground, and one from D- to ground, to comply with USB-spec for hostmode, as Freerunner is switching off the internal resistors when you enable charging/powering over USB by asserting EN_USBHOST. See schematics, LOCATION:49XX

Just for reference, the USB wires from left to right are:

  • Black: Power -
  • Green: Data -
  • White: Data +
  • Red: Power +

The Mini_USB-B connector has a fifth pin, the ID-pin. This pin is supposed to be short to ground to signal Freerunner to enter hostmode. For the Y-cable and enabling external power while in hostmode, you may connect a 47kOhm resistor from ID-pin to ground. This is the same trick the OM-wallcharger uses to signal to Freerunner it can charge with 1A. Future kernels should switch to hostmode + external power when seeing this 47k resistor.

Power Concerns

You'll need to force the Neo to go into fast charge mode, since it can't do its usual power negotiation over USB.

echo -n "fast_cccv" >  /sys/devices/platform/s3c2410-i2c/i2c-adapter/i2c-0/0-0008/chgmode

DIY USB host adapter

Note that these instructions are provided in the hope that they are useful but without any warranty!

2-usb-receptables.jpg

  1. Find an old motherboard with a set of two USB receptables as shown above.
  2. Desolder this set of receptables from the motherboard. This can be bit tricky but it is doable at least with a desoldering gun.
  3. Each receptable has four pins. Use a multimeter to verify that you have no short circuits between the pins or the shield.
  4. Solder adjacent pins together (GND to GND, D- to D-, D+ to D+, VCC to VCC).
  5. (Optional) Build a test cable. Cut an USB cable with A plug into half, connect it a receptable and again measure that you have no short circuits. Then connect the test cable to PC and verify that you see
black GND
green 0V
white 0V
red +5V
  1. Freerunner is shipped with a mini-B-to-A-plug cable. Connect this to a receptable.
  2. (Optional)Connect test cable to another receptable and verify that you see
black GND
green 0V
white 0V
red 0V

when freerunner acts as a device and

black GND
green 0V
white 0V
red +5V

when it acts as a host.

  1. At your own risk, switch freerunner to USB host mode and connect an usb device to a receptable. Here's how the setup should look like:

Usb-gender-changer1.jpg Usb-gender-changer2.jpg

Compatibility

The adapter works with kingston data traveller 4G memory stick and aiptec pencam webcam. However, for some reason it did not work with any of the tested USB keyboards or mice:

usb 1-2: new full speed USB device using s3c2410-ohci and address 24
usb 1-2: device descriptor read/64, error -62
usb 1-2: device descriptor read/64, error -62
usb 1-2: new full speed USB device using s3c2410-ohci and address 25
usb 1-2: device descriptor read/64, error -62
usb 1-2: device descriptor read/64, error -62
usb 1-2: new full speed USB device using s3c2410-ohci and address 26
usb 1-2: device not accepting address 26, error -62
usb 1-2: new full speed USB device using s3c2410-ohci and address 27
usb 1-2: device not accepting address 27, error -62

However, if I connect neo to small (unpowered) USB hub

usb 1-2: new full speed USB device using s3c2410-ohci and address 61
usb 1-2: configuration #1 chosen from 1 choice
hub 1-2:1.0: USB hub found
hub 1-2:1.0: 4 ports detected

and connect the keyboard to the hub then it is correctly recognized:

usb 1-2.3: new low speed USB device using s3c2410-ohci and address 62
usb 1-2.3: configuration #1 chosen from 1 choice
input:   USB Keyboard as /devices/platform/s3c2410-ohci/usb1/1-2/1-2.3/1-2.3:1.0/input/input13
input: USB HID v1.10 Keyboard [  USB Keyboard] on usb-s3c24xx-2.3
input:   USB Keyboard as /devices/platform/s3c2410-ohci/usb1/1-2/1-2.3/1-2.3:1.1/input/input14
input: USB HID v1.10 Device [  USB Keyboard] on usb-s3c24xx-2.3

With the hub I can also use both keyboard and usb memory stick at the same time.

Power consumption

When I unplug the USB hub (with only keyboard connected to it) the power consumption estimate at /sys/devices/platform/bq2700-battery.0/power_supply/bat/current_now decreases from 175000 to 145000 (are these microamperes?).