[USB OTG] [11DEC13] [PATCH] Externally Powered USB OTG

Search This thread

nigelhealy

Senior Member
Aug 3, 2012
1,537
444
Preston
nothing
active mounts:none

Cover the basics. You're running stock ROM and rooted? You are actually using a powered Y OTG cable? My USB drive I had to connect Y to power then connect drive then connect to N4 for it to work. Try difference sequences.

When you say you formatted it FAT32, are you SURE? Its not NTFS or exFAT?

Stickmount points to files you put in /sdcard for ntfs-3gg and exFAT.

Also the filesystem must be mountable meaning not containing filesystem errors, and on another device (e.g. windows) do a chkdsk. I run Linux and for ntfs I used ntfsfix to fix my NTFS USB storage before Stickmount would mount it.
 

MC MILK

Senior Member
Jan 3, 2012
224
7
i don't know why when i flash the fk r199 with Franko kernel but the phone doesn't start before the Google Logo then never pass it.
 

giebeka

Senior Member
Mar 14, 2013
163
34
Hi I am using zidney's r193 otg kernel and PACman 4.3.1 ROM. GTA SA cant detect my XBOX 360 Controller via USBa.
I try to this:
"Modules cifs.ko, ff-memless.ko, hid-dr.ko, hid-logitech.ko, and xpad.ko (/system/lib/modules). Manually insmod as needed or create an appropriate init.d script to load on boot. These are only required for certain gamepads. Refer here for more information."
xpad = xbox controller
may need ff-memless to load xpad. Refer to linked thread for more information..
But it didn't help.

Thats what CatLog says when I plug in controller:
Code:
12-23 17:12:23.001 I/System.out( 4794): BroadcastReceiver WarMedia Base android.hardware.usb.action.USB_DEVICE_ATTACHED
12-23 17:12:23.001 E/WarBase ( 4794): BroadcastReceiver -> ACTION_USB_DEVICE_ATTACHED UsbDevice[mName=/dev/bus/usb/002/002,mVendorId=1118,mProductId=654,mClass=255,mSubclass=255,mProtocol=255,mInterfaces=[Landroid.os.Parcelable;@422a16f8]
12-23 17:12:23.001 E/WarGamepad( 4794): Device Attached : UsbDevice[mName=/dev/bus/usb/002/002,mVendorId=1118,mProductId=654,mClass=255,mSubclass=255,mProtocol=255,mInterfaces=[Landroid.os.Parcelable;@422a16f8]
12-23 17:12:23.001 E/WarGamepad( 4794): could not find interface
12-23 17:12:23.001 W/ContextImpl(  768): Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1114 com.android.server.usb.UsbSettingsManager.deviceAttached:621 com.android.server.usb.UsbHostManager.usbDeviceAdded:156 com.android.server.usb.UsbHostManager.monitorUsbHostBus:-2 com.android.server.usb.UsbHostManager.access$000:38

Sorry for my english
 

Sacob

Senior Member
Jan 8, 2011
918
84
199-Cm version sets the cpu governor to performance and i can't change it. every time i try to change it i get a hard reboot (with cm performance settings and franko kernel app). did this happened to any of you?
 

Sacob

Senior Member
Jan 8, 2011
918
84
which versions does this problem affect? fk r200 or fk r200-CM? normal version or the version from this thread with otg?
 

Sacob

Senior Member
Jan 8, 2011
918
84

anandbibek

Senior Member
May 18, 2013
846
762
Agartala
theweekendcoder.blogspot.com
Hello Ziddey, I was going through the changes in zip file between r197 and latest, trying to figure out the cause behind governor bug.

I think the modrd.sh file has 4 lines missing in modifying init.mako.rc related to setting each cpu's scaling governor.

I couldn't get enough time to test drive myself. Maybe someone could check?
 
  • Like
Reactions: kd8bny

Top Liked Posts

  • There are no posts matching your filters.
  • 228
    Externally Powered USB OTG - Nexus 4

    This is an all-in-one patch to enable externally powered OTG (technically usb host mode) support. It's built off either the stock kernel or Franco's kernel sources, and should work with any ROM (that these kernels otherwise support). Refer to the second post for details on modifications and additions.

    Again, power MUST be supplied externally, as there is no way for the phone to provide it.


    Requirements:

    Power MUST be supplied to both the USB device and phone. The easiest way would be by using an OTG Y-cable:


    If using a traditional OTG cable, a USB Y-cable can be used:


    Some powered USB hubs also send power up to the host and can be used directly with a regular OTG cable.

    I am not endorsing any specific product or seller. Links are provided solely as examples, and are by no means definitive. As long as the phone and device both get 5V (charger, computer, etc.), and the data pins are connected, host mode will work (provided enough current can be supplied).


    Installation:

    Simply install the zip in recovery. Script will automatically install/patch necessary files. Must reinstall any time ROM is updated.

    To uninstall, simply reflash your ROM. Data wipe is not necessary. If for some reason that's not an option, use the flashable unmod script to remove ROM-side modifications. Flash your kernel of choice afterwards (must flash "reset" kernel first if flashing an "anykernel").


    Recovery:
    (Optional)

    For support in recovery, I've created a sort of "any-any" script. It replaces the recovery's kernel with the boot one. Therefore, by flashing this after the main patch, OTG will effectively be enabled in recovery (after a reboot). However, it is on the actual recovery itself to provide support for usb drives-- TWRP does. Otherwise, you'll have to manually mount any drives via linux console commands.

    For your own safety/sanity, ensure the main patch works before flashing this. If recovery fails to boot after flashing, it can easily be replaced by using GooManager or similar. Worst case scenario, a new recovery can always be flashed via fastboot.


    Downloads:
    (Changelog at end of second post)

    MAKE SURE TO DOWNLOAD THE RIGHT VERSION FOR YOUR ROM.
    I don't keep track of all the different ROMs so it's on you guys to figure out which one is appropriate. The -CM builds have the two "CAF" commits that are now required for CM and its derivatives (unless they have specifically reverted the associated commits).

    Franco-CM builds make use of a ramdisk mod script, which may have unpredictable results. Be ready in case it doesn't boot.

    Current:

    Old:

    Bugs / Notes:
    • An OTG cable has the ID pin grounded out, which is used to trigger usb host mode. However, ID pin detection is broken in the Nexus 4 (although working for Slimport detection). Instead, we rely on detection of a "proprietary" charger (voltage on the data pins) in order to determine when to enable host mode.
    • Self-powered devices (e.g. digital cameras) don't send power to the phone. This will cause the device to not be detectable. Therefore, external power is still required.
    • Slimport cannot work concurrently with usb data due to hardware limitations (Slimport takes over the usb data pins).
    • USB drive will automatically mount at /storage/usbdisk0 (also accessible at /usbdisk and /mnt/usbdisk). Media scanning should occur automatically. Make sure to unmount before removal to avoid data loss.
    • Stock Android only supports FAT for storage. NTFS/exFAT/ext4 partitions may require the use of a third party app like StickMount (CM now supports these partitions natively!).
    • There appears to be a minor bug in the AOSP code that prevents available space from being reported in Settings->Storage->USB Storage. The screenshot is of CM10.1, which has this fixed
    • Current builds do not allow for host mode without charging. Use this as a workaround:
      For those that want to stop usb charging, create a script modifying this to either 1 (disabled) or 0 (enabled). Works for me :) Not responsible for your phone(s) exploding.

      echo 1 > /sys/module/pm8921_charger/parameters/disabled
      echo 0 > /sys/module/pm8921_charger/parameters/disabled
    • Standard Disclaimer-- Flashing this patch is at your own risk, and carries no warranty or liability on my part. The assumption is that you will perform due diligence before flashing and make any necessary backups if required.

    Screenshots:




    Credits:
    • CaptainMuon, for proving that host mode is possible on the Nexus 4.
    • Franco, for his kernel, which this patch is based off.
    • garyd9, for his command to patch platform.xml.
    • Chainfire, for his usb host wisdom, and article on secondary storage write permissions.
    • arpruss, for his compiled zip-for-android
    • All you guys for testing!
    61
    Patch Overview:
    • Kernel with modified msm_otg.c -- This will REPLACE whatever kernel you currently have installed. If you flash a different kernel on top, you will obviously lose OTG capability. This contains the necessary workaround to enable usb host mode ("OTG").
    • Modified init.mako.rc/init.mako.usbdisk.rc -- Required for creating usb drive directories.
    • Precompiled modified storage_list.xml -- Allows unmounting usb drive in Settings->Storage. Hex offsets for storageDescription patched during flash.
    • Addition to build.prop -- Enables downloading apps from play store that require usb host mode support.
    • Addition to platform.xml -- Workaround to allow apps write access to usb drives
    • Addition to handheld_core_hardware.xml -- Activate android.hardware.usb.host.xml
    • android.hardware.usb.host.xml -- Enables Android API support for usb host mode.
    • fstab.mako (4.3) / vold.fstab (4.2) -- Required for automounting usb drive
    • Modules cifs.ko, ff-memless.ko, hid-dr.ko, hid-logitech.ko, and xpad.ko (/system/lib/modules). Manually insmod as needed or create an appropriate init.d script to load on boot. These are only required for certain gamepads. Refer here for more information.

    Patch Details:

    There seems to be an issue with detecting the state of the ID pin on the OTG cable, so we need to come up with an alternate way of determining when to switch to host mode. drivers/usb/otg/msm_otg.c (kernel) is responsible for detecting the charger type and setting host mode, among other tasks. I noticed that when connected to a powered OTG cable, the charge type becomes USB_PROPRIETARY_CHARGER (vs USB_DCP_CHARGER when connected to the wall, and USB_SDP_CHARGER to a computer). This will be the condition that we use to trigger host mode.

    Standard OTG cables will have the ID pin shorted to ground. There are also usb accessory charger adapters (ACA) that provide different resistances between these pins to signal functionality (see http://en.wikipedia.org/wiki/USB_On-The-Go#OTG_Micro_Plugs). Support for accessory charger detection isn't enabled in the kernel originally, and doesn't seem to work properly anyway. However, one of the modes is essentially what we're trying to achieve (ID_A): "A charger and a B-device are attached. The OTG device is allowed to charge and enter host mode." So I've added code when USB_PROPRIETARY_CHARGER is detected to simulate the case of ID_A being detected. Following through the code for host mode, certain events are handled differently when ACA support is enabled (specifically, suspension of host mode). In these instances, we need to simulate ACA support since ID_A is technically dependent on it (run into issues with the usb controller getting stuck in a suspended state otherwise). Now we have host mode with charging working properly.

    Finally, we need a method of detecting when the OTG cable is unplugged so the device can switch out of host mode. Fortunately, since power (vbus) detection does work, we can use that. Normally, changes in vbus state are ignored while in host mode, so we need to address that. From there, we simulate ACA detection for the case of no ID_A, which is just clearing the ID_A bit and charger. Afterwards, it'll automatically reset the usb state, ready to start all over again.

    The dirty hacks to msm_otg.c are complete, and externally-powered OTG is functional.

    Refer here for actual changes: https://github.com/ziddey/mako/commits/nightlies-4.3-JSS

    No changes are needed to the kernel's .config. Do not enable Drivers->USB->OTG support (we get our support through "OTG support for Qualcomm on-chip USB controller" which is already enabled) or Support for ACA (does not work and most users don't have the proper adapter anyway).


    Now we run into a problem with usb storage. Since there is no /system/etc/vold.fstab, usb drives get automatically mounted to /mnt/shell/emulated/0 (at least in CM10.1), which overloads the emulated sdcard, and causes major problems. So we create /system/etc/vold.fstab:

    Code:
    dev_mount usbdisk /storage/usbdisk0 auto /devices/platform/msm_hsusb_host/usb2

    Update:
    In 4.3, Google did away with vold.fstab, instead unifying mounting with fstab.mako (on the ramdisk). The replacement line would be:

    Code:
    /devices/platform/msm_hsusb_host/usb2 /storage/usbdisk0 auto defaults voldmanaged=usbdisk0:auto

    Update:
    In 4.4, mountpoint is set to auto instead of /storage/usbdisk0, and will be taken care of by vold / fuse daemon.

    But /storage/usbdisk0 does not exist, so it will fail to mount. We will be using /init.mako.rc to create this directory and symlink associated legacy ones. This file resides in a ramdisk (which combines with the kernel to form boot.img), so we need to modify that instead of /init.mako.rc on the device itself (since it wouldn't be able to persist through a reboot). As well, we define the environmental variable SECONDARY_STORAGE. Below the analogous /storage/sdcard0 lines, add:

    Code:
    export SECONDARY_STORAGE /storage/usbdisk0
    
    mkdir /storage/usbdisk0 0666 system system
    
    symlink /storage/usbdisk0 /usbdisk
    symlink /storage/usbdisk0 /mnt/usbdisk

    Update:
    In 4.4, usb disks must be further FUSE mounted. Rather than insert the script into init.mako.rc, it will now reside in init.mako.usbdisk.rc and be imported to init.mako.rc (strictly for ease/neatness and not standard convention):

    Code:
    # USB Storage -ziddey
    
    on init
        mkdir /mnt/media_rw/usbdisk0 0700 media_rw media_rw
        mkdir /storage/usbdisk0 0700 root root
    
        export SECONDARY_STORAGE /storage/usbdisk0
    
        # Support legacy paths
        symlink /storage/usbdisk0 /usbdisk
        symlink /storage/usbdisk0 /mnt/usbdisk
    
    service fuse_usbdisk0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/usbdisk0 /storage/usbdisk0
        class late_start
        disabled

    In order to enable Settings->Storage->USB Storage, res/xml/storage_list.xml in /system/framework/framework-res.apk needs to be modified. We should be able to simply inject an encoded version of our modified storage_list.xml. I'm not sure if it's possible to simply encode a single file, so I decompiled framework-res.apk in order to make the following addition to res/xml/storage_list.xml (inside StorageList):

    Code:
        <storage android:mountPoint="/storage/usbdisk0"
                 android:storageDescription="@string/storage_usb"
                 android:primary="false"
                 android:removable="true" />

    After recompiling, we should now be able to extract our newly encoded storage_list.xml for use with any ROM's framework-res.apk.

    To allow downloading apps from the market that require usb host support, we need to add the following to /system/build.prop:

    Code:
    ro.usb.host=1

    To enable android api support for usb host, we need to create /system/etc/permissions/android.hardware.usb.host.xml with the following:

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <feature name="android.hardware.usb.host" />
    </permissions>

    Now to "activate" this file, we add to /system/etc/permissions/handheld_core_hardware.xml:

    Code:
    <feature name="android.hardware.usb.host" />

    Google assigned a different permission group for secondary storage devices (e.g. usb drives), media_rw, for which user apps cannot have write access (Chainfire has a good article on the issue here). We need to modify /system/etc/permissions/platform.xml to allow write access. Add the line in red ("officially" used by Samsung):

    Code:
    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        [color=red]<group gid="media_rw" />[/color]
        <group gid="sdcard_rw" />
    </permission>

    That's it! Externally powered usb host mode should be fully functional.

    For full disclosure, these are the changes to the kernel config vs stock (really just NTFS and modules):

    Code:
            echo "CONFIG_INPUT_JOYSTICK=y" >> .config
            echo "CONFIG_JOYSTICK_XPAD=m" >> .config
            echo "CONFIG_JOYSTICK_XPAD_FF=y" >> .config
            echo "CONFIG_JOYSTICK_XPAD_LEDS=y" >> .config
            echo "CONFIG_INPUT_FF_MEMLESS=m" >> .config
            echo "CONFIG_HID_LOGITECH=m" >> .config
            echo "CONFIG_LOGITECH_FF=y" >> .config
            echo "CONFIG_LOGIRUMBLEPAD2_FF=y" >> .config
            echo "CONFIG_LOGIG940_FF=y" >> .config
            echo "CONFIG_LOGIWHEELS_FF=y" >> .config
            echo "CONFIG_HID_DRAGONRISE=m" >> .config
            echo "CONFIG_DRAGONRISE_FF=y" >> .config
            echo "CONFIG_CIFS=m" >> .config
    
            echo "CONFIG_NTFS_FS=y" >> .config
    #        echo "CONFIG_USB_DEBUG=y" >> .config
            sed 's/\(CONFIG_USB_STORAGE_DEBUG\)=y/# \1 is not set/' -i .config


    Changelog:
    • 4.4: 2013.12.01 0349ET: [fk r196] [fk r196-CM] [aosp r5] aosp includes gamepad kernel modules.
    • 4.4: 2013.11.29 0219ET: [fk r195] [fk r195-CM] CM build attempts to patch Franco ramdisk mods on the fly, so be prepared if things go south.
    • 4.4: 2013.11.21 1922ET: [fk r194] [aosp r2] Update to 4.4 configuration for mounting usbdisk.
    • 4.3: 2013.10.22 2201ET r191: [JWR] [JSS/JLS] Allow potentially faster charging in host mode, re-add manual host mode
    • 4.3: 2013.10.22 2204ET r191-CM: [JWR] [JSS/JLS] ^ + 2 "CAF" commits for CM compatibility
    • 4.3: 2013.10.09 2148ET r190: [JWR] [JSS/JLS] Re-enable USB debug messages
    • 4.3: 2013.10.01 1954ET r188: [JWR] [JSS/JLS] Zipalign framework-res.apk
    • ziddey-otg-r183-09141713.zip ziddey-otg-r183-JSS-09141713.zip Add SECONDARY_STORAGE env., do ramdisk patching during flash, include CIFS module -- rebase to r183.
    • ziddey-otg-r182-09041823.zip ziddey-otg-r182-JSS-09041823.zip Remove module unloading support, patch handheld_core_hardware.xml -- rebase to Franco r182.
    • ziddey-otg-r178-08240234.zip ziddey-otg-r178-JSS-08240238.zipDisable modversions, enable kernel wakelock stats-- rebase to Franco r178.
    • JSS15J 4.3.0 2013.08.13 1533ET: ziddey-otg-r174-08131533.zip First release for JSS15J. Updated to 4.3's new unified fstab (native mounting support). Using an "anyramdisk" method for compatibility with different ROMs (specifically, different su implementations). Based off Franco r174.
    • 2013.07.29 1101ET: ziddey-otg-r165-07291101.zip Maintenance build-- rebase to Franco r165.
    • 2013.07.14 2015ET: ziddey-otg-r163-07142015.zip Allow automatic host mode without charging-- rebase to Franco r163.
    • 2013.07.08 1420ET: ziddey-otg-r162-07081420.zip Update storage_list.xml for compatibility with new CM nightlies-- rebase to Franco r162.
    • 2013.06.28 1551ET: ziddey-otg-M3-06281551.zip Maintenance build-- rebase to Franco M3.
    • 2013.06.27 0427ET: ziddey-otg-r156-06270427.zip Re-enable read-only NTFS support in kernel.
      • 2013.06.06 1736ET: ziddey-otg-r151-06061736.zip Releases will now include modules ff-memless.ko, hid-dr.ko, hid-logitech.ko, and xpad.ko (/system/lib/modules). Manually insmod as needed or create an appropriate init.d script to load on boot. Rebase to Franco r151.
      • 2013.05.25 0749ET: ziddey-otg-05250749.zip Fix compatibility issue with CWM (MTP crashes).
      • 2013.05.23 2119ET: ziddey-otg-05232119.zip Start charging immediately when entering host mode. This resolves issues with proprietary chargers.
      • 2013.05.22 2305ET: ziddey-otg-05222305.zip Rebase to Franco's r140. Revert checks for actual proprietary chargers in favor of manually disabling automatic host mode (temporary). Issue "# echo disable > /sys/kernel/debug/msm_otg/aca" to disable automatic host mode (enable to re-enable).
      • 2013.05.17 0107ET: ziddey-otg-05170107.zip Added check for other proprietary charger case. Rebase to Franco's r137.
      • 2013.05.15 0124ET: ziddey-otg-05150124.zip Attempt to detect actual proprietary chargers (Apple-compatible) and charge properly. Rebase to Franco's r136.
      • 2013.05.09 1729ET: ziddey-otg-05091729.zip Should now patch precompiled storage_list.xml to address incorrect strings (Internal Storage/USB Storage). Re-enabled verbose usb debugging messages (dmesg).
      • 2013.05.06 1846ET: ziddey-otg-05061846.zip Maintenance build. Based off Franco's current nightlies branch (r134?). Updated storage_list.xml to match current CM nightlites. Removed freshen flag to hopefully address issues with framework-res.apk not being patched (thanks sga999). Verbose usb debugging messages not enabled (unaltered r134 config)
      • 2013.04.07 0355ET: ziddey-otg-04070355.zip Now modifies /system/etc/permissions/platform.xml to allow app write access to usb storage (thanks garyd9 for script code). Kernel build number reverted to 105 to match Franco's M1 build number.
      • 2013.03.27.2338ET: ziddey-otg-03272334.zip Allow host mode when slimport connected (must manually enable for now. not sure if it actually works, so please report results.) Prevent forced host mode from entering suspended state so it won't get stuck (perhaps worth reinvestigating if we ever get internal power working). Allow forcing mode via /sys/kernel/debug/msm_otg/mode regardless of current state (original code had conditions that were unreasonable. it is designed to be used for debugging after all..). Forgot to reset the build number; should be 105. Would only potentially matter if using Franco's app.
      • 2013.03.23 2000ET: ziddey-otg-03231951.zip All-in-one update now enables android api for usb host mode. Should automatically rescan media library when usb storage is connected. Kernel updated to Franco M1 (milestone), and will probably stay here for a while.
      • 2013.03.17 1548ET: otg-aio-20130317.zip All-in-one flashable zip that includes modified kernel/ramdisk, vold.fstab, and precompiled storage_list.xml for framework-res.apk (thanks arpruss for precompiled zip-for-android). Kernel unchanged from last release (Franco r102 base), but removed unrelated line previously added to default.prop in ramdisk
      • 2013.03.14 1648ET: otg-franco-boot-03141621.img Should have fixed all issues involving unpopulated hubs, unplugged devices, host mode timeout, and charging. Changed main mount point to /storage/usbdisk0 since that seems to be the new standard (manually update vold.fstab accordingly). Based on Franco's git as of 3/12 (after r102)
      • 2013.03.11 2244ET: otg_boot_r3.img Interim build to address wall charging issues (do not attach/detach devices while otg cable connected to phone)
      • 2013.03.09 0739ET: otg_boot_r2.img Should charge (faster) in host mode
      • 2013.03.08 1128ET: otg_franco.zip Initial release in this thread.
      • 2013.03.07 1350ET: franco-otg-201303071328.img "Pre-alpha" build posted in CaptainMuon's thread. Forces disabling of host mode on device unplug.
      • 2013.03.07 1102ET: franco-otg-201303071032.img "Pre-alpha" build posted in CaptainMuon's thread. Forces host mode on detection of "proprietary" type charger (vs usb = sdp, wall = dcp).
    References:

    22
    4.4.x: 2013.12.30 0348ET: [fk r200] [fk r200-CM]
    17
    4.4.1: 2013.12.11 1604ET: [fk r199] [fk r199-cm]
    15
    MAKE SURE TO DOWNLOAD THE RIGHT VERSION FOR YOUR ROM.

    JSS15J 4.3.0 2013.08.14 2031ET: ziddey-otg-r176-JSS-08142031.zip Use Franco's ramdisk (plus necessary mods) instead of "anyramdisk" method-- rebase to Franco r176.
    JWR66V 4.3.0 2013.08.14 2035ET: ziddey-otg-r176-08142035.zip First release for JWR66V-- based on Franco r176.
    JDQ39E 4.2.2 2013.07.29 1101ET: ziddey-otg-r165-07291101.zip Maintenance build-- rebase to Franco r165.


    Ramdisks are prebuilt now and not dynamically patched during flash (only the last JSS15J version had this patching). The issue is/was with various implementations of root access. If you are having issues, you may need to flash a different supersu/superuser/etc. Refer to your ROM's thread for details.

    Also worth noting that modules support is enabled in the 4.3 kernels.