diff options
| -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; } |
