diff options
| author | Thomas Shum <jabashque@gmail.com> | 2019-07-29 19:26:23 -0700 |
|---|---|---|
| committer | celtare21 <celtare21@gmail.com> | 2019-08-02 11:18:30 +0000 |
| commit | 957e95f325482e9cffebc5c23b4976eee29fcc0e (patch) | |
| tree | 666046ca007d05bc39681b446dd55b1dca47293c | |
| parent | 8acbf5ec362cc0c514eb28336a28c99ff1be8e31 (diff) | |
mata: Remove (slightly broken) USB Gadget HAL for now
This is currently causing issues for Android Auto, where the phone can
see the connected car but Android Auto doesn't start.
This commit consists of the following reverts:
Revert "mata: Allow USB HAL to access dual_role_usb nodes"
Revert "Add audio_source combinations to usb hal"
Revert "Set VID/PID for diag functions"
Revert "Initialize booleans"
Revert "Usb Gadget hal implementation for mata"
Change-Id: I1981680d2325abc8ea9ad7b04dafbda286e69bb1
Signed-off-by: celtare21 <celtare21@gmail.com>
| -rw-r--r-- | manifest.xml | 9 | ||||
| -rw-r--r-- | rootdir/etc/init.mata.rc | 6 | ||||
| -rw-r--r-- | rootdir/etc/init.mata.usb.rc | 413 | ||||
| -rw-r--r-- | sepolicy/vendor/file.te | 1 | ||||
| -rw-r--r-- | sepolicy/vendor/file_contexts | 2 | ||||
| -rw-r--r-- | sepolicy/vendor/hal_usb_default.te | 1 | ||||
| -rw-r--r-- | sepolicy/vendor/hal_usb_impl.te | 14 | ||||
| -rw-r--r-- | sepolicy/vendor/property.te | 1 | ||||
| -rw-r--r-- | sepolicy/vendor/property_contexts | 4 | ||||
| -rw-r--r-- | usb/Android.bp | 3 | ||||
| -rw-r--r-- | usb/Usb.cpp | 2 | ||||
| -rw-r--r-- | usb/Usb.h | 2 | ||||
| -rw-r--r-- | usb/UsbGadget.cpp | 602 | ||||
| -rw-r--r-- | usb/UsbGadget.h | 101 | ||||
| -rw-r--r-- | usb/android.hardware.usb@1.1-service.mata.rc | 12 | ||||
| -rw-r--r-- | usb/service.cpp | 26 |
16 files changed, 377 insertions, 822 deletions
diff --git a/manifest.xml b/manifest.xml index 3d69e7aa..ab88f7e1 100644 --- a/manifest.xml +++ b/manifest.xml @@ -287,15 +287,6 @@ </interface> </hal> <hal format="hidl"> - <name>android.hardware.usb.gadget</name> - <transport>hwbinder</transport> - <version>1.0</version> - <interface> - <name>IUsbGadget</name> - <instance>default</instance> - </interface> - </hal> - <hal format="hidl"> <name>android.hardware.vibrator</name> <transport>hwbinder</transport> <version>1.0</version> diff --git a/rootdir/etc/init.mata.rc b/rootdir/etc/init.mata.rc index 803b527f..32a19a26 100644 --- a/rootdir/etc/init.mata.rc +++ b/rootdir/etc/init.mata.rc @@ -630,12 +630,6 @@ on property:sys.boot_completed=1 start tfa-sh -on property:vendor.usb.config=* - start usbd - -on property:persist.vendor.usb.usbradio.config=* - start usbd - on property:vold.decrypt=trigger_restart_framework start vendor.qti start vendor.netmgrd diff --git a/rootdir/etc/init.mata.usb.rc b/rootdir/etc/init.mata.usb.rc index 5ed1c64a..8a207912 100644 --- a/rootdir/etc/init.mata.usb.rc +++ b/rootdir/etc/init.mata.usb.rc @@ -30,94 +30,411 @@ on charger mount configfs none /config - mkdir /config/usb_gadget/g1 0770 + mkdir /config/usb_gadget/g1 0770 shell shell + mkdir /config/usb_gadget/g1/strings/0x409 0770 shell shell write /config/usb_gadget/g1/bcdUSB 0x0200 - write /config/usb_gadget/g1/idProduct 0xC033 - write /config/usb_gadget/g1/idVendor 0x2E17 - mkdir /config/usb_gadget/g1/strings/0x409 0770 + write /config/usb_gadget/g1/os_desc/use 1 write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/mass_storage.0 + mkdir /config/usb_gadget/g1/functions/mtp.gs0 + mkdir /config/usb_gadget/g1/functions/ptp.gs1 mkdir /config/usb_gadget/g1/functions/accessory.gs2 - mkdir /config/usb_gadget/g1/functions/audio_source.gs2 mkdir /config/usb_gadget/g1/functions/audio_source.gs3 - mkdir /config/usb_gadget/g1/functions/ccid.ccid + mkdir /config/usb_gadget/g1/functions/midi.gs5 + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/functions/diag.diag mkdir /config/usb_gadget/g1/functions/cser.dun.0 mkdir /config/usb_gadget/g1/functions/cser.nmea.1 - mkdir /config/usb_gadget/g1/functions/diag.diag - mkdir /config/usb_gadget/g1/functions/ffs.adb - mkdir /config/usb_gadget/g1/functions/gsi.dpl mkdir /config/usb_gadget/g1/functions/gsi.rmnet mkdir /config/usb_gadget/g1/functions/gsi.rndis - mkdir /config/usb_gadget/g1/functions/mass_storage.0 - mkdir /config/usb_gadget/g1/functions/midi.gs5 - mkdir /config/usb_gadget/g1/functions/mtp.gs0 - mkdir /config/usb_gadget/g1/functions/ncm.0 - mkdir /config/usb_gadget/g1/functions/ptp.gs1 + mkdir /config/usb_gadget/g1/functions/gsi.dpl mkdir /config/usb_gadget/g1/functions/qdss.qdss - mkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl mkdir /config/usb_gadget/g1/functions/rndis_bam.rndis mkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnet - mkdir /config/usb_gadget/g1/configs/b.1 0770 - mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 + mkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl + mkdir /config/usb_gadget/g1/functions/ncm.0 + mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100" - write /config/usb_gadget/g1/os_desc/use 1 + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "msc" rm /config/usb_gadget/g1/configs/b.1/f1 rm /config/usb_gadget/g1/configs/b.1/f2 rm /config/usb_gadget/g1/configs/b.1/f3 rm /config/usb_gadget/g1/configs/b.1/f4 rm /config/usb_gadget/g1/configs/b.1/f5 - symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC033 symlink /config/usb_gadget/g1/functions/mass_storage.0 /config/usb_gadget/g1/configs/b.1/f1 write /config/usb_gadget/g1/UDC a800000.dwc3 -on early-boot +on boot + mkdir /dev/usb-ffs 0770 shell shell + mkdir /dev/usb-ffs/adb 0770 shell shell mount configfs none /config - mkdir /config/usb_gadget/g1 0770 + mkdir /config/usb_gadget/g1 0770 shell shell + mkdir /config/usb_gadget/g1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/os_desc/use 1 write /config/usb_gadget/g1/bcdDevice 0x0223 write /config/usb_gadget/g1/bcdUSB 0x0200 - write /config/usb_gadget/g1/idVendor 0x2E17 - mkdir /config/usb_gadget/g1/strings/0x409 0770 write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/mass_storage.0 + mkdir /config/usb_gadget/g1/functions/mtp.gs0 + mkdir /config/usb_gadget/g1/functions/ptp.gs1 mkdir /config/usb_gadget/g1/functions/accessory.gs2 mkdir /config/usb_gadget/g1/functions/audio_source.gs2 mkdir /config/usb_gadget/g1/functions/audio_source.gs3 - mkdir /config/usb_gadget/g1/functions/ccid.ccid + mkdir /config/usb_gadget/g1/functions/midi.gs5 + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/functions/diag.diag mkdir /config/usb_gadget/g1/functions/cser.dun.0 mkdir /config/usb_gadget/g1/functions/cser.nmea.1 - mkdir /config/usb_gadget/g1/functions/diag.diag - mkdir /config/usb_gadget/g1/functions/ffs.adb - mkdir /config/usb_gadget/g1/functions/gsi.dpl mkdir /config/usb_gadget/g1/functions/gsi.rmnet mkdir /config/usb_gadget/g1/functions/gsi.rndis - mkdir /config/usb_gadget/g1/functions/mass_storage.0 - mkdir /config/usb_gadget/g1/functions/midi.gs5 - mkdir /config/usb_gadget/g1/functions/mtp.gs0 - mkdir /config/usb_gadget/g1/functions/ncm.0 - mkdir /config/usb_gadget/g1/functions/ptp.gs1 + mkdir /config/usb_gadget/g1/functions/gsi.dpl mkdir /config/usb_gadget/g1/functions/qdss.qdss - mkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl - mkdir /config/usb_gadget/g1/functions/rndis_bam.rndis - mkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnet - mkdir /config/usb_gadget/g1/configs/b.1 0770 - mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 + mkdir /config/usb_gadget/g1/functions/ncm.0 + mkdir /config/usb_gadget/g1/functions/ccid.ccid + mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100" - write /config/usb_gadget/g1/os_desc/use 1 - mkdir /dev/usb-ffs 0775 shell shell - mkdir /dev/usb-ffs/adb 0770 shell shell - mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000 - mkdir /dev/usb-ffs/mtp 0770 mtp mtp - mount functionfs mtp /dev/usb-ffs/mtp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1 - mkdir /dev/usb-ffs/ptp 0770 mtp mtp - mount functionfs ptp /dev/usb-ffs/ptp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1 symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000 + setprop sys.usb.configfs 1 setprop sys.usb.controller "a800000.dwc3" - setprop sys.usb.mtp.device_type 3 -on boot - setprop sys.usb.configfs 2 +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=none && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/os_desc/use 0 + setprop sys.usb.ffs.ready 0 + +on property:sys.usb.ffs.ready=1 && property:init.svc.adbd=stopped + setprop sys.usb.ffs.ready 0 + +on property:sys.usb.config=none && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/UDC "none" + stop adbd + write /config/usb_gadget/g1/bDeviceClass 0 + write /config/usb_gadget/g1/bDeviceSubClass 0 + write /config/usb_gadget/g1/bDeviceProtocol 0 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC032 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id "MTP" + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC033 + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id "MTP" + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC030 + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/compatible_id "PTP" + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC034 + symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/compatible_id "PTP" + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC031 + symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC041 + symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=midi,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC042 + symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +# Implement AOAv2 interface + +on property:sys.usb.config=accessory && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x18D1 + write /config/usb_gadget/g1/idProduct 0x2D00 + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x18D1 + write /config/usb_gadget/g1/idProduct 0x2D01 + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "audiosource" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x18D1 + write /config/usb_gadget/g1/idProduct 0x2d02 + symlink /config/usb_gadget/g1/functions/audio_source.gs2 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "audiosource_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x18D1 + write /config/usb_gadget/g1/idProduct 0x2d03 + symlink /config/usb_gadget/g1/functions/audio_source.gs2 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory_audiosource" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x18D1 + write /config/usb_gadget/g1/idProduct 0x2d04 + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "accessory_audiosource_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x18D1 + write /config/usb_gadget/g1/idProduct 0x2d05 + symlink /config/usb_gadget/g1/functions/accessory.gs2 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/audio_source.gs3 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.tethering=true + write /sys/class/net/rndis0/queues/rx-0/rps_cpus ${sys.usb.rps_mask} + +on property:sys.usb.config=rndis + setprop sys.usb.config rndis,${persist.sys.usb.config.extra} + +on property:sys.usb.config=rndis,none && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC022 + symlink /config/usb_gadget/g1/functions/gsi.rndis /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,adb + setprop sys.usb.config rndis,${persist.sys.usb.config.extra},adb + +on property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x2E17 + write /config/usb_gadget/g1/idProduct 0xC008 + symlink /config/usb_gadget/g1/functions/gsi.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + + +on property:sys.usb.config=diag,serial_cdev,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "Default composition" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9091 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/gsi.rmnet /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC "a800000.dwc3" + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "Default composition" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9092 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/gsi.rmnet /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC "a800000.dwc3" + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x902C + symlink /config/usb_gadget/g1/functions/gsi.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x902D + symlink /config/usb_gadget/g1/functions/gsi.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} diff --git a/sepolicy/vendor/file.te b/sepolicy/vendor/file.te index 54294b17..2b8dc5d8 100644 --- a/sepolicy/vendor/file.te +++ b/sepolicy/vendor/file.te @@ -11,6 +11,5 @@ type sysfs_input, sysfs_type, fs_type; type sysfs_fingerprint, sysfs_type, fs_type; type sysfs_msm_subsys, sysfs_type, fs_type; type sysfs_scsi_devices_0000, sysfs_type, fs_type; -type sysfs_usb_device, sysfs_type, fs_type; type sysfs_wifi, sysfs_type, fs_type; type vendor_keylayout_file, file_type, vendor_file_type; diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts index 25b14430..32c2746b 100644 --- a/sepolicy/vendor/file_contexts +++ b/sepolicy/vendor/file_contexts @@ -29,7 +29,7 @@ /vendor/bin/hw/android\.hardware\.light@2\.0-service\.mata u:object_r:hal_light_default_exec:s0 /vendor/bin/hw/android\.hardware\.power@1\.3-service\.mata-libperfmgr u:object_r:hal_power_default_exec:s0 /vendor/bin/hw/android\.hardware\.thermal@1\.1-service\.mata u:object_r:hal_thermal_default_exec:s0 -/vendor/bin/hw/android\.hardware\.usb@1\.1-service\.mata u:object_r:hal_usb_impl_exec:s0 +/vendor/bin/hw/android\.hardware\.usb@1\.1-service\.mata u:object_r:hal_usb_default_exec:s0 /vendor/bin/hw/android\.hardware\.vibrator@1\.2-service\.mata u:object_r:hal_vibrator_default_exec:s0 /vendor/bin/hw/vendor\.essential\.hardware\.sidecar@1\.0-service u:object_r:hal_sidecar_essential_default_exec:s0 diff --git a/sepolicy/vendor/hal_usb_default.te b/sepolicy/vendor/hal_usb_default.te new file mode 100644 index 00000000..c582505a --- /dev/null +++ b/sepolicy/vendor/hal_usb_default.te @@ -0,0 +1 @@ +r_dir_file(hal_usb_default, sysfs_usbpd_device) diff --git a/sepolicy/vendor/hal_usb_impl.te b/sepolicy/vendor/hal_usb_impl.te deleted file mode 100644 index a9a3c4f5..00000000 --- a/sepolicy/vendor/hal_usb_impl.te +++ /dev/null @@ -1,14 +0,0 @@ -type hal_usb_impl, domain; -hal_server_domain(hal_usb_impl, hal_usb) -hal_server_domain(hal_usb_impl, hal_usb_gadget) - -type hal_usb_impl_exec, exec_type, vendor_file_type, file_type; -init_daemon_domain(hal_usb_impl) - -r_dir_file(hal_usb_impl, sysfs_usbpd_device) -allow hal_usb_impl sysfs_usbpd_device:file w_file_perms; -allow hal_usb_impl sysfs_usb_device:dir r_dir_perms; -allow hal_usb_impl sysfs_usb_device:file rw_file_perms; -allow hal_usb_impl configfs:file create_file_perms; - -set_prop(hal_usb_impl, vendor_usb_config_prop) diff --git a/sepolicy/vendor/property.te b/sepolicy/vendor/property.te index 48dc2c40..1d828e3f 100644 --- a/sepolicy/vendor/property.te +++ b/sepolicy/vendor/property.te @@ -6,4 +6,3 @@ type sidecar_prop, property_type; type tee_listener_prop, property_type; type vendor_device_prop, property_type; type vendor_hbtp_prop, property_type; -type vendor_usb_config_prop, property_type; diff --git a/sepolicy/vendor/property_contexts b/sepolicy/vendor/property_contexts index c055f621..20253077 100644 --- a/sepolicy/vendor/property_contexts +++ b/sepolicy/vendor/property_contexts @@ -128,7 +128,3 @@ persist.radio.VT_ENABLE u:object_r:vendor_radio_prop:s0 persist.radio.VT_HYBRID_ENABLE u:object_r:vendor_radio_prop:s0 radio. u:object_r:vendor_radio_prop:s0 rcs.publish.status u:object_r:vendor_radio_prop:s0 - -# vendor_usb_config_prop -persist.vendor.usb.config u:object_r:vendor_usb_config_prop:s0 -vendor.usb.config u:object_r:vendor_usb_config_prop:s0 diff --git a/usb/Android.bp b/usb/Android.bp index 028ab138..4a1c4544 100644 --- a/usb/Android.bp +++ b/usb/Android.bp @@ -17,7 +17,7 @@ cc_binary { name: "android.hardware.usb@1.1-service.mata", relative_install_path: "hw", init_rc: ["android.hardware.usb@1.1-service.mata.rc"], - srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"], + srcs: ["service.cpp", "Usb.cpp"], shared_libs: [ "libbase", "libhidlbase", @@ -27,7 +27,6 @@ cc_binary { "libhardware", "android.hardware.usb@1.0", "android.hardware.usb@1.1", - "android.hardware.usb.gadget@1.0", "libcutils", ], proprietary: true, diff --git a/usb/Usb.cpp b/usb/Usb.cpp index e78a82f2..9f0e6401 100644 --- a/usb/Usb.cpp +++ b/usb/Usb.cpp @@ -106,7 +106,7 @@ std::string convertRoletoString(PortRole role) { } Return<void> Usb::switchRole(const hidl_string& portName, - const V1_0::PortRole& newRole) { + const PortRole& newRole) { std::string filename = appendRoleNodeHelper(std::string(portName.c_str()), newRole.type); std::ofstream file(filename); @@ -42,7 +42,7 @@ using ::android::sp; struct Usb : public IUsb { Usb(); - Return<void> switchRole(const hidl_string& portName, const V1_0::PortRole& role) override; + Return<void> switchRole(const hidl_string& portName, const PortRole& role) override; Return<void> setCallback(const sp<V1_0::IUsbCallback>& callback) override; Return<void> queryPortStatus() override; diff --git a/usb/UsbGadget.cpp b/usb/UsbGadget.cpp deleted file mode 100644 index 895bf6c3..00000000 --- a/usb/UsbGadget.cpp +++ /dev/null @@ -1,602 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "android.hardware.usb.gadget@1.0-service.mata" - -#include "UsbGadget.h" -#include <dirent.h> -#include <fcntl.h> -#include <stdio.h> -#include <sys/inotify.h> -#include <sys/mount.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -constexpr int BUFFER_SIZE = 512; -constexpr int MAX_FILE_PATH_LENGTH = 256; -constexpr int EPOLL_EVENTS = 10; -constexpr bool DEBUG = false; -constexpr int DISCONNECT_WAIT_US = 10000; - -#define BUILD_TYPE "ro.build.type" -#define GADGET_PATH "/config/usb_gadget/g1/" -#define PULLUP_PATH GADGET_PATH "UDC" -#define GADGET_NAME "a800000.dwc3" -#define PERSISTENT_BOOT_MODE "ro.bootmode" -#define VENDOR_ID_PATH GADGET_PATH "idVendor" -#define PRODUCT_ID_PATH GADGET_PATH "idProduct" -#define DEVICE_CLASS_PATH GADGET_PATH "bDeviceClass" -#define DEVICE_SUB_CLASS_PATH GADGET_PATH "bDeviceSubClass" -#define DEVICE_PROTOCOL_PATH GADGET_PATH "bDeviceProtocol" -#define DESC_USE_PATH GADGET_PATH "os_desc/use" -#define OS_DESC_PATH GADGET_PATH "os_desc/b.1" -#define CONFIG_PATH GADGET_PATH "configs/b.1/" -#define FUNCTIONS_PATH GADGET_PATH "functions/" -#define FUNCTION_NAME "function" -#define FUNCTION_PATH CONFIG_PATH FUNCTION_NAME -#define RNDIS_PATH FUNCTIONS_PATH "gsi.rndis" - -#define PERSISTENT_VENDOR_CONFIG "persist.vendor.usb.usbradio.config" -#define VENDOR_CONFIG "vendor.usb.config" - -namespace android { -namespace hardware { -namespace usb { -namespace gadget { -namespace V1_0 { -namespace implementation { - -volatile bool gadgetPullup; - -// Used for debug. -static void displayInotifyEvent(struct inotify_event *i) { - ALOGE(" wd =%2d; ", i->wd); - if (i->cookie > 0) ALOGE("cookie =%4d; ", i->cookie); - - ALOGE("mask = "); - if (i->mask & IN_ACCESS) ALOGE("IN_ACCESS "); - if (i->mask & IN_ATTRIB) ALOGE("IN_ATTRIB "); - if (i->mask & IN_CLOSE_NOWRITE) ALOGE("IN_CLOSE_NOWRITE "); - if (i->mask & IN_CLOSE_WRITE) ALOGE("IN_CLOSE_WRITE "); - if (i->mask & IN_CREATE) ALOGE("IN_CREATE "); - if (i->mask & IN_DELETE) ALOGE("IN_DELETE "); - if (i->mask & IN_DELETE_SELF) ALOGE("IN_DELETE_SELF "); - if (i->mask & IN_IGNORED) ALOGE("IN_IGNORED "); - if (i->mask & IN_ISDIR) ALOGE("IN_ISDIR "); - if (i->mask & IN_MODIFY) ALOGE("IN_MODIFY "); - if (i->mask & IN_MOVE_SELF) ALOGE("IN_MOVE_SELF "); - if (i->mask & IN_MOVED_FROM) ALOGE("IN_MOVED_FROM "); - if (i->mask & IN_MOVED_TO) ALOGE("IN_MOVED_TO "); - if (i->mask & IN_OPEN) ALOGE("IN_OPEN "); - if (i->mask & IN_Q_OVERFLOW) ALOGE("IN_Q_OVERFLOW "); - if (i->mask & IN_UNMOUNT) ALOGE("IN_UNMOUNT "); - ALOGE("\n"); - - if (i->len > 0) ALOGE(" name = %s\n", i->name); -} - -static void *monitorFfs(void *param) { - UsbGadget *usbGadget = (UsbGadget *)param; - char buf[BUFFER_SIZE]; - bool writeUdc = true, stopMonitor = false; - struct epoll_event events[EPOLL_EVENTS]; - - bool descriptorWritten = true; - for (int i = 0; i < static_cast<int>(usbGadget->mEndpointList.size()); i++) { - if (access(usbGadget->mEndpointList.at(i).c_str(), R_OK)) { - descriptorWritten = false; - break; - } - } - - // notify here if the endpoints are already present. - if (descriptorWritten && !!WriteStringToFile(GADGET_NAME, PULLUP_PATH)) { - lock_guard<mutex> lock(usbGadget->mLock); - usbGadget->mCurrentUsbFunctionsApplied = true; - gadgetPullup = true; - usbGadget->mCv.notify_all(); - } - - while (!stopMonitor) { - int nrEvents = epoll_wait(usbGadget->mEpollFd, events, EPOLL_EVENTS, -1); - if (nrEvents <= 0) { - ALOGE("epoll wait did not return descriptor number"); - continue; - } - - for (int i = 0; i < nrEvents; i++) { - ALOGI("event=%u on fd=%d\n", events[i].events, events[i].data.fd); - - if (events[i].data.fd == usbGadget->mInotifyFd) { - // Process all of the events in buffer returned by read(). - int numRead = read(usbGadget->mInotifyFd, buf, BUFFER_SIZE); - for (char *p = buf; p < buf + numRead;) { - struct inotify_event *event = (struct inotify_event *)p; - if (DEBUG) displayInotifyEvent(event); - - p += sizeof(struct inotify_event) + event->len; - - bool descriptorPresent = true; - for (int j = 0; j < static_cast<int>(usbGadget->mEndpointList.size()); - j++) { - if (access(usbGadget->mEndpointList.at(j).c_str(), R_OK)) { - if (DEBUG) - ALOGI("%s absent", usbGadget->mEndpointList.at(j).c_str()); - descriptorPresent = false; - break; - } - } - - if (!descriptorPresent && !writeUdc) { - if (DEBUG) ALOGI("endpoints not up"); - writeUdc = true; - } else if (descriptorPresent && writeUdc && - !!WriteStringToFile(GADGET_NAME, PULLUP_PATH)) { - lock_guard<mutex> lock(usbGadget->mLock); - usbGadget->mCurrentUsbFunctionsApplied = true; - ALOGI("GADGET pulled up"); - writeUdc = false; - gadgetPullup = true; - // notify the main thread to signal userspace. - usbGadget->mCv.notify_all(); - } - } - } else { - uint64_t flag; - read(usbGadget->mEventFd, &flag, sizeof(flag)); - if (flag == 100) { - stopMonitor = true; - break; - } - } - } - } - return NULL; -} - -UsbGadget::UsbGadget() - : mMonitorCreated(false), mCurrentUsbFunctionsApplied(false) { - if (access(OS_DESC_PATH, R_OK) != 0) ALOGE("configfs setup not done yet"); -} - -static int unlinkFunctions(const char *path) { - DIR *config = opendir(path); - struct dirent *function; - char filepath[MAX_FILE_PATH_LENGTH]; - int ret = 0; - - if (config == NULL) return -1; - - // d_type does not seems to be supported in /config - // so filtering by name. - while (((function = readdir(config)) != NULL)) { - if ((strstr(function->d_name, FUNCTION_NAME) == NULL)) continue; - // build the path for each file in the folder. - sprintf(filepath, "%s/%s", path, function->d_name); - ret = remove(filepath); - if (ret) { - ALOGE("Unable remove file %s errno:%d", filepath, errno); - break; - } - } - - closedir(config); - return ret; -} - -static int addEpollFd(const unique_fd &epfd, const unique_fd &fd) { - struct epoll_event event; - int ret; - - event.data.fd = fd; - event.events = EPOLLIN; - - ret = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event); - if (ret) ALOGE("epoll_ctl error %d", errno); - - return ret; -} - -Return<void> UsbGadget::getCurrentUsbFunctions( - const sp<V1_0::IUsbGadgetCallback> &callback) { - Return<void> ret = callback->getCurrentUsbFunctionsCb( - mCurrentUsbFunctions, mCurrentUsbFunctionsApplied - ? Status::FUNCTIONS_APPLIED - : Status::FUNCTIONS_NOT_APPLIED); - if (!ret.isOk()) - ALOGE("Call to getCurrentUsbFunctionsCb failed %s", - ret.description().c_str()); - - return Void(); -} - -V1_0::Status UsbGadget::tearDownGadget() { - ALOGI("setCurrentUsbFunctions None"); - - if (!WriteStringToFile("none", PULLUP_PATH)) - ALOGI("Gadget cannot be pulled down"); - - if (!WriteStringToFile("0", DEVICE_CLASS_PATH)) return Status::ERROR; - - if (!WriteStringToFile("0", DEVICE_SUB_CLASS_PATH)) return Status::ERROR; - - if (!WriteStringToFile("0", DEVICE_PROTOCOL_PATH)) return Status::ERROR; - - if (!WriteStringToFile("0", DESC_USE_PATH)) return Status::ERROR; - - if (unlinkFunctions(CONFIG_PATH)) return Status::ERROR; - - if (mMonitorCreated) { - uint64_t flag = 100; - // Stop the monitor thread by writing into signal fd. - write(mEventFd, &flag, sizeof(flag)); - mMonitor->join(); - mMonitorCreated = false; - ALOGI("mMonitor destroyed"); - } else { - ALOGI("mMonitor not running"); - } - - mInotifyFd.reset(-1); - mEventFd.reset(-1); - mEpollFd.reset(-1); - mEndpointList.clear(); - return Status::SUCCESS; -} - -static int linkFunction(const char *function, int index) { - char functionPath[MAX_FILE_PATH_LENGTH]; - char link[MAX_FILE_PATH_LENGTH]; - - sprintf(functionPath, "%s%s", FUNCTIONS_PATH, function); - sprintf(link, "%s%d", FUNCTION_PATH, index); - if (symlink(functionPath, link)) { - ALOGE("Cannot create symlink %s -> %s errno:%d", link, functionPath, errno); - return -1; - } - return 0; -} - -static V1_0::Status setVidPid(const char *vid, const char *pid) { - if (!WriteStringToFile(vid, VENDOR_ID_PATH)) return Status::ERROR; - - if (!WriteStringToFile(pid, PRODUCT_ID_PATH)) return Status::ERROR; - - return Status::SUCCESS; -} - -static std::string getVendorFunctions() { - if (GetProperty(BUILD_TYPE, "") == "user") return "user"; - - std::string bootMode = GetProperty(PERSISTENT_BOOT_MODE, ""); - std::string persistVendorFunctions = - GetProperty(PERSISTENT_VENDOR_CONFIG, ""); - std::string vendorFunctions = GetProperty(VENDOR_CONFIG, ""); - std::string ret = ""; - - if (vendorFunctions != "") { - ret = vendorFunctions; - } else if (bootMode == "usbradio") { - if (persistVendorFunctions != "") - ret = persistVendorFunctions; - else - ret = "diag"; - // vendor.usb.config will reflect the current configured functions - SetProperty(VENDOR_CONFIG, ret); - } - - return ret; -} - -static V1_0::Status validateAndSetVidPid(uint64_t functions) { - V1_0::Status ret = Status::SUCCESS; - std::string vendorFunctions = getVendorFunctions(); - - switch (functions) { - case static_cast<uint64_t>(GadgetFunction::MTP): - if (vendorFunctions == "diag") { - ret = setVidPid("0x05C6", "0x901B"); - } else { - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc033"); - } - break; - case GadgetFunction::ADB | GadgetFunction::MTP: - if (vendorFunctions == "diag") { - ret = setVidPid("0x05C6", "0x903A"); - } else { - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc030"); - } - break; - case static_cast<uint64_t>(GadgetFunction::RNDIS): - if (vendorFunctions == "diag") { - ret = setVidPid("0x05C6", "0x902C"); - } else if (vendorFunctions == "serial_cdev,diag") { - ret = setVidPid("0x05C6", "0x90B5"); - } else { - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc035"); - } - break; - case GadgetFunction::ADB | GadgetFunction::RNDIS: - if (vendorFunctions == "diag") { - ret = setVidPid("0x05C6", "0x902D"); - } else if (vendorFunctions == "serial_cdev,diag") { - ret = setVidPid("0x05C6", "0x90B6"); - } else { - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc036"); - } - break; - case static_cast<uint64_t>(GadgetFunction::PTP): - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc034"); - break; - case GadgetFunction::ADB | GadgetFunction::PTP: - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc031"); - break; - case static_cast<uint64_t>(GadgetFunction::ADB): - if (vendorFunctions == "diag") { - ret = setVidPid("0x05C6", "0x901D"); - } else if (vendorFunctions == "diag,serial_cdev,rmnet_gsi") { - ret = setVidPid("0x05C6", "0x9091"); - } else if (vendorFunctions == "diag,serial_cdev") { - ret = setVidPid("0x05C6", "0x901F"); - } else { - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc032"); - } - break; - case static_cast<uint64_t>(GadgetFunction::MIDI): - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc041"); - break; - case GadgetFunction::ADB | GadgetFunction::MIDI: - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0xc042"); - break; - case static_cast<uint64_t>(GadgetFunction::ACCESSORY): - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0x2d00"); - break; - case GadgetFunction::ADB | GadgetFunction::ACCESSORY: - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x2e17", "0x2d01"); - break; - case static_cast<uint64_t>(GadgetFunction::AUDIO_SOURCE): - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x18d1", "0x2d02"); - break; - case GadgetFunction::ADB | GadgetFunction::AUDIO_SOURCE: - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x18d1", "0x2d03"); - break; - case GadgetFunction::ACCESSORY | GadgetFunction::AUDIO_SOURCE: - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x18d1", "0x2d04"); - break; - case GadgetFunction::ADB | GadgetFunction::ACCESSORY | - GadgetFunction::AUDIO_SOURCE: - if (!(vendorFunctions == "user" || vendorFunctions == "")) - ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str()); - ret = setVidPid("0x18d1", "0x2d05"); - break; - default: - ALOGE("Combination not supported"); - ret = Status::CONFIGURATION_NOT_SUPPORTED; - } - return ret; -} - -V1_0::Status UsbGadget::setupFunctions( - uint64_t functions, const sp<V1_0::IUsbGadgetCallback> &callback, - uint64_t timeout) { - std::unique_lock<std::mutex> lk(mLock); - - unique_fd inotifyFd(inotify_init()); - if (inotifyFd < 0) { - ALOGE("inotify init failed"); - return Status::ERROR; - } - - bool ffsEnabled = false; - int i = 0; - std::string bootMode = GetProperty(PERSISTENT_BOOT_MODE, ""); - - if (((functions & GadgetFunction::MTP) != 0)) { - ALOGI("setCurrentUsbFunctions mtp"); - if (linkFunction("mtp.gs0", i++)) return Status::ERROR; - } - - if (((functions & GadgetFunction::PTP) != 0)) { - ALOGI("setCurrentUsbFunctions ptp"); - if (linkFunction("ptp.gs1", i++)) return Status::ERROR; - } - - if ((functions & GadgetFunction::MIDI) != 0) { - ALOGI("setCurrentUsbFunctions MIDI"); - if (linkFunction("midi.gs5", i++)) return Status::ERROR; - } - - if ((functions & GadgetFunction::ACCESSORY) != 0) { - ALOGI("setCurrentUsbFunctions Accessory"); - if (linkFunction("accessory.gs2", i++)) return Status::ERROR; - } - - if ((functions & GadgetFunction::AUDIO_SOURCE) != 0) { - ALOGI("setCurrentUsbFunctions Audio Source"); - if (linkFunction("audio_source.gs3", i++)) return Status::ERROR; - } - - if ((functions & GadgetFunction::RNDIS) != 0) { - ALOGI("setCurrentUsbFunctions rndis"); - if (linkFunction("gsi.rndis", i++)) return Status::ERROR; - } - - std::string vendorFunctions = getVendorFunctions(); - if (vendorFunctions != "") { - ALOGI("enable usbradio debug functions"); - char *function = strtok(const_cast<char *>(vendorFunctions.c_str()), ","); - while (function != NULL) { - if (string(function) == "diag" && linkFunction("diag.diag", i++)) - return Status::ERROR; - if (string(function) == "serial_cdev" && linkFunction("cser.dun.0", i++)) - return Status::ERROR; - if (string(function) == "rmnet_gsi" && linkFunction("gsi.rmnet", i++)) - return Status::ERROR; - function = strtok(NULL, ","); - } - } - - if ((functions & GadgetFunction::ADB) != 0) { - ffsEnabled = true; - ALOGI("setCurrentUsbFunctions Adb"); - if (inotify_add_watch(inotifyFd, "/dev/usb-ffs/adb/", IN_ALL_EVENTS) == -1) - return Status::ERROR; - - if (linkFunction("ffs.adb", i++)) return Status::ERROR; - mEndpointList.push_back("/dev/usb-ffs/adb/ep1"); - mEndpointList.push_back("/dev/usb-ffs/adb/ep2"); - ALOGI("Service started"); - } - - // Pull up the gadget right away when there are no ffs functions. - if (!ffsEnabled) { - if (!WriteStringToFile(GADGET_NAME, PULLUP_PATH)) return Status::ERROR; - mCurrentUsbFunctionsApplied = true; - if (callback) - callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS); - return Status::SUCCESS; - } - - unique_fd eventFd(eventfd(0, 0)); - if (eventFd == -1) { - ALOGE("mEventFd failed to create %d", errno); - return Status::ERROR; - } - - unique_fd epollFd(epoll_create(2)); - if (epollFd == -1) { - ALOGE("mEpollFd failed to create %d", errno); - return Status::ERROR; - } - - if (addEpollFd(epollFd, inotifyFd) == -1) return Status::ERROR; - - if (addEpollFd(epollFd, eventFd) == -1) return Status::ERROR; - - mEpollFd = move(epollFd); - mInotifyFd = move(inotifyFd); - mEventFd = move(eventFd); - gadgetPullup = false; - - // Monitors the ffs paths to pull up the gadget when descriptors are written. - // Also takes of the pulling up the gadget again if the userspace process - // dies and restarts. - mMonitor = unique_ptr<thread>(new thread(monitorFfs, this)); - mMonitorCreated = true; - if (DEBUG) ALOGI("Mainthread in Cv"); - - if (callback) { - if (mCv.wait_for(lk, timeout * 1ms, [] { return gadgetPullup; })) { - ALOGI("monitorFfs signalled true"); - } else { - ALOGI("monitorFfs signalled error"); - // continue monitoring as the descriptors might be written at a later - // point. - } - Return<void> ret = callback->setCurrentUsbFunctionsCb( - functions, gadgetPullup ? Status::SUCCESS : Status::ERROR); - if (!ret.isOk()) - ALOGE("setCurrentUsbFunctionsCb error %s", ret.description().c_str()); - } - - return Status::SUCCESS; -} - -Return<void> UsbGadget::setCurrentUsbFunctions( - uint64_t functions, const sp<V1_0::IUsbGadgetCallback> &callback, - uint64_t timeout) { - std::unique_lock<std::mutex> lk(mLockSetCurrentFunction); - - mCurrentUsbFunctions = functions; - mCurrentUsbFunctionsApplied = false; - - // Unlink the gadget and stop the monitor if running. - V1_0::Status status = tearDownGadget(); - if (status != Status::SUCCESS) { - goto error; - } - - // Leave the gadget pulled down to give time for the host to sense disconnect. - usleep(DISCONNECT_WAIT_US); - - if (functions == static_cast<uint64_t>(GadgetFunction::NONE)) { - if (callback == NULL) return Void(); - Return<void> ret = - callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS); - if (!ret.isOk()) - ALOGE("Error while calling setCurrentUsbFunctionsCb %s", - ret.description().c_str()); - return Void(); - } - - status = validateAndSetVidPid(functions); - - if (status != Status::SUCCESS) { - goto error; - } - - status = setupFunctions(functions, callback, timeout); - if (status != Status::SUCCESS) { - goto error; - } - - ALOGI("Usb Gadget setcurrent functions called successfully"); - return Void(); - -error: - ALOGI("Usb Gadget setcurrent functions failed"); - if (callback == NULL) return Void(); - Return<void> ret = callback->setCurrentUsbFunctionsCb(functions, status); - if (!ret.isOk()) - ALOGE("Error while calling setCurrentUsbFunctionsCb %s", - ret.description().c_str()); - return Void(); -} -} // namespace implementation -} // namespace V1_0 -} // namespace gadget -} // namespace usb -} // namespace hardware -} // namespace android diff --git a/usb/UsbGadget.h b/usb/UsbGadget.h deleted file mode 100644 index 9a2c4dd3..00000000 --- a/usb/UsbGadget.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_HARDWARE_USB_GADGET_V1_0_USBGADGET_H -#define ANDROID_HARDWARE_USB_GADGET_V1_0_USBGADGET_H - -#include <android-base/file.h> -#include <android-base/properties.h> -#include <android-base/unique_fd.h> -#include <android/hardware/usb/gadget/1.0/IUsbGadget.h> -#include <hidl/MQDescriptor.h> -#include <hidl/Status.h> -#include <string> -#include <sys/epoll.h> -#include <sys/eventfd.h> -#include <thread> -#include <utils/Log.h> -#include <chrono> -#include <condition_variable> -#include <mutex> - -namespace android { -namespace hardware { -namespace usb { -namespace gadget { -namespace V1_0 { -namespace implementation { - -using ::android::sp; -using ::android::base::GetProperty; -using ::android::base::SetProperty; -using ::android::base::unique_fd; -using ::android::base::WriteStringToFile; -using ::android::hardware::hidl_array; -using ::android::hardware::hidl_memory; -using ::android::hardware::hidl_string; -using ::android::hardware::hidl_vec; -using ::android::hardware::Return; -using ::android::hardware::Void; -using ::std::lock_guard; -using ::std::move; -using ::std::mutex; -using ::std::string; -using ::std::thread; -using ::std::unique_ptr; -using ::std::vector; -using namespace std::chrono_literals; - -struct UsbGadget : public IUsbGadget { - UsbGadget(); - unique_fd mInotifyFd; - unique_fd mEventFd; - unique_fd mEpollFd; - - unique_ptr<thread> mMonitor; - volatile bool mMonitorCreated; - vector<string> mEndpointList; - // protects the CV. - std::mutex mLock; - std::condition_variable mCv; - - // Makes sure that only one request is processed at a time. - std::mutex mLockSetCurrentFunction; - uint64_t mCurrentUsbFunctions; - bool mCurrentUsbFunctionsApplied; - - Return<void> setCurrentUsbFunctions(uint64_t functions, - const sp<IUsbGadgetCallback>& callback, - uint64_t timeout) override; - - Return<void> getCurrentUsbFunctions( - const sp<IUsbGadgetCallback>& callback) override; - - private: - Status tearDownGadget(); - Status setupFunctions(uint64_t functions, - const sp<IUsbGadgetCallback>& callback, - uint64_t timeout); -}; - -} // namespace implementation -} // namespace V1_0 -} // namespace gadget -} // namespace usb -} // namespace hardware -} // namespace android - -#endif // ANDROID_HARDWARE_USB_V1_2_USBGADGET_H diff --git a/usb/android.hardware.usb@1.1-service.mata.rc b/usb/android.hardware.usb@1.1-service.mata.rc index 2b7acd22..fec6f43d 100644 --- a/usb/android.hardware.usb@1.1-service.mata.rc +++ b/usb/android.hardware.usb@1.1-service.mata.rc @@ -1,14 +1,4 @@ service vendor.usb-hal-1-1 /vendor/bin/hw/android.hardware.usb@1.1-service.mata class hal user root - group root system shell mtp - -on boot - chown root system /sys/class/dual_role_usb/otg_default/power_role - chown root system /sys/class/dual_role_usb/otg_default/data_role - chown root system /sys/class/dual_role_usb/otg_default/mode - chown root system /sys/class/dual_role_usb/otg_default/supported_modes - chmod 664 /sys/class/dual_role_usb/otg_default/power_role - chmod 664 /sys/class/dual_role_usb/otg_default/data_role - chmod 664 /sys/class/dual_role_usb/otg_default/mode - chmod 664 /sys/class/dual_role_usb/otg_default/supported_modes + group root system diff --git a/usb/service.cpp b/usb/service.cpp index b0f1ce00..37efef1f 100644 --- a/usb/service.cpp +++ b/usb/service.cpp @@ -17,7 +17,6 @@ #include <hidl/HidlTransportSupport.h> #include "Usb.h" -#include "UsbGadget.h" using android::sp; @@ -27,36 +26,23 @@ using android::hardware::joinRpcThreadpool; // Generated HIDL files using android::hardware::usb::V1_1::IUsb; -using android::hardware::usb::gadget::V1_0::IUsbGadget; using android::hardware::usb::V1_1::implementation::Usb; -using android::hardware::usb::gadget::V1_0::implementation::UsbGadget; -using android::OK; using android::status_t; +using android::OK; int main() { android::sp<IUsb> service = new Usb(); - android::sp<IUsbGadget> service2 = new UsbGadget(); - configureRpcThreadpool(2, true /*callerWillJoin*/); + configureRpcThreadpool(1, true /*callerWillJoin*/); status_t status = service->registerAsService(); - if (status != OK) { - ALOGE("Cannot register USB HAL service"); - return 1; - } - - status = service2->registerAsService(); - - if (status != OK) { - ALOGE("Cannot register USB Gadget HAL service"); - return 1; + if (status == OK) { + ALOGI("USB HAL Ready."); + joinRpcThreadpool(); } - ALOGI("USB HAL Ready."); - joinRpcThreadpool(); - // Under noraml cases, execution will not reach this line. - ALOGI("USB HAL failed to join thread pool."); + ALOGE("Cannot register USB HAL service"); return 1; } |
