User:Joerg rw/hostmode/summary

N900 (rx51) hostmode notes

There were several (semi-) successful encounters of using the hostmode, some via tricking the OTG statemachine, some via implementing the FORCE_HOST testmode properly, we'll concentrate on the latter

The detailed overview is at http://wiki.maemo.org/N900_Hardware_USB
 * Hardware


 * There're leaked schematics

ISP1707/1074
 * There're datasheets for SoC (spurf98d is the best version) and

while N900 uses SoC-integrated musb with ISP1707 PHY via ULPI link programmatically, thus activating the host mode in the core, not possible with ISP1707 stupid decided to not route it to ISP1707 on N900 (he routed it to TWL4030 instead)
 * Comparision with N8x0
 * Same USB core
 * N8x0 uses a discrete component TUSB6010 that integrates musb core and phy
 * ID pin of the USB core on N8x0 can be forcibly grounded
 * ID pin is connected to the micro-usb receptable on N8x0, but some

supply 5V/200mA on usb vbus when asked to. OTG-like operation (at least automatic switching to/from hostmode) possible?
 * The battery charger chip is controlled via i2c and can
 * twl4030 has connection to the ID pin and can sense it

(nobody's tried to use it on N900 so far) See the patchsets in the repository, there're no incremental patches accompanied by the meaningful logs (yet); when it starts working, implement it in a separate file as a "platform" function for ``echo host >/sys/devices/platform/musb_hdrc/mode'' to start working. diff --git a/drivers/usb/core/generic.c b/drivers/usb/core/generic.c index 7e912f2..b51e5ea 100644 --- a/drivers/usb/core/generic.c +++ b/drivers/usb/core/generic.c @@ -97,10 +97,10 @@ int usb_choose_configuration(struct usb_device *udev) */               /* Rule out configs that draw too much bus current */ -              if (c->desc.bMaxPower * 2 > udev->bus_mA) { +              /*if (c->desc.bMaxPower * 2 > udev->bus_mA) { insufficient_power++; continue; -              } +               }*/                /* When the first config's first interface is one of Microsoft's                 * pet nonstandard Ethernet-over-USB protocols, ignore it unless @@ -132,10 +132,10 @@ int usb_choose_configuration(struct usb_device *udev) best = c;       } -      if (insufficient_power > 0) +      /*if (insufficient_power > 0) dev_info(&udev->dev, "rejected %d configuration%s "                       "due to insufficient available bus power\n", -                       insufficient_power, plural(insufficient_power)); +                      insufficient_power, plural(insufficient_power));*/        if (best) {                i = best->desc.bConfigurationValue;
 * Software
 * Driver
 * Shitty
 * There's a considerably improved version at linux-omap
 * Needs implementation of forced hostmode via one of the testmodes
 * Needs (why?) disabling of some current limiting features

diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c index ecffb2a..1577e7a 100644 --- a/drivers/usb/otg/twl4030-usb.c +++ b/drivers/usb/otg/twl4030-usb.c @@ -480,7 +480,7 @@ extern void musb_restore_ctx_and_resume(struct usb_gadget *gadget); static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off) { -      if (twl->asleep) +      if (!twl->asleep) return; twl4030_phy_power(twl, 0);
 * Needs (why?) disabling of some suspend features

pcsuite-enable.sh echo H >/proc/driver/musb_hdrc echo host >/sys/devices/platform/musb_hdrc/mode echo e > /proc/driver/musb_hdrc echo F > /proc/driver/musb_hdrc echo host >/sys/devices/platform/musb_hdrc/mode echo H >/proc/driver/musb_hdrc echo I > /proc/driver/musb_hdrc echo host >/sys/devices/platform/musb_hdrc/mode echo H >/proc/driver/musb_hdrc echo "Done echo'ing" stop bme; sleep 3; i2cset -y -m 0x07 2 0x6b 0x01 0x05; while true; do sleep 28; i2cset -y -m 0x80 2 0x6b 0x00 0x80; done
 * Needs (why?) manual step-through to get device recognised, enumerated, etc
 * 1) echo "Connect the flash drive in 3 seconds!"

by just looking at the D+, D- states (via debug register of isp1704), needs special care
 * How can it switch out of "waiting Vbus to rise" state?
 * No way to distinguish between full-speed and high-speed modes

stop bme One can use ``i2cset -y -m 0x07 2 0x6b 0x01 0x05'' instead to enable the reverse boost converter and ``i2cset -y -m 0x80 2 0x6b 0x00 0x80'' to disable
 * BME
 * Messes with charging so should be disabled
 * Incapable of providing VBUS to external device

Switches state to b_idle if the ID pin is not grounded), so should be (at least partially) disabled. Should we provide a minimal OTG driver for isp1407 instead? Or should we rather get the whole stuff somehow working and then try to port the upstream driver (it's supposed to be saner)?
 * twl4030-usb.c
 * Gets in the way by switching states behind your back
 * Is registered as an OTG controller


 * musb
 * SESSREQ (Session request) interrupt preconditions?
 * CONNECT interrupt preconditions?