Merge SQ3A.220705.003 to aosp-master - DO NOT MERGE
Merged-In: Idb4a38c1a7e263037d990ff16bbb65348ec11cf6
Merged-In: I7ff232089ae3726290c9f50ee286441ebc5d5cf3
Change-Id: I8ee9528f221167a736c51a7b5d3b5198410b9883
diff --git a/Android.mk b/Android.mk
index e6a9462..4072655 100644
--- a/Android.mk
+++ b/Android.mk
@@ -22,6 +22,22 @@
LOCAL_PATH := $(call my-dir)
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,default-permissions.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,libnfc-nci.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,fstab.postinstall,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,ueventd.rc,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,wpa_supplicant.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,hals.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,media_profiles_V1_0.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,media_codecs_performance.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,device_state_configuration.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,task_profiles.json,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,p2p_supplicant.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,wpa_supplicant.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,wpa_supplicant_overlay.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+
+$(eval $(call declare-1p-copy-files,device/google/gs101,audio_policy_configuration.xml))
+
# if some modules are built directly from this directory (not subdirectories),
# their rules should be written here.
diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk
index d4eed86..5a0f14d 100644
--- a/BoardConfig-common.mk
+++ b/BoardConfig-common.mk
@@ -68,12 +68,7 @@
# This is the fstab file that will be included in the recovery image. Note that
# recovery doesn't care about the encryption settings, so it doesn't matter
# whether we use the normal or the fips fstab here.
-#
-# Since this is a generated file, it's necessary to use intermediates-dir-for in
-# order to refer to it correctly. And since intermediates-dir-for isn't defined
-# yet when this file is included, it's necessary to use a deferred variable
-# assignment ( = ) rather than an immediate variable assignment ( := ).
-TARGET_RECOVERY_FSTAB = $(call intermediates-dir-for,ETC,fstab.gs101)/fstab.gs101
+TARGET_RECOVERY_FSTAB_GENRULE = gen_fstab.gs101
TARGET_RECOVERY_PIXEL_FORMAT := ABGR_8888
TARGET_RECOVERY_UI_MARGIN_HEIGHT := 165
@@ -116,29 +111,20 @@
BOARD_USES_SWIFTSHADER := false
# Gralloc4
-SOONG_CONFIG_NAMESPACES += arm_gralloc
-SOONG_CONFIG_arm_gralloc := \
- gralloc_arm_no_external_afbc \
- mali_gpu_support_afbc_basic \
- mali_gpu_support_afbc_wideblk \
- gralloc_init_afbc \
- gralloc_ion_sync_on_lock \
- dpu_support_1010102_afbc
-
ifeq ($(BOARD_USES_SWIFTSHADER),true)
-SOONG_CONFIG_arm_gralloc_gralloc_arm_no_external_afbc := true
-SOONG_CONFIG_arm_gralloc_mali_gpu_support_afbc_basic := false
-SOONG_CONFIG_arm_gralloc_mali_gpu_support_afbc_wideblk := false
-SOONG_CONFIG_arm_gralloc_gralloc_init_afbc := false
-SOONG_CONFIG_arm_gralloc_dpu_support_1010102_afbc := false
+$(call soong_config_set,arm_gralloc,gralloc_arm_no_external_afbc,true)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_basic,false)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_wideblk,false)
+$(call soong_config_set,arm_gralloc,gralloc_init_afbc,false)
+$(call soong_config_set,arm_gralloc,dpu_support_1010102_afbc,false)
else
-SOONG_CONFIG_arm_gralloc_gralloc_arm_no_external_afbc := false
-SOONG_CONFIG_arm_gralloc_mali_gpu_support_afbc_basic := true
-SOONG_CONFIG_arm_gralloc_mali_gpu_support_afbc_wideblk := true
-SOONG_CONFIG_arm_gralloc_gralloc_init_afbc := true
-SOONG_CONFIG_arm_gralloc_dpu_support_1010102_afbc := true
+$(call soong_config_set,arm_gralloc,gralloc_arm_no_external_afbc,false)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_basic,true)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_wideblk,true)
+$(call soong_config_set,arm_gralloc,gralloc_init_afbc,true)
+$(call soong_config_set,arm_gralloc,dpu_support_1010102_afbc,true)
endif # ifeq ($(BOARD_USES_SWIFTSHADER),true)
-SOONG_CONFIG_arm_gralloc_gralloc_ion_sync_on_lock := $(BOARD_USES_GRALLOC_ION_SYNC)
+$(call soong_config_set,arm_gralloc,gralloc_ion_sync_on_lock,$(BOARD_USES_GRALLOC_ION_SYNC))
# Graphics
#BOARD_USES_EXYNOS_DATASPACE_FEATURE := true
@@ -202,34 +188,19 @@
#
BOARD_USES_GENERIC_AUDIO := true
-SOONG_CONFIG_NAMESPACES += aoc_audio_func
-
-SOONG_CONFIG_aoc_audio_func += \
- ext_hidl
-
-SOONG_CONFIG_aoc_audio_func_ext_hidl := true
+$(call soong_config_set,aoc_audio_func,ext_hidl,true)
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
-SOONG_CONFIG_aoc_audio_func += \
- dump_usecase_data \
- hal_socket_control \
- record_tunning_keys
-
-SOONG_CONFIG_aoc_audio_func_dump_usecase_data := true
-SOONG_CONFIG_aoc_audio_func_hal_socket_control := true
-SOONG_CONFIG_aoc_audio_func_record_tunning_keys := true
+$(call soong_config_set,aoc_audio_func,dump_usecase_data,true)
+$(call soong_config_set,aoc_audio_func,hal_socket_control,true)
+$(call soong_config_set,aoc_audio_func,record_tunning_keys,true)
endif
ifneq (,$(filter aosp_%,$(TARGET_PRODUCT)))
-SOONG_CONFIG_aoc_audio_func += aosp_build
-
-SOONG_CONFIG_aoc_audio_func_aosp_build := true
+$(call soong_config_set,aoc_audio_func,aosp_build,true)
endif
-SOONG_CONFIG_NAMESPACES += haptics
-SOONG_CONFIG_haptics += \
- actuator_model
-SOONG_CONFIG_haptics_actuator_model := $(ACTUATOR_MODEL)
+$(call soong_config_set,haptics,actuator_model,$(ACTUATOR_MODEL))
# Primary AudioHAL Configuration
#BOARD_USE_COMMON_AUDIOHAL := true
@@ -359,7 +330,7 @@
# NeuralNetworks
GPU_SOURCE_PRESENT := $(wildcard vendor/arm/mali/valhall)
GPU_PREBUILD_PRESENT := $(wildcard vendor/google_devices/gs101/prebuilts/gpu/libs)
-ifneq "$(or $(GPU_SOURCE_PRESENT),$(GPU_PREBUILD_PRESENT))" ""
+ifneq (,$(strip $(GPU_SOURCE_PRESENT) $(GPU_PREBUILD_PRESENT)))
ARMNN_COMPUTE_CL_ENABLE := 1
else
ARMNN_COMPUTE_CL_ENABLE := 0
diff --git a/conf/init.gs101.rc b/conf/init.gs101.rc
index 0029363..09ab2e6 100644
--- a/conf/init.gs101.rc
+++ b/conf/init.gs101.rc
@@ -93,7 +93,7 @@
write /proc/sys/net/core/optmem_max 20480
write /proc/sys/net/core/netdev_max_backlog 10000
write /proc/sys/net/ipv4/tcp_rmem "2097152 4194304 8388608"
- write /proc/sys/net/ipv4/tcp_wmem "262144 524288 1048576"
+ write /proc/sys/net/ipv4/tcp_wmem "262144 524288 8388608"
write /proc/sys/net/ipv4/tcp_mem "44259 59012 88518"
write /proc/sys/net/ipv4/udp_mem "88518 118025 177036"
@@ -188,6 +188,7 @@
chown system system /dev/logbuffer_ttf
chown system system /dev/logbuffer_tcpm
chown system system /dev/logbuffer_usbpd
+ chown system system /dev/logbuffer_pogo_transport
chown system system /dev/logbuffer_wireless
chown system system /dev/logbuffer_pca9468
chown system system /dev/logbuffer_cpm
@@ -441,9 +442,6 @@
setprop vendor.all.modules.ready 1
setprop vendor.all.devices.ready 1
- # Update dm-verity state and set partition.*.verified properties
- verity_update_state
-
# Permission for Health Storage HAL
chown system system /dev/sys/block/bootdevice/manual_gc
diff --git a/conf/init.gs101.usb.rc b/conf/init.gs101.usb.rc
index 749d4b4..6b04012 100644
--- a/conf/init.gs101.usb.rc
+++ b/conf/init.gs101.usb.rc
@@ -71,6 +71,83 @@
# acm function for uwb
mkdir /config/usb_gadget/g1/functions/acm.uwb0
+ # chown file/folder permission
+ chown system system /config/usb_gadget/
+ chown system system /config/usb_gadget/g1
+ chown system system /config/usb_gadget/g1/UDC
+ chown system system /config/usb_gadget/g1/bDeviceClass
+ chown system system /config/usb_gadget/g1/bDeviceProtocol
+ chown system system /config/usb_gadget/g1/bDeviceSubClass
+ chown system system /config/usb_gadget/g1/bMaxPacketSize0
+ chown system system /config/usb_gadget/g1/bcdDevice
+ chown system system /config/usb_gadget/g1/bcdUSB
+ chown system system /config/usb_gadget/g1/configs
+ chown system system /config/usb_gadget/g1/configs/b.1
+ chown system system /config/usb_gadget/g1/configs/b.1/MaxPower
+ chown system system /config/usb_gadget/g1/configs/b.1/bmAttributes
+ chown system system /config/usb_gadget/g1/configs/b.1/strings
+ chown system system /config/usb_gadget/g1/functions
+ chown system system /config/usb_gadget/g1/functions/accessory.gs2
+ chown system system /config/usb_gadget/g1/functions/acm.gs6
+ chown system system /config/usb_gadget/g1/functions/acm.gs6/port_num
+ chown system system /config/usb_gadget/g1/functions/acm.uwb0
+ chown system system /config/usb_gadget/g1/functions/acm.uwb0/port_num
+ chown system system /config/usb_gadget/g1/functions/audio_source.gs3
+ chown system system /config/usb_gadget/g1/functions/dm.gs7
+ chown system system /config/usb_gadget/g1/functions/ffs.adb
+ chown system system /config/usb_gadget/g1/functions/ffs.mtp
+ chown system system /config/usb_gadget/g1/functions/ffs.ptp
+ chown system system /config/usb_gadget/g1/functions/midi.gs5
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/buflen
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/id
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/in_ports
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/index
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/out_ports
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/qlen
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/dev_addr
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/host_addr
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/ifname
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm/compatible_id
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/qmult
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/compatible_id
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/class
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/dev_addr
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/host_addr
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/ifname
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/compatible_id
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/protocol
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/qmult
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/subclass
+ chown system system /config/usb_gadget/g1/idProduct
+ chown system system /config/usb_gadget/g1/idVendor
+ chown system system /config/usb_gadget/g1/max_speed
+ chown system system /config/usb_gadget/g1/os_desc
+ chown system system /config/usb_gadget/g1/os_desc/b.1
+ chown system system /config/usb_gadget/g1/os_desc/b_vendor_code
+ chown system system /config/usb_gadget/g1/os_desc/qw_sign
+ chown system system /config/usb_gadget/g1/os_desc/use
+ chown system system /config/usb_gadget/g1/strings
+ chown system system /config/usb_gadget/g1/strings/0x409
+ chown system system /config/usb_gadget/g1/strings/0x409/manufacturer
+ chown system system /config/usb_gadget/g1/strings/0x409/product
+ chown system system /config/usb_gadget/g1/strings/0x409/serialnumber
setprop vendor.usb.functions.ready 1
on boot
@@ -88,12 +165,6 @@
on property:persist.vendor.usb.usbradio.config=*
start usbd
-on property:vendor.usb.dwc3_irq=medium
- exec /vendor/bin/hw/set_usb_irq.sh medium
-
-on property:vendor.usb.dwc3_irq=big
- exec /vendor/bin/hw/set_usb_irq.sh big
-
on charger
mkdir /config/usb_gadget/g1
mkdir /config/usb_gadget/g1/strings/0x409
diff --git a/device.mk b/device.mk
index c9df784..768e840 100644
--- a/device.mk
+++ b/device.mk
@@ -113,6 +113,33 @@
PRODUCT_PROPERTY_OVERRIDES += \
persist.vendor.radio.config.carrier_config_dir=/mnt/vendor/modem_img/images/default/confpack
+# Set the Bluetooth Class of Device
+# Service Field: 0x5A -> 90
+# Bit 17: Networking
+# Bit 19: Capturing
+# Bit 20: Object Transfer
+# Bit 22: Telephony
+# MAJOR_CLASS: 0x02 -> 2 (Phone)
+# MINOR_CLASS: 0x0C -> 12 (Smart Phone)
+PRODUCT_PRODUCT_PROPERTIES += \
+ bluetooth.device.class_of_device=90,2,12
+
+# Set supported Bluetooth profiles to enabled
+PRODUCT_PRODUCT_PROPERTIES += \
+ bluetooth.profile.asha.central.enabled?=true \
+ bluetooth.profile.a2dp.source.enabled?=true \
+ bluetooth.profile.avrcp.target.enabled?=true \
+ bluetooth.profile.bas.client.enabled?=true \
+ bluetooth.profile.gatt.enabled?=true \
+ bluetooth.profile.hfp.ag.enabled?=true \
+ bluetooth.profile.hid.device.enabled?=true \
+ bluetooth.profile.hid.host.enabled?=true \
+ bluetooth.profile.map.server.enabled?=true \
+ bluetooth.profile.opp.enabled?=true \
+ bluetooth.profile.pan.nap.enabled?=true \
+ bluetooth.profile.pan.panu.enabled?=true \
+ bluetooth.profile.pbap.server.enabled?=true \
+ bluetooth.profile.sap.server.enabled?=true \
PRODUCT_PROPERTY_OVERRIDES += \
telephony.active_modems.max_count=2
@@ -255,7 +282,6 @@
# Shell scripts
PRODUCT_COPY_FILES += \
device/google/gs101/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh \
- device/google/gs101/set_usb_irq.sh:$(TARGET_COPY_OUT_VENDOR)/bin/hw/set_usb_irq.sh \
device/google/gs101/disable_contaminant_detection.sh:$(TARGET_COPY_OUT_VENDOR)/bin/hw/disable_contaminant_detection.sh
# insmod files
@@ -364,7 +390,9 @@
# USB HAL
PRODUCT_PACKAGES += \
- android.hardware.usb@1.3-service.gs101
+ android.hardware.usb-service.gs101
+PRODUCT_PACKAGES += \
+ android.hardware.usb.gadget-service.gs101
# MIDI feature
PRODUCT_COPY_FILES += \
@@ -471,16 +499,11 @@
android.hardware.drm@1.4-service.widevine \
liboemcrypto \
-SOONG_CONFIG_NAMESPACES += google3a_config
-SOONG_CONFIG_google3a_config += \
- soc \
- gcam_awb \
- ghawb_truetone \
- target_device
-SOONG_CONFIG_google3a_config_soc := gs101
-SOONG_CONFIG_google3a_config_gcam_awb := true
-SOONG_CONFIG_google3a_config_ghawb_truetone := true
+
+$(call soong_config_set,google3a_config,soc,gs101)
+$(call soong_config_set,google3a_config,gcam_awb,true)
+$(call soong_config_set,google3a_config,ghawb_truetone,true)
# Determine if Lyric is in the tree, and only have GCH build against it
# if it is. Cases when Lyric isn't going to be in the tree:
@@ -492,20 +515,13 @@
# - PDK gs101 builds because they still have vendor/google/services/LyricCameraHAL/src
ifneq ($(wildcard vendor/google/services/LyricCameraHAL/src),)
-SOONG_CONFIG_NAMESPACES += lyric
-SOONG_CONFIG_lyric += \
- use_lyric_camera_hal \
- tuning_product
-
-SOONG_CONFIG_lyric_soc := gs101
-SOONG_CONFIG_lyric_use_lyric_camera_hal := true
-# SOONG_CONFIG_lyric_tuning_product is set in device-specific makefiles,
+$(call soong_config_set,lyric,soc,gs101)
+$(call soong_config_set,lyric,use_lyric_camera_hal,true)
+# lyric::tuning_product is set in device-specific makefiles,
# such as device/google/raviole/device-oriole.mk
# Camera HAL library selection
-SOONG_CONFIG_NAMESPACES += gch
-SOONG_CONFIG_gch += hwl_library
-SOONG_CONFIG_gch_hwl_library := lyric
+$(call soong_config_set,gch,hwl_library,lyric)
endif
# WiFi
@@ -681,9 +697,7 @@
## VIDEO
####################################
-SOONG_CONFIG_NAMESPACES += bigo
-SOONG_CONFIG_bigo += soc
-SOONG_CONFIG_bigo_soc := gs101
+$(call soong_config_set,bigo,soc,gs101)
# MFC firmware
PRODUCT_COPY_FILES += \
@@ -974,11 +988,7 @@
vendor/google/whitechapel/audio/hal \
vendor/google/whitechapel/audio/interfaces
-SOONG_CONFIG_NAMESPACES += aoc_audio_board
-SOONG_CONFIG_aoc_audio_board += \
- platform
-
-SOONG_CONFIG_aoc_audio_board_platform := $(TARGET_BOARD_PLATFORM)
+$(call soong_config_set,aoc_audio_board,platform,$(TARGET_BOARD_PLATFORM))
# Audio properties
PRODUCT_PROPERTY_OVERRIDES += \
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
index 813d186..545872c 100644
--- a/dumpstate/DumpstateDevice.cpp
+++ b/dumpstate/DumpstateDevice.cpp
@@ -369,6 +369,7 @@
"echo \"contaminant_detection_status:\"; cat $f/contaminant_detection_status; done"});
DumpFileToFd(fd, "PD Engine", "/dev/logbuffer_usbpd");
+ DumpFileToFd(fd, "POGO Transport", "/dev/logbuffer_pogo_transport");
DumpFileToFd(fd, "PPS-google_cpm", "/dev/logbuffer_cpm");
DumpFileToFd(fd, "PPS-dc", "/dev/logbuffer_pca9468");
diff --git a/edgetpu/edgetpu.mk b/edgetpu/edgetpu.mk
index 426dfa9..49658ed 100644
--- a/edgetpu/edgetpu.mk
+++ b/edgetpu/edgetpu.mk
@@ -1,8 +1,5 @@
# Config variables for TPU chip on device.
-SOONG_CONFIG_NAMESPACES += edgetpu_config
-SOONG_CONFIG_edgetpu_config += chip
-
-SOONG_CONFIG_edgetpu_config_chip := abrolhos
+$(call soong_config_set,edgetpu_config,chip,abrolhos)
# TPU logging service
PRODUCT_PACKAGES += \
diff --git a/fingerprint/extension/Android.bp b/fingerprint/extension/Android.bp
index 4f64c3c..fa2f13e 100644
--- a/fingerprint/extension/Android.bp
+++ b/fingerprint/extension/Android.bp
@@ -1,3 +1,12 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
sh_binary {
name: "fingerprint.extension.sh",
init_rc: ["init.fingerprint.extension.rc"],
diff --git a/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
index 1f933a6..2a1193e 100644
--- a/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
+++ b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
@@ -20,6 +20,4 @@
GOOGLE_CONFIG_PERFORMANCE=1
# Enable Suez
-SOONG_CONFIG_NAMESPACES += fp_hal_feature
-SOONG_CONFIG_fp_hal_feature += biometric_suez_support
-SOONG_CONFIG_fp_hal_feature_biometric_suez_support := true
+$(call soong_config_set,fp_hal_feature,biometric_suez_support,true)
diff --git a/fingerprint/udfps_common.mk b/fingerprint/udfps_common.mk
index aa9de37..a41b3ad 100644
--- a/fingerprint/udfps_common.mk
+++ b/fingerprint/udfps_common.mk
@@ -34,6 +34,4 @@
$(error Invalid udfps build version)
endif
-SOONG_CONFIG_NAMESPACES += fp_hal_feature
-SOONG_CONFIG_fp_hal_feature += biometric_suez_support
-SOONG_CONFIG_fp_hal_feature_biometric_suez_support := true
+$(call soong_config_set,fp_hal_feature,biometric_suez_support,true)
diff --git a/gnss/47765/Android.bp b/gnss/47765/Android.bp
index f4a2902..4843b23 100644
--- a/gnss/47765/Android.bp
+++ b/gnss/47765/Android.bp
@@ -42,7 +42,7 @@
"android.hardware.gnss@2.1",
"android.hardware.gnss.measurement_corrections@1.0",
"android.hardware.gnss.visibility_control@1.0",
- "android.hardware.gnss-V1-ndk_platform",
+ "android.hardware.gnss-V1-ndk",
"libhardware",
"libc++",
"libc",
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 8f8f9fc..cbc708a 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -34,12 +34,6 @@
<!-- Maximum number of supported users -->
<integer name="config_multiuserMaximumUsers">4</integer>
- <!-- Boolean indicating if current platform supports HFP inband ringing -->
- <bool name="config_bluetooth_hfp_inband_ringing_support">true</bool>
-
- <!-- Whether Hearing Aid profile is supported -->
- <bool name="config_hearing_aid_profile_supported">true</bool>
-
<!-- Boolean indicating whether the wifi chipset has dual frequency band support -->
<bool translatable="false" name="config_wifi_dual_band_support">true</bool>
@@ -234,7 +228,6 @@
<string-array translatable="false" name="config_defaultPinnerServiceFiles">
<item>"/apex/com.android.art/javalib/core-oj.jar"</item>
<item>"/apex/com.android.art/javalib/core-libart.jar"</item>
- <item>"/apex/com.android.media/javalib/updatable-media.jar"</item>
<item>"/system/framework/framework.jar"</item>
<item>"/system/framework/services.jar"</item>
<item>"/system/bin/surfaceflinger"</item>
diff --git a/powerstats/Gs101CommonDataProviders.cpp b/powerstats/Gs101CommonDataProviders.cpp
index e156b7b..f1e3aa5 100644
--- a/powerstats/Gs101CommonDataProviders.cpp
+++ b/powerstats/Gs101CommonDataProviders.cpp
@@ -79,6 +79,23 @@
};
p->addStateResidencyDataProvider(
std::make_unique<AocStateResidencyDataProvider>(monitorIds, monitorStates));
+
+ // Add AoC restart count
+ const GenericStateResidencyDataProvider::StateResidencyConfig restartCountConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "",
+ .totalTimeSupported = false,
+ .lastEntrySupported = false,
+ };
+ const std::vector<std::pair<std::string, std::string>> restartCountHeaders = {
+ std::make_pair("RESTART", ""),
+ };
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(
+ generateGenericStateResidencyConfigs(restartCountConfig, restartCountHeaders),
+ "AoC-Count", "");
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/19000000.aoc/restart_count", cfgs));
}
void addDvfsStats(std::shared_ptr<PowerStats> p) {
diff --git a/set_usb_irq.sh b/set_usb_irq.sh
deleted file mode 100755
index 29d3781..0000000
--- a/set_usb_irq.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/vendor/bin/sh
-
-# Switch into /proc/irq/$IRQ for the dwc3 usb controller
-cd /proc/irq/*/dwc3/.. || exit 7
-
-# Move the USB Controller (DWC3) interrupt as requested
-# Modem and DIT are on 0/2/5 depending on throughput, so avoid those.
-# 0-3 small, 4-5 medium, 6-7 big
-case "$1" in
- medium) core=4;;
- big) core=6;;
- *) core=0;;
-esac
-
-# This can sometimes fail due to smp_affinity_list no longer existing...
-echo "${core}" > smp_affinity_list
diff --git a/usb/Usb.cpp b/usb/Usb.cpp
deleted file mode 100644
index caf4f57..0000000
--- a/usb/Usb.cpp
+++ /dev/null
@@ -1,938 +0,0 @@
-/*
- * 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@1.3-service.gs101"
-
-#include <android-base/logging.h>
-#include <android-base/properties.h>
-#include <assert.h>
-#include <dirent.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <chrono>
-#include <regex>
-#include <thread>
-#include <unordered_map>
-
-#include <cutils/uevent.h>
-#include <sys/epoll.h>
-#include <utils/Errors.h>
-#include <utils/StrongPointer.h>
-
-#include "Usb.h"
-#include "UsbGadget.h"
-
-#include <aidl/android/frameworks/stats/IStats.h>
-#include <pixelstats/StatsHelper.h>
-
-using aidl::android::frameworks::stats::IStats;
-using android::base::GetProperty;
-using android::hardware::google::pixel::getStatsService;
-using android::hardware::google::pixel::PixelAtoms::VendorUsbPortOverheat;
-using android::hardware::google::pixel::reportUsbPortOverheat;
-
-namespace android {
-namespace hardware {
-namespace usb {
-namespace V1_3 {
-namespace implementation {
-
-Return<bool> Usb::enableUsbDataSignal(bool enable) {
- bool result = true;
-
- ALOGI("Userspace turn %s USB data signaling", enable ? "on" : "off");
-
- if(enable) {
- if (!WriteStringToFile("1", USB_DATA_PATH)) {
- ALOGE("Not able to turn on usb connection notification");
- result = false;
- }
-
- if(!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
- ALOGE("Gadget cannot be pulled up");
- result = false;
- }
- }
- else {
- if (!WriteStringToFile("1", ID_PATH)) {
- ALOGE("Not able to turn off host mode");
- result = false;
- }
-
- if (!WriteStringToFile("0", VBUS_PATH)) {
- ALOGE("Not able to set Vbus state");
- result = false;
- }
-
- if (!WriteStringToFile("0", USB_DATA_PATH)) {
- ALOGE("Not able to turn off usb connection notification");
- result = false;
- }
-
- if(!WriteStringToFile("none", PULLUP_PATH)) {
- ALOGE("Gadget cannot be pulled down");
- result = false;
- }
- }
-
- return result;
-}
-
-// Set by the signal handler to destroy the thread
-volatile bool destroyThread;
-
-std::string enabledPath;
-constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
-constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
-constexpr char kContaminantDetectionPath[] = "i2c-max77759tcpc/contaminant_detection";
-constexpr char kStatusPath[] = "i2c-max77759tcpc/contaminant_detection_status";
-constexpr char kTypecPath[] = "/sys/class/typec";
-constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
-constexpr char kOverheatStatsPath[] = "/sys/devices/platform/google,usbc_port_cooling_dev/";
-constexpr char kOverheatStatsDev[] = "DRIVER=google,usbc_port_cooling_dev";
-constexpr char kThermalZoneForTrip[] = "VIRTUAL-USB-THROTTLING";
-constexpr char kThermalZoneForTempReadPrimary[] = "usb_pwr_therm2";
-constexpr char kThermalZoneForTempReadSecondary1[] = "usb_pwr_therm";
-constexpr char kThermalZoneForTempReadSecondary2[] = "qi_therm";
-constexpr int kSamplingIntervalSec = 5;
-
-int32_t readFile(const std::string &filename, std::string *contents) {
- FILE *fp;
- ssize_t read = 0;
- char *line = NULL;
- size_t len = 0;
-
- fp = fopen(filename.c_str(), "r");
- if (fp != NULL) {
- if ((read = getline(&line, &len, fp)) != -1) {
- char *pos;
- if ((pos = strchr(line, '\n')) != NULL)
- *pos = '\0';
- *contents = line;
- }
- free(line);
- fclose(fp);
- return 0;
- } else {
- ALOGE("fopen failed");
- }
-
- return -1;
-}
-
-int32_t writeFile(const std::string &filename, const std::string &contents) {
- FILE *fp;
- std::string written;
-
- fp = fopen(filename.c_str(), "w");
- if (fp != NULL) {
- // FAILURE RETRY
- int ret = fputs(contents.c_str(), fp);
- fclose(fp);
- if ((ret != EOF) && !readFile(filename, &written) && written == contents)
- return 0;
- }
- return -1;
-}
-
-Status getContaminantDetectionNamesHelper(std::string *name) {
- DIR *dp;
-
- dp = opendir(kHsi2cPath);
- if (dp != NULL) {
- struct dirent *ep;
-
- while ((ep = readdir(dp))) {
- if (ep->d_type == DT_DIR) {
- if (std::string::npos != std::string(ep->d_name).find("i2c-")) {
- std::strtok(ep->d_name, "-");
- *name = std::strtok(NULL, "-");
- }
- }
- }
- closedir(dp);
- return Status::SUCCESS;
- }
-
- ALOGE("Failed to open %s", kHsi2cPath);
- return Status::ERROR;
-}
-
-Status queryMoistureDetectionStatus(hidl_vec<PortStatus> *currentPortStatus_1_2) {
- std::string enabled, status, path, DetectedPath;
-
- if (currentPortStatus_1_2 == NULL || currentPortStatus_1_2->size() == 0) {
- ALOGE("currentPortStatus_1_2 is not available");
- return Status::ERROR;
- }
-
- (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes = 0;
- (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes |=
- V1_2::ContaminantProtectionMode::FORCE_SINK;
- (*currentPortStatus_1_2)[0].contaminantProtectionStatus = V1_2::ContaminantProtectionStatus::NONE;
- (*currentPortStatus_1_2)[0].contaminantDetectionStatus = V1_2::ContaminantDetectionStatus::DISABLED;
- (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceDetection = true;
- (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceProtection = false;
-
- getContaminantDetectionNamesHelper(&path);
- enabledPath = kI2CPath + path + "/" + kContaminantDetectionPath;
- if (readFile(enabledPath, &enabled)) {
- ALOGE("Failed to open moisture_detection_enabled");
- return Status::ERROR;
- }
-
- if (enabled == "1") {
- DetectedPath = kI2CPath + path + "/" + kStatusPath;
- if (readFile(DetectedPath, &status)) {
- ALOGE("Failed to open moisture_detected");
- return Status::ERROR;
- }
- if (status == "1") {
- (*currentPortStatus_1_2)[0].contaminantDetectionStatus =
- V1_2::ContaminantDetectionStatus::DETECTED;
- (*currentPortStatus_1_2)[0].contaminantProtectionStatus =
- V1_2::ContaminantProtectionStatus::FORCE_SINK;
- } else
- (*currentPortStatus_1_2)[0].contaminantDetectionStatus =
- V1_2::ContaminantDetectionStatus::NOT_DETECTED;
- }
-
- ALOGI("ContaminantDetectionStatus:%d ContaminantProtectionStatus:%d",
- (*currentPortStatus_1_2)[0].contaminantDetectionStatus,
- (*currentPortStatus_1_2)[0].contaminantProtectionStatus);
-
- return Status::SUCCESS;
-}
-
-std::string appendRoleNodeHelper(const std::string &portName, PortRoleType type) {
- std::string node("/sys/class/typec/" + portName);
-
- switch (type) {
- case PortRoleType::DATA_ROLE:
- return node + "/data_role";
- case PortRoleType::POWER_ROLE:
- return node + "/power_role";
- case PortRoleType::MODE:
- return node + "/port_type";
- default:
- return "";
- }
-}
-
-std::string convertRoletoString(PortRole role) {
- if (role.type == PortRoleType::POWER_ROLE) {
- if (role.role == static_cast<uint32_t>(PortPowerRole::SOURCE))
- return "source";
- else if (role.role == static_cast<uint32_t>(PortPowerRole::SINK))
- return "sink";
- } else if (role.type == PortRoleType::DATA_ROLE) {
- if (role.role == static_cast<uint32_t>(PortDataRole::HOST))
- return "host";
- if (role.role == static_cast<uint32_t>(PortDataRole::DEVICE))
- return "device";
- } else if (role.type == PortRoleType::MODE) {
- if (role.role == static_cast<uint32_t>(PortMode_1_1::UFP))
- return "sink";
- if (role.role == static_cast<uint32_t>(PortMode_1_1::DFP))
- return "source";
- }
- return "none";
-}
-
-void extractRole(std::string *roleName) {
- std::size_t first, last;
-
- first = roleName->find("[");
- last = roleName->find("]");
-
- if (first != std::string::npos && last != std::string::npos) {
- *roleName = roleName->substr(first + 1, last - first - 1);
- }
-}
-
-void switchToDrp(const std::string &portName) {
- std::string filename = appendRoleNodeHelper(std::string(portName.c_str()), PortRoleType::MODE);
- FILE *fp;
-
- if (filename != "") {
- fp = fopen(filename.c_str(), "w");
- if (fp != NULL) {
- int ret = fputs("dual", fp);
- fclose(fp);
- if (ret == EOF)
- ALOGE("Fatal: Error while switching back to drp");
- } else {
- ALOGE("Fatal: Cannot open file to switch back to drp");
- }
- } else {
- ALOGE("Fatal: invalid node type");
- }
-}
-
-bool switchMode(const hidl_string &portName, const PortRole &newRole, struct Usb *usb) {
- std::string filename = appendRoleNodeHelper(std::string(portName.c_str()), newRole.type);
- std::string written;
- FILE *fp;
- bool roleSwitch = false;
-
- if (filename == "") {
- ALOGE("Fatal: invalid node type");
- return false;
- }
-
- fp = fopen(filename.c_str(), "w");
- if (fp != NULL) {
- // Hold the lock here to prevent loosing connected signals
- // as once the file is written the partner added signal
- // can arrive anytime.
- pthread_mutex_lock(&usb->mPartnerLock);
- usb->mPartnerUp = false;
- int ret = fputs(convertRoletoString(newRole).c_str(), fp);
- fclose(fp);
-
- if (ret != EOF) {
- struct timespec to;
- struct timespec now;
-
- wait_again:
- clock_gettime(CLOCK_MONOTONIC, &now);
- to.tv_sec = now.tv_sec + PORT_TYPE_TIMEOUT;
- to.tv_nsec = now.tv_nsec;
-
- int err = pthread_cond_timedwait(&usb->mPartnerCV, &usb->mPartnerLock, &to);
- // There are no uevent signals which implies role swap timed out.
- if (err == ETIMEDOUT) {
- ALOGI("uevents wait timedout");
- // Validity check.
- } else if (!usb->mPartnerUp) {
- goto wait_again;
- // Role switch succeeded since usb->mPartnerUp is true.
- } else {
- roleSwitch = true;
- }
- } else {
- ALOGI("Role switch failed while wrting to file");
- }
- pthread_mutex_unlock(&usb->mPartnerLock);
- }
-
- if (!roleSwitch)
- switchToDrp(std::string(portName.c_str()));
-
- return roleSwitch;
-}
-
-Usb::Usb()
- : mLock(PTHREAD_MUTEX_INITIALIZER),
- mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER),
- mPartnerLock(PTHREAD_MUTEX_INITIALIZER),
- mPartnerUp(false),
- mOverheat(ZoneInfo(TemperatureType::USB_PORT, kThermalZoneForTrip,
- ThrottlingSeverity::CRITICAL),
- {ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadPrimary,
- ThrottlingSeverity::NONE),
- ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary1,
- ThrottlingSeverity::NONE),
- ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary2,
- ThrottlingSeverity::NONE)}, kSamplingIntervalSec) {
- pthread_condattr_t attr;
- if (pthread_condattr_init(&attr)) {
- ALOGE("pthread_condattr_init failed: %s", strerror(errno));
- abort();
- }
- if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) {
- ALOGE("pthread_condattr_setclock failed: %s", strerror(errno));
- abort();
- }
- if (pthread_cond_init(&mPartnerCV, &attr)) {
- ALOGE("pthread_cond_init failed: %s", strerror(errno));
- abort();
- }
- if (pthread_condattr_destroy(&attr)) {
- ALOGE("pthread_condattr_destroy failed: %s", strerror(errno));
- abort();
- }
-}
-
-Return<void> Usb::switchRole(const hidl_string &portName, const V1_0::PortRole &newRole) {
- std::string filename = appendRoleNodeHelper(std::string(portName.c_str()), newRole.type);
- std::string written;
- FILE *fp;
- bool roleSwitch = false;
-
- if (filename == "") {
- ALOGE("Fatal: invalid node type");
- return Void();
- }
-
- pthread_mutex_lock(&mRoleSwitchLock);
-
- ALOGI("filename write: %s role:%s", filename.c_str(), convertRoletoString(newRole).c_str());
-
- if (newRole.type == PortRoleType::MODE) {
- roleSwitch = switchMode(portName, newRole, this);
- } else {
- fp = fopen(filename.c_str(), "w");
- if (fp != NULL) {
- int ret = fputs(convertRoletoString(newRole).c_str(), fp);
- fclose(fp);
- if ((ret != EOF) && !readFile(filename, &written)) {
- extractRole(&written);
- ALOGI("written: %s", written.c_str());
- if (written == convertRoletoString(newRole)) {
- roleSwitch = true;
- } else {
- ALOGE("Role switch failed");
- }
- } else {
- ALOGE("failed to update the new role");
- }
- } else {
- ALOGE("fopen failed");
- }
- }
-
- pthread_mutex_lock(&mLock);
- if (mCallback_1_0 != NULL) {
- Return<void> ret = mCallback_1_0->notifyRoleSwitchStatus(
- portName, newRole, roleSwitch ? Status::SUCCESS : Status::ERROR);
- if (!ret.isOk())
- ALOGE("RoleSwitchStatus error %s", ret.description().c_str());
- } else {
- ALOGE("Not notifying the userspace. Callback is not set");
- }
- pthread_mutex_unlock(&mLock);
- pthread_mutex_unlock(&mRoleSwitchLock);
-
- return Void();
-}
-
-Status getAccessoryConnected(const std::string &portName, std::string *accessory) {
- std::string filename = "/sys/class/typec/" + portName + "-partner/accessory_mode";
-
- if (readFile(filename, accessory)) {
- ALOGE("getAccessoryConnected: Failed to open filesystem node: %s", filename.c_str());
- return Status::ERROR;
- }
-
- return Status::SUCCESS;
-}
-
-Status getCurrentRoleHelper(const std::string &portName, bool connected, PortRoleType type,
- uint32_t *currentRole) {
- std::string filename;
- std::string roleName;
- std::string accessory;
-
- // Mode
-
- if (type == PortRoleType::POWER_ROLE) {
- filename = "/sys/class/typec/" + portName + "/power_role";
- *currentRole = static_cast<uint32_t>(PortPowerRole::NONE);
- } else if (type == PortRoleType::DATA_ROLE) {
- filename = "/sys/class/typec/" + portName + "/data_role";
- *currentRole = static_cast<uint32_t>(PortDataRole::NONE);
- } else if (type == PortRoleType::MODE) {
- filename = "/sys/class/typec/" + portName + "/data_role";
- *currentRole = static_cast<uint32_t>(PortMode_1_1::NONE);
- } else {
- return Status::ERROR;
- }
-
- if (!connected)
- return Status::SUCCESS;
-
- if (type == PortRoleType::MODE) {
- if (getAccessoryConnected(portName, &accessory) != Status::SUCCESS) {
- return Status::ERROR;
- }
- if (accessory == "analog_audio") {
- *currentRole = static_cast<uint32_t>(PortMode_1_1::AUDIO_ACCESSORY);
- return Status::SUCCESS;
- } else if (accessory == "debug") {
- *currentRole = static_cast<uint32_t>(PortMode_1_1::DEBUG_ACCESSORY);
- return Status::SUCCESS;
- }
- }
-
- if (readFile(filename, &roleName)) {
- ALOGE("getCurrentRole: Failed to open filesystem node: %s", filename.c_str());
- return Status::ERROR;
- }
-
- extractRole(&roleName);
-
- if (roleName == "source") {
- *currentRole = static_cast<uint32_t>(PortPowerRole::SOURCE);
- } else if (roleName == "sink") {
- *currentRole = static_cast<uint32_t>(PortPowerRole::SINK);
- } else if (roleName == "host") {
- if (type == PortRoleType::DATA_ROLE)
- *currentRole = static_cast<uint32_t>(PortDataRole::HOST);
- else
- *currentRole = static_cast<uint32_t>(PortMode_1_1::DFP);
- } else if (roleName == "device") {
- if (type == PortRoleType::DATA_ROLE)
- *currentRole = static_cast<uint32_t>(PortDataRole::DEVICE);
- else
- *currentRole = static_cast<uint32_t>(PortMode_1_1::UFP);
- } else if (roleName != "none") {
- /* case for none has already been addressed.
- * so we check if the role isn't none.
- */
- return Status::UNRECOGNIZED_ROLE;
- }
-
- return Status::SUCCESS;
-}
-
-Status getTypeCPortNamesHelper(std::unordered_map<std::string, bool> *names) {
- DIR *dp;
-
- dp = opendir(kTypecPath);
- if (dp != NULL) {
- struct dirent *ep;
-
- while ((ep = readdir(dp))) {
- if (ep->d_type == DT_LNK) {
- if (std::string::npos == std::string(ep->d_name).find("-partner")) {
- std::unordered_map<std::string, bool>::const_iterator portName =
- names->find(ep->d_name);
- if (portName == names->end()) {
- names->insert({ep->d_name, false});
- }
- } else {
- (*names)[std::strtok(ep->d_name, "-")] = true;
- }
- }
- }
- closedir(dp);
- return Status::SUCCESS;
- }
-
- ALOGE("Failed to open /sys/class/typec");
- return Status::ERROR;
-}
-
-bool canSwitchRoleHelper(const std::string &portName, PortRoleType /*type*/) {
- std::string filename = "/sys/class/typec/" + portName + "-partner/supports_usb_power_delivery";
- std::string supportsPD;
-
- if (!readFile(filename, &supportsPD)) {
- if (supportsPD == "yes") {
- return true;
- }
- }
-
- return false;
-}
-
-/*
- * Reuse the same method for both V1_0 and V1_1 callback objects.
- * The caller of this method would reconstruct the V1_0::PortStatus
- * object if required.
- */
-Status getPortStatusHelper(hidl_vec<PortStatus> *currentPortStatus_1_2, HALVersion version,
- android::hardware::usb::V1_3::implementation::Usb *usb) {
- std::unordered_map<std::string, bool> names;
- Status result = getTypeCPortNamesHelper(&names);
- int i = -1;
-
- if (result == Status::SUCCESS) {
- currentPortStatus_1_2->resize(names.size());
- for (std::pair<std::string, bool> port : names) {
- i++;
- ALOGI("%s", port.first.c_str());
- (*currentPortStatus_1_2)[i].status_1_1.status.portName = port.first;
-
- uint32_t currentRole;
- if (getCurrentRoleHelper(port.first, port.second, PortRoleType::POWER_ROLE,
- ¤tRole) == Status::SUCCESS) {
- (*currentPortStatus_1_2)[i].status_1_1.status.currentPowerRole =
- static_cast<PortPowerRole>(currentRole);
- } else {
- ALOGE("Error while retrieving portNames");
- goto done;
- }
-
- if (getCurrentRoleHelper(port.first, port.second, PortRoleType::DATA_ROLE,
- ¤tRole) == Status::SUCCESS) {
- (*currentPortStatus_1_2)[i].status_1_1.status.currentDataRole =
- static_cast<PortDataRole>(currentRole);
- } else {
- ALOGE("Error while retrieving current port role");
- goto done;
- }
-
- if (getCurrentRoleHelper(port.first, port.second, PortRoleType::MODE, ¤tRole) ==
- Status::SUCCESS) {
- (*currentPortStatus_1_2)[i].status_1_1.currentMode =
- static_cast<PortMode_1_1>(currentRole);
- (*currentPortStatus_1_2)[i].status_1_1.status.currentMode =
- static_cast<V1_0::PortMode>(currentRole);
- } else {
- ALOGE("Error while retrieving current data role");
- goto done;
- }
-
- (*currentPortStatus_1_2)[i].status_1_1.status.canChangeMode = true;
- (*currentPortStatus_1_2)[i].status_1_1.status.canChangeDataRole =
- port.second ? canSwitchRoleHelper(port.first, PortRoleType::DATA_ROLE) : false;
- (*currentPortStatus_1_2)[i].status_1_1.status.canChangePowerRole =
- port.second ? canSwitchRoleHelper(port.first, PortRoleType::POWER_ROLE) : false;
-
- if (version == HALVersion::V1_0) {
- ALOGI("HAL version V1_0");
- (*currentPortStatus_1_2)[i].status_1_1.status.supportedModes = V1_0::PortMode::DRP;
- } else {
- if (version == HALVersion::V1_1)
- ALOGI("HAL version V1_1");
- else
- ALOGI("HAL version V1_2");
- (*currentPortStatus_1_2)[i].status_1_1.supportedModes = 0 | PortMode_1_1::DRP;
- (*currentPortStatus_1_2)[i].status_1_1.status.supportedModes = V1_0::PortMode::NONE;
- (*currentPortStatus_1_2)[i].status_1_1.status.currentMode = V1_0::PortMode::NONE;
- }
-
- // Query temperature for the first connect
- if (port.second && !usb->mPluggedTemperatureCelsius) {
- usb->mOverheat.getCurrentTemperature(kThermalZoneForTempReadPrimary,
- &usb->mPluggedTemperatureCelsius);
- ALOGV("USB Initial temperature: %f", usb->mPluggedTemperatureCelsius);
- }
- ALOGI(
- "%d:%s connected:%d canChangeMode:%d canChagedata:%d canChangePower:%d "
- "supportedModes:%d",
- i, port.first.c_str(), port.second,
- (*currentPortStatus_1_2)[i].status_1_1.status.canChangeMode,
- (*currentPortStatus_1_2)[i].status_1_1.status.canChangeDataRole,
- (*currentPortStatus_1_2)[i].status_1_1.status.canChangePowerRole,
- (*currentPortStatus_1_2)[i].status_1_1.supportedModes);
- }
- return Status::SUCCESS;
- }
-done:
- return Status::ERROR;
-}
-
-void queryVersionHelper(android::hardware::usb::V1_3::implementation::Usb *usb,
- hidl_vec<PortStatus> *currentPortStatus_1_2) {
- hidl_vec<V1_1::PortStatus_1_1> currentPortStatus_1_1;
- hidl_vec<V1_0::PortStatus> currentPortStatus;
- Status status;
- sp<V1_1::IUsbCallback> callback_V1_1 = V1_1::IUsbCallback::castFrom(usb->mCallback_1_0);
- sp<IUsbCallback> callback_V1_2 = IUsbCallback::castFrom(usb->mCallback_1_0);
-
- pthread_mutex_lock(&usb->mLock);
- if (usb->mCallback_1_0 != NULL) {
- if (callback_V1_2 != NULL) {
- status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_2, usb);
- if (status == Status::SUCCESS)
- queryMoistureDetectionStatus(currentPortStatus_1_2);
- } else if (callback_V1_1 != NULL) {
- status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_1, usb);
- currentPortStatus_1_1.resize(currentPortStatus_1_2->size());
- for (unsigned long i = 0; i < currentPortStatus_1_2->size(); i++)
- currentPortStatus_1_1[i] = (*currentPortStatus_1_2)[i].status_1_1;
- } else {
- status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_0, usb);
- currentPortStatus.resize(currentPortStatus_1_2->size());
- for (unsigned long i = 0; i < currentPortStatus_1_2->size(); i++)
- currentPortStatus[i] = (*currentPortStatus_1_2)[i].status_1_1.status;
- }
-
- Return<void> ret;
-
- if (callback_V1_2 != NULL)
- ret = callback_V1_2->notifyPortStatusChange_1_2(*currentPortStatus_1_2, status);
- else if (callback_V1_1 != NULL)
- ret = callback_V1_1->notifyPortStatusChange_1_1(currentPortStatus_1_1, status);
- else
- ret = usb->mCallback_1_0->notifyPortStatusChange(currentPortStatus, status);
-
- if (!ret.isOk())
- ALOGE("queryPortStatus_1_2 error %s", ret.description().c_str());
- } else {
- ALOGI("Notifying userspace skipped. Callback is NULL");
- }
- pthread_mutex_unlock(&usb->mLock);
-}
-
-Return<void> Usb::queryPortStatus() {
- hidl_vec<PortStatus> currentPortStatus_1_2;
-
- queryVersionHelper(this, ¤tPortStatus_1_2);
- return Void();
-}
-
-Return<void> Usb::enableContaminantPresenceDetection(const hidl_string & /*portName*/,
- bool enable) {
-
- std::string disable = GetProperty(kDisableContatminantDetection, "");
-
- if (disable != "true")
- writeFile(enabledPath, enable ? "1" : "0");
-
- hidl_vec<PortStatus> currentPortStatus_1_2;
-
- queryVersionHelper(this, ¤tPortStatus_1_2);
- return Void();
-}
-
-Return<void> Usb::enableContaminantPresenceProtection(const hidl_string & /*portName*/,
- bool /*enable*/) {
- hidl_vec<PortStatus> currentPortStatus_1_2;
-
- queryVersionHelper(this, ¤tPortStatus_1_2);
- return Void();
-}
-
-void report_overheat_event(android::hardware::usb::V1_3::implementation::Usb *usb) {
- VendorUsbPortOverheat overheat_info;
- std::string contents;
-
- overheat_info.set_plug_temperature_deci_c(usb->mPluggedTemperatureCelsius * 10);
- overheat_info.set_max_temperature_deci_c(usb->mOverheat.getMaxOverheatTemperature() * 10);
- if (ReadFileToString(std::string(kOverheatStatsPath) + "trip_time", &contents)) {
- overheat_info.set_time_to_overheat_secs(stoi(contents));
- } else {
- ALOGE("Unable to read trip_time");
- return;
- }
- if (ReadFileToString(std::string(kOverheatStatsPath) + "hysteresis_time", &contents)) {
- overheat_info.set_time_to_hysteresis_secs(stoi(contents));
- } else {
- ALOGE("Unable to read hysteresis_time");
- return;
- }
- if (ReadFileToString(std::string(kOverheatStatsPath) + "cleared_time", &contents)) {
- overheat_info.set_time_to_inactive_secs(stoi(contents));
- } else {
- ALOGE("Unable to read cleared_time");
- return;
- }
-
- const std::shared_ptr<IStats> stats_client = getStatsService();
- if (!stats_client) {
- ALOGE("Unable to get AIDL Stats service");
- } else {
- reportUsbPortOverheat(stats_client, overheat_info);
- }
-}
-
-struct data {
- int uevent_fd;
- android::hardware::usb::V1_3::implementation::Usb *usb;
-};
-
-static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
- char msg[UEVENT_MSG_LEN + 2];
- char *cp;
- int n;
-
- n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN);
- if (n <= 0)
- return;
- if (n >= UEVENT_MSG_LEN) /* overflow -- discard */
- return;
-
- msg[n] = '\0';
- msg[n + 1] = '\0';
- cp = msg;
-
- while (*cp) {
- if (std::regex_match(cp, std::regex("(add)(.*)(-partner)"))) {
- ALOGI("partner added");
- pthread_mutex_lock(&payload->usb->mPartnerLock);
- payload->usb->mPartnerUp = true;
- pthread_cond_signal(&payload->usb->mPartnerCV);
- pthread_mutex_unlock(&payload->usb->mPartnerLock);
- // Update Plugged temperature
- payload->usb->mOverheat.getCurrentTemperature(kThermalZoneForTempReadPrimary,
- &payload->usb->mPluggedTemperatureCelsius);
- ALOGI("Usb Plugged temp: %f", payload->usb->mPluggedTemperatureCelsius);
- } else if (!strncmp(cp, "DEVTYPE=typec_", strlen("DEVTYPE=typec_")) ||
- !strncmp(cp, "DRIVER=max77759tcpc",
- strlen("DRIVER=max77759tcpc"))) {
- hidl_vec<PortStatus> currentPortStatus_1_2;
- queryVersionHelper(payload->usb, ¤tPortStatus_1_2);
-
- // Role switch is not in progress and port is in disconnected state
- if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) {
- for (unsigned long i = 0; i < currentPortStatus_1_2.size(); i++) {
- DIR *dp =
- opendir(std::string("/sys/class/typec/" +
- std::string(currentPortStatus_1_2[i]
- .status_1_1.status.portName.c_str()) +
- "-partner")
- .c_str());
- if (dp == NULL) {
- // PortRole role = {.role = static_cast<uint32_t>(PortMode::UFP)};
- switchToDrp(currentPortStatus_1_2[i].status_1_1.status.portName);
- } else {
- closedir(dp);
- }
- }
- pthread_mutex_unlock(&payload->usb->mRoleSwitchLock);
- }
- break;
- } else if (!strncmp(cp, kOverheatStatsDev, strlen(kOverheatStatsDev))) {
- ALOGV("Overheat Cooling device suez update");
- report_overheat_event(payload->usb);
- }
- /* advance to after the next \0 */
- while (*cp++) {
- }
- }
-}
-
-void *work(void *param) {
- int epoll_fd, uevent_fd;
- struct epoll_event ev;
- int nevents = 0;
- struct data payload;
-
- ALOGE("creating thread");
-
- uevent_fd = uevent_open_socket(64 * 1024, true);
-
- if (uevent_fd < 0) {
- ALOGE("uevent_init: uevent_open_socket failed\n");
- return NULL;
- }
-
- payload.uevent_fd = uevent_fd;
- payload.usb = (android::hardware::usb::V1_3::implementation::Usb *)param;
-
- fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
-
- ev.events = EPOLLIN;
- ev.data.ptr = (void *)uevent_event;
-
- epoll_fd = epoll_create(64);
- if (epoll_fd == -1) {
- ALOGE("epoll_create failed; errno=%d", errno);
- goto error;
- }
-
- if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) {
- ALOGE("epoll_ctl failed; errno=%d", errno);
- goto error;
- }
-
- while (!destroyThread) {
- struct epoll_event events[64];
-
- nevents = epoll_wait(epoll_fd, events, 64, -1);
- if (nevents == -1) {
- if (errno == EINTR)
- continue;
- ALOGE("usb epoll_wait failed; errno=%d", errno);
- break;
- }
-
- for (int n = 0; n < nevents; ++n) {
- if (events[n].data.ptr)
- (*(void (*)(int, struct data *payload))events[n].data.ptr)(events[n].events,
- &payload);
- }
- }
-
- ALOGI("exiting worker thread");
-error:
- close(uevent_fd);
-
- if (epoll_fd >= 0)
- close(epoll_fd);
-
- return NULL;
-}
-
-void sighandler(int sig) {
- if (sig == SIGUSR1) {
- destroyThread = true;
- ALOGI("destroy set");
- return;
- }
- signal(SIGUSR1, sighandler);
-}
-
-Return<void> Usb::setCallback(const sp<V1_0::IUsbCallback> &callback) {
- sp<V1_1::IUsbCallback> callback_V1_1 = V1_1::IUsbCallback::castFrom(callback);
- sp<IUsbCallback> callback_V1_2 = IUsbCallback::castFrom(callback);
-
- if (callback != NULL) {
- if (callback_V1_2 != NULL)
- ALOGI("Registering 1.2 callback");
- else if (callback_V1_1 != NULL)
- ALOGI("Registering 1.1 callback");
- }
-
- pthread_mutex_lock(&mLock);
- /*
- * When both the old callback and new callback values are NULL,
- * there is no need to spin off the worker thread.
- * When both the values are not NULL, we would already have a
- * worker thread running, so updating the callback object would
- * be suffice.
- */
- if ((mCallback_1_0 == NULL && callback == NULL) ||
- (mCallback_1_0 != NULL && callback != NULL)) {
- /*
- * Always store as V1_0 callback object. Type cast to V1_1
- * when the callback is actually invoked.
- */
- mCallback_1_0 = callback;
- pthread_mutex_unlock(&mLock);
- return Void();
- }
-
- mCallback_1_0 = callback;
- ALOGI("registering callback");
-
- // Kill the worker thread if the new callback is NULL.
- if (mCallback_1_0 == NULL) {
- pthread_mutex_unlock(&mLock);
- if (!pthread_kill(mPoll, SIGUSR1)) {
- pthread_join(mPoll, NULL);
- ALOGI("pthread destroyed");
- }
- return Void();
- }
-
- destroyThread = false;
- signal(SIGUSR1, sighandler);
-
- /*
- * Create a background thread if the old callback value is NULL
- * and being updated with a new value.
- */
- if (pthread_create(&mPoll, NULL, work, this)) {
- ALOGE("pthread creation failed %d", errno);
- mCallback_1_0 = NULL;
- }
-
- pthread_mutex_unlock(&mLock);
- return Void();
-}
-
-} // namespace implementation
-} // namespace V1_3
-} // namespace usb
-} // namespace hardware
-} // namespace android
diff --git a/usb/Usb.h b/usb/Usb.h
deleted file mode 100644
index 23ed011..0000000
--- a/usb/Usb.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.
- */
-
-#pragma once
-
-#include <android-base/file.h>
-#include <android/hardware/usb/1.3/IUsb.h>
-#include <android/hardware/usb/1.2/types.h>
-#include <android/hardware/usb/1.2/IUsbCallback.h>
-#include <hidl/Status.h>
-#include <pixelusb/UsbOverheatEvent.h>
-#include <utils/Log.h>
-
-#define UEVENT_MSG_LEN 2048
-// The type-c stack waits for 4.5 - 5.5 secs before declaring a port non-pd.
-// The -partner directory would not be created until this is done.
-// Having a margin of ~3 secs for the directory and other related bookeeping
-// structures created and uvent fired.
-#define PORT_TYPE_TIMEOUT 8
-
-namespace android {
-namespace hardware {
-namespace usb {
-namespace V1_3 {
-namespace implementation {
-
-using ::android::base::WriteStringToFile;
-using ::android::base::ReadFileToString;
-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::google::pixel::usb::UsbOverheatEvent;
-using ::android::hardware::google::pixel::usb::ZoneInfo;
-using ::android::hardware::thermal::V2_0::TemperatureType;
-using ::android::hardware::thermal::V2_0::ThrottlingSeverity;
-using ::android::hardware::usb::V1_0::PortRole;
-using ::android::hardware::usb::V1_0::PortRoleType;
-using ::android::hardware::usb::V1_0::PortDataRole;
-using ::android::hardware::usb::V1_0::PortPowerRole;
-using ::android::hardware::usb::V1_0::PortRole;
-using ::android::hardware::usb::V1_0::PortRoleType;
-using ::android::hardware::usb::V1_0::Status;
-using ::android::hardware::usb::V1_3::IUsb;
-using ::android::hardware::usb::V1_2::IUsbCallback;
-using ::android::hardware::usb::V1_2::PortStatus;
-using ::android::hardware::usb::V1_1::PortMode_1_1;
-using ::android::hardware::usb::V1_1::PortStatus_1_1;
-using ::android::hidl::base::V1_0::DebugInfo;
-using ::android::hidl::base::V1_0::IBase;
-using ::android::sp;
-
-enum class HALVersion{
- V1_0,
- V1_1,
- V1_2,
- V1_3
-};
-
-constexpr char kGadgetName[] = "11110000.dwc3";
-#define NEW_UDC_PATH "/sys/devices/platform/11110000.usb/"
-
-#define ID_PATH NEW_UDC_PATH "dwc3_exynos_otg_id"
-#define VBUS_PATH NEW_UDC_PATH "dwc3_exynos_otg_b_sess"
-#define USB_DATA_PATH NEW_UDC_PATH "usb_data_enabled"
-
-struct Usb : public IUsb {
- Usb();
-
- 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;
- Return<void> enableContaminantPresenceDetection(const hidl_string &portName, bool enable);
- Return<void> enableContaminantPresenceProtection(const hidl_string &portName, bool enable);
- Return<bool> enableUsbDataSignal(bool enable) override;
-
- sp<V1_0::IUsbCallback> mCallback_1_0;
- // Protects mCallback variable
- pthread_mutex_t mLock;
- // Protects roleSwitch operation
- pthread_mutex_t mRoleSwitchLock;
- // Threads waiting for the partner to come back wait here
- pthread_cond_t mPartnerCV;
- // lock protecting mPartnerCV
- pthread_mutex_t mPartnerLock;
- // Variable to signal partner coming back online after type switch
- bool mPartnerUp;
-
- // Usb Overheat object for push suez event
- UsbOverheatEvent mOverheat;
- // Temperature when connected
- float mPluggedTemperatureCelsius;
-
- private:
- pthread_t mPoll;
-};
-
-} // namespace implementation
-} // namespace V1_3
-} // namespace usb
-} // namespace hardware
-} // namespace android
diff --git a/usb/android.hardware.usb@1.3-service.gs101.rc b/usb/android.hardware.usb@1.3-service.gs101.rc
deleted file mode 100644
index 4112b4e..0000000
--- a/usb/android.hardware.usb@1.3-service.gs101.rc
+++ /dev/null
@@ -1,99 +0,0 @@
-service vendor.usb-hal-1-3 /vendor/bin/hw/android.hardware.usb@1.3-service.gs101
- class hal
- user system
- group system shell mtp wakelock
- capabilities WAKE_ALARM BLOCK_SUSPEND
-
-on post-fs
- chown root system /sys/class/typec/port0/power_role
- chown root system /sys/class/typec/port0/data_role
- chown root system /sys/class/typec/port0/port_type
- chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
- chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
- chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
- chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
- chown root system /sys/devices/platform/11110000.usb/usb_data_enabled
- chmod 664 /sys/class/typec/port0/power_role
- chmod 664 /sys/class/typec/port0/data_role
- chmod 664 /sys/class/typec/port0/port_type
- chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
- chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
- chmod 664 /sys/devices/platform/11110000.usb/usb_data_enabled
-
-on property:vendor.usb.functions.ready=1
- chown system system /config/usb_gadget/
- chown system system /config/usb_gadget/g1
- chown system system /config/usb_gadget/g1/UDC
- chown system system /config/usb_gadget/g1/bDeviceClass
- chown system system /config/usb_gadget/g1/bDeviceProtocol
- chown system system /config/usb_gadget/g1/bDeviceSubClass
- chown system system /config/usb_gadget/g1/bMaxPacketSize0
- chown system system /config/usb_gadget/g1/bcdDevice
- chown system system /config/usb_gadget/g1/bcdUSB
- chown system system /config/usb_gadget/g1/configs
- chown system system /config/usb_gadget/g1/configs/b.1
- chown system system /config/usb_gadget/g1/configs/b.1/MaxPower
- chown system system /config/usb_gadget/g1/configs/b.1/bmAttributes
- chown system system /config/usb_gadget/g1/configs/b.1/strings
- chown system system /config/usb_gadget/g1/functions
- chown system system /config/usb_gadget/g1/functions/accessory.gs2
- chown system system /config/usb_gadget/g1/functions/acm.gs6
- chown system system /config/usb_gadget/g1/functions/acm.gs6/port_num
- chown system system /config/usb_gadget/g1/functions/acm.uwb0
- chown system system /config/usb_gadget/g1/functions/acm.uwb0/port_num
- chown system system /config/usb_gadget/g1/functions/audio_source.gs3
- chown system system /config/usb_gadget/g1/functions/dm.gs7
- chown system system /config/usb_gadget/g1/functions/ffs.adb
- chown system system /config/usb_gadget/g1/functions/ffs.mtp
- chown system system /config/usb_gadget/g1/functions/ffs.ptp
- chown system system /config/usb_gadget/g1/functions/midi.gs5
- chown system system /config/usb_gadget/g1/functions/midi.gs5/buflen
- chown system system /config/usb_gadget/g1/functions/midi.gs5/id
- chown system system /config/usb_gadget/g1/functions/midi.gs5/in_ports
- chown system system /config/usb_gadget/g1/functions/midi.gs5/index
- chown system system /config/usb_gadget/g1/functions/midi.gs5/out_ports
- chown system system /config/usb_gadget/g1/functions/midi.gs5/qlen
- chown system system /config/usb_gadget/g1/functions/mtp.gs0
- chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc
- chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP
- chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id
- chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/sub_compatible_id
- chown system system /config/usb_gadget/g1/functions/ncm.gs9
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/dev_addr
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/host_addr
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/ifname
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm/compatible_id
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm/sub_compatible_id
- chown system system /config/usb_gadget/g1/functions/ncm.gs9/qmult
- chown system system /config/usb_gadget/g1/functions/ptp.gs1
- chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc
- chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP
- chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/compatible_id
- chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/sub_compatible_id
- chown system system /config/usb_gadget/g1/functions/rndis.gs4
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/class
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/dev_addr
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/host_addr
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/ifname
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/compatible_id
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/sub_compatible_id
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/protocol
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/qmult
- chown system system /config/usb_gadget/g1/functions/rndis.gs4/subclass
- chown system system /config/usb_gadget/g1/idProduct
- chown system system /config/usb_gadget/g1/idVendor
- chown system system /config/usb_gadget/g1/max_speed
- chown system system /config/usb_gadget/g1/os_desc
- chown system system /config/usb_gadget/g1/os_desc/b.1
- chown system system /config/usb_gadget/g1/os_desc/b_vendor_code
- chown system system /config/usb_gadget/g1/os_desc/qw_sign
- chown system system /config/usb_gadget/g1/os_desc/use
- chown system system /config/usb_gadget/g1/strings
- chown system system /config/usb_gadget/g1/strings/0x409
- chown system system /config/usb_gadget/g1/strings/0x409/manufacturer
- chown system system /config/usb_gadget/g1/strings/0x409/product
- chown system system /config/usb_gadget/g1/strings/0x409/serialnumber
diff --git a/usb/Android.bp b/usb/gadget/Android.bp
similarity index 66%
rename from usb/Android.bp
rename to usb/gadget/Android.bp
index 40454af..ab7ac32 100644
--- a/usb/Android.bp
+++ b/usb/gadget/Android.bp
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2017 The Android Open Source Project
+// Copyright (C) 2021 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.
@@ -25,14 +25,13 @@
}
cc_binary {
- name: "android.hardware.usb@1.3-service.gs101",
+ name: "android.hardware.usb.gadget-service.gs101",
relative_install_path: "hw",
- init_rc: ["android.hardware.usb@1.3-service.gs101.rc"],
+ init_rc: ["android.hardware.usb.gadget-service.gs101.rc"],
vintf_fragments: [
- "android.hardware.usb@1.3-service.gs101.xml",
"android.hardware.usb.gadget@1.2-service.gs101.xml",
],
- srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"],
+ srcs: ["service_gadget.cpp", "UsbGadget.cpp"],
cflags: ["-Wall", "-Werror"],
shared_libs: [
"libbase",
@@ -41,27 +40,13 @@
"liblog",
"libutils",
"libhardware",
- "android.hardware.usb@1.0",
- "android.hardware.usb@1.1",
- "android.hardware.usb@1.2",
- "android.hardware.usb@1.3",
"android.hardware.usb.gadget@1.0",
"android.hardware.usb.gadget@1.1",
"android.hardware.usb.gadget@1.2",
- "android.hardware.thermal@1.0",
- "android.hardware.thermal@2.0",
"libcutils",
- "android.frameworks.stats-V1-ndk_platform",
- "pixelatoms-cpp",
- "libbinder_ndk",
],
static_libs: [
"libpixelusb",
- "libpixelstats",
- ],
- export_shared_lib_headers: [
- "android.frameworks.stats-V1-ndk_platform",
- "pixelatoms-cpp",
],
proprietary: true,
}
diff --git a/usb/UsbGadget.cpp b/usb/gadget/UsbGadget.cpp
similarity index 88%
rename from usb/UsbGadget.cpp
rename to usb/gadget/UsbGadget.cpp
index 5c0021f..361cefd 100644
--- a/usb/UsbGadget.cpp
+++ b/usb/gadget/UsbGadget.cpp
@@ -33,13 +33,55 @@
namespace V1_2 {
namespace implementation {
-UsbGadget::UsbGadget() {
+UsbGadget::UsbGadget() : mGadgetIrqPath("") {
if (access(OS_DESC_PATH, R_OK) != 0) {
ALOGE("configfs setup not done yet");
abort();
}
}
+V1_0::Status UsbGadget::getUsbGadgetIrqPath() {
+ std::string irqs;
+ size_t read_pos = 0;
+ size_t found_pos = 0;
+
+ if (!ReadFileToString(kProcInterruptsPath, &irqs)) {
+ ALOGE("cannot read all interrupts");
+ return Status::ERROR;
+ }
+
+ while (true) {
+ found_pos = irqs.find_first_of("\n", read_pos);
+ if (found_pos == std::string::npos) {
+ ALOGI("the string of all interrupts is unexpected");
+ return Status::ERROR;
+ }
+
+ std::string single_irq = irqs.substr(read_pos, found_pos - read_pos);
+
+ if (single_irq.find("dwc3", 0) != std::string::npos) {
+ unsigned int dwc3_irq_number;
+ size_t dwc3_pos = single_irq.find_first_of(":");
+ if (!ParseUint(single_irq.substr(0, dwc3_pos), &dwc3_irq_number)) {
+ ALOGI("unknown IRQ strings");
+ return Status::ERROR;
+ }
+
+ mGadgetIrqPath = kProcIrqPath + single_irq.substr(0, dwc3_pos) + kSmpAffinityList;
+ break;
+ }
+
+ if (found_pos == irqs.npos) {
+ ALOGI("USB gadget doesn't start");
+ return Status::ERROR;
+ }
+
+ read_pos = found_pos + 1;
+ }
+
+ return Status::SUCCESS;
+}
+
void currentFunctionsAppliedCallback(bool functionsApplied, void *payload) {
UsbGadget *gadget = (UsbGadget *)payload;
gadget->mCurrentUsbFunctionsApplied = functionsApplied;
@@ -346,6 +388,10 @@
mCurrentUsbFunctions = functions;
mCurrentUsbFunctionsApplied = false;
+ // Get the gadget IRQ number before tearDownGadget()
+ if (mGadgetIrqPath.empty())
+ getUsbGadgetIrqPath();
+
// Unlink the gadget and stop the monitor if running.
V1_0::Status status = tearDownGadget();
if (status != Status::SUCCESS) {
@@ -378,9 +424,15 @@
}
if (functions & GadgetFunction::NCM) {
- SetProperty("vendor.usb.dwc3_irq", "big");
+ if (!mGadgetIrqPath.empty()) {
+ if (!WriteStringToFile(BIG_CORE, mGadgetIrqPath))
+ ALOGI("Cannot move gadget IRQ to big core, path:%s", mGadgetIrqPath.c_str());
+ }
} else {
- SetProperty("vendor.usb.dwc3_irq", "medium");
+ if (!mGadgetIrqPath.empty()) {
+ if (!WriteStringToFile(MEDIUM_CORE, mGadgetIrqPath))
+ ALOGI("Cannot move gadget IRQ to medium core, path:%s", mGadgetIrqPath.c_str());
+ }
}
ALOGI("Usb Gadget setcurrent functions called successfully");
diff --git a/usb/UsbGadget.h b/usb/gadget/UsbGadget.h
similarity index 91%
rename from usb/UsbGadget.h
rename to usb/gadget/UsbGadget.h
index 2669f8d..f89476d 100644
--- a/usb/UsbGadget.h
+++ b/usb/gadget/UsbGadget.h
@@ -19,6 +19,7 @@
#include <android-base/file.h>
#include <android-base/properties.h>
#include <android-base/unique_fd.h>
+#include <android-base/parseint.h>
#include <android-base/strings.h>
#include <android/hardware/usb/gadget/1.2/IUsbGadget.h>
#include <android/hardware/usb/gadget/1.2/types.h>
@@ -44,6 +45,7 @@
using ::android::sp;
using ::android::base::GetProperty;
using ::android::base::SetProperty;
+using ::android::base::ParseUint;
using ::android::base::unique_fd;
using ::android::base::ReadFileToString;
using ::android::base::Trim;
@@ -71,6 +73,9 @@
using ::std::string;
constexpr char kGadgetName[] = "11110000.dwc3";
+constexpr char kProcInterruptsPath[] = "/proc/interrupts";
+constexpr char kProcIrqPath[] = "/proc/irq/";
+constexpr char kSmpAffinityList[] = "/smp_affinity_list";
#ifndef UDC_PATH
#define UDC_PATH "/sys/class/udc/11110000.dwc3/"
#endif
@@ -78,11 +83,15 @@
#define SPEED_PATH UDC_PATH "current_speed"
+#define BIG_CORE "6"
+#define MEDIUM_CORE "4"
+
struct UsbGadget : public IUsbGadget {
UsbGadget();
// Makes sure that only one request is processed at a time.
std::mutex mLockSetCurrentFunction;
+ std::string mGadgetIrqPath;
uint64_t mCurrentUsbFunctions;
bool mCurrentUsbFunctionsApplied;
UsbSpeed mUsbSpeed;
@@ -99,6 +108,7 @@
private:
Status tearDownGadget();
+ Status getUsbGadgetIrqPath();
Status setupFunctions(uint64_t functions, const sp<V1_0::IUsbGadgetCallback> &callback,
uint64_t timeout);
};
diff --git a/usb/gadget/android.hardware.usb.gadget-service.gs101.rc b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
new file mode 100644
index 0000000..91b55c6
--- /dev/null
+++ b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
@@ -0,0 +1,21 @@
+service vendor.usb-gadget-hal-1-2 /vendor/bin/hw/android.hardware.usb.gadget-service.gs101
+ class hal
+ user system
+ group system shell mtp wakelock
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+
+on post-fs
+ chown root system /sys/class/typec/port0/power_role
+ chown root system /sys/class/typec/port0/data_role
+ chown root system /sys/class/typec/port0/port_type
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chown root system /sys/devices/platform/11110000.usb/usb_data_enabled
+ chmod 664 /sys/class/typec/port0/power_role
+ chmod 664 /sys/class/typec/port0/data_role
+ chmod 664 /sys/class/typec/port0/port_type
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chmod 664 /sys/devices/platform/11110000.usb/usb_data_enabled
diff --git a/usb/android.hardware.usb.gadget@1.2-service.gs101.xml b/usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml
similarity index 100%
rename from usb/android.hardware.usb.gadget@1.2-service.gs101.xml
rename to usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml
diff --git a/usb/service.cpp b/usb/gadget/service_gadget.cpp
similarity index 69%
rename from usb/service.cpp
rename to usb/gadget/service_gadget.cpp
index a4a30d2..d0908ee 100644
--- a/usb/service.cpp
+++ b/usb/gadget/service_gadget.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2021 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.
@@ -14,10 +14,9 @@
* limitations under the License.
*/
-#define LOG_TAG "android.hardware.usb@1.3-service.gs101"
+#define LOG_TAG "android.hardware.usb.gadget-service.gs101"
#include <hidl/HidlTransportSupport.h>
-#include "Usb.h"
#include "UsbGadget.h"
using android::sp;
@@ -29,34 +28,23 @@
// Generated HIDL files
using android::hardware::usb::gadget::V1_2::IUsbGadget;
using android::hardware::usb::gadget::V1_2::implementation::UsbGadget;
-using android::hardware::usb::V1_3::IUsb;
-using android::hardware::usb::V1_3::implementation::Usb;
using android::OK;
using android::status_t;
int main() {
- android::sp<IUsb> service = new Usb();
- android::sp<IUsbGadget> service2 = new UsbGadget();
-
+ android::sp<IUsbGadget> service = new UsbGadget();
configureRpcThreadpool(2, 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;
}
- ALOGI("USB HAL Ready.");
+ ALOGI("USB gadget HAL Ready.");
joinRpcThreadpool();
// Under noraml cases, execution will not reach this line.
- ALOGI("USB HAL failed to join thread pool.");
+ ALOGI("USB gadget HAL failed to join thread pool.");
return 1;
}
diff --git a/usb/usb/Android.bp b/usb/usb/Android.bp
new file mode 100644
index 0000000..f0f5069
--- /dev/null
+++ b/usb/usb/Android.bp
@@ -0,0 +1,61 @@
+//
+// Copyright (C) 2021 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.
+//
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+cc_binary {
+ name: "android.hardware.usb-service.gs101",
+ relative_install_path: "hw",
+ init_rc: ["android.hardware.usb-service.rc"],
+ vintf_fragments: ["android.hardware.usb-service.xml"],
+ vendor: true,
+ srcs: [
+ "service.cpp",
+ "Usb.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libhidlbase",
+ "liblog",
+ "libutils",
+ "libhardware",
+ "android.hardware.thermal@1.0",
+ "android.hardware.thermal@2.0",
+ "android.hardware.usb.gadget@1.0",
+ "android.hardware.usb-V1-ndk",
+ "libcutils",
+ "android.frameworks.stats-V1-ndk",
+ "pixelatoms-cpp",
+ "libbinder_ndk",
+
+ ],
+ static_libs: [
+ "libpixelusb",
+ "libpixelstats",
+ ],
+ export_shared_lib_headers: [
+ "android.frameworks.stats-V1-ndk",
+ "pixelatoms-cpp",
+ ],
+}
diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp
new file mode 100644
index 0000000..7aa4ced
--- /dev/null
+++ b/usb/usb/Usb.cpp
@@ -0,0 +1,850 @@
+/*
+ * Copyright (C) 2021 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.aidl-service"
+
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <assert.h>
+#include <dirent.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <chrono>
+#include <regex>
+#include <thread>
+#include <unordered_map>
+
+#include <cutils/uevent.h>
+#include <sys/epoll.h>
+#include <utils/Errors.h>
+#include <utils/StrongPointer.h>
+
+#include "Usb.h"
+
+#include <aidl/android/frameworks/stats/IStats.h>
+#include <pixelusb/UsbGadgetCommon.h>
+#include <pixelstats/StatsHelper.h>
+
+using aidl::android::frameworks::stats::IStats;
+using android::base::GetProperty;
+using android::base::Trim;
+using android::hardware::google::pixel::getStatsService;
+using android::hardware::google::pixel::PixelAtoms::VendorUsbPortOverheat;
+using android::hardware::google::pixel::reportUsbPortOverheat;
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace usb {
+// Set by the signal handler to destroy the thread
+volatile bool destroyThread;
+
+string enabledPath;
+constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
+constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
+constexpr char kContaminantDetectionPath[] = "i2c-max77759tcpc/contaminant_detection";
+constexpr char kStatusPath[] = "i2c-max77759tcpc/contaminant_detection_status";
+constexpr char kTypecPath[] = "/sys/class/typec";
+constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
+constexpr char kOverheatStatsPath[] = "/sys/devices/platform/google,usbc_port_cooling_dev/";
+constexpr char kOverheatStatsDev[] = "DRIVER=google,usbc_port_cooling_dev";
+constexpr char kThermalZoneForTrip[] = "VIRTUAL-USB-THROTTLING";
+constexpr char kThermalZoneForTempReadPrimary[] = "usb_pwr_therm2";
+constexpr char kThermalZoneForTempReadSecondary1[] = "usb_pwr_therm";
+constexpr char kThermalZoneForTempReadSecondary2[] = "qi_therm";
+constexpr int kSamplingIntervalSec = 5;
+void queryVersionHelper(android::hardware::usb::Usb *usb,
+ std::vector<PortStatus> *currentPortStatus);
+
+ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable,
+ int64_t in_transactionId) {
+ bool result = true;
+ std::vector<PortStatus> currentPortStatus;
+
+ ALOGI("Userspace turn %s USB data signaling. opID:%ld", in_enable ? "on" : "off",
+ in_transactionId);
+
+ if (in_enable) {
+ if (!WriteStringToFile("1", USB_DATA_PATH)) {
+ ALOGE("Not able to turn on usb connection notification");
+ result = false;
+ }
+
+ if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
+ ALOGE("Gadget cannot be pulled up");
+ result = false;
+ }
+ } else {
+ if (!WriteStringToFile("1", ID_PATH)) {
+ ALOGE("Not able to turn off host mode");
+ result = false;
+ }
+
+ if (!WriteStringToFile("0", VBUS_PATH)) {
+ ALOGE("Not able to set Vbus state");
+ result = false;
+ }
+
+ if (!WriteStringToFile("0", USB_DATA_PATH)) {
+ ALOGE("Not able to turn on usb connection notification");
+ result = false;
+ }
+
+ if (!WriteStringToFile("none", PULLUP_PATH)) {
+ ALOGE("Gadget cannot be pulled down");
+ result = false;
+ }
+ }
+
+ if (result) {
+ mUsbDataEnabled = in_enable;
+ }
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyEnableUsbDataStatus(
+ in_portName, in_enable, result ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyEnableUsbDataStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+ queryVersionHelper(this, ¤tPortStatus);
+
+ return ScopedAStatus::ok();
+}
+
+Status getContaminantDetectionNamesHelper(string *name) {
+ DIR *dp;
+
+ dp = opendir(kHsi2cPath);
+ if (dp != NULL) {
+ struct dirent *ep;
+
+ while ((ep = readdir(dp))) {
+ if (ep->d_type == DT_DIR) {
+ if (string::npos != string(ep->d_name).find("i2c-")) {
+ std::strtok(ep->d_name, "-");
+ *name = std::strtok(NULL, "-");
+ }
+ }
+ }
+ closedir(dp);
+ return Status::SUCCESS;
+ }
+
+ ALOGE("Failed to open %s", kHsi2cPath);
+ return Status::ERROR;
+}
+
+Status queryMoistureDetectionStatus(std::vector<PortStatus> *currentPortStatus) {
+ string enabled, status, path, DetectedPath;
+
+ (*currentPortStatus)[0].supportedContaminantProtectionModes
+ .push_back(ContaminantProtectionMode::FORCE_DISABLE);
+ (*currentPortStatus)[0].contaminantProtectionStatus = ContaminantProtectionStatus::NONE;
+ (*currentPortStatus)[0].contaminantDetectionStatus = ContaminantDetectionStatus::DISABLED;
+ (*currentPortStatus)[0].supportsEnableContaminantPresenceDetection = true;
+ (*currentPortStatus)[0].supportsEnableContaminantPresenceProtection = false;
+
+ getContaminantDetectionNamesHelper(&path);
+ enabledPath = kI2CPath + path + "/" + kContaminantDetectionPath;
+ if (!ReadFileToString(enabledPath, &enabled)) {
+ ALOGE("Failed to open moisture_detection_enabled");
+ return Status::ERROR;
+ }
+
+ enabled = Trim(enabled);
+ if (enabled == "1") {
+ DetectedPath = kI2CPath + path + "/" + kStatusPath;
+ if (!ReadFileToString(DetectedPath, &status)) {
+ ALOGE("Failed to open moisture_detected");
+ return Status::ERROR;
+ }
+ status = Trim(status);
+ if (status == "1") {
+ (*currentPortStatus)[0].contaminantDetectionStatus =
+ ContaminantDetectionStatus::DETECTED;
+ (*currentPortStatus)[0].contaminantProtectionStatus =
+ ContaminantProtectionStatus::FORCE_DISABLE;
+ } else {
+ (*currentPortStatus)[0].contaminantDetectionStatus =
+ ContaminantDetectionStatus::NOT_DETECTED;
+ }
+ }
+
+ ALOGI("ContaminantDetectionStatus:%d ContaminantProtectionStatus:%d",
+ (*currentPortStatus)[0].contaminantDetectionStatus,
+ (*currentPortStatus)[0].contaminantProtectionStatus);
+
+ return Status::SUCCESS;
+}
+
+string appendRoleNodeHelper(const string &portName, PortRole::Tag tag) {
+ string node("/sys/class/typec/" + portName);
+
+ switch (tag) {
+ case PortRole::dataRole:
+ return node + "/data_role";
+ case PortRole::powerRole:
+ return node + "/power_role";
+ case PortRole::mode:
+ return node + "/port_type";
+ default:
+ return "";
+ }
+}
+
+string convertRoletoString(PortRole role) {
+ if (role.getTag() == PortRole::powerRole) {
+ if (role.get<PortRole::powerRole>() == PortPowerRole::SOURCE)
+ return "source";
+ else if (role.get<PortRole::powerRole>() == PortPowerRole::SINK)
+ return "sink";
+ } else if (role.getTag() == PortRole::dataRole) {
+ if (role.get<PortRole::dataRole>() == PortDataRole::HOST)
+ return "host";
+ if (role.get<PortRole::dataRole>() == PortDataRole::DEVICE)
+ return "device";
+ } else if (role.getTag() == PortRole::mode) {
+ if (role.get<PortRole::mode>() == PortMode::UFP)
+ return "sink";
+ if (role.get<PortRole::mode>() == PortMode::DFP)
+ return "source";
+ }
+ return "none";
+}
+
+void extractRole(string *roleName) {
+ std::size_t first, last;
+
+ first = roleName->find("[");
+ last = roleName->find("]");
+
+ if (first != string::npos && last != string::npos) {
+ *roleName = roleName->substr(first + 1, last - first - 1);
+ }
+}
+
+void switchToDrp(const string &portName) {
+ string filename = appendRoleNodeHelper(string(portName.c_str()), PortRole::mode);
+ FILE *fp;
+
+ if (filename != "") {
+ fp = fopen(filename.c_str(), "w");
+ if (fp != NULL) {
+ int ret = fputs("dual", fp);
+ fclose(fp);
+ if (ret == EOF)
+ ALOGE("Fatal: Error while switching back to drp");
+ } else {
+ ALOGE("Fatal: Cannot open file to switch back to drp");
+ }
+ } else {
+ ALOGE("Fatal: invalid node type");
+ }
+}
+
+bool switchMode(const string &portName, const PortRole &in_role, struct Usb *usb) {
+ string filename = appendRoleNodeHelper(string(portName.c_str()), in_role.getTag());
+ string written;
+ FILE *fp;
+ bool roleSwitch = false;
+
+ if (filename == "") {
+ ALOGE("Fatal: invalid node type");
+ return false;
+ }
+
+ fp = fopen(filename.c_str(), "w");
+ if (fp != NULL) {
+ // Hold the lock here to prevent loosing connected signals
+ // as once the file is written the partner added signal
+ // can arrive anytime.
+ pthread_mutex_lock(&usb->mPartnerLock);
+ usb->mPartnerUp = false;
+ int ret = fputs(convertRoletoString(in_role).c_str(), fp);
+ fclose(fp);
+
+ if (ret != EOF) {
+ struct timespec to;
+ struct timespec now;
+
+ wait_again:
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ to.tv_sec = now.tv_sec + PORT_TYPE_TIMEOUT;
+ to.tv_nsec = now.tv_nsec;
+
+ int err = pthread_cond_timedwait(&usb->mPartnerCV, &usb->mPartnerLock, &to);
+ // There are no uevent signals which implies role swap timed out.
+ if (err == ETIMEDOUT) {
+ ALOGI("uevents wait timedout");
+ // Validity check.
+ } else if (!usb->mPartnerUp) {
+ goto wait_again;
+ // Role switch succeeded since usb->mPartnerUp is true.
+ } else {
+ roleSwitch = true;
+ }
+ } else {
+ ALOGI("Role switch failed while wrting to file");
+ }
+ pthread_mutex_unlock(&usb->mPartnerLock);
+ }
+
+ if (!roleSwitch)
+ switchToDrp(string(portName.c_str()));
+
+ return roleSwitch;
+}
+
+Usb::Usb()
+ : mLock(PTHREAD_MUTEX_INITIALIZER),
+ mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER),
+ mPartnerLock(PTHREAD_MUTEX_INITIALIZER),
+ mPartnerUp(false),
+ mOverheat(ZoneInfo(TemperatureType::USB_PORT, kThermalZoneForTrip,
+ ThrottlingSeverity::CRITICAL),
+ {ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadPrimary,
+ ThrottlingSeverity::NONE),
+ ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary1,
+ ThrottlingSeverity::NONE),
+ ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary2,
+ ThrottlingSeverity::NONE)}, kSamplingIntervalSec),
+ mUsbDataEnabled(true) {
+ pthread_condattr_t attr;
+ if (pthread_condattr_init(&attr)) {
+ ALOGE("pthread_condattr_init failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) {
+ ALOGE("pthread_condattr_setclock failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_cond_init(&mPartnerCV, &attr)) {
+ ALOGE("pthread_cond_init failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_condattr_destroy(&attr)) {
+ ALOGE("pthread_condattr_destroy failed: %s", strerror(errno));
+ abort();
+ }
+}
+
+ScopedAStatus Usb::switchRole(const string& in_portName, const PortRole& in_role,
+ int64_t in_transactionId) {
+ string filename = appendRoleNodeHelper(string(in_portName.c_str()), in_role.getTag());
+ string written;
+ FILE *fp;
+ bool roleSwitch = false;
+
+ if (filename == "") {
+ ALOGE("Fatal: invalid node type");
+ return ScopedAStatus::ok();
+ }
+
+ pthread_mutex_lock(&mRoleSwitchLock);
+
+ ALOGI("filename write: %s role:%s", filename.c_str(), convertRoletoString(in_role).c_str());
+
+ if (in_role.getTag() == PortRole::mode) {
+ roleSwitch = switchMode(in_portName, in_role, this);
+ } else {
+ fp = fopen(filename.c_str(), "w");
+ if (fp != NULL) {
+ int ret = fputs(convertRoletoString(in_role).c_str(), fp);
+ fclose(fp);
+ if ((ret != EOF) && ReadFileToString(filename, &written)) {
+ written = Trim(written);
+ extractRole(&written);
+ ALOGI("written: %s", written.c_str());
+ if (written == convertRoletoString(in_role)) {
+ roleSwitch = true;
+ } else {
+ ALOGE("Role switch failed");
+ }
+ } else {
+ ALOGE("failed to update the new role");
+ }
+ } else {
+ ALOGE("fopen failed");
+ }
+ }
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyRoleSwitchStatus(
+ in_portName, in_role, roleSwitch ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("RoleSwitchStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+ pthread_mutex_unlock(&mRoleSwitchLock);
+
+ return ScopedAStatus::ok();
+}
+
+Status getAccessoryConnected(const string &portName, string *accessory) {
+ string filename = "/sys/class/typec/" + portName + "-partner/accessory_mode";
+
+ if (!ReadFileToString(filename, accessory)) {
+ ALOGE("getAccessoryConnected: Failed to open filesystem node: %s", filename.c_str());
+ return Status::ERROR;
+ }
+ *accessory = Trim(*accessory);
+
+ return Status::SUCCESS;
+}
+
+Status getCurrentRoleHelper(const string &portName, bool connected, PortRole *currentRole) {
+ string filename;
+ string roleName;
+ string accessory;
+
+ // Mode
+
+ if (currentRole->getTag() == PortRole::powerRole) {
+ filename = "/sys/class/typec/" + portName + "/power_role";
+ currentRole->set<PortRole::powerRole>(PortPowerRole::NONE);
+ } else if (currentRole->getTag() == PortRole::dataRole) {
+ filename = "/sys/class/typec/" + portName + "/data_role";
+ currentRole->set<PortRole::dataRole>(PortDataRole::NONE);
+ } else if (currentRole->getTag() == PortRole::mode) {
+ filename = "/sys/class/typec/" + portName + "/data_role";
+ currentRole->set<PortRole::mode>(PortMode::NONE);
+ } else {
+ return Status::ERROR;
+ }
+
+ if (!connected)
+ return Status::SUCCESS;
+
+ if (currentRole->getTag() == PortRole::mode) {
+ if (getAccessoryConnected(portName, &accessory) != Status::SUCCESS) {
+ return Status::ERROR;
+ }
+ if (accessory == "analog_audio") {
+ currentRole->set<PortRole::mode>(PortMode::AUDIO_ACCESSORY);
+ return Status::SUCCESS;
+ } else if (accessory == "debug") {
+ currentRole->set<PortRole::mode>(PortMode::DEBUG_ACCESSORY);
+ return Status::SUCCESS;
+ }
+ }
+
+ if (!ReadFileToString(filename, &roleName)) {
+ ALOGE("getCurrentRole: Failed to open filesystem node: %s", filename.c_str());
+ return Status::ERROR;
+ }
+
+ roleName = Trim(roleName);
+ extractRole(&roleName);
+
+ if (roleName == "source") {
+ currentRole->set<PortRole::powerRole>(PortPowerRole::SOURCE);
+ } else if (roleName == "sink") {
+ currentRole->set<PortRole::powerRole>(PortPowerRole::SINK);
+ } else if (roleName == "host") {
+ if (currentRole->getTag() == PortRole::dataRole)
+ currentRole->set<PortRole::dataRole>(PortDataRole::HOST);
+ else
+ currentRole->set<PortRole::mode>(PortMode::DFP);
+ } else if (roleName == "device") {
+ if (currentRole->getTag() == PortRole::dataRole)
+ currentRole->set<PortRole::dataRole>(PortDataRole::DEVICE);
+ else
+ currentRole->set<PortRole::mode>(PortMode::UFP);
+ } else if (roleName != "none") {
+ /* case for none has already been addressed.
+ * so we check if the role isn't none.
+ */
+ return Status::UNRECOGNIZED_ROLE;
+ }
+ return Status::SUCCESS;
+}
+
+Status getTypeCPortNamesHelper(std::unordered_map<string, bool> *names) {
+ DIR *dp;
+
+ dp = opendir(kTypecPath);
+ if (dp != NULL) {
+ struct dirent *ep;
+
+ while ((ep = readdir(dp))) {
+ if (ep->d_type == DT_LNK) {
+ if (string::npos == string(ep->d_name).find("-partner")) {
+ std::unordered_map<string, bool>::const_iterator portName =
+ names->find(ep->d_name);
+ if (portName == names->end()) {
+ names->insert({ep->d_name, false});
+ }
+ } else {
+ (*names)[std::strtok(ep->d_name, "-")] = true;
+ }
+ }
+ }
+ closedir(dp);
+ return Status::SUCCESS;
+ }
+
+ ALOGE("Failed to open /sys/class/typec");
+ return Status::ERROR;
+}
+
+bool canSwitchRoleHelper(const string &portName) {
+ string filename = "/sys/class/typec/" + portName + "-partner/supports_usb_power_delivery";
+ string supportsPD;
+
+ if (ReadFileToString(filename, &supportsPD)) {
+ supportsPD = Trim(supportsPD);
+ if (supportsPD == "yes") {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+Status getPortStatusHelper(android::hardware::usb::Usb *usb,
+ std::vector<PortStatus> *currentPortStatus) {
+ std::unordered_map<string, bool> names;
+ Status result = getTypeCPortNamesHelper(&names);
+ int i = -1;
+
+ if (result == Status::SUCCESS) {
+ currentPortStatus->resize(names.size());
+ for (std::pair<string, bool> port : names) {
+ i++;
+ ALOGI("%s", port.first.c_str());
+ (*currentPortStatus)[i].portName = port.first;
+
+ PortRole currentRole;
+ currentRole.set<PortRole::powerRole>(PortPowerRole::NONE);
+ if (getCurrentRoleHelper(port.first, port.second, ¤tRole) == Status::SUCCESS){
+ (*currentPortStatus)[i].currentPowerRole = currentRole.get<PortRole::powerRole>();
+ } else {
+ ALOGE("Error while retrieving portNames");
+ goto done;
+ }
+
+ currentRole.set<PortRole::dataRole>(PortDataRole::NONE);
+ if (getCurrentRoleHelper(port.first, port.second, ¤tRole) == Status::SUCCESS) {
+ (*currentPortStatus)[i].currentDataRole = currentRole.get<PortRole::dataRole>();
+ } else {
+ ALOGE("Error while retrieving current port role");
+ goto done;
+ }
+
+ currentRole.set<PortRole::mode>(PortMode::NONE);
+ if (getCurrentRoleHelper(port.first, port.second, ¤tRole) == Status::SUCCESS) {
+ (*currentPortStatus)[i].currentMode = currentRole.get<PortRole::mode>();
+ } else {
+ ALOGE("Error while retrieving current data role");
+ goto done;
+ }
+
+ (*currentPortStatus)[i].canChangeMode = true;
+ (*currentPortStatus)[i].canChangeDataRole =
+ port.second ? canSwitchRoleHelper(port.first) : false;
+ (*currentPortStatus)[i].canChangePowerRole =
+ port.second ? canSwitchRoleHelper(port.first) : false;
+
+ (*currentPortStatus)[i].supportedModes.push_back(PortMode::DRP);
+ (*currentPortStatus)[i].usbDataEnabled = usb->mUsbDataEnabled;
+
+ ALOGI("%d:%s connected:%d canChangeMode:%d canChagedata:%d canChangePower:%d "
+ "usbDataEnabled:%d",
+ i, port.first.c_str(), port.second,
+ (*currentPortStatus)[i].canChangeMode,
+ (*currentPortStatus)[i].canChangeDataRole,
+ (*currentPortStatus)[i].canChangePowerRole,
+ (*currentPortStatus)[i].usbDataEnabled ? 1 : 0);
+ }
+ return Status::SUCCESS;
+ }
+done:
+ return Status::ERROR;
+}
+
+void queryVersionHelper(android::hardware::usb::Usb *usb,
+ std::vector<PortStatus> *currentPortStatus) {
+ Status status;
+ pthread_mutex_lock(&usb->mLock);
+ status = getPortStatusHelper(usb, currentPortStatus);
+ queryMoistureDetectionStatus(currentPortStatus);
+ if (usb->mCallback != NULL) {
+ ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus,
+ status);
+ if (!ret.isOk())
+ ALOGE("queryPortStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGI("Notifying userspace skipped. Callback is NULL");
+ }
+ pthread_mutex_unlock(&usb->mLock);
+}
+
+ScopedAStatus Usb::queryPortStatus(int64_t in_transactionId) {
+ std::vector<PortStatus> currentPortStatus;
+
+ queryVersionHelper(this, ¤tPortStatus);
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyQueryPortStatus(
+ "all", Status::SUCCESS, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyQueryPortStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::enableContaminantPresenceDetection(const string& in_portName,
+ bool in_enable, int64_t in_transactionId) {
+ string disable = GetProperty(kDisableContatminantDetection, "");
+ std::vector<PortStatus> currentPortStatus;
+ bool success = true;
+
+ if (disable != "true")
+ success = WriteStringToFile(in_enable ? "1" : "0", enabledPath);
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyContaminantEnabledStatus(
+ in_portName, in_enable, success ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyContaminantEnabledStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+
+ queryVersionHelper(this, ¤tPortStatus);
+ return ScopedAStatus::ok();
+}
+
+
+void report_overheat_event(android::hardware::usb::Usb *usb) {
+ VendorUsbPortOverheat overheat_info;
+ string contents;
+
+ overheat_info.set_plug_temperature_deci_c(usb->mPluggedTemperatureCelsius * 10);
+ overheat_info.set_max_temperature_deci_c(usb->mOverheat.getMaxOverheatTemperature() * 10);
+ if (ReadFileToString(string(kOverheatStatsPath) + "trip_time", &contents)) {
+ overheat_info.set_time_to_overheat_secs(stoi(Trim(contents)));
+ } else {
+ ALOGE("Unable to read trip_time");
+ return;
+ }
+ if (ReadFileToString(string(kOverheatStatsPath) + "hysteresis_time", &contents)) {
+ overheat_info.set_time_to_hysteresis_secs(stoi(Trim(contents)));
+ } else {
+ ALOGE("Unable to read hysteresis_time");
+ return;
+ }
+ if (ReadFileToString(string(kOverheatStatsPath) + "cleared_time", &contents)) {
+ overheat_info.set_time_to_inactive_secs(stoi(Trim(contents)));
+ } else {
+ ALOGE("Unable to read cleared_time");
+ return;
+ }
+
+ const shared_ptr<IStats> stats_client = getStatsService();
+ if (!stats_client) {
+ ALOGE("Unable to get AIDL Stats service");
+ } else {
+ reportUsbPortOverheat(stats_client, overheat_info);
+ }
+}
+
+struct data {
+ int uevent_fd;
+ ::aidl::android::hardware::usb::Usb *usb;
+};
+
+static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
+ char msg[UEVENT_MSG_LEN + 2];
+ char *cp;
+ int n;
+
+ n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN);
+ if (n <= 0)
+ return;
+ if (n >= UEVENT_MSG_LEN) /* overflow -- discard */
+ return;
+
+ msg[n] = '\0';
+ msg[n + 1] = '\0';
+ cp = msg;
+
+ while (*cp) {
+ if (std::regex_match(cp, std::regex("(add)(.*)(-partner)"))) {
+ ALOGI("partner added");
+ pthread_mutex_lock(&payload->usb->mPartnerLock);
+ payload->usb->mPartnerUp = true;
+ pthread_cond_signal(&payload->usb->mPartnerCV);
+ pthread_mutex_unlock(&payload->usb->mPartnerLock);
+ } else if (!strncmp(cp, "DEVTYPE=typec_", strlen("DEVTYPE=typec_")) ||
+ !strncmp(cp, "DRIVER=max77759tcpc",
+ strlen("DRIVER=max77759tcpc"))) {
+ std::vector<PortStatus> currentPortStatus;
+ queryVersionHelper(payload->usb, ¤tPortStatus);
+
+ // Role switch is not in progress and port is in disconnected state
+ if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) {
+ for (unsigned long i = 0; i < currentPortStatus.size(); i++) {
+ DIR *dp =
+ opendir(string("/sys/class/typec/" +
+ string(currentPortStatus[i].portName.c_str()) +
+ "-partner").c_str());
+ if (dp == NULL) {
+ switchToDrp(currentPortStatus[i].portName);
+ } else {
+ closedir(dp);
+ }
+ }
+ pthread_mutex_unlock(&payload->usb->mRoleSwitchLock);
+ }
+ break;
+ } else if (!strncmp(cp, kOverheatStatsDev, strlen(kOverheatStatsDev))) {
+ ALOGV("Overheat Cooling device suez update");
+ report_overheat_event(payload->usb);
+ }
+ /* advance to after the next \0 */
+ while (*cp++) {
+ }
+ }
+}
+
+void *work(void *param) {
+ int epoll_fd, uevent_fd;
+ struct epoll_event ev;
+ int nevents = 0;
+ struct data payload;
+
+ ALOGE("creating thread");
+
+ uevent_fd = uevent_open_socket(64 * 1024, true);
+
+ if (uevent_fd < 0) {
+ ALOGE("uevent_init: uevent_open_socket failed\n");
+ return NULL;
+ }
+
+ payload.uevent_fd = uevent_fd;
+ payload.usb = (::aidl::android::hardware::usb::Usb *)param;
+
+ fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
+
+ ev.events = EPOLLIN;
+ ev.data.ptr = (void *)uevent_event;
+
+ epoll_fd = epoll_create(64);
+ if (epoll_fd == -1) {
+ ALOGE("epoll_create failed; errno=%d", errno);
+ goto error;
+ }
+
+ if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) {
+ ALOGE("epoll_ctl failed; errno=%d", errno);
+ goto error;
+ }
+
+ while (!destroyThread) {
+ struct epoll_event events[64];
+
+ nevents = epoll_wait(epoll_fd, events, 64, -1);
+ if (nevents == -1) {
+ if (errno == EINTR)
+ continue;
+ ALOGE("usb epoll_wait failed; errno=%d", errno);
+ break;
+ }
+
+ for (int n = 0; n < nevents; ++n) {
+ if (events[n].data.ptr)
+ (*(void (*)(int, struct data *payload))events[n].data.ptr)(events[n].events,
+ &payload);
+ }
+ }
+
+ ALOGI("exiting worker thread");
+error:
+ close(uevent_fd);
+
+ if (epoll_fd >= 0)
+ close(epoll_fd);
+
+ return NULL;
+}
+
+void sighandler(int sig) {
+ if (sig == SIGUSR1) {
+ destroyThread = true;
+ ALOGI("destroy set");
+ return;
+ }
+ signal(SIGUSR1, sighandler);
+}
+
+ScopedAStatus Usb::setCallback(const shared_ptr<IUsbCallback>& in_callback) {
+ pthread_mutex_lock(&mLock);
+ if ((mCallback == NULL && in_callback == NULL) ||
+ (mCallback != NULL && in_callback != NULL)) {
+ mCallback = in_callback;
+ pthread_mutex_unlock(&mLock);
+ return ScopedAStatus::ok();
+ }
+
+ mCallback = in_callback;
+ ALOGI("registering callback");
+
+ if (mCallback == NULL) {
+ if (!pthread_kill(mPoll, SIGUSR1)) {
+ pthread_join(mPoll, NULL);
+ ALOGI("pthread destroyed");
+ }
+ pthread_mutex_unlock(&mLock);
+ return ScopedAStatus::ok();
+ }
+
+ destroyThread = false;
+ signal(SIGUSR1, sighandler);
+
+ /*
+ * Create a background thread if the old callback value is NULL
+ * and being updated with a new value.
+ */
+ if (pthread_create(&mPoll, NULL, work, this)) {
+ ALOGE("pthread creation failed %d", errno);
+ mCallback = NULL;
+ }
+
+ pthread_mutex_unlock(&mLock);
+ return ScopedAStatus::ok();
+}
+
+} // namespace usb
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h
new file mode 100644
index 0000000..51f9d43
--- /dev/null
+++ b/usb/usb/Usb.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+#pragma once
+
+#include <android-base/file.h>
+#include <aidl/android/hardware/usb/BnUsb.h>
+#include <aidl/android/hardware/usb/BnUsbCallback.h>
+#include <pixelusb/UsbOverheatEvent.h>
+#include <utils/Log.h>
+
+#define UEVENT_MSG_LEN 2048
+// The type-c stack waits for 4.5 - 5.5 secs before declaring a port non-pd.
+// The -partner directory would not be created until this is done.
+// Having a margin of ~3 secs for the directory and other related bookeeping
+// structures created and uvent fired.
+#define PORT_TYPE_TIMEOUT 8
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace usb {
+
+using ::aidl::android::hardware::usb::IUsbCallback;
+using ::aidl::android::hardware::usb::PortRole;
+using ::android::base::ReadFileToString;
+using ::android::base::WriteStringToFile;
+using ::android::hardware::google::pixel::usb::UsbOverheatEvent;
+using ::android::hardware::google::pixel::usb::ZoneInfo;
+using ::android::hardware::thermal::V2_0::TemperatureType;
+using ::android::hardware::thermal::V2_0::ThrottlingSeverity;
+using ::android::sp;
+using ::ndk::ScopedAStatus;
+using ::std::shared_ptr;
+using ::std::string;
+
+constexpr char kGadgetName[] = "11110000.dwc3";
+#define NEW_UDC_PATH "/sys/devices/platform/11110000.usb/"
+
+#define ID_PATH NEW_UDC_PATH "dwc3_exynos_otg_id"
+#define VBUS_PATH NEW_UDC_PATH "dwc3_exynos_otg_b_sess"
+#define USB_DATA_PATH NEW_UDC_PATH "usb_data_enabled"
+
+struct Usb : public BnUsb {
+ Usb();
+
+ ScopedAStatus enableContaminantPresenceDetection(const std::string& in_portName,
+ bool in_enable, int64_t in_transactionId) override;
+ ScopedAStatus queryPortStatus(int64_t in_transactionId) override;
+ ScopedAStatus setCallback(const shared_ptr<IUsbCallback>& in_callback) override;
+ ScopedAStatus switchRole(const string& in_portName, const PortRole& in_role,
+ int64_t in_transactionId) override;
+ ScopedAStatus enableUsbData(const string& in_portName, bool in_enable,
+ int64_t in_transactionId) override;
+
+ std::shared_ptr<::aidl::android::hardware::usb::IUsbCallback> mCallback;
+ // Protects mCallback variable
+ pthread_mutex_t mLock;
+ // Protects roleSwitch operation
+ pthread_mutex_t mRoleSwitchLock;
+ // Threads waiting for the partner to come back wait here
+ pthread_cond_t mPartnerCV;
+ // lock protecting mPartnerCV
+ pthread_mutex_t mPartnerLock;
+ // Variable to signal partner coming back online after type switch
+ bool mPartnerUp;
+
+ // Usb Overheat object for push suez event
+ UsbOverheatEvent mOverheat;
+ // Temperature when connected
+ float mPluggedTemperatureCelsius;
+ // Usb Data status
+ bool mUsbDataEnabled;
+
+ private:
+ pthread_t mPoll;
+};
+
+} // namespace usb
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/usb/usb/android.hardware.usb-service.rc b/usb/usb/android.hardware.usb-service.rc
new file mode 100644
index 0000000..c842877
--- /dev/null
+++ b/usb/usb/android.hardware.usb-service.rc
@@ -0,0 +1,21 @@
+service vendor.usb /vendor/bin/hw/android.hardware.usb-service.gs101
+ class hal
+ user system
+ group system shell wakelock
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+
+on post-fs
+ chown root system /sys/class/typec/port0/power_role
+ chown root system /sys/class/typec/port0/data_role
+ chown root system /sys/class/typec/port0/port_type
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chown root system /sys/devices/platform/11110000.usb/usb_data_enabled
+ chmod 664 /sys/class/typec/port0/power_role
+ chmod 664 /sys/class/typec/port0/data_role
+ chmod 664 /sys/class/typec/port0/port_type
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chmod 664 /sys/devices/platform/11110000.usb/usb_data_enabled
diff --git a/usb/android.hardware.usb@1.3-service.gs101.xml b/usb/usb/android.hardware.usb-service.xml
similarity index 68%
rename from usb/android.hardware.usb@1.3-service.gs101.xml
rename to usb/usb/android.hardware.usb-service.xml
index cd54268..6088194 100644
--- a/usb/android.hardware.usb@1.3-service.gs101.xml
+++ b/usb/usb/android.hardware.usb-service.xml
@@ -1,12 +1,10 @@
<manifest version="1.0" type="device">
- <hal format="hidl">
+ <hal format="aidl">
<name>android.hardware.usb</name>
- <transport>hwbinder</transport>
- <version>1.3</version>
+ <version>1</version>
<interface>
<name>IUsb</name>
<instance>default</instance>
</interface>
</hal>
</manifest>
-
diff --git a/usb/usb/service.cpp b/usb/usb/service.cpp
new file mode 100644
index 0000000..2c0a596
--- /dev/null
+++ b/usb/usb/service.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+#include <android-base/logging.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <utils/Log.h>
+
+#include "Usb.h"
+
+using ::aidl::android::hardware::usb::Usb;
+
+int main() {
+ ABinderProcess_setThreadPoolMaxThreadCount(0);
+ std::shared_ptr<Usb> usb = ndk::SharedRefBase::make<Usb>();
+
+ const std::string instance = std::string() + Usb::descriptor + "/default";
+ binder_status_t status = AServiceManager_addService(usb->asBinder().get(), instance.c_str());
+ CHECK(status == STATUS_OK);
+
+ ALOGV("AIDL USB HAL about to start");
+ ABinderProcess_joinThreadPool();
+ return -1; // Should never be reached
+}