From ecfab0dcb6a0456ac54dc7cdb5c6cad4eb0f2229 Mon Sep 17 00:00:00 2001 From: Ash Blake Date: Sun, 18 Apr 2021 17:15:17 +0200 Subject: [PATCH] rosemary: usb: implement gadget Implement a USB gadget HAL based on the default implementation from AOSP and move key features from init.mt6768.usb.rc to it. Also remove triggers for some proprietary USB features that aren't too useful on custom ROMs and seem to exist mostly for engineering purposes. Change-Id: Ie920fea8b3834d3bada2609df66ca68ddbb980b1 --- rootdir/etc/init.mt6785.usb.rc | 685 +----------------- usb/gadget/Android.bp | 38 + usb/gadget/UsbGadget.cpp | 182 +++++ usb/gadget/UsbGadget.h | 94 +++ ...ardware.usb.gadget@1.1-service.rosemary.rc | 7 + ...rdware.usb.gadget@1.1-service.rosemary.xml | 11 + usb/gadget/lib/Android.bp | 40 + usb/gadget/lib/UsbGadgetUtils.cpp | 153 ++++ usb/gadget/lib/include/UsbGadgetCommon.h | 114 +++ usb/gadget/service.cpp | 52 ++ 10 files changed, 698 insertions(+), 678 deletions(-) create mode 100644 usb/gadget/Android.bp create mode 100644 usb/gadget/UsbGadget.cpp create mode 100644 usb/gadget/UsbGadget.h create mode 100644 usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.rc create mode 100644 usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.xml create mode 100644 usb/gadget/lib/Android.bp create mode 100644 usb/gadget/lib/UsbGadgetUtils.cpp create mode 100644 usb/gadget/lib/include/UsbGadgetCommon.h create mode 100644 usb/gadget/service.cpp diff --git a/rootdir/etc/init.mt6785.usb.rc b/rootdir/etc/init.mt6785.usb.rc index 7343e0e..32c82a6 100644 --- a/rootdir/etc/init.mt6785.usb.rc +++ b/rootdir/etc/init.mt6785.usb.rc @@ -3,14 +3,14 @@ on early-init on post-fs setprop vendor.usb.vid "0x0E8D" - mkdir /dev/usb-ffs 0770 shell shell + mkdir /dev/usb-ffs 0775 shell shell mkdir /dev/usb-ffs/adb 0770 shell shell - mkdir /config/usb_gadget/g1 0770 shell shell - write /config/usb_gadget/g1/idVendor 0x2717 + mkdir /config/usb_gadget/g1 0770 + mkdir /config/usb_gadget/g1/strings/0x409 0770 + write /config/usb_gadget/g1/idVendor ${vendor.usb.vid} write /config/usb_gadget/g1/bcdDevice 0x0404 write /config/usb_gadget/g1/bcdUSB 0x0200 write /config/usb_gadget/g1/os_desc/use 1 - 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} @@ -31,13 +31,13 @@ on post-fs mkdir /config/usb_gadget/g1/functions/via_modem.gs0 mkdir /config/usb_gadget/g1/functions/via_ets.gs0 mkdir /config/usb_gadget/g1/functions/via_atc.gs0 - mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell - mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell + mkdir /config/usb_gadget/g1/configs/b.1 0770 + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 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/configs/b.1/MaxPower 500 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 + mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000,no_disconnect=1 on boot setprop sys.usb.configfs 1 @@ -123,616 +123,6 @@ on property:sys.usb.config=hid && property:sys.usb.configfs=1 on property:dev.bootcomplete=1 write /config/usb_gadget/g1/strings/0x409/product ${ro.product.marketname} -### main function : adb ### -### start adbd at init.usb.configfs.rc ### -on property:sys.usb.config=adb && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x201C -on property:sys.usb.config=adb && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2006 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=adb && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2029 - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && \ -property:vendor.usb.acm_enable=1 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb_acm" - write /config/usb_gadget/g1/idProduct 0xFF0C - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && \ -property:vendor.usb.acm_enable=0 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" - write /config/usb_gadget/g1/idProduct 0xFF08 - symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### main function : mtp ### -on property:sys.usb.config=mtp && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2008 -on property:sys.usb.config=mtp && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2012 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=mtp && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x202A - -on property:sys.usb.config=mtp && property:vendor.usb.acm_enable=1 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_acm" - write /config/usb_gadget/g1/idProduct 0xFF44 - write /config/usb_gadget/g1/os_desc/use 1 - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f3 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=mtp && property:vendor.usb.acm_enable=0 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp" - write /config/usb_gadget/g1/idProduct 0xFF40 - write /config/usb_gadget/g1/os_desc/use 1 - symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### start adbd at init.usb.configfs.rc ### -on property:sys.usb.config=mtp,adb && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x201D -on property:sys.usb.config=mtp,adb && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x200A - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=mtp,adb && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2026 - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && \ -property:vendor.usb.acm_enable=1 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb_acm" - write /config/usb_gadget/g1/idProduct 0xFF4C - write /config/usb_gadget/g1/os_desc/use 1 - write /sys/class/udc/musb-hdrc/device/saving 1 - 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 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && \ -property:vendor.usb.acm_enable=0 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb" - write /config/usb_gadget/g1/idProduct 0xFF48 - write /config/usb_gadget/g1/os_desc/use 1 - 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 ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### main function : ptp ### -on property:sys.usb.config=ptp && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x200B -on property:sys.usb.config=ptp && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2013 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=ptp && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x202B - -on property:sys.usb.config=ptp && property:vendor.usb.acm_enable=1 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp_acm" - write /config/usb_gadget/g1/idProduct 0xFF14 - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f3 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=ptp && property:vendor.usb.acm_enable=0 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp" - write /config/usb_gadget/g1/idProduct 0xFF10 - symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### start adbd at init.usb.configfs.rc ### -on property:sys.usb.config=ptp,adb && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x200C -on property:sys.usb.config=ptp,adb && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x200D - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=ptp,adb && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2027 - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ptp,adb && \ -property:vendor.usb.acm_enable=1 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp_adb_acm" - write /config/usb_gadget/g1/idProduct 0xFF1C - write /sys/class/udc/musb-hdrc/device/saving 1 - 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 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ptp,adb && \ -property:vendor.usb.acm_enable=0 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp_adb" - write /config/usb_gadget/g1/idProduct 0xFF18 - 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 ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### main function : rndis ### -on property:sys.usb.config=rndis && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2004 -on property:sys.usb.config=rndis && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2011 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=rndis && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x202C - -on property:sys.usb.config=rndis && property:vendor.usb.acm_enable=1 && \ -property:sys.usb.configfs=1 - mkdir /config/usb_gadget/g1/functions/rndis.gs4 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums_acm" - write /config/usb_gadget/g1/idProduct 0xFF84 - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f3 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=rndis && property:vendor.usb.acm_enable=0 && \ -property:sys.usb.configfs=1 - mkdir /config/usb_gadget/g1/functions/rndis.gs4 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis" - write /config/usb_gadget/g1/idProduct 0xFF80 - symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=rndis,adb && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2005 -on property:sys.usb.config=rndis,adb && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2010 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=rndis,adb && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2028 - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,adb && \ -property:vendor.usb.acm_enable=1 && property:sys.usb.configfs=1 - mkdir /config/usb_gadget/g1/functions/rndis.gs4 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb_acm" - write /config/usb_gadget/g1/idProduct 0xFF8C - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,adb && \ -property:vendor.usb.acm_enable=0 && property:sys.usb.configfs=1 - mkdir /config/usb_gadget/g1/functions/rndis.gs4 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb" - write /config/usb_gadget/g1/idProduct 0xFF88 - symlink /config/usb_gadget/g1/functions/rndis.gs4 /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 ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### main function : midi ### -on property:sys.usb.config=midi && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idProduct 0x2046 - -on property:sys.usb.config=midi,adb && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idProduct 0x2048 - -### main function : accessory ### -on property:sys.usb.config=accessory && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idVendor 0x18d1 - write /config/usb_gadget/g1/idProduct 0x2d00 - -on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idVendor 0x18d1 - write /config/usb_gadget/g1/idProduct 0x2d01 - -### main function : audio_source ### -on property:sys.usb.config=audio_source && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idVendor 0x18d1 - write /config/usb_gadget/g1/idProduct 0x2d02 - -on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idVendor 0x18d1 - write /config/usb_gadget/g1/idProduct 0x2d03 - -### main function : accessory,audio_source ### -on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idVendor 0x18d1 - write /config/usb_gadget/g1/idProduct 0x2d04 - -on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/idVendor 0x18d1 - write /config/usb_gadget/g1/idProduct 0x2d05 - -on property:sys.usb.config=via_bypass && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2031 -on property:sys.usb.config=via_bypass && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2033 - setprop vendor.usb.acm_port1 "" - -##via_modem,via_ets,via_atc,acm -on property:sys.usb.config=via_bypass && property:vendor.usb.acm_enable=1 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "via_bypass" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/via_modem.gs0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/via_ets.gs0 /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/via_atc.gs0 /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -##via_modem,via_ets,via_atc,adb -on property:sys.usb.config=via_bypass && property:vendor.usb.acm_enable=0 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "via_bypass" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/via_modem.gs0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/via_ets.gs0 /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/via_atc.gs0 /config/usb_gadget/g1/configs/b.1/f3 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=via_bypass,adb && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2032 -on property:sys.usb.config=via_bypass,adb && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2034 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=via_bypass,adb && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2050 - -on property:sys.usb.config=via_bypass,adb && property:sys.usb.configfs=1 - start adbd - -##via_modem,via_ets,via_atc,adb,acm -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=via_bypass,adb && \ -property:vendor.usb.acm_enable=1 && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb_acm" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/via_modem.gs0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/via_ets.gs0 /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/via_atc.gs0 /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f5 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -##via_modem,acm,adb -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=via_bypass,adb && \ -property:vendor.usb.acm_enable=1 && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb_acm2" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/via_modem.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 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -##via_modem,via_ets,via_atc,adb -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=via_bypass,adb && \ -property:vendor.usb.acm_enable=0 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/via_modem.gs0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/via_ets.gs0 /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/via_atc.gs0 /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 ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### main function : mass_storage ### -on property:sys.usb.config=mass_storage && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2002 -on property:sys.usb.config=mass_storage && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x200F - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=mass_storage && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x202D - -on property:sys.usb.config=mass_storage && property:vendor.usb.acm_enable=1 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums_acm" - write /config/usb_gadget/g1/idProduct 0xFF24 - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f3 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=mass_storage && property:vendor.usb.acm_enable=0 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums" - write /config/usb_gadget/g1/idProduct 0xFF20 - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /config/usb_gadget/g1/configs/b.1/f1 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=mass_storage,adb && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2003 -on property:sys.usb.config=mass_storage,adb && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2006 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=mass_storage,adb && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2029 - -on property:sys.usb.config=mass_storage,adb && property:sys.usb.configfs=1 - start adbd - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mass_storage,adb && \ -property:vendor.usb.acm_enable=1 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums_adb_acm" - write /config/usb_gadget/g1/idProduct 0xFF2C - write /sys/class/udc/musb-hdrc/device/saving 1 - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mass_storage,adb && \ -property:vendor.usb.acm_enable=0 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums_adb" - write /config/usb_gadget/g1/idProduct 0xFF28 - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /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 ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### main function : bicr ### -on property:sys.usb.config=bicr && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2002 -on property:sys.usb.config=bicr && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x200F - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=bicr && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x202D - -on property:sys.usb.config=bicr && property:vendor.usb.acm_enable=1 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums_acm" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /sys/class/udc/musb-hdrc/device/saving 1 - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/cdrom 1 - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file "/dev/block/loop0" - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f3 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=bicr && property:vendor.usb.acm_enable=0 && \ -property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/cdrom 1 - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file "/dev/block/loop0" - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /config/usb_gadget/g1/configs/b.1/f1 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.config=bicr,adb && property:vendor.usb.acm_cnt=0 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2003 -on property:sys.usb.config=bicr,adb && property:vendor.usb.acm_cnt=1 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2006 - setprop vendor.usb.acm_port1 "" -on property:sys.usb.config=bicr,adb && property:vendor.usb.acm_cnt=2 && \ -property:sys.usb.configfs=1 - setprop vendor.usb.pid 0x2029 - -on property:sys.usb.config=bicr,adb && property:sys.usb.configfs=1 - start adbd - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=bicr,adb && \ -property:vendor.usb.acm_enable=1 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums_adb_acm" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /sys/class/udc/musb-hdrc/device/saving 1 - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/cdrom 1 - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file "/dev/block/loop0" - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /config/usb_gadget/g1/configs/b.1/f1 - symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port0} /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs${vendor.usb.acm_port1} /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -on property:sys.usb.ffs.ready=1 && property:sys.usb.config=bicr,adb && \ -property:vendor.usb.acm_enable=0 && property:sys.usb.configfs=1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ums_adb" - write /config/usb_gadget/g1/idProduct ${vendor.usb.pid} - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/cdrom 1 - write /config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file "/dev/block/loop0" - symlink /config/usb_gadget/g1/functions/mass_storage.usb0 /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 ${vendor.usb.controller} - setprop sys.usb.state ${sys.usb.config} - -### ACM APPEND SERIES ### -on property:persist.vendor.radio.port_index=0 && property:sys.boot_completed=1 - setprop vendor.usb.acm_idx "" - setprop vendor.usb.acm_cnt 0 - setprop vendor.usb.acm_enable 0 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - -on property:persist.vendor.radio.port_index=1 && property:sys.boot_completed=1 - setprop sys.usb.config acm_gs0 -on property:sys.usb.config=mass_storage,adb,acm - setprop sys.usb.config acm_gs0 -on property:sys.usb.config=acm_gs0 - setprop vendor.usb.acm_port0 0 - setprop vendor.usb.acm_port1 "" - setprop vendor.usb.acm_cnt 1 - setprop vendor.usb.acm_enable 1 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - setprop vendor.usb.acm_idx "1" - -on property:persist.vendor.radio.port_index=2 && property:sys.boot_completed=1 - setprop sys.usb.config acm_gs1 -on property:sys.usb.config=acm_gs1 - setprop vendor.usb.acm_port0 1 - setprop vendor.usb.acm_port1 "" - setprop vendor.usb.acm_cnt 1 - setprop vendor.usb.acm_enable 1 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - setprop vendor.usb.acm_idx "2" - -on property:persist.vendor.radio.port_index=3 && property:sys.boot_completed=1 - setprop sys.usb.config acm_gs2 -on property:sys.usb.config=acm_third - setprop sys.usb.config acm_gs2 -on property:sys.usb.config=acm_gs2 - setprop vendor.usb.acm_port0 2 - setprop vendor.usb.acm_port1 "" - setprop vendor.usb.acm_cnt 1 - setprop vendor.usb.acm_enable 1 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - setprop vendor.usb.acm_idx "3" - -on property:persist.vendor.radio.port_index=4 && property:sys.boot_completed=1 - setprop sys.usb.config acm_gs3 -on property:sys.usb.config=gs3 - setprop sys.usb.config acm_gs3 -on property:sys.usb.config=mtp,gs3 - setprop sys.usb.config acm_gs3 -on property:sys.usb.config=acm_gs3 - setprop vendor.usb.acm_port0 3 - setprop vendor.usb.acm_port1 "" - setprop vendor.usb.acm_cnt 1 - setprop vendor.usb.acm_enable 1 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - setprop vendor.usb.acm_idx "4" - -on property:sys.usb.config=mtp,gs0gs1 - setprop sys.usb.config acm_gs0gs1 -on property:sys.usb.config=gs0gs1 - setprop sys.usb.config acm_gs0gs1 -on property:sys.usb.config=rndis,gs0gs1 - setprop sys.usb.config acm_gs0gs1 -on property:sys.usb.config=rndis,adb,gs0gs1 - setprop sys.usb.config acm_gs0gs1 -on property:sys.usb.config=acm_gs0gs1 - setprop vendor.usb.acm_port0 0 - setprop vendor.usb.acm_port1 1 - setprop vendor.usb.acm_cnt 2 - setprop vendor.usb.acm_enable 1 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - setprop vendor.usb.acm_idx "1,2" - -on property:sys.usb.config=gs3,dual_acm - setprop sys.usb.config acm_gs0gs3 -on property:sys.usb.config=mtp,gs3,dual_acm - setprop sys.usb.config acm_gs0gs3 -on property:sys.usb.config=mtp,gs0gs3 - setprop sys.usb.config acm_gs0gs3 -on property:sys.usb.config=gs0gs3 - setprop sys.usb.config acm_gs0gs3 -on property:sys.usb.config=rndis,gs0gs3 - setprop sys.usb.config acm_gs0gs3 -on property:sys.usb.config=rndis,adb,gs0gs3 - setprop sys.usb.config acm_gs0gs3 -on property:sys.usb.config=acm_gs0gs3 - setprop vendor.usb.acm_port0 0 - setprop vendor.usb.acm_port1 3 - setprop vendor.usb.acm_cnt 2 - setprop vendor.usb.acm_enable 1 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - setprop vendor.usb.acm_idx "1,4" - -on property:sys.usb.config=gs1gs3 - setprop sys.usb.config acm_gs1gs3 -on property:sys.usb.config=mtp,gs1gs3 - setprop sys.usb.config acm_gs1gs3 -on property:sys.usb.config=via_bypass,gs1gs3 - setprop sys.usb.config acm_gs1gs3 -on property:sys.usb.config=rndis,gs1gs3 - setprop sys.usb.config acm_gs1gs3 -on property:sys.usb.config=acm_gs1gs3 - setprop vendor.usb.acm_port0 1 - setprop vendor.usb.acm_port1 3 - setprop vendor.usb.acm_cnt 2 - setprop vendor.usb.acm_enable 1 - setprop sys.usb.config none - setprop sys.usb.config ${sys.usb.state} - setprop vendor.usb.acm_idx "2,4" - # For ATM (Android Test Mode) on property:vendor.usb.clear=1 && property:sys.usb.configfs=1 write /config/usb_gadget/g1/UDC "none" @@ -754,60 +144,6 @@ on property:sys.usb.ffs.ready=0 on property:sys.usb.ffs.ready=1 setprop vendor.usb.ffs.ready 1 -on property:sys.usb.config=atm_gs0 && property:sys.usb.configfs=1 - stop adbd - setprop vendor.usb.ffs.ready 0 - setprop vendor.usb.clear 1 - -on property:vendor.usb.ffs.ready=0 && property:sys.usb.config=atm_gs0 && \ -property:vendor.usb.clear=2 && property:sys.usb.configfs=1 - start adbd - -on property:vendor.usb.ffs.ready=1 && property:sys.usb.config=atm_gs0 && \ -property:vendor.usb.clear=2 && property:sys.usb.configfs=1 - setprop vendor.usb.acm_port0 0 - setprop vendor.usb.acm_port1 "" - setprop vendor.usb.acm_cnt 1 - setprop vendor.usb.acm_enable 1 - write /sys/class/udc/musb-hdrc/device/saving 1 - write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "atm_gs0" - write /config/usb_gadget/g1/idProduct 0x200A - 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 - symlink /config/usb_gadget/g1/functions/acm.gs0 /config/usb_gadget/g1/configs/b.1/f3 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - #setprop sys.usb.state ${sys.usb.config} - #setprop vendor.usb.pid 0x200A - setprop vendor.usb.clear 0 - setprop vendor.usb.acm_idx "1" - -on property:sys.usb.config=atm_gs0gs3 && property:sys.usb.configfs=1 - stop adbd - setprop vendor.usb.ffs.ready 0 - setprop vendor.usb.clear 1 - -on property:vendor.usb.ffs.ready=0 && property:sys.usb.config=atm_gs0gs3 && \ -property:vendor.usb.clear=2 && property:sys.usb.configfs=1 - start adbd - -on property:vendor.usb.ffs.ready=1 && property:sys.usb.config=atm_gs0gs3 && \ -property:vendor.usb.clear=2 && property:sys.usb.configfs=1 - setprop vendor.usb.acm_port0 0 - setprop vendor.usb.acm_port1 3 - setprop vendor.usb.acm_cnt 2 - setprop vendor.usb.acm_enable 1 - write /sys/class/udc/musb-hdrc/device/saving 1 - write /config/usb_gadget/g1/idProduct 0x2026 - 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 - symlink /config/usb_gadget/g1/functions/acm.gs0 /config/usb_gadget/g1/configs/b.1/f3 - symlink /config/usb_gadget/g1/functions/acm.gs3 /config/usb_gadget/g1/configs/b.1/f4 - write /config/usb_gadget/g1/UDC ${vendor.usb.controller} - #setprop sys.usb.state ${sys.usb.config} - #setprop vendor.usb.pid 0x2026 - setprop vendor.usb.clear 0 - setprop vendor.usb.acm_idx "1,4" - ### CHARGING ### on property:sys.usb.config=cdp && property:sys.usb.configfs=1 write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp" @@ -835,13 +171,6 @@ on property:vendor.usb.charging=yes on property:vendor.usb.charging=no write /sys/class/udc/musb-hdrc/device/cmode 1 -on property:vendor.usb.bicr=yes - write /sys/class/android_usb/android0/f_mass_storage/bicr 1 - write /sys/class/android_usb/android0/f_mass_storage/lun/file "/dev/block/loop0" -on property:vendor.usb.bicr=no - write /sys/class/android_usb/android0/f_mass_storage/bicr 0 - write /sys/class/android_usb/android0/f_mass_storage/lun/file "off" - on property:vendor.usb.port.mode=usb write /sys/class/udc/musb-hdrc/device/portmode 0 on property:vendor.usb.port.mode=uart diff --git a/usb/gadget/Android.bp b/usb/gadget/Android.bp new file mode 100644 index 0000000..5ee5a5f --- /dev/null +++ b/usb/gadget/Android.bp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2020 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. + */ + +cc_binary { + name: "android.hardware.usb.gadget@1.1-service.rosemary", + relative_install_path: "hw", + init_rc: ["android.hardware.usb.gadget@1.1-service.rosemary.rc"], + vintf_fragments: ["android.hardware.usb.gadget@1.1-service.rosemary.xml"], + srcs: [ + "service.cpp", + "UsbGadget.cpp", + ], + shared_libs: [ + "android.hardware.usb.gadget@1.0", + "android.hardware.usb.gadget@1.1", + "libbase", + "libcutils", + "libhardware", + "libhidlbase", + "liblog", + "libutils", + ], + static_libs: ["libusbconfigfs_rosemary"], + proprietary: true, +} diff --git a/usb/gadget/UsbGadget.cpp b/usb/gadget/UsbGadget.cpp new file mode 100644 index 0000000..8d7e719 --- /dev/null +++ b/usb/gadget/UsbGadget.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2020 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.1-service.rosemary" +#include "UsbGadget.h" +#include +#include +#include +#include +#include +#include +#include +#include +namespace android { +namespace hardware { +namespace usb { +namespace gadget { +namespace V1_1 { +namespace implementation { +UsbGadget::UsbGadget() { + if (access(OS_DESC_PATH, R_OK) != 0) { + ALOGE("configfs setup not done yet"); + abort(); + } +} +void currentFunctionsAppliedCallback(bool functionsApplied, void* payload) { + UsbGadget* gadget = (UsbGadget*)payload; + gadget->mCurrentUsbFunctionsApplied = functionsApplied; +} +Return UsbGadget::getCurrentUsbFunctions(const sp& callback) { + Return 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() { + if (resetGadget() != V1_0::Status::SUCCESS) return V1_0::Status::ERROR; + return V1_0::Status::SUCCESS; +} +Return UsbGadget::reset() { + if (!WriteStringToFile("none", PULLUP_PATH)) { + ALOGI("Gadget cannot be pulled down"); + return Status::ERROR; + } + return Status::SUCCESS; +} +static V1_0::Status validateAndSetVidPid(uint64_t functions) { + V1_0::Status ret = V1_0::Status::SUCCESS; + switch (functions) { + case static_cast(V1_0::GadgetFunction::MTP): + ret = setVidPid("0x2717", "0xFF40"); + WriteStringToFile("mtp", CONFIG_STR_PATH); + WriteStringToFile("1", DESC_USE_PATH); + break; + case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::MTP: + ret = setVidPid("0x2717", "0xFF48"); + WriteStringToFile("mtp_adb", CONFIG_STR_PATH); + WriteStringToFile("1", DESC_USE_PATH); + break; + case static_cast(V1_0::GadgetFunction::RNDIS): + ret = setVidPid("0x2717", "0xFF80"); + WriteStringToFile("rndis", CONFIG_STR_PATH); + break; + case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::RNDIS: + ret = setVidPid("0x2717", "0xFF88"); + WriteStringToFile("rndis_adb", CONFIG_STR_PATH); + break; + case static_cast(V1_0::GadgetFunction::PTP): + ret = setVidPid("0x2717", "0xFF10"); + WriteStringToFile("ptp", CONFIG_STR_PATH); + break; + case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::PTP: + ret = setVidPid("0x2717", "0xFF18"); + WriteStringToFile("ptp_adb", CONFIG_STR_PATH); + break; + case static_cast(V1_0::GadgetFunction::ADB): + ret = setVidPid("0x18d1", "0x4ee7"); + WriteStringToFile("adb", CONFIG_STR_PATH); + break; + case static_cast(V1_0::GadgetFunction::MIDI): + ret = setVidPid("0x0E8D", "0x2046"); + break; + case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::MIDI: + ret = setVidPid("0x0E8D", "0x2048"); + break; + case static_cast(V1_0::GadgetFunction::ACCESSORY): + ret = setVidPid("0x18d1", "0x2d00"); + break; + case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::ACCESSORY: + ret = setVidPid("0x18d1", "0x2d01"); + break; + case static_cast(V1_0::GadgetFunction::AUDIO_SOURCE): + ret = setVidPid("0x18d1", "0x2d02"); + break; + case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::AUDIO_SOURCE: + ret = setVidPid("0x18d1", "0x2d03"); + break; + case V1_0::GadgetFunction::ACCESSORY | V1_0::GadgetFunction::AUDIO_SOURCE: + ret = setVidPid("0x18d1", "0x2d04"); + break; + case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::ACCESSORY | + V1_0::GadgetFunction::AUDIO_SOURCE: + ret = setVidPid("0x18d1", "0x2d05"); + break; + default: + ALOGE("Combination not supported"); + ret = V1_0::Status::CONFIGURATION_NOT_SUPPORTED; + } + return ret; +} +V1_0::Status UsbGadget::setupFunctions(uint64_t functions, + const sp& callback, + uint64_t timeout) { + int i = 1; + if (addGenericAndroidFunctions(functions, &i) != + V1_0::Status::SUCCESS) + return V1_0::Status::ERROR; + + if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) return V1_0::Status::ERROR; + mCurrentUsbFunctionsApplied = true; + if (callback) callback->setCurrentUsbFunctionsCb(functions, V1_0::Status::SUCCESS); + return V1_0::Status::SUCCESS; +} + +Return UsbGadget::setCurrentUsbFunctions(uint64_t functions, + const sp& callback, + uint64_t timeout) { + std::unique_lock lk(mLockSetCurrentFunction); + mCurrentUsbFunctions = functions; + mCurrentUsbFunctionsApplied = false; + // Unlink the gadget + V1_0::Status status = tearDownGadget(); + if (status != V1_0::Status::SUCCESS) { + goto error; + } + ALOGI("Returned from tearDown gadget"); + // Leave the gadget pulled down to give time for the host to sense disconnect. + usleep(kDisconnectWaitUs); + if (functions == static_cast(V1_0::GadgetFunction::NONE)) { + if (callback == NULL) return Void(); + Return ret = callback->setCurrentUsbFunctionsCb(functions, V1_0::Status::SUCCESS); + if (!ret.isOk()) + ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.description().c_str()); + return Void(); + } + status = validateAndSetVidPid(functions); + if (status != V1_0::Status::SUCCESS) { + goto error; + } + status = setupFunctions(functions, callback, timeout); + if (status != V1_0::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 ret = callback->setCurrentUsbFunctionsCb(functions, status); + if (!ret.isOk()) + ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.description().c_str()); + return Void(); +} +} // namespace implementation +} // namespace V1_1 +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android diff --git a/usb/gadget/UsbGadget.h b/usb/gadget/UsbGadget.h new file mode 100644 index 0000000..040878b --- /dev/null +++ b/usb/gadget/UsbGadget.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2020 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_1_USBGADGET_H +#define ANDROID_HARDWARE_USB_GADGET_V1_1_USBGADGET_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace usb { +namespace gadget { +namespace V1_1 { +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 ::android::hardware::usb::gadget::getVendorFunctions; +using ::android::hardware::usb::gadget::kDebug; +using ::android::hardware::usb::gadget::kDisconnectWaitUs; +using ::android::hardware::usb::gadget::linkFunction; +using ::android::hardware::usb::gadget::resetGadget; +using ::android::hardware::usb::gadget::setVidPid; +using ::android::hardware::usb::gadget::unlinkFunctions; +using ::std::string; + +constexpr char kGadgetName[] = "musb-hdrc"; + +struct UsbGadget : public IUsbGadget { + UsbGadget(); + + // Makes sure that only one request is processed at a time. + std::mutex mLockSetCurrentFunction; + uint64_t mCurrentUsbFunctions; + bool mCurrentUsbFunctionsApplied; + + Return setCurrentUsbFunctions(uint64_t functions, + const sp& callback, + uint64_t timeout) override; + + Return getCurrentUsbFunctions(const sp& callback) override; + + Return reset() override; + + private: + V1_0::Status tearDownGadget(); + V1_0::Status setupFunctions(uint64_t functions, const sp& callback, + uint64_t timeout); +}; + +} // namespace implementation +} // namespace V1_1 +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_USB_V1_1_USBGADGET_H diff --git a/usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.rc b/usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.rc new file mode 100644 index 0000000..5d8b024 --- /dev/null +++ b/usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.rc @@ -0,0 +1,7 @@ +service vendor.usb-gadget-hal-1-1 /vendor/bin/hw/android.hardware.usb.gadget@1.1-service.rosemary + interface android.hardware.usb.gadget@1.0::IUsbGadget default + interface android.hardware.usb.gadget@1.1::IUsbGadget default + class hal + user root + group root system shell mtp + capabilities diff --git a/usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.xml b/usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.xml new file mode 100644 index 0000000..a6f9a1f --- /dev/null +++ b/usb/gadget/android.hardware.usb.gadget@1.1-service.rosemary.xml @@ -0,0 +1,11 @@ + + + android.hardware.usb.gadget + hwbinder + 1.1 + + IUsbGadget + default + + + diff --git a/usb/gadget/lib/Android.bp b/usb/gadget/lib/Android.bp new file mode 100644 index 0000000..e42c1c6 --- /dev/null +++ b/usb/gadget/lib/Android.bp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2020 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. + */ + +cc_library_static { + name: "libusbconfigfs_rosemary", + vendor_available: true, + export_include_dirs: ["include"], + + srcs: [ + "UsbGadgetUtils.cpp", + ], + + cflags: [ + "-Wall", + "-Werror", + "-Wno-error=unused-parameter", + ], + + shared_libs: [ + "android.hardware.usb.gadget@1.0", + "android.hardware.usb.gadget@1.1", + "libbase", + "libcutils", + "libhidlbase", + "libutils", + ], +} diff --git a/usb/gadget/lib/UsbGadgetUtils.cpp b/usb/gadget/lib/UsbGadgetUtils.cpp new file mode 100644 index 0000000..6e09204 --- /dev/null +++ b/usb/gadget/lib/UsbGadgetUtils.cpp @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2020 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 "libusbconfigfs" + +#include "include/UsbGadgetCommon.h" + +namespace android { +namespace hardware { +namespace usb { +namespace gadget { + +int unlinkFunctions(const char* path) { + DIR* config = opendir(path); + struct dirent* function; + char filepath[kMaxFilePathLength]; + 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; +} + + +int linkFunction(const char* function, int index) { + char functionPath[kMaxFilePathLength]; + char link[kMaxFilePathLength]; + + 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; +} + +Status setVidPid(const char* vid, const char* pid) { + ALOGI("setVidPid %s %s", vid, pid); + if (!WriteStringToFile(vid, VENDOR_ID_PATH)) return Status::ERROR; + + if (!WriteStringToFile(pid, PRODUCT_ID_PATH)) return Status::ERROR; + ALOGI("setVidPid %s %s: success", vid, pid); + return Status::SUCCESS; +} + +std::string getVendorFunctions() { + if (GetProperty(kBuildType, "") == "user") return "user"; + + std::string bootMode = GetProperty(PERSISTENT_BOOT_MODE, ""); + std::string persistVendorFunctions = GetProperty(kPersistentVendorConfig, ""); + std::string vendorFunctions = GetProperty(kVendorConfig, ""); + std::string ret = ""; + + if (vendorFunctions != "") { + ret = vendorFunctions; + } else if (bootMode == "usbradio" || bootMode == "factory" || bootMode == "ffbm-00" || + bootMode == "ffbm-01") { + if (persistVendorFunctions != "") + ret = persistVendorFunctions; + else + ret = "diag"; + // vendor.usb.config will reflect the current configured functions + SetProperty(kVendorConfig, ret); + } + + return ret; +} + +Status resetGadget() { + ALOGI("setCurrentUsbFunctions None"); + + if (!WriteStringToFile("none", PULLUP_PATH)) ALOGI("Gadget cannot be pulled down"); + ALOGI("RESETGADGET: gadget pulled down"); + if (!WriteStringToFile("0", DEVICE_CLASS_PATH)) return Status::ERROR; + ALOGI("RESETGADGET: class reset"); + if (!WriteStringToFile("0", DEVICE_SUB_CLASS_PATH)) return Status::ERROR; + ALOGI("RESETGADGET: subclass reset"); + if (!WriteStringToFile("0", DEVICE_PROTOCOL_PATH)) return Status::ERROR; + ALOGI("RESETGADGET: protocol reset"); + if (!WriteStringToFile("0", DESC_USE_PATH)) return Status::ERROR; + ALOGI("RESETGADGET: use set to 0"); + if (unlinkFunctions(CONFIG_PATH)) return Status::ERROR; + + return Status::SUCCESS; +} + +Status addGenericAndroidFunctions(uint64_t functions, int* functionCount) { + if ((functions & GadgetFunction::MTP) != 0) { + ALOGI("setCurrentUsbFunctions MTP"); + if (linkFunction("mtp.gs0", (*functionCount)++)) return Status::ERROR; + } else if ((functions & GadgetFunction::PTP) != 0) { + ALOGI("setCurrentUsbFunctions PTP"); + if (linkFunction("ptp.gs1", (*functionCount)++)) return Status::ERROR; + } + if ((functions & GadgetFunction::MIDI) != 0) { + ALOGI("setCurrentUsbFunctions MIDI"); + if (linkFunction("midi.gs5", (*functionCount)++)) return Status::ERROR; + } + + if ((functions & GadgetFunction::ACCESSORY) != 0) { + ALOGI("setCurrentUsbFunctions Accessory"); + if (linkFunction("accessory.gs2", (*functionCount)++)) return Status::ERROR; + } + + if ((functions & GadgetFunction::AUDIO_SOURCE) != 0) { + ALOGI("setCurrentUsbFunctions Audio Source"); + if (linkFunction("audio_source.gs3", (*functionCount)++)) return Status::ERROR; + } + + if ((functions & GadgetFunction::RNDIS) != 0) { + ALOGI("setCurrentUsbFunctions rndis"); + if (linkFunction("rndis.gs4", (*functionCount)++)) return Status::ERROR; + } + + if ((functions & GadgetFunction::ADB) != 0) { + ALOGI("setCurrentUsbFunctions ADB"); + if (linkFunction("ffs.adb", (*functionCount)++)) return Status::ERROR; + } + return Status::SUCCESS; +} + +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android diff --git a/usb/gadget/lib/include/UsbGadgetCommon.h b/usb/gadget/lib/include/UsbGadgetCommon.h new file mode 100644 index 0000000..8dc49dc --- /dev/null +++ b/usb/gadget/lib/include/UsbGadgetCommon.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2020 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 HARDWARE_USB_USBGADGETCOMMON_H +#define HARDWARE_USB_USBGADGETCOMMON_H + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace usb { +namespace gadget { + +constexpr int kBufferSize = 512; +constexpr int kMaxFilePathLength = 256; +constexpr int kEpollEvents = 10; +constexpr bool kDebug = false; +constexpr int kDisconnectWaitUs = 100000; +constexpr int kPullUpDelay = 500000; +constexpr int kShutdownMonitor = 100; + +constexpr char kBuildType[] = "ro.build.type"; +constexpr char kPersistentVendorConfig[] = "persist.vendor.usb.usbradio.config"; +constexpr char kVendorConfig[] = "vendor.usb.config"; + +#define GADGET_PATH "/config/usb_gadget/g1/" +#define PULLUP_PATH GADGET_PATH "UDC" +#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 CONFIG_STR_PATH CONFIG_PATH "strings/0x409/configuration" +#define FUNCTIONS_PATH GADGET_PATH "functions/" +#define FUNCTION_NAME "f" +#define FUNCTION_PATH CONFIG_PATH FUNCTION_NAME +#define RNDIS_PATH FUNCTIONS_PATH "rndis.gs4" + +using ::android::base::GetProperty; +using ::android::base::SetProperty; +using ::android::base::unique_fd; +using ::android::base::WriteStringToFile; +using ::android::hardware::usb::gadget::V1_0::GadgetFunction; +using ::android::hardware::usb::gadget::V1_0::Status; + +using ::std::lock_guard; +using ::std::move; +using ::std::mutex; +using ::std::string; +using ::std::thread; +using ::std::unique_ptr; +using ::std::vector; +using ::std::chrono::microseconds; +using ::std::chrono::steady_clock; +using ::std::literals::chrono_literals::operator""ms; + +//**************** Helper functions ************************// + +// Removes all the usb functions link in the specified path. +int unlinkFunctions(const char* path); +// Craetes a configfs link for the function. +int linkFunction(const char* function, int index); +// Sets the USB VID and PID. +Status setVidPid(const char* vid, const char* pid); +// Extracts vendor functions from the vendor init properties. +std::string getVendorFunctions(); +// Adds all applicable generic android usb functions other than ADB. +Status addGenericAndroidFunctions(uint64_t functions, int* functionCount); +// Pulls down USB gadget. +Status resetGadget(); + +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android +#endif diff --git a/usb/gadget/service.cpp b/usb/gadget/service.cpp new file mode 100644 index 0000000..fe5bcd6 --- /dev/null +++ b/usb/gadget/service.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020 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.1-service.rosemary" + +#include +#include "UsbGadget.h" + +using android::sp; + +// libhwbinder: +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; + +// Generated HIDL files +using android::hardware::usb::gadget::V1_1::IUsbGadget; +using android::hardware::usb::gadget::V1_1::implementation::UsbGadget; + +using android::OK; +using android::status_t; + +int main() { + configureRpcThreadpool(1, true /*callerWillJoin*/); + + android::sp service2 = new UsbGadget(); + + status_t status = service2->registerAsService(); + + if (status != OK) { + ALOGE("Cannot register USB Gadget HAL service"); + return 1; + } + + ALOGI("USB Gadget HAL Ready."); + joinRpcThreadpool(); + // Under noraml cases, execution will not reach this line. + ALOGI("USB Gadget HAL failed to join thread pool."); + return 1; +}