24

I am developing an Android application in which I have to communicate to an USB device. I tried to use standart google API in my app, but list of devices is allways empty.

Same things if i use USB device info with google api. List of devices searched by google api is empty,

lsusb gives following results:

Bus 001 Device 001: ID 1d6b:0001
Bus 002 Device 001: ID 1d6b:0002
Bus 003 Device 001: ID 1d6b:0001
Bus 002 Device 002: ID 2226:0014

my device is 2226:0014

log of eclipse:

I/USB3G(92): event { 'add', '/devices/platform/sw-ehci.1/usb2/2-1', 'usb', '', 189, 133 }
I/USB3G(92): path : '/sys/devices/platform/sw-ehci.1/usb2/2-1'
I/USB3G(92): VID :size 5,vid_path '/sys/devices/platform/sw-ehci.1/usb2/2-1/idVendor',VID  '2226
I/USB3G(92): '.
I/USB3G(92): PID :size 5,Pid_path '/sys/devices/platform/sw-ehci.1/usb2/2-1/idProduct',PID  '0014
I/USB3G(92): '.
I/USB3G(92): cmd=/system/etc/usb_modeswitch.sh /system/etc/usb_modeswitch.d/2226_0014 &,
I/USB3G(92): excute ret : 0,err:No such file or directory

If i plug in devices like rs232 adapters, bluetooth dongle, nothing happens,and there is no any result from API and lsusb.

Prtocol of a device is based on ezusb library. Android v.: 4.0.3 kernel v.: 3.0.8 firmware build: crane_evb-eng 4.0.3 IMLK74k 20120330

Is there are any way to access hidden USB devices via API, or should i implement support of this device by writing driver and patching it into the firmware?

UPDATE: even if i create info file in *system/etc/usb_modeswitch.d/* with name 2226_0014 containing

DefaultVendor= 0x2226
DefaultProduct=0x0014
TargetVendor=  0x2226
TargetProductList="0014"
MessageEndpoint="0x00"
NeedResponse=1
CheckSuccess=20

i get the same error: "No such file or directory"

Alexey.Shilenkov
  • 243
  • 1
  • 3
  • 7

4 Answers4

43

To enable USB host API support you should add a file named
android.hardware.usb.host.xml and containing the following lines:

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

into folder

/system/etc/permissions

in that folder find file named

handheld_core_hardware.xml or tablet_core_hardware.xml 

and add

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

into <permissions> section.

Reboot your device. Usb host api should work.

Tested on CUBE U30GT with android 4.

Violet Giraffe
  • 29,070
  • 38
  • 172
  • 299
Greg-q
  • 446
  • 5
  • 3
  • @Greg-q : Where is handheld_core_hardware.xml or tablet_core_hardware.xml located. I did't get these files. – Prasad Oct 11 '12 at 07:57
  • 1
    After making these changes, DeviceList is still empty for me, even though I can see my HID device being connected when running dmesg – TimothyP May 21 '13 at 01:58
  • It should be stated that making these changes is only possible if you are a ROM developer or if you have root and a writable (via remount) system partition, and only worthwhile if the hardware supports it. – Chris Stratton Jun 11 '13 at 18:44
  • @Droider how did you edit it? I am facing the same problem: read only file system – Gaurav Jul 24 '13 at 13:17
  • 1
    @Gaurav i had a rooted device so it did not made any issues for me. – Calvin Jul 25 '13 at 05:25
  • does all this require root access? – Matical Jun 21 '15 at 08:56
6

Excellent! This worked on my Envizen V700NA running Android 4.0.4.

Minor Typo: <feature name="android.hardware.usb.host">

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

Procedure:

  1. adb pull /system/etc/permissions/tablet_core_hardware.xml
  2. Update that file and create android.hardware.usb.host.xml as specified by Greg-q.
  3. adb push android.hardware.usb.host.xml /system/etc/permissions
  4. adb push tablet_core_hardware.xml /system/etc/permissions
  5. Reboot.
markjuggles
  • 457
  • 1
  • 4
  • 10
2

Worked like a charm on a micromax A120 canvas 2 phone (kitkat 4.4.2). now i can control my Arduino! i used busybox tools to do all the command line work (otherwise chmod wouldn't work). my steps (perhaps some were not required):

(0) install PDAnet drivers (http://pdanet.co/a/) on my Windows 8 computer. (1) root the phone using Vroot (now called iRoot) at http://www.mgyun.com/m/en. Very simple, only catch is that the su grant/deny page is partly in chinese, no big deal. (2) install busybox and jackpal's Android-Terminal-Emulator (see github https://github.com/jackpal/Android-Terminal-Emulator or play store https://play.google.com/store/apps/details?id=jackpal.androidterm&hl=en )

(3) open a terminal window and become the superuser:

# su

(4) the file system may be read-only, so you might have to remount it:

# mount -o rw,remount -t yaffs2 /

or

# mount -o rw,remount -t rootfs /

or

# mount -o rw,remount -t rootfs rootfs /system

see http://www.pocketmagic.net/write-on-the-android-read-only-file-system/ also, see Android 2.3 : Read-Only file system stuck also, https://ckirbach.wordpress.com/2012/11/27/how-to-remount-system-as-read-write-in-android/

(5) make default.prop read/write:

chmod 666 /default.prop

(6) edit /default.prop, make the following changes:

ro.secure=0
ro.debuggable=1
persist.service.adb.enable=1

see https://android.stackexchange.com/questions/28653/obtaining-root-by-modifying-default-propro-secure or http://bclary.com/blog/2014/04/14/splitting-and-packing-android-boot-images/

Finally, just for completeness, as the answer above says (https://stackoverflow.com/a/11992683/979369):

(7) To enable USB host API support you should add a file named android.hardware.usb.host.xml and containing the following lines:

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

into folder

/system/etc/permissions

in that folder find file named

handheld_core_hardware.xml or tablet_core_hardware.xml 

and add

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

into section.

(8) Reboot your device. Usb host api should work.

Community
  • 1
  • 1
mahesh
  • 227
  • 2
  • 8
1

i've used adb on MK809, Android 4.1 Jelly Bean, and the command are:

adb remount /../../file.xml rw adb push...

with normal command i'vent permission and the file is read only

Sorry for my bad english :P

Marco
  • 181
  • 1
  • 5