Merge "Merge sc-v2-dev-plus-aosp-without-vendor@8433047" into stage-aosp-master am: 4bf5985951 am: a3cc2e0bbd
Original change: undetermined
Change-Id: I563b91d0b624a6cc8ceded879a17dc7cdb846e0b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk
index 5a0f14d..f0a226a 100644
--- a/BoardConfig-common.mk
+++ b/BoardConfig-common.mk
@@ -32,7 +32,9 @@
TARGET_CPU_VARIANT := cortex-a55
TARGET_CPU_VARIANT_RUNTIME := cortex-a55
-ifeq (,$(filter %_64,$(TARGET_PRODUCT)))
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifneq ($(DEVICE_IS_64BIT_ONLY),true)
TARGET_2ND_ARCH := arm
TARGET_2ND_ARCH_VARIANT := armv8-a
TARGET_2ND_CPU_ABI := armeabi-v7a
@@ -80,6 +82,7 @@
AB_OTA_PARTITIONS += \
system \
+ system_dlkm \
system_ext \
product \
vbmeta_system
@@ -130,7 +133,7 @@
#BOARD_USES_EXYNOS_DATASPACE_FEATURE := true
# Enable chain partition for system.
-BOARD_AVB_VBMETA_SYSTEM := system system_ext product
+BOARD_AVB_VBMETA_SYSTEM := system system_dlkm system_ext product
BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
@@ -158,6 +161,11 @@
BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_SYSTEM_EXT := system_ext
+# system_dlkm.img
+BOARD_USES_SYSTEM_DLKMIMAGE := true
+BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
+TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
+
########################
# Video Codec
########################
@@ -175,6 +183,7 @@
BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE := 8527020032
BOARD_GOOGLE_DYNAMIC_PARTITIONS_PARTITION_LIST := \
system \
+ system_dlkm \
system_ext \
product \
vendor \
@@ -311,22 +320,6 @@
# H/W align restriction of MM IPs
BOARD_EXYNOS_S10B_FORMAT_ALIGN := 64
-# WiFi
-BOARD_WLAN_DEVICE := bcmdhd
-BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
-BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd
-WPA_SUPPLICANT_VERSION := VER_0_8_X
-BOARD_WPA_SUPPLICANT_DRIVER := NL80211
-BOARD_HOSTAPD_DRIVER := NL80211
-# Wifi interface combination - {1 STA + 1 AP (bridged or single)} or {1 STA + 1 P2P}
-# or {1 STA + 1 NAN} or {2 STA}
-WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{P2P, NAN, AP}, 1}}, {{{STA}, 2}}
-WIFI_FEATURE_WIFI_EXT_HAL := true
-WIFI_FEATURE_IMU_DETECTION := true
-# Avoid Wifi reset on MAC Address change
-WIFI_AVOID_IFACE_RESET_MAC_CHANGE := true
-WIFI_FEATURE_HOSTAPD_11AX := true
-
# NeuralNetworks
GPU_SOURCE_PRESENT := $(wildcard vendor/arm/mali/valhall)
GPU_PREBUILD_PRESENT := $(wildcard vendor/google_devices/gs101/prebuilts/gpu/libs)
@@ -361,11 +354,11 @@
# Vendor ramdisk image for kernel development
BOARD_BUILD_VENDOR_RAMDISK_IMAGE := true
-BOARD_VENDOR_KERNEL_MODULES_BLOCKLIST_FILE := device/google/gs101/vendor_dlkm.blocklist
-
KERNEL_MODULE_DIR := $(TARGET_KERNEL_DIR)
KERNEL_MODULES := $(wildcard $(KERNEL_MODULE_DIR)/*.ko)
+BOARD_VENDOR_KERNEL_MODULES_BLOCKLIST_FILE := $(KERNEL_MODULE_DIR)/vendor_dlkm.modules.blocklist
+
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(strip $(shell cat $(KERNEL_MODULE_DIR)/vendor_boot.modules.load))
ifndef BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
$(error vendor_boot.modules.load not found or empty)
@@ -389,4 +382,7 @@
# Enable larger logbuf
BOARD_KERNEL_CMDLINE += log_buf_len=1024K
+# Protected VM firmware
+BOARD_PVMFWIMAGE_PARTITION_SIZE := 0x00100000
+
-include vendor/google_devices/gs101/proprietary/BoardConfigVendor.mk
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 12538be..8639586 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -83,3 +83,9 @@
$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/init/android.hardware.keymaster@4.0-service.trusty.rc)
$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.keymaster@4.0-service.trusty.xml)
$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/bin/hw/wait_for_strongbox)
+
+# Health HAL to AIDL
+$(call add-clean-step, find $(PRODUCT_OUT)/system -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/vendor -type f -name "*health@*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*health@*" -print0 | xargs -0 rm -f)
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..4d9cf6e
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,2 @@
+per-file powerhint.json = wvw@google.com,joaodias@google.com,jenhaochen@google.com,rkganesh@google.com,jychen@google.com
+per-file powerhint.json = wvw@google.com,joaodias@google.com,jenhaochen@google.com,rkganesh@google.com,jychen@google.com
diff --git a/aosp_common.mk b/aosp_common.mk
index 1ad6eb7..5ba9882 100644
--- a/aosp_common.mk
+++ b/aosp_common.mk
@@ -17,11 +17,14 @@
#
# All components inherited here go to system image
#
-ifeq (,$(filter %_64,$(TARGET_PRODUCT)))
-$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
-else
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+else
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
endif
+
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_system.mk)
# Enable CSI checking
diff --git a/bluetooth/bluetooth.mk b/bluetooth/bluetooth.mk
new file mode 100644
index 0000000..f203610
--- /dev/null
+++ b/bluetooth/bluetooth.mk
@@ -0,0 +1,4 @@
+PRODUCT_PACKAGES += \
+ android.hardware.bluetooth@1.1-service.bcmbtlinux
+
+BOARD_SEPOLICY_DIRS += device/google/gs101-sepolicy/bluetooth
diff --git a/conf/Android.bp b/conf/Android.bp
index 5e58678..45e6b6f 100644
--- a/conf/Android.bp
+++ b/conf/Android.bp
@@ -24,6 +24,12 @@
// identical with the exception of the encryption settings, so to keep them in
// sync the rules below generate them from a template file.
+soong_namespace {
+ imports: [
+ "device/google/gs101",
+ ],
+}
+
package {
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
@@ -33,6 +39,11 @@
default_applicable_licenses: ["device_google_gs101_license"],
}
+filegroup {
+ name: "gs101_srcs",
+ srcs: ["fstab.gs101.in"],
+}
+
genrule {
name: "gen_fstab.gs101",
srcs: ["fstab.gs101.in"],
diff --git a/conf/fstab.gs101.in b/conf/fstab.gs101.in
index 8b7a7e3..5ad10a3 100644
--- a/conf/fstab.gs101.in
+++ b/conf/fstab.gs101.in
@@ -5,6 +5,7 @@
#
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
+system_dlkm /system_dlkm ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
system_ext /system_ext ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
product /product ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_vendor,logical,first_stage_mount,readahead_size_kb=128
diff --git a/conf/init.gs101.rc b/conf/init.gs101.rc
index 19b16e5..d45b31a 100644
--- a/conf/init.gs101.rc
+++ b/conf/init.gs101.rc
@@ -3,17 +3,6 @@
import init.exynos.sensorhub.rc
import /vendor/etc/init/hw/init.aoc.rc
-service vendor.charger /system/bin/charger
- class charger
- seclabel u:r:charger:s0
- user system
- group system wakelock input
- capabilities SYS_BOOT
- file /dev/kmsg w
- file /sys/fs/pstore/console-ramoops-0 r
- file /sys/fs/pstore/console-ramoops r
- file /proc/last_kmsg r
-
on early-init
mount_all /vendor/etc/fstab.persist --early
@@ -29,29 +18,75 @@
write /dev/sys/fs/by-name/userdata/data_io_flag 56
write /dev/sys/fs/by-name/userdata/node_io_flag 56
- chown system system /sys/kernel/vendor_sched/set_task_group_bg
- chown system system /sys/kernel/vendor_sched/set_task_group_cam
- chown system system /sys/kernel/vendor_sched/set_task_group_fg
- chown system system /sys/kernel/vendor_sched/set_task_group_nnapi
- chown system system /sys/kernel/vendor_sched/set_task_group_sys
- chown system system /sys/kernel/vendor_sched/set_task_group_sysbg
- chown system system /sys/kernel/vendor_sched/set_task_group_ta
- chown system system /sys/kernel/vendor_sched/set_task_group_rt
- chown system system /sys/kernel/vendor_sched/set_task_group_sf
- chown system system /sys/kernel/vendor_sched/set_task_group_dex2oat
- chown system system /sys/kernel/vendor_sched/clear_group
+ chown system system /proc/vendor_sched/set_task_group_bg
+ chown system system /proc/vendor_sched/set_task_group_cam
+ chown system system /proc/vendor_sched/set_task_group_fg
+ chown system system /proc/vendor_sched/set_task_group_nnapi
+ chown system system /proc/vendor_sched/set_task_group_sys
+ chown system system /proc/vendor_sched/set_task_group_sysbg
+ chown system system /proc/vendor_sched/set_task_group_ta
+ chown system system /proc/vendor_sched/set_task_group_rt
+ chown system system /proc/vendor_sched/set_task_group_sf
+ chown system system /proc/vendor_sched/set_task_group_dex2oat
+ chown system system /proc/vendor_sched/set_task_group_cam_power
+ chown system system /proc/vendor_sched/set_task_group_ota
+ chown system system /proc/vendor_sched/set_proc_group_bg
+ chown system system /proc/vendor_sched/set_proc_group_cam
+ chown system system /proc/vendor_sched/set_proc_group_fg
+ chown system system /proc/vendor_sched/set_proc_group_nnapi
+ chown system system /proc/vendor_sched/set_proc_group_sys
+ chown system system /proc/vendor_sched/set_proc_group_sysbg
+ chown system system /proc/vendor_sched/set_proc_group_ta
+ chown system system /proc/vendor_sched/set_proc_group_rt
+ chown system system /proc/vendor_sched/set_proc_group_sf
+ chown system system /proc/vendor_sched/set_proc_group_dex2oat
+ chown system system /proc/vendor_sched/set_proc_group_cam_power
+ chown system system /proc/vendor_sched/set_proc_group_ota
+ chown system system /proc/vendor_sched/prefer_idle_set
+ chown system system /proc/vendor_sched/prefer_idle_clear
+ chown system system /proc/vendor_sched/pmu_poll_enable
+ chown system system /proc/vendor_sched/pmu_poll_time
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/lcpi_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/spc_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/limit_frequency
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/pmu_limit_enable
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/lcpi_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/spc_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/limit_frequency
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/pmu_limit_enable
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/lcpi_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/spc_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/limit_frequency
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/pmu_limit_enable
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_bg
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_cam
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_fg
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_nnapi
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_sys
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_sysbg
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_ta
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_rt
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_sf
- chmod 0220 /sys/kernel/vendor_sched/set_task_group_dex2oat
- chmod 0220 /sys/kernel/vendor_sched/clear_group
+ chmod 0220 /proc/vendor_sched/set_task_group_bg
+ chmod 0220 /proc/vendor_sched/set_task_group_cam
+ chmod 0220 /proc/vendor_sched/set_task_group_fg
+ chmod 0220 /proc/vendor_sched/set_task_group_nnapi
+ chmod 0220 /proc/vendor_sched/set_task_group_sys
+ chmod 0220 /proc/vendor_sched/set_task_group_sysbg
+ chmod 0220 /proc/vendor_sched/set_task_group_ta
+ chmod 0220 /proc/vendor_sched/set_task_group_rt
+ chmod 0220 /proc/vendor_sched/set_task_group_sf
+ chmod 0220 /proc/vendor_sched/set_task_group_dex2oat
+ chmod 0220 /proc/vendor_sched/set_task_group_cam_power
+ chmod 0220 /proc/vendor_sched/set_task_group_ota
+ chmod 0220 /proc/vendor_sched/set_proc_group_bg
+ chmod 0220 /proc/vendor_sched/set_proc_group_cam
+ chmod 0220 /proc/vendor_sched/set_proc_group_fg
+ chmod 0220 /proc/vendor_sched/set_proc_group_nnapi
+ chmod 0220 /proc/vendor_sched/set_proc_group_sys
+ chmod 0220 /proc/vendor_sched/set_proc_group_sysbg
+ chmod 0220 /proc/vendor_sched/set_proc_group_ta
+ chmod 0220 /proc/vendor_sched/set_proc_group_rt
+ chmod 0220 /proc/vendor_sched/set_proc_group_sf
+ chmod 0220 /proc/vendor_sched/set_proc_group_dex2oat
+ chmod 0220 /proc/vendor_sched/set_proc_group_cam_power
+ chmod 0220 /proc/vendor_sched/set_proc_group_ota
+ chmod 0220 /proc/vendor_sched/prefer_idle_set
+ chmod 0220 /proc/vendor_sched/prefer_idle_clear
+ chmod 0220 /proc/vendor_sched/pmu_poll_enable
+ chmod 0220 /proc/vendor_sched/pmu_poll_time
wait /dev/block/platform/${ro.boot.boot_devices}
symlink /dev/block/platform/${ro.boot.boot_devices} /dev/block/bootdevice
@@ -68,10 +103,6 @@
write /sys/block/zram0/comp_algorithm lz77eh
write /proc/sys/vm/page-cluster 0
- # Page Pinner dumping at bugreport
- chown system system /sys/kernel/debug/page_pinner/longterm_pinner
- chown system system /sys/kernel/debug/page_pinner/alloc_contig_failed
-
# Some user code relies on ro.boot.hardware.revision
setprop ro.boot.hardware.revision ${ro.revision}
@@ -117,12 +148,12 @@
mkdir /dev/socket/pdx/system/vr/sensors 0775 system system
# Boot time 183626384
- write /sys/kernel/vendor_sched/ta_uclamp_min 1024
- write /sys/kernel/vendor_sched/ta_prefer_idle 1
- write /sys/kernel/vendor_sched/fg_uclamp_min 1024
- write /sys/kernel/vendor_sched/fg_prefer_idle 1
- write /sys/kernel/vendor_sched/sys_uclamp_min 1024
- write /sys/kernel/vendor_sched/sys_prefer_idle 1
+ write /proc/vendor_sched/ta_uclamp_min 1024
+ write /proc/vendor_sched/ta_prefer_idle 1
+ write /proc/vendor_sched/fg_uclamp_min 1024
+ write /proc/vendor_sched/fg_prefer_idle 1
+ write /proc/vendor_sched/sys_uclamp_min 1024
+ write /proc/vendor_sched/sys_prefer_idle 1
# governor setting
write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor sched_pixel
@@ -163,8 +194,8 @@
chown system system /dev/cpuset/camera-daemon-mid-high-group/tasks
chmod 0664 /dev/cpuset/camera-daemon-mid-high-group/tasks
- write /sys/kernel/vendor_sched/cam_prefer_idle 1
- write /sys/kernel/vendor_sched/cam_uclamp_min 1
+ write /proc/vendor_sched/cam_prefer_idle 1
+ write /proc/vendor_sched/cam_uclamp_min 1
chown system system /dev/cpuset/cgroup.procs
@@ -197,6 +228,9 @@
chown system system /sys/class/power_supply/maxfg_base/m5_model_state
# Dump eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-8/8-0050/eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom
chown system system /sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom
chown system system /sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom
chown system system /dev/battery_history
@@ -267,8 +301,8 @@
start watchdogd
# Add a boost for NNAPI HAL
- write /sys/kernel/vendor_sched/nnapi_prefer_idle 0
- write /sys/kernel/vendor_sched/nnapi_uclamp_min 512
+ write /proc/vendor_sched/nnapi_prefer_idle 0
+ write /proc/vendor_sched/nnapi_uclamp_min 512
# Add memlat governor settings
write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu0_memlat@17000010/polling_interval 10
@@ -393,7 +427,7 @@
on zygote-start
# For PixelLogger configuration file.
chmod 0771 /data/vendor/wifi
- write /sys/kernel/vendor_sched/sys_uclamp_min 0
+ write /proc/vendor_sched/sys_uclamp_min 0
on post-fs-data
# Create the directories used by the Wireless subsystem
@@ -545,32 +579,33 @@
chown system system /sys/devices/platform/exynos-drm/primary-panel/gamma
chown system system /sys/devices/platform/exynos-drm/primary-panel/min_vrefresh
chown system system /sys/devices/platform/exynos-drm/primary-panel/idle_delay_ms
+ chown system system /sys/devices/platform/exynos-drm/primary-panel/panel_need_handle_idle_exit
chown system system /sys/module/drm/parameters/vblankoffdelay
- chown system system /sys/class/dqe/atc/ambient_light
- chown system system /sys/class/dqe/atc/st
- chown system system /sys/class/dqe/atc/en
- chown system system /sys/class/dqe/atc/lt
- chown system system /sys/class/dqe/atc/ns
- chown system system /sys/class/dqe/atc/dither
- chown system system /sys/class/dqe/atc/pl_w1
- chown system system /sys/class/dqe/atc/pl_w2
- chown system system /sys/class/dqe/atc/ctmode
- chown system system /sys/class/dqe/atc/pp_en
- chown system system /sys/class/dqe/atc/upgrade_on
- chown system system /sys/class/dqe/atc/tdr_max
- chown system system /sys/class/dqe/atc/tdr_min
- chown system system /sys/class/dqe/atc/back_light
- chown system system /sys/class/dqe/atc/dstep
- chown system system /sys/class/dqe/atc/scale_mode
- chown system system /sys/class/dqe/atc/threshold_1
- chown system system /sys/class/dqe/atc/threshold_2
- chown system system /sys/class/dqe/atc/threshold_3
- chown system system /sys/class/dqe/atc/gain_limit
- chown system system /sys/class/dqe/atc/lt_calc_ab_shift
+ chown system system /sys/class/dqe0/atc/ambient_light
+ chown system system /sys/class/dqe0/atc/st
+ chown system system /sys/class/dqe0/atc/en
+ chown system system /sys/class/dqe0/atc/lt
+ chown system system /sys/class/dqe0/atc/ns
+ chown system system /sys/class/dqe0/atc/dither
+ chown system system /sys/class/dqe0/atc/pl_w1
+ chown system system /sys/class/dqe0/atc/pl_w2
+ chown system system /sys/class/dqe0/atc/ctmode
+ chown system system /sys/class/dqe0/atc/pp_en
+ chown system system /sys/class/dqe0/atc/upgrade_on
+ chown system system /sys/class/dqe0/atc/tdr_max
+ chown system system /sys/class/dqe0/atc/tdr_min
+ chown system system /sys/class/dqe0/atc/back_light
+ chown system system /sys/class/dqe0/atc/dstep
+ chown system system /sys/class/dqe0/atc/scale_mode
+ chown system system /sys/class/dqe0/atc/threshold_1
+ chown system system /sys/class/dqe0/atc/threshold_2
+ chown system system /sys/class/dqe0/atc/threshold_3
+ chown system system /sys/class/dqe0/atc/gain_limit
+ chown system system /sys/class/dqe0/atc/lt_calc_ab_shift
chown system system /sys/devices/platform/1c300000.drmdecon/early_wakeup
- chmod 0220 /sys/devices/platform/1c300000.drmdecon/early_wakeup
+ chmod 0660 /sys/devices/platform/1c300000.drmdecon/early_wakeup
chown system system /sys/devices/platform/1c302000.drmdecon/early_wakeup
- chmod 0220 /sys/devices/platform/1c302000.drmdecon/early_wakeup
+ chmod 0660 /sys/devices/platform/1c302000.drmdecon/early_wakeup
# Copy DRM Key
# copy /system/app/wv.keys /factory/wv.keys
@@ -596,11 +631,7 @@
-O/data/vendor/wifi/wpa/sockets -puse_p2p_group_interface=1p2p_device=1 \
-m/vendor/etc/wifi/p2p_supplicant.conf \
-g@android:wpa_wlan0 -dd
- interface android.hardware.wifi.supplicant@1.0::ISupplicant default
- interface android.hardware.wifi.supplicant@1.1::ISupplicant default
- interface android.hardware.wifi.supplicant@1.2::ISupplicant default
- interface android.hardware.wifi.supplicant@1.3::ISupplicant default
- interface android.hardware.wifi.supplicant@1.4::ISupplicant default
+ interface aidl android.hardware.wifi.supplicant.ISupplicant/default
socket wpa_wlan0 dgram 660 wifi wifi
class main
disabled
@@ -652,6 +683,8 @@
chown system system /sys/devices/virtual/sec/tsp/cmd
chown system system /sys/devices/virtual/sec/tsp/cmd_result
chown system system /sys/devices/virtual/sec/tsp/status
+ chown system system /sys/class/spi_master/spi11/spi11.0/input/nvt_touch/force_touch_active
+ chown system system /sys/class/spi_master/spi11/spi11.0/input/nvt_touch/nvt_dttw_mode
# Allow access to touch
chown system input /dev/touch_offload
chmod 660 /dev/touch_offload
@@ -692,10 +725,6 @@
chown system system /dev/sys/fs/by-name/userdata/gc_segment_mode
chown system system /dev/sys/fs/by-name/userdata/gc_reclaimed_segments
- # Block layer tuning: discard chunk size up to 128MB
- # Otherwise, contiguous discards can be merged
- write /sys/block/sda/queue/discard_max_bytes 134217728
-
# Enable ZRAM on boot_complete
swapon_all /vendor/etc/fstab.${ro.board.platform}
write /proc/sys/vm/swappiness 100
@@ -717,26 +746,47 @@
setprop vendor.powerhal.init 1
# Setup final cpu.uclamp
- write /sys/kernel/vendor_sched/ta_uclamp_min 1
- write /sys/kernel/vendor_sched/fg_uclamp_min 0
- write /sys/kernel/vendor_sched/sys_prefer_idle 0
+ write /proc/vendor_sched/uclamp_threshold 8
+ write /proc/vendor_sched/ta_uclamp_min 1
+ write /proc/vendor_sched/fg_uclamp_min 0
+ write /proc/vendor_sched/sys_prefer_idle 0
# cfs_rq clamp is using tg->uclamp setting
# align it with the vendor_group setting
- write /sys/kernel/vendor_sched/bg_uclamp_max 512
+ write /proc/vendor_sched/bg_uclamp_max 512
write /dev/cpuctl/background/cpu.uclamp.max 50
- write /sys/kernel/vendor_sched/bg_group_throttle 512
- write /sys/kernel/vendor_sched/sysbg_uclamp_max 512
+ write /proc/vendor_sched/bg_group_throttle 512
+ write /proc/vendor_sched/sysbg_uclamp_max 512
write /dev/cpuctl/system-background/cpu.uclamp.max 50
- write /sys/kernel/vendor_sched/sysbg_group_throttle 512
- write /sys/kernel/vendor_sched/dex2oat_uclamp_max 615
+ write /proc/vendor_sched/sysbg_group_throttle 512
+ write /proc/vendor_sched/dex2oat_uclamp_max 615
write /dev/cpuctl/dex2oat/cpu.uclamp.max 60
- write /sys/kernel/vendor_sched/dex2oat_group_throttle 615
+ write /proc/vendor_sched/dex2oat_group_throttle 615
+ write /proc/vendor_sched/ota_uclamp_max 410
+ write /proc/vendor_sched/ota_group_throttle 410
+
+ # Set PMU freq limit parameters
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/lcpi_threshold 2
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/spc_threshold 59
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/limit_frequency 1401000
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/lcpi_threshold 6
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/spc_threshold 64
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/limit_frequency 1826000
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/lcpi_threshold 5
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/spc_threshold 69
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/limit_frequency 2507000
+ write /proc/vendor_sched/pmu_poll_time 10
+
+ # Disable PMU freq limit
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/pmu_limit_enable 1
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/pmu_limit_enable 1
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/pmu_limit_enable 1
+ write /proc/vendor_sched/pmu_poll_enable 0
# Setup groups for SF (RT used for SF RE, SF used for SF main)
- write /sys/kernel/vendor_sched/rt_uclamp_min 125
- write /sys/kernel/vendor_sched/rt_prefer_idle 1
- write /sys/kernel/vendor_sched/sf_uclamp_min 30
- write /sys/kernel/vendor_sched/sf_prefer_idle 1
+ write /proc/vendor_sched/rt_uclamp_min 125
+ write /proc/vendor_sched/rt_prefer_idle 1
+ write /proc/vendor_sched/sf_uclamp_min 30
+ write /proc/vendor_sched/sf_prefer_idle 1
# Setup cpu.shares to throttle background groups (bg ~ 5% sysbg ~ 5% dex2oat ~2.5%)
write /dev/cpuctl/background/cpu.shares 1024
@@ -757,11 +807,8 @@
chown root system /sys/devices/platform/19000000.aoc/reset
chmod 0220 /sys/devices/platform/19000000.aoc/reset
-# charger driver exposes now finer grain control, map demo mode to those properties
-# NOTE: demo mode can only be exit wiping data (which reset the persist properties)
-on property:sys.retaildemo.enabled=1
- setprop persist.vendor.charge.stop.level 35
- setprop persist.vendor.charge.start.level 30
+ # write serialno to battery path for pairing
+ write /sys/class/power_supply/battery/dev_sn ${ro.boot.serialno}
# Test Harness Mode default battery profile.
on property:persist.sys.test_harness=1 && property:persist.vendor.testing_battery_profile=0
@@ -843,6 +890,9 @@
# ODPM
on fs
+ chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-0/i2c-s2mpg10mfd/s2mpg10-meter/s2mpg10-odpm/iio:device1/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-1/i2c-s2mpg11mfd/s2mpg11-meter/s2mpg11-odpm/iio:device0/enabled_rails
+
chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-6/i2c-s2mpg10mfd/s2mpg10-meter/s2mpg10-odpm/iio:device0/enabled_rails
chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-7/i2c-s2mpg11mfd/s2mpg11-meter/s2mpg11-odpm/iio:device1/enabled_rails
@@ -931,8 +981,8 @@
mkdir /dev/thermal/tz-by-name 0750 system system
mkdir /dev/thermal/cdev-by-name 0750 system system
start vendor.thermal.symlinks
- write /sys/kernel/vendor_sched/sys_uclamp_min 0
- write /sys/kernel/vendor_sched/sys_prefer_idle 0
+ write /proc/vendor_sched/sys_uclamp_min 0
+ write /proc/vendor_sched/sys_prefer_idle 0
# Launch thermal hal in off charging mode
on charger && property:vendor.thermal.link_ready=1
diff --git a/conf/nomodem/Android.bp b/conf/nomodem/Android.bp
new file mode 100644
index 0000000..1b1ae24
--- /dev/null
+++ b/conf/nomodem/Android.bp
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+// By default this device uses hardware-wrapped keys for storage encryption,
+// which is intended to offer increased security over the traditional method
+// (software keys). However, hardware-wrapped keys aren't compatible with
+// FIPS-140 certification of the encryption hardware, and hence we have to
+// disable the use of them in FIPS mode. This requires having two fstab files:
+// one for the default mode, and one for FIPS mode selectable via
+// androidboot.fstab_suffix on the kernel command line. These fstabs should be
+// identical with the exception of the encryption settings, so to keep them in
+// sync the rules below generate them from a template file.
+
+soong_namespace {
+ imports: [
+ "device/google/gs101",
+ "device/google/gs101/conf",
+ ],
+}
+
+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"],
+}
+
+genrule {
+ name: "gen_fstab.gs101",
+ srcs: [
+ "fstab.gs101.in*",
+ ":gs101_srcs",
+ ],
+ out: ["fstab.gs101"],
+ cmd: "sed -e s/@fileencryption@/::inlinecrypt_optimized+wrappedkey_v0/" +
+ " -e s/@metadata_encryption@/:wrappedkey_v0/" +
+ " -e /modem/d " +
+ " -e /efs/d $(in) > $(out)",
+}
+
+genrule {
+ name: "gen_fstab.gs101-fips",
+ srcs: [
+ "fstab.gs101.in*",
+ ":gs101_srcs",
+ ],
+ out: ["fstab.gs101-fips"],
+ cmd: "sed -e s/@fileencryption@/aes-256-xts/" +
+ " -e s/@metadata_encryption@/aes-256-xts/" +
+ " -e /modem/d " +
+ " -e /efs/d $(in) > $(out)",
+}
+
+prebuilt_etc {
+ name: "fstab.gs101",
+ src: ":gen_fstab.gs101",
+ vendor: true,
+ vendor_ramdisk_available: true,
+}
+
+prebuilt_etc {
+ name: "fstab.gs101-fips",
+ src: ":gen_fstab.gs101-fips",
+ vendor: true,
+ vendor_ramdisk_available: true,
+}
\ No newline at end of file
diff --git a/default-permissions.xml b/default-permissions.xml
index 12b4037..cf2e7b7 100644
--- a/default-permissions.xml
+++ b/default-permissions.xml
@@ -47,6 +47,8 @@
<!-- Location -->
<permission name="android.permission.ACCESS_FINE_LOCATION" fixed="false"/>
<permission name="android.permission.ACCESS_BACKGROUND_LOCATION" fixed="false"/>
+ <!-- Battery Widget -->
+ <permission name="android.permission.BLUETOOTH_CONNECT" fixed="false"/>
</exception>
<exception package="com.google.android.apps.camera.services">
@@ -79,6 +81,8 @@
<permission name="android.permission.WRITE_CALL_LOG" fixed="false"/>
<!-- Used to set up a Wi-Fi P2P network -->
<permission name="android.permission.ACCESS_FINE_LOCATION" fixed="false"/>
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
</exception>
<exception
@@ -117,6 +121,15 @@
<!-- Microphone: To hear user's voice commands -->
<permission name="android.permission.RECORD_AUDIO" fixed="false"/>
</exception>
-
+ <exception
+ package="com.google.android.deskclock">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+ <exception
+ package="com.google.android.apps.tips">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
</exceptions>
diff --git a/device-common.mk b/device-common.mk
index 250de1c..cdafd12 100644
--- a/device-common.mk
+++ b/device-common.mk
@@ -14,6 +14,7 @@
# limitations under the License.
#
+-include vendor/google_devices/gs101/proprietary/telephony/device-vendor.mk
include device/google/gs101/device.mk
# Telephony
diff --git a/device.mk b/device.mk
index bd9ce56..80603e8 100644
--- a/device.mk
+++ b/device.mk
@@ -14,9 +14,12 @@
# limitations under the License.
#
-TARGET_BOARD_PLATFORM := gs101
+include device/google/gs-common/device.mk
-ifneq (,$(filter %_64,$(TARGET_PRODUCT)))
+TARGET_BOARD_PLATFORM := gs101
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
LOCAL_64ONLY := _64
endif
@@ -32,6 +35,14 @@
# Set boot SPL
BOOT_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)
+# TODO(b/207450311): Remove this flag once implemented
+USE_PIXEL_GRALLOC := false
+ifeq ($(USE_PIXEL_GRALLOC),true)
+ PRODUCT_SOONG_NAMESPACES += hardware/google/gchips/GrallocHAL
+else
+ PRODUCT_SOONG_NAMESPACES += hardware/google/gchips/gralloc4
+endif
+
PRODUCT_SOONG_NAMESPACES += \
hardware/google/av \
hardware/google/gchips \
@@ -40,6 +51,7 @@
hardware/google/interfaces \
hardware/google/pixel \
device/google/gs101 \
+ device/google/gs101/powerstats \
vendor/google/whitechapel/tools \
vendor/broadcom/bluetooth \
vendor/google/camera \
@@ -54,6 +66,10 @@
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
ro.oem_unlock_supported=1
+# Include vendor telephony soong namespace
+PRODUCT_SOONG_NAMESPACES += \
+ vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)
+
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
#Set IKE logs to verbose for WFC
PRODUCT_PROPERTY_OVERRIDES += log.tag.IKE=VERBOSE
@@ -87,7 +103,6 @@
# From system.property
PRODUCT_PROPERTY_OVERRIDES += \
- dev.usbsetting.embedded=on \
ro.telephony.default_network=27 \
persist.vendor.ril.use.iccid_to_plmn=1 \
persist.vendor.ril.emergencynumber.mode=5
@@ -165,18 +180,21 @@
TARGET_USES_VULKAN = true
PRODUCT_SOONG_NAMESPACES += \
- vendor/arm/mali/valhall \
- vendor/arm/mali/valhall/cl \
- vendor/arm/mali/valhall/libmali \
- vendor/arm/mali/valhall/cinstr/production/gpu-hwc-reader
+ vendor/arm/mali/valhall
+
+$(call soong_config_set,pixel_mali,soc,$(TARGET_BOARD_PLATFORM))
include device/google/gs101/neuralnetwork/neuralnetwork.mk
PRODUCT_PACKAGES += \
libGLES_mali \
- vulkan.gs101 \
+ vulkan.mali \
libOpenCL \
libgpudataproducer
+
+PRODUCT_VENDOR_PROPERTIES += \
+ ro.hardware.vulkan=mali
+
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
debug.mali.disable_backend_affinity=true
@@ -192,8 +210,8 @@
frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \
frameworks/native/data/etc/android.hardware.vulkan.level-1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \
frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \
- frameworks/native/data/etc/android.software.vulkan.deqp.level-2021-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.vulkan.deqp.level.xml \
- frameworks/native/data/etc/android.software.opengles.deqp.level-2021-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml
+ frameworks/native/data/etc/android.software.vulkan.deqp.level-2022-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.vulkan.deqp.level.xml \
+ frameworks/native/data/etc/android.software.opengles.deqp.level-2022-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml
ifeq ($(USE_SWIFTSHADER),true)
PRODUCT_VENDOR_PROPERTIES += \
@@ -266,6 +284,12 @@
PRODUCT_COPY_FILES += \
device/google/gs101/conf/init.recovery.device.rc:$(TARGET_COPY_OUT_RECOVERY)/root/init.recovery.gs101.rc
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+PRODUCT_SOONG_NAMESPACES += device/google/gs101/conf
+else
+PRODUCT_SOONG_NAMESPACES += device/google/gs101/conf/nomodem
+endif
+
# Fstab files
PRODUCT_PACKAGES += \
fstab.gs101 \
@@ -294,7 +318,7 @@
# Contexthub HAL
PRODUCT_PACKAGES += \
- android.hardware.contexthub@1.2-service.generic
+ android.hardware.contexthub-service.generic
# CHRE tools
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
@@ -365,6 +389,15 @@
frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml
# Sensors
+ifneq (,$(findstring tangor, $(TARGET_PRODUCT)))
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
+ frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \
+ frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \
+ frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml\
+ frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
+ frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml
+else
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \
@@ -375,19 +408,16 @@
frameworks/native/data/etc/android.hardware.sensor.proximity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.proximity.xml \
frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml
+endif
# Add sensor HAL 2.1 product packages
PRODUCT_PACKAGES += android.hardware.sensors@2.1-service.multihal
-# Debug property for sensor.
-ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
-PRODUCT_PROPERTY_OVERRIDES += \
- vendor.debug.sensor.hal.event_logger=true
-endif
-
# 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 += \
@@ -474,7 +504,8 @@
PRODUCT_PACKAGES += \
android.hardware.graphics.mapper@4.0-impl \
android.hardware.graphics.allocator@4.0-service \
- android.hardware.graphics.allocator@4.0-impl
+ android.hardware.graphics.allocator@4.0-impl \
+ android.hardware.graphics.allocator-V1-service
PRODUCT_PACKAGES += \
android.hardware.memtrack-service.pixel \
@@ -490,8 +521,8 @@
# WideVine modules
PRODUCT_PACKAGES += \
- android.hardware.drm@1.4-service.clearkey \
- android.hardware.drm@1.4-service.widevine \
+ android.hardware.drm-service.clearkey \
+ android.hardware.drm-service.widevine \
liboemcrypto \
@@ -548,7 +579,7 @@
# Enable project quotas and casefolding for emulated storage without sdcardfs
$(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk)
-$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression_with_xor.mk)
# Enforce generic ramdisk allow list
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
@@ -573,8 +604,16 @@
frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \
frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml
+# (See b/211840489)
+ifneq ($(DISABLE_CAMERA_FS_AF),true)
PRODUCT_COPY_FILES += \
- frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \
+ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml
+else
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.camera.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.xml
+endif
+
+PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \
frameworks/native/data/etc/android.hardware.camera.concurrent.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \
frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml\
@@ -762,7 +801,9 @@
endif
# GPS HAL
+ifeq (,$(filter tangor citron,$(subst _, ,$(TARGET_PRODUCT))))
include device/google/gs101/gnss/device-gnss.mk
+endif
# Trusty (KM, GK, Storage)
$(call inherit-product, system/core/trusty/trusty-storage.mk)
@@ -783,10 +824,7 @@
PRODUCT_PROPERTY_OVERRIDES += \
ro.frp.pst=/dev/block/by-name/frp
-# Bluetooth HAL
-PRODUCT_PACKAGES += \
- android.hardware.bluetooth@1.1-service.bcmbtlinux \
- bt_vendor.conf
+# Bluetooth
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml
@@ -816,6 +854,10 @@
PRODUCT_PRODUCT_PROPERTIES += \
persist.sys.fuse.passthrough.enable=true
+# Use FUSE BPF
+PRODUCT_PRODUCT_PROPERTIES += \
+ ro.fuse.bpf.enabled=false
+
# Use /product/etc/fstab.postinstall to mount system_other
PRODUCT_PRODUCT_PROPERTIES += \
ro.postinstall.fstab.prefix=/product
@@ -851,12 +893,11 @@
vts.bin
# This will be called only if IMSService is building with source code for dev branches.
-$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/shannon-ims/device-vendor.mk)
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/shannon-ims/device-vendor.mk)
PRODUCT_PACKAGES += ShannonIms
-$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/shannon-iwlan/device-vendor.mk)
-include device/google/gs101/telephony/pktrouter.mk
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/shannon-iwlan/device-vendor.mk)
#RCS Test Messaging App
PRODUCT_PACKAGES_DEBUG += \
@@ -882,13 +923,13 @@
#$(call inherit-product, vendor/google_devices/gs101/proprietary/device-vendor.mk)
ifneq ($(BOARD_WITHOUT_RADIO),true)
-$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/common/device-vendor.mk)
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/common/device-vendor.mk)
endif
-ifeq (,$(filter %_64,$(TARGET_PRODUCT)))
-$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
-else
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+else
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
endif
#$(call inherit-product, hardware/google_devices/exynos5/exynos5.mk)
#$(call inherit-product-if-exists, hardware/google_devices/gs101/gs101.mk)
@@ -900,8 +941,7 @@
PRODUCT_COPY_FILES += \
device/google/gs101/default-permissions.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/default-permissions/default-permissions.xml \
- device/google/gs101/component-overrides.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sysconfig/component-overrides.xml \
- frameworks/native/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml \
+ device/google/gs101/component-overrides.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sysconfig/component-overrides.xml
# modem_svc_sit daemon
PRODUCT_PACKAGES += modem_svc_sit
@@ -909,6 +949,27 @@
# modem logging binary/configs
PRODUCT_PACKAGES += modem_logging_control
+# modem logging configs
+PRODUCT_COPY_FILES += \
+ device/google/gs101/radio/config/logging.conf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/logging.conf \
+ device/google/gs101/radio/config/default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default.cfg \
+ device/google/gs101/radio/config/default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default.nprf \
+ device/google/gs101/radio/config/default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_metrics.xml \
+ device/google/gs101/radio/config/teamfood_default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default.cfg \
+ device/google/gs101/radio/config/teamfood_default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default.nprf \
+ device/google/gs101/radio/config/teamfood_default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default_metrics.xml \
+ device/google/gs101/radio/config/default_stability.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_stability.cfg \
+ device/google/gs101/radio/config/default_stability.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_stability.nprf \
+ device/google/gs101/radio/config/default_NAS_RRC.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_NAS_RRC.cfg \
+ device/google/gs101/radio/config/default_NAS_RRC.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_NAS_RRC.nprf \
+ device/google/gs101/radio/config/default_network.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_network.cfg \
+ device/google/gs101/radio/config/default_network.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_network.nprf \
+ device/google/gs101/radio/config/Pixel_Default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default.cfg \
+ device/google/gs101/radio/config/Pixel_Default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default.nprf \
+ device/google/gs101/radio/config/Pixel_Default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default_metrics.xml \
+ device/google/gs101/radio/config/Pixel_stability.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_stability.cfg \
+ device/google/gs101/radio/config/Pixel_stability.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_stability.nprf
+
PRODUCT_COPY_FILES += \
device/google/gs101/radio/gnss_blanking.csv:$(TARGET_COPY_OUT_VENDOR)/etc/modem/gnss_blanking.csv
@@ -923,18 +984,18 @@
$(NULL)
PRODUCT_PACKAGES += \
- android.hardware.health@2.1-impl-gs101 \
- android.hardware.health@2.1-service
+ android.hardware.health-service.gs101 \
+ android.hardware.health-service.gs101_recovery \
# Audio
# Audio HAL Server & Default Implementations
PRODUCT_PACKAGES += \
android.hardware.audio.service \
- android.hardware.audio@7.0-impl \
+ android.hardware.audio@7.1-impl \
android.hardware.audio.effect@7.0-impl \
- android.hardware.bluetooth.audio@2.1-impl \
+ android.hardware.bluetooth.audio-impl \
android.hardware.soundtrigger@2.3-impl \
- vendor.google.whitechapel.audio.audioext@2.0-impl
+ vendor.google.whitechapel.audio.audioext@3.0-impl
#Audio HAL libraries
PRODUCT_PACKAGES += \
@@ -954,7 +1015,6 @@
audio_spk_35l41 \
audio.usb.default \
audio.usbv2.default \
- audio.a2dp.default \
audio.bluetooth.default \
audio.r_submix.default \
libamcsextfile \
@@ -985,6 +1045,14 @@
$(call soong_config_set,aoc_audio_board,platform,$(TARGET_BOARD_PLATFORM))
+## AoC soong
+PRODUCT_SOONG_NAMESPACES += \
+ vendor/google/whitechapel/aoc
+
+$(call soong_config_set,aoc,target_soc,$(TARGET_BOARD_PLATFORM))
+
+$(call soong_config_set,android_hardware_audio,run_64bit,true)
+
# Audio properties
PRODUCT_PROPERTY_OVERRIDES += \
ro.config.vc_call_vol_steps=7 \
@@ -1055,8 +1123,13 @@
vendor.samsung_slsi.hardware.tetheroffload@1.1-service
# pKVM
+$(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk)
+PRODUCT_BUILD_PVMFW_IMAGE := true
ifeq ($(TARGET_PKVM_ENABLED),true)
- $(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk)
+ PRODUCT_PACKAGES += pkvm_enabler
+else
+ PRODUCT_COPY_FILES += \
+ device/google/gs101/pkvm/pkvm_experiment.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/pkvm_experiment.rc
endif
# Enable watchdog timeout loop breaker.
@@ -1088,6 +1161,9 @@
# Telephony
include device/google/gs101/telephony/user.mk
+# Wifi ext
+include hardware/google/pixel/wifi_ext/device.mk
+
# Battery Stats Viewer
PRODUCT_PACKAGES_DEBUG += BatteryStatsViewer
diff --git a/device_framework_matrix_product.xml b/device_framework_matrix_product.xml
index ba34409..e65f01c 100644
--- a/device_framework_matrix_product.xml
+++ b/device_framework_matrix_product.xml
@@ -57,7 +57,15 @@
</interface>
</hal>
<hal format="aidl" optional="true">
+ <name>com.google.face.debug</name>
+ <interface>
+ <name>IDebugHost</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
<name>com.google.edgetpu</name>
+ <version>2</version>
<interface>
<name>IEdgeTpuVendorService</name>
<instance>default</instance>
@@ -106,7 +114,7 @@
<hal format="aidl" optional="true">
<name>hardware.qorvo.uwb</name>
<interface>
- <name>IUwb</name>
+ <name>IUwbVendor</name>
<instance>default</instance>
</interface>
</hal>
@@ -120,7 +128,7 @@
</hal>
<hal format="hidl" optional="true">
<name>vendor.google.google_battery</name>
- <version>1.1</version>
+ <version>1.2</version>
<interface>
<name>IGoogleBattery</name>
<instance>default</instance>
@@ -136,7 +144,7 @@
</hal>
<hal format="hidl">
<name>vendor.google.whitechapel.audio.audioext</name>
- <version>2.0</version>
+ <version>3.0</version>
<interface>
<name>IAudioExt</name>
<instance>default</instance>
@@ -144,7 +152,7 @@
</hal>
<hal format="hidl" optional="true">
<name>vendor.google.wifi_ext</name>
- <version>1.2</version>
+ <version>1.3</version>
<interface>
<name>IWifiExt</name>
<instance>default</instance>
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
index 813d186..ca391e5 100644
--- a/dumpstate/DumpstateDevice.cpp
+++ b/dumpstate/DumpstateDevice.cpp
@@ -214,6 +214,8 @@
// sessions or starts a new session after the one with performance issues).
dumpLogs(fd, kCameraLogDir, cameraDestDir, 10, "session-ended-");
dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "high-drop-rate-");
+ dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "watchdog-");
+ dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "camera-ended-");
}
timepoint_t startSection(int fd, const std::string §ionName) {
@@ -249,6 +251,7 @@
DumpstateDevice::DumpstateDevice()
: mTextSections{
+ { "pre-touch", [this](int fd) { dumpPreTouchSection(fd); } },
{ "wlan", [this](int fd) { dumpWlanSection(fd); } },
{ "soc", [this](int fd) { dumpSocSection(fd); } },
{ "storage", [this](int fd) { dumpStorageSection(fd); } },
@@ -347,6 +350,9 @@
DumpFileToFd(fd, "maxfg_base", "/dev/logbuffer_maxfg_base_monitor");
DumpFileToFd(fd, "maxfg_flip", "/dev/logbuffer_maxfg_flip_monitor");
}
+ if (!stat("/sys/class/power_supply/dock", &buffer)) {
+ DumpFileToFd(fd, "Power supply property dock", "/sys/class/power_supply/dock/uevent");
+ }
if (!stat("/dev/logbuffer_tcpm", &buffer)) {
DumpFileToFd(fd, "Logbuffer TCPM", "/dev/logbuffer_tcpm");
@@ -377,6 +383,7 @@
DumpFileToFd(fd, "TTF details", "/sys/class/power_supply/battery/ttf_details");
DumpFileToFd(fd, "TTF stats", "/sys/class/power_supply/battery/ttf_stats");
DumpFileToFd(fd, "maxq", "/dev/logbuffer_maxq");
+ DumpFileToFd(fd, "aacr_state", "/sys/class/power_supply/battery/aacr_state");
RunCommandToFd(fd, "TRICKLE-DEFEND Config", {"/vendor/bin/sh", "-c",
" cd /sys/devices/platform/google,battery/power_supply/battery/;"
@@ -392,6 +399,7 @@
if (!PropertiesHelper::IsUserBuild()) {
DumpFileToFd(fd, "DC_registers dump", "/sys/class/power_supply/pca9468-mains/device/registers_dump");
+ DumpFileToFd(fd, "Charging table dump", "/d/google_battery/chg_raw_profile");
RunCommandToFd(fd, "fg_model", {"/vendor/bin/sh", "-c",
@@ -420,8 +428,14 @@
/* EEPROM State */
if (!stat("/sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom", &buffer)) {
RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom"});
- } else {
+ } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom", &buffer)) {
RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom"});
+ } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom", &buffer)) {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom"});
+ } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom", &buffer)) {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom"});
+ } else {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-8/8-0050/eeprom"});
}
DumpFileToFd(fd, "Charger Stats", "/sys/class/power_supply/battery/charge_details");
@@ -487,14 +501,20 @@
"for f in /sys/class/thermal/cooling* ; do "
"type=`cat $f/type` ; temp=`cat $f/cur_state` ; echo \"$type: $temp\" ; "
"done"});
+ RunCommandToFd(fd, "Cooling Device User Vote State", {"/vendor/bin/sh", "-c",
+ "for f in /sys/class/thermal/cooling* ; do "
+ "if [ ! -f $f/user_vote ]; then continue; fi; "
+ "type=`cat $f/type` ; temp=`cat $f/user_vote` ; echo \"$type: $temp\" ; "
+ "done"});
RunCommandToFd(fd, "Cooling Device Time in State", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; "
"do type=`cat $f/type` ; temp=`cat $f/stats/time_in_state_ms` ; echo \"$type:\n$temp\" ; done"});
RunCommandToFd(fd, "Cooling Device Trans Table", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; "
"do type=`cat $f/type` ; temp=`cat $f/stats/trans_table` ; echo \"$type:\n$temp\" ; done"});
RunCommandToFd(fd, "Cooling Device State2Power Table", {"/vendor/bin/sh", "-c",
"for f in /sys/class/thermal/cooling* ; do "
- "type=`cat $f/type` ; state2power_table=`cat $f/state2power_table` ; echo \"$type: $state2power_table\" ; "
- "done"});
+ "if [ ! -f $f/state2power_table ]; then continue; fi; "
+ "type=`cat $f/type` ; state2power_table=`cat $f/state2power_table` ; echo \"$type: $state2power_table\" ; "
+ "done"});
DumpFileToFd(fd, "TMU state:", "/sys/module/gs101_thermal/parameters/tmu_reg_dump_state");
DumpFileToFd(fd, "TMU current temperature:", "/sys/module/gs101_thermal/parameters/tmu_reg_dump_current_temp");
DumpFileToFd(fd, "TMU_TOP rise thresholds:", "/sys/module/gs101_thermal/parameters/tmu_top_reg_dump_rise_thres");
@@ -504,6 +524,42 @@
}
// Dump items related to touch
+void DumpstateDevice::dumpPreTouchSection(int fd) {
+ const char nvt_spi_path[] = "/sys/class/spi_master/spi11/spi11.0/input/nvt_touch";
+ char cmd[256];
+
+ /* NVT touch */
+ if (!access(nvt_spi_path, R_OK)) {
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/%s",
+ "0x21",
+ nvt_spi_path,
+ "force_touch_active");
+ RunCommandToFd(fd, "Force Touch Active(Enable)", {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "/proc/nvt_fw_version");
+ if (!access(cmd, R_OK))
+ DumpFileToFd(fd, "FW version", cmd);
+
+#if 0 /* b/193467774: remove this temporarily */
+ snprintf(cmd, sizeof(cmd), "/proc/nvt_diff");
+ if (!access(cmd, R_OK))
+ DumpFileToFd(fd, "Diff", cmd);
+
+ snprintf(cmd, sizeof(cmd), "%s/nvt_fw_history", nvt_spi_path);
+ if (!access(nvt_spi_path, R_OK))
+ DumpFileToFd(fd, "FW History", cmd);
+#endif
+
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/%s",
+ "0x20",
+ nvt_spi_path,
+ "force_touch_active");
+ RunCommandToFd(fd, "Force Touch Active(Disable)", {"/vendor/bin/sh", "-c", cmd});
+ }
+}
+
void DumpstateDevice::dumpTouchSection(int fd) {
const char stm_cmd_path[4][50] = {"/sys/class/spi_master/spi11/spi11.0",
"/proc/fts/driver_test",
@@ -918,6 +974,21 @@
DumpFileToFd(fd, "AoC hotword wake", "/sys/devices/platform/19000000.aoc/control/hotword_wakeup");
DumpFileToFd(fd, "AoC memory exception wake", "/sys/devices/platform/19000000.aoc/control/memory_exception");
DumpFileToFd(fd, "AoC memory votes", "/sys/devices/platform/19000000.aoc/control/memory_votes");
+ RunCommandToFd(fd, "AoC Heap Stats (A32)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 1' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+ RunCommandToFd(fd, "AoC Heap Stats (F1)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 2' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+ RunCommandToFd(fd, "AoC Heap Stats (HF0)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 3' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+ RunCommandToFd(fd, "AoC Heap Stats (HF1)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 4' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+ RunCommandToFd(fd, "AoC MIF Stats",
+ {"/vendor/bin/sh", "-c", "echo 'mif details' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
}
// Dump items related to sensors usf.
@@ -982,6 +1053,7 @@
void DumpstateDevice::dumpGscSection(int fd) {
RunCommandToFd(fd, "Citadel VERSION", {"vendor/bin/hw/citadel_updater", "-lv"});
RunCommandToFd(fd, "Citadel STATS", {"vendor/bin/hw/citadel_updater", "--stats"});
+ RunCommandToFd(fd, "GSC DEBUG DUMP", {"vendor/bin/hw/citadel_updater", "-D"});
}
// Dump essential camera debugging logs
diff --git a/dumpstate/DumpstateDevice.h b/dumpstate/DumpstateDevice.h
index 74d0ce1..5cc3249 100644
--- a/dumpstate/DumpstateDevice.h
+++ b/dumpstate/DumpstateDevice.h
@@ -64,6 +64,7 @@
void dumpWlanSection(int fd);
void dumpPowerSection(int fd);
void dumpThermalSection(int fd);
+ void dumpPreTouchSection(int fd);
void dumpTouchSection(int fd);
void dumpSocSection(int fd);
void dumpCpuSection(int fd);
diff --git a/edgetpu/OWNERS b/edgetpu/OWNERS
new file mode 100644
index 0000000..9eb92a9
--- /dev/null
+++ b/edgetpu/OWNERS
@@ -0,0 +1,6 @@
+# Devs who work on EdgeTPU on Android.
+hsuy@google.com
+yuchicheng@google.com
+iayara@google.com
+qinyiyan@google.com
+macwang@google.com
\ No newline at end of file
diff --git a/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
index 2a1193e..1880f60 100644
--- a/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
+++ b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
@@ -21,3 +21,6 @@
# Enable Suez
$(call soong_config_set,fp_hal_feature,biometric_suez_support,true)
+
+# Must add below method to each project's device.mk to show sensorLocation
+#$(call soong_config_set,fp_hal_feature,pixel_product, project_XX)
diff --git a/gnss/47765/config/gps.xml b/gnss/47765/config/gps.xml
index 0cb80ed..9c49907 100644
--- a/gnss/47765/config/gps.xml
+++ b/gnss/47765/config/gps.xml
@@ -21,6 +21,7 @@
SuplSslMethod="SSLv23_NO_TLSv1_2"
SuplEnable="true"
SuplUseApn="true"
+ SuplUseFwCellInfo="false"
SuplTlsCertDirPath="/etc/security/cacerts"
SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
SuplUT1Seconds="20"
@@ -54,6 +55,8 @@
AssertEnabled="true"
CpLppeCancelDbhOnAgnssProvideLoc="true"
CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
/>
<gll
diff --git a/gnss/47765/config/gps.xml.oriole b/gnss/47765/config/gps.xml.oriole
index 0fec87d..f34f73c 100644
--- a/gnss/47765/config/gps.xml.oriole
+++ b/gnss/47765/config/gps.xml.oriole
@@ -21,6 +21,7 @@
SuplSslMethod="SSLv23_NO_TLSv1_2"
SuplEnable="true"
SuplUseApn="true"
+ SuplUseFwCellInfo="false"
SuplTlsCertDirPath="/etc/security/cacerts"
SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
SuplUT1Seconds="20"
@@ -54,9 +55,13 @@
AssertEnabled="true"
CpLppeCancelDbhOnAgnssProvideLoc="true"
CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
/>
<gll
+ PpsEnable="true"
LogPriMask="LOG_INFO"
LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/gps.xml.raven b/gnss/47765/config/gps.xml.raven
index 25ea859..f06958b 100644
--- a/gnss/47765/config/gps.xml.raven
+++ b/gnss/47765/config/gps.xml.raven
@@ -21,6 +21,7 @@
SuplSslMethod="SSLv23_NO_TLSv1_2"
SuplEnable="true"
SuplUseApn="true"
+ SuplUseFwCellInfo="false"
SuplTlsCertDirPath="/etc/security/cacerts"
SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
SuplUT1Seconds="20"
@@ -54,9 +55,13 @@
AssertEnabled="true"
CpLppeCancelDbhOnAgnssProvideLoc="true"
CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
/>
<gll
+ PpsEnable="true"
LogPriMask="LOG_INFO"
LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/gps_user.xml b/gnss/47765/config/gps_user.xml
index f435fd7..9e1a246 100644
--- a/gnss/47765/config/gps_user.xml
+++ b/gnss/47765/config/gps_user.xml
@@ -20,6 +20,7 @@
SuplSslMethod="SSLv23_NO_TLSv1_2"
SuplEnable="true"
SuplUseApn="true"
+ SuplUseFwCellInfo="false"
SuplTlsCertDirPath="/etc/security/cacerts"
SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
SuplUT1Seconds="20"
@@ -53,6 +54,8 @@
AssertEnabled="false"
CpLppeCancelDbhOnAgnssProvideLoc="true"
CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
/>
<gll
diff --git a/gnss/47765/config/gps_user.xml.oriole b/gnss/47765/config/gps_user.xml.oriole
index f701c00..3ec656c 100644
--- a/gnss/47765/config/gps_user.xml.oriole
+++ b/gnss/47765/config/gps_user.xml.oriole
@@ -20,6 +20,7 @@
SuplSslMethod="SSLv23_NO_TLSv1_2"
SuplEnable="true"
SuplUseApn="true"
+ SuplUseFwCellInfo="false"
SuplTlsCertDirPath="/etc/security/cacerts"
SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
SuplUT1Seconds="20"
@@ -53,9 +54,13 @@
AssertEnabled="false"
CpLppeCancelDbhOnAgnssProvideLoc="true"
CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
/>
<gll
+ PpsEnable="true"
LogPriMask="LOG_INFO"
LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/gps_user.xml.raven b/gnss/47765/config/gps_user.xml.raven
index e5800db..98cf347 100644
--- a/gnss/47765/config/gps_user.xml.raven
+++ b/gnss/47765/config/gps_user.xml.raven
@@ -20,6 +20,7 @@
SuplSslMethod="SSLv23_NO_TLSv1_2"
SuplEnable="true"
SuplUseApn="true"
+ SuplUseFwCellInfo="false"
SuplTlsCertDirPath="/etc/security/cacerts"
SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
SuplUT1Seconds="20"
@@ -53,9 +54,13 @@
AssertEnabled="false"
CpLppeCancelDbhOnAgnssProvideLoc="true"
CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
/>
<gll
+ PpsEnable="true"
LogPriMask="LOG_INFO"
LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
diff --git a/gnss/47765/config/lhd.conf b/gnss/47765/config/lhd.conf
index efde25b..c000d58 100644
--- a/gnss/47765/config/lhd.conf
+++ b/gnss/47765/config/lhd.conf
@@ -31,3 +31,4 @@
SkipSensorWakeLock=true
LoggerWakeLockEnable=false
+PpsEnable=true
diff --git a/gnss/47765/config/lhd_user.conf b/gnss/47765/config/lhd_user.conf
index 0216ace..682d03a 100644
--- a/gnss/47765/config/lhd_user.conf
+++ b/gnss/47765/config/lhd_user.conf
@@ -29,3 +29,4 @@
SkipSensorWakeLock=true
LoggerWakeLockEnable=false
+PpsEnable=true
diff --git a/health/Android.bp b/health/Android.bp
index 41a0e12..2bac61b 100644
--- a/health/Android.bp
+++ b/health/Android.bp
@@ -13,7 +13,6 @@
* 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
@@ -24,36 +23,39 @@
"//device/google/gs101:device_google_gs101_license",
],
}
-
-cc_library_shared {
- name: "android.hardware.health@2.1-impl-gs101",
- stem: "android.hardware.health@2.0-impl-2.1-gs101",
-
- proprietary: true,
+cc_defaults {
+ name: "android.hardware.health-service.gs101-defaults",
+ defaults: [
+ "libhealth_aidl_impl_user",
+ "libhealth_aidl_charger_defaults",
+ ],
relative_install_path: "hw",
+ vintf_fragments: ["android.hardware.health-service.gs101.xml"],
srcs: [
"Health.cpp",
],
-
cflags: [
"-Wall",
"-Werror",
],
-
static_libs: [
- "android.hardware.health@1.0-convert",
- "libbatterymonitor",
- "libhealth2impl",
- "libhealthloop",
+ "libhealth_aidl_impl",
],
-
+}
+cc_binary {
+ name: "android.hardware.health-service.gs101",
+ defaults: ["android.hardware.health-service.gs101-defaults"],
+ proprietary: true,
+ init_rc: ["android.hardware.health-service.gs101.rc"],
+ overrides: ["charger"],
shared_libs: [
- "libbase",
- "libcutils",
- "libhidlbase",
"libpixelhealth",
- "libutils",
- "android.hardware.health@2.0",
- "android.hardware.health@2.1",
],
}
+cc_binary {
+ name: "android.hardware.health-service.gs101_recovery",
+ defaults: ["android.hardware.health-service.gs101-defaults"],
+ recovery: true,
+ init_rc: ["android.hardware.health-service.gs101_recovery.rc"],
+ overrides: ["charger.recovery"],
+}
diff --git a/health/Health.cpp b/health/Health.cpp
index fe8ad84..a50cc8b 100644
--- a/health/Health.cpp
+++ b/health/Health.cpp
@@ -19,17 +19,20 @@
#include <android-base/file.h>
#include <android-base/parseint.h>
#include <android-base/strings.h>
-#include <android/hardware/health/2.0/types.h>
-#include <health2impl/Health.h>
+#include <android/hardware/health/translate-ndk.h>
+#include <health-impl/Health.h>
#include <health/utils.h>
-#include <hal_conversion.h>
+// Recovery doesn't have libpixelhealth and charger mode
+#ifndef __ANDROID_RECOVERY__
+#include <health-impl/ChargerUtils.h>
#include <pixelhealth/BatteryDefender.h>
#include <pixelhealth/BatteryMetricsLogger.h>
#include <pixelhealth/BatteryThermalControl.h>
#include <pixelhealth/ChargerDetect.h>
#include <pixelhealth/DeviceHealth.h>
#include <pixelhealth/LowBatteryShutdownMetrics.h>
+#endif // !__ANDROID_RECOVERY__
#include <chrono>
#include <fstream>
@@ -41,15 +44,15 @@
using namespace std::literals;
-using android::hardware::health::V1_0::hal_conversion::convertFromHealthInfo;
-using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
-using android::hardware::health::V2_0::DiskStats;
-using android::hardware::health::V2_0::StorageAttribute;
-using android::hardware::health::V2_0::StorageInfo;
-using android::hardware::health::V2_0::Result;
-using ::android::hardware::health::V2_1::IHealth;
+using aidl::android::hardware::health::DiskStats;
+using aidl::android::hardware::health::HalHealthLoop;
+using aidl::android::hardware::health::HealthInfo;
+using aidl::android::hardware::health::StorageInfo;
using android::hardware::health::InitHealthdConfig;
+#ifndef __ANDROID_RECOVERY__
+using aidl::android::hardware::health::charger::ChargerCallback;
+using aidl::android::hardware::health::charger::ChargerModeMain;
using hardware::google::pixel::health::BatteryDefender;
using hardware::google::pixel::health::BatteryMetricsLogger;
using hardware::google::pixel::health::BatteryThermalControl;
@@ -72,6 +75,7 @@
static BatteryMetricsLogger battMetricsLogger(kBatteryResistance, kBatteryOCV);
static LowBatteryShutdownMetrics shutdownMetrics(kVoltageAvg);
static DeviceHealth deviceHealth;
+#endif // !__ANDROID_RECOVERY__
#define UFS_DIR "/dev/sys/block/bootdevice"
constexpr char kUfsHealthEol[]{UFS_DIR "/health_descriptor/eol_info"};
@@ -79,7 +83,6 @@
constexpr char kUfsHealthLifetimeB[]{UFS_DIR "/health_descriptor/life_time_estimation_b"};
constexpr char kUfsVersion[]{UFS_DIR "/device_descriptor/specification_version"};
constexpr char kDiskStatsFile[]{"/sys/block/sda/stat"};
-constexpr char kUFSName[]{"UFS0"};
static std::string ufs_version;
static uint16_t eol;
@@ -88,8 +91,10 @@
static std::chrono::system_clock::time_point ufs_last_query_time;
constexpr auto kUfsQueryIntervalHours = std::chrono::hours{24};
+#ifndef __ANDROID_RECOVERY__
static bool needs_wlc_updates = false;
constexpr char kWlcCapacity[]{WLC_DIR "/capacity"};
+#endif // !__ANDROID_RECOVERY__
std::ifstream assert_open(const std::string &path) {
std::ifstream stream(path);
@@ -118,12 +123,10 @@
info->version = ufs_version;
}
-void fill_ufs_storage_attribute(StorageAttribute *attr) {
- attr->isInternal = true;
- attr->isBootDevice = true;
- attr->name = kUFSName;
-}
-
+#ifdef __ANDROID_RECOVERY__
+void private_healthd_board_init(struct healthd_config *) {}
+int private_healthd_board_battery_update(HealthInfo *) { return 0; }
+#else // !__ANDROID__RECOVERY__
static bool FileExists(const std::string &filename) {
struct stat buffer;
@@ -140,26 +143,26 @@
}
}
-int private_healthd_board_battery_update(struct android::BatteryProperties *props) {
- deviceHealth.update(props);
- battThermalControl.updateThermalState(props);
- battMetricsLogger.logBatteryProperties(props);
- shutdownMetrics.logShutdownVoltage(props);
+int private_healthd_board_battery_update(HealthInfo *health_info) {
+ deviceHealth.update(health_info);
+ battThermalControl.updateThermalState(*health_info);
+ battMetricsLogger.logBatteryProperties(*health_info);
+ shutdownMetrics.logShutdownVoltage(*health_info);
// Allow BatteryDefender to override online properties
- ChargerDetect::onlineUpdate(props);
- battDefender.update(props);
+ ChargerDetect::onlineUpdate(health_info);
+ battDefender.update(health_info);
if (needs_wlc_updates &&
- !android::base::WriteStringToFile(std::to_string(props->batteryLevel), kWlcCapacity))
+ !android::base::WriteStringToFile(std::to_string(health_info->batteryLevel), kWlcCapacity))
LOG(INFO) << "Unable to write battery level to wireless capacity";
return 0;
}
+#endif // __ANDROID_RECOVERY__
-void private_get_storage_info(std::vector<StorageInfo> &vec_storage_info) {
- vec_storage_info.resize(1);
- StorageInfo *storage_info = &vec_storage_info[0];
- fill_ufs_storage_attribute(&storage_info->attr);
+void private_get_storage_info(std::vector<StorageInfo> *vec_storage_info) {
+ vec_storage_info->resize(1);
+ StorageInfo *storage_info = &vec_storage_info->at(0);
read_ufs_version(storage_info);
@@ -180,10 +183,9 @@
return;
}
-void private_get_disk_stats(std::vector<DiskStats> &vec_stats) {
- vec_stats.resize(1);
- DiskStats *stats = &vec_stats[0];
- fill_ufs_storage_attribute(&stats->attr);
+void private_get_disk_stats(std::vector<DiskStats> *vec_stats) {
+ vec_stats->resize(1);
+ DiskStats *stats = &vec_stats->at(0);
auto stream = assert_open(kDiskStatsFile);
// Regular diskstats entries
@@ -195,18 +197,14 @@
}
} // anonymous namespace
-namespace android {
-namespace hardware {
-namespace health {
-namespace V2_1 {
-namespace implementation {
+namespace aidl::android::hardware::health::implementation {
class HealthImpl : public Health {
public:
- HealthImpl(std::unique_ptr<healthd_config>&& config)
- : Health(std::move(config)) {}
+ HealthImpl(std::string_view instance_name, std::unique_ptr<healthd_config>&& config)
+ : Health(std::move(instance_name), std::move(config)) {}
- Return<void> getStorageInfo(getStorageInfo_cb _hidl_cb) override;
- Return<void> getDiskStats(getDiskStats_cb _hidl_cb) override;
+ ndk::ScopedAStatus getDiskStats(std::vector<DiskStats>* out) override;
+ ndk::ScopedAStatus getStorageInfo(std::vector<StorageInfo>* out) override;
protected:
void UpdateHealthInfo(HealthInfo* health_info) override;
@@ -214,53 +212,57 @@
};
void HealthImpl::UpdateHealthInfo(HealthInfo* health_info) {
- struct BatteryProperties props;
- convertFromHealthInfo(health_info->legacy.legacy, &props);
- private_healthd_board_battery_update(&props);
- convertToHealthInfo(&props, health_info->legacy.legacy);
+ private_healthd_board_battery_update(health_info);
}
-Return<void> HealthImpl::getStorageInfo(getStorageInfo_cb _hidl_cb)
+ndk::ScopedAStatus HealthImpl::getStorageInfo(std::vector<StorageInfo>* out)
{
- std::vector<struct StorageInfo> info;
- private_get_storage_info(info);
- hidl_vec<struct StorageInfo> info_vec(info);
- if (!info.size()) {
- _hidl_cb(Result::NOT_SUPPORTED, info_vec);
- } else {
- _hidl_cb(Result::SUCCESS, info_vec);
+ private_get_storage_info(out);
+ if (out->empty()) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
- return Void();
+ return ndk::ScopedAStatus::ok();
}
-Return<void> HealthImpl::getDiskStats(getDiskStats_cb _hidl_cb)
+ndk::ScopedAStatus HealthImpl::getDiskStats(std::vector<DiskStats>* out)
{
- std::vector<struct DiskStats> stats;
- private_get_disk_stats(stats);
- hidl_vec<struct DiskStats> stats_vec(stats);
- if (!stats.size()) {
- _hidl_cb(Result::NOT_SUPPORTED, stats_vec);
- } else {
- _hidl_cb(Result::SUCCESS, stats_vec);
+ private_get_disk_stats(out);
+ if (out->empty()) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
- return Void();
+ return ndk::ScopedAStatus::ok();
}
-} // namespace implementation
-} // namespace V2_1
-} // namespace health
-} // namespace hardware
-} // namespace android
+} // namespace aidl::android::hardware::health::implementation
-extern "C" IHealth* HIDL_FETCH_IHealth(const char* instance) {
- using ::android::hardware::health::V2_1::implementation::HealthImpl;
- if (instance != "default"sv) {
- return nullptr;
- }
+int main(int argc, char **argv) {
+ using ::aidl::android::hardware::health::implementation::HealthImpl;
+
+ // Use kernel logging in recovery
+#ifdef __ANDROID_RECOVERY__
+ android::base::InitLogging(argv, android::base::KernelLogger);
+#endif
+
auto config = std::make_unique<healthd_config>();
InitHealthdConfig(config.get());
private_healthd_board_init(config.get());
- return new HealthImpl(std::move(config));
+ auto binder =
+ ndk::SharedRefBase::make<HealthImpl>("default"sv, std::move(config));
+
+ if (argc >= 2 && argv[1] == "--charger"sv) {
+ // In regular mode, start charger UI.
+#ifndef __ANDROID_RECOVERY__
+ LOG(INFO) << "Starting charger mode with UI.";
+ return ChargerModeMain(binder, std::make_shared<ChargerCallback>(binder));
+#endif
+ // In recovery, ignore --charger arg.
+ LOG(INFO) << "Starting charger mode without UI.";
+ } else {
+ LOG(INFO) << "Starting health HAL.";
+ }
+
+ auto hal_health_loop = std::make_shared<HalHealthLoop>(binder, binder);
+ return hal_health_loop->StartLoop();
}
diff --git a/health/android.hardware.health-service.gs101.rc b/health/android.hardware.health-service.gs101.rc
new file mode 100644
index 0000000..0c31362
--- /dev/null
+++ b/health/android.hardware.health-service.gs101.rc
@@ -0,0 +1,16 @@
+service vendor.health-gs101 /vendor/bin/hw/android.hardware.health-service.gs101
+ class hal
+ user system
+ group system
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+ file /dev/kmsg w
+service vendor.charger /vendor/bin/hw/android.hardware.health-service.gs101 --charger
+ class charger
+ seclabel u:r:charger_vendor:s0
+ user system
+ group system wakelock input
+ capabilities SYS_BOOT
+ file /dev/kmsg w
+ file /sys/fs/pstore/console-ramoops-0 r
+ file /sys/fs/pstore/console-ramoops r
+ file /proc/last_kmsg r
diff --git a/health/android.hardware.health-service.gs101.xml b/health/android.hardware.health-service.gs101.xml
new file mode 100644
index 0000000..98026cb
--- /dev/null
+++ b/health/android.hardware.health-service.gs101.xml
@@ -0,0 +1,7 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.health</name>
+ <version>1</version>
+ <fqname>IHealth/default</fqname>
+ </hal>
+</manifest>
diff --git a/health/android.hardware.health-service.gs101_recovery.rc b/health/android.hardware.health-service.gs101_recovery.rc
new file mode 100644
index 0000000..d1e3504
--- /dev/null
+++ b/health/android.hardware.health-service.gs101_recovery.rc
@@ -0,0 +1,7 @@
+service vendor.health-gs101 /system/bin/hw/android.hardware.health-service.gs101_recovery
+ class hal
+ seclabel u:r:hal_health_default:s0
+ user system
+ group system
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+ file /dev/kmsg w
diff --git a/manifest-gralloc3.xml b/manifest-gralloc3.xml
deleted file mode 100644
index ca284df..0000000
--- a/manifest-gralloc3.xml
+++ /dev/null
@@ -1,231 +0,0 @@
-<manifest version="1.0" type="device" target-level="5">
- <hal format="hidl">
- <name>android.hardware.audio</name>
- <transport>hwbinder</transport>
- <version>7.0</version>
- <interface>
- <name>IDevicesFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.audio.effect</name>
- <transport>hwbinder</transport>
- <version>7.0</version>
- <interface>
- <name>IEffectsFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.soundtrigger</name>
- <transport>hwbinder</transport>
- <version>2.3</version>
- <interface>
- <name>ISoundTriggerHw</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.media.omx</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IOmx</name>
- <instance>default</instance>
- </interface>
- <interface>
- <name>IOmxStore</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.graphics.allocator</name>
- <transport>hwbinder</transport>
- <version>2.0</version>
- <interface>
- <name>IAllocator</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.graphics.mapper</name>
- <transport arch="32+64">passthrough</transport>
- <version>2.0</version>
- <interface>
- <name>IMapper</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.graphics.composer</name>
- <transport>hwbinder</transport>
- <version>2.4</version>
- <interface>
- <name>IComposer</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.memtrack</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IMemtrack</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.renderscript</name>
- <transport arch="32+64">passthrough</transport>
- <version>1.0</version>
- <interface>
- <name>IDevice</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.drm</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>ICryptoFactory</name>
- <instance>default</instance>
- </interface>
- <interface>
- <name>IDrmFactory</name>
- <instance>default</instance>
- </interface>
- <fqname>@1.3::ICryptoFactory/clearkey</fqname>
- <fqname>@1.3::IDrmFactory/clearkey</fqname>
- <fqname>@1.3::ICryptoFactory/widevine</fqname>
- <fqname>@1.3::IDrmFactory/widevine</fqname>
- </hal>
- <hal format = "hidl">
- <name>android.hardware.dumpstate</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IDumpstateDevice</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.bluetooth</name>
- <transport>hwbinder</transport>
- <version>1.1</version>
- <interface>
- <name>IBluetoothHci</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.bluetooth.audio</name>
- <transport>hwbinder</transport>
- <version>2.1</version>
- <interface>
- <name>IBluetoothAudioProvidersFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.boot</name>
- <transport>hwbinder</transport>
- <fqname>@1.2::IBootControl/default</fqname>
- </hal>
- <hal format="hidl">
- <name>android.hardware.sensors</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>ISensors</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.neuralnetworks</name>
- <transport>hwbinder</transport>
- <version>1.2</version>
- <interface>
- <name>IDevice</name>
- <instance>armnn</instance>
- </interface>
- <fqname>@1.2::IDevice/armnn</fqname>
- </hal>
- <hal format="hidl">
- <name>android.hardware.neuralnetworks</name>
- <transport>hwbinder</transport>
- <fqname>@1.3::IDevice/google-edgetpu</fqname>
- </hal>
- <hal format="hidl">
- <name>android.hardware.health</name>
- <transport>hwbinder</transport>
- <version>2.1</version>
- <interface>
- <name>IHealth</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="aidl">
- <name>com.google.input</name>
- <interface>
- <name>ITouchContextService</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>hardware.google.bluetooth.bt_channel_avoidance</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IBTChannelAvoidance</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>hardware.google.bluetooth.sar</name>
- <transport>hwbinder</transport>
- <version>1.1</version>
- <interface>
- <name>IBluetoothSar</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>hardware.google.bluetooth.ccc</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IBluetoothCcc</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>vendor.google.google_battery</name>
- <transport>hwbinder</transport>
- <version>1.1</version>
- <interface>
- <name>IGoogleBattery</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>vendor.google.whitechapel.audio.audioext</name>
- <transport>hwbinder</transport>
- <version>2.0</version>
- <interface>
- <name>IAudioExt</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>vendor.google.audiometricext</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IAudioMetricExt</name>
- <instance>default</instance>
- </interface>
- </hal>
- <kernel target-level="6"/>
-</manifest>
diff --git a/manifest.xml b/manifest.xml
index 7b78da9..f213f00 100644
--- a/manifest.xml
+++ b/manifest.xml
@@ -2,7 +2,7 @@
<hal format="hidl">
<name>android.hardware.audio</name>
<transport>hwbinder</transport>
- <version>7.0</version>
+ <version>7.1</version>
<interface>
<name>IDevicesFactory</name>
<instance>default</instance>
@@ -85,15 +85,6 @@
</interface>
</hal>
<hal format="hidl">
- <name>android.hardware.bluetooth.audio</name>
- <transport>hwbinder</transport>
- <version>2.1</version>
- <interface>
- <name>IBluetoothAudioProvidersFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
<name>android.hardware.boot</name>
<transport>hwbinder</transport>
<fqname>@1.2::IBootControl/default</fqname>
@@ -108,15 +99,6 @@
</interface>
<fqname>@1.3::IDevice/google-armnn</fqname>
</hal>
- <hal format="hidl">
- <name>android.hardware.health</name>
- <transport>hwbinder</transport>
- <version>2.1</version>
- <interface>
- <name>IHealth</name>
- <instance>default</instance>
- </interface>
- </hal>
<hal format="aidl">
<name>com.google.input</name>
<interface>
@@ -154,7 +136,7 @@
<hal format="hidl">
<name>vendor.google.google_battery</name>
<transport>hwbinder</transport>
- <version>1.1</version>
+ <version>1.2</version>
<interface>
<name>IGoogleBattery</name>
<instance>default</instance>
@@ -163,7 +145,7 @@
<hal format="hidl">
<name>vendor.google.whitechapel.audio.audioext</name>
<transport>hwbinder</transport>
- <version>2.0</version>
+ <version>3.0</version>
<interface>
<name>IAudioExt</name>
<instance>default</instance>
diff --git a/manifest_64-gralloc3.xml b/manifest_64-gralloc3.xml
deleted file mode 100644
index 9dc7924..0000000
--- a/manifest_64-gralloc3.xml
+++ /dev/null
@@ -1,220 +0,0 @@
-<manifest version="1.0" type="device" target-level="5">
- <hal format="hidl">
- <name>android.hardware.audio</name>
- <transport>hwbinder</transport>
- <version>7.0</version>
- <interface>
- <name>IDevicesFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.audio.effect</name>
- <transport>hwbinder</transport>
- <version>7.0</version>
- <interface>
- <name>IEffectsFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.soundtrigger</name>
- <transport>hwbinder</transport>
- <version>2.3</version>
- <interface>
- <name>ISoundTriggerHw</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.graphics.allocator</name>
- <transport>hwbinder</transport>
- <version>2.0</version>
- <interface>
- <name>IAllocator</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.graphics.mapper</name>
- <transport arch="32+64">passthrough</transport>
- <version>2.1</version>
- <interface>
- <name>IMapper</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.graphics.composer</name>
- <transport>hwbinder</transport>
- <version>2.4</version>
- <interface>
- <name>IComposer</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.memtrack</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IMemtrack</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.renderscript</name>
- <transport arch="32+64">passthrough</transport>
- <version>1.0</version>
- <interface>
- <name>IDevice</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.drm</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>ICryptoFactory</name>
- <instance>default</instance>
- </interface>
- <interface>
- <name>IDrmFactory</name>
- <instance>default</instance>
- </interface>
- <fqname>@1.3::ICryptoFactory/clearkey</fqname>
- <fqname>@1.3::IDrmFactory/clearkey</fqname>
- <fqname>@1.3::ICryptoFactory/widevine</fqname>
- <fqname>@1.3::IDrmFactory/widevine</fqname>
- </hal>
- <hal format = "hidl">
- <name>android.hardware.dumpstate</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IDumpstateDevice</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.bluetooth</name>
- <transport>hwbinder</transport>
- <version>1.1</version>
- <interface>
- <name>IBluetoothHci</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.bluetooth.audio</name>
- <transport>hwbinder</transport>
- <version>2.1</version>
- <interface>
- <name>IBluetoothAudioProvidersFactory</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>android.hardware.boot</name>
- <transport>hwbinder</transport>
- <fqname>@1.2::IBootControl/default</fqname>
- </hal>
- <hal format="hidl">
- <name>android.hardware.sensors</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>ISensors</name>
- <instance>default</instance>
- </interface>
- </hal>
-<!--
- <hal format="hidl">
- <name>android.hardware.neuralnetworks</name>
- <transport>hwbinder</transport>
- <version>1.2</version>
- <interface>
- <name>IDevice</name>
- <instance>armnn</instance>
- </interface>
- <fqname>@1.2::IDevice/armnn</fqname>
- </hal>
--->
- <hal format="hidl">
- <name>android.hardware.neuralnetworks</name>
- <transport>hwbinder</transport>
- <fqname>@1.3::IDevice/google-edgetpu</fqname>
- </hal>
- <hal format="hidl">
- <name>android.hardware.health</name>
- <transport>hwbinder</transport>
- <version>2.1</version>
- <interface>
- <name>IHealth</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="aidl">
- <name>com.google.input</name>
- <interface>
- <name>ITouchContextService</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>hardware.google.bluetooth.bt_channel_avoidance</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IBTChannelAvoidance</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>hardware.google.bluetooth.sar</name>
- <transport>hwbinder</transport>
- <version>1.1</version>
- <interface>
- <name>IBluetoothSar</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>hardware.google.bluetooth.ccc</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IBluetoothCcc</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>vendor.google.google_battery</name>
- <transport>hwbinder</transport>
- <version>1.1</version>
- <interface>
- <name>IGoogleBattery</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>vendor.google.whitechapel.audio.audioext</name>
- <transport>hwbinder</transport>
- <version>2.0</version>
- <interface>
- <name>IAudioExt</name>
- <instance>default</instance>
- </interface>
- </hal>
- <hal format="hidl">
- <name>vendor.google.audiometricext</name>
- <transport>hwbinder</transport>
- <version>1.0</version>
- <interface>
- <name>IAudioMetricExt</name>
- <instance>default</instance>
- </interface>
- </hal>
- <kernel target-level="6"/>
-</manifest>
diff --git a/manifest_64.xml b/manifest_64.xml
index 17b08d0..8c19233 100644
--- a/manifest_64.xml
+++ b/manifest_64.xml
@@ -2,7 +2,7 @@
<hal format="hidl">
<name>android.hardware.audio</name>
<transport>hwbinder</transport>
- <version>7.0</version>
+ <version>7.1</version>
<interface>
<name>IDevicesFactory</name>
<instance>default</instance>
@@ -109,15 +109,6 @@
<transport>hwbinder</transport>
<fqname>@1.3::IDevice/google-edgetpu</fqname>
</hal>
- <hal format="hidl">
- <name>android.hardware.health</name>
- <transport>hwbinder</transport>
- <version>2.1</version>
- <interface>
- <name>IHealth</name>
- <instance>default</instance>
- </interface>
- </hal>
<hal format="aidl">
<name>com.google.input</name>
<interface>
@@ -155,7 +146,7 @@
<hal format="hidl">
<name>vendor.google.google_battery</name>
<transport>hwbinder</transport>
- <version>1.1</version>
+ <version>1.2</version>
<interface>
<name>IGoogleBattery</name>
<instance>default</instance>
@@ -164,7 +155,7 @@
<hal format="hidl">
<name>vendor.google.whitechapel.audio.audioext</name>
<transport>hwbinder</transport>
- <version>2.0</version>
+ <version>3.0</version>
<interface>
<name>IAudioExt</name>
<instance>default</instance>
diff --git a/media_codecs_aosp_c2.xml b/media_codecs_aosp_c2.xml
index 5d34a90..62b4707 100644
--- a/media_codecs_aosp_c2.xml
+++ b/media_codecs_aosp_c2.xml
@@ -153,6 +153,7 @@
<Limit name="concurrent-instances" max="16" />
<Feature name="can-swap-width-height" value="1" />
<Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
</MediaCodec>
<MediaCodec name="c2.exynos.hevc.encoder" type="video/hevc" >
<Limit name="size" min="64x64" max="3840x2176" />
@@ -166,6 +167,7 @@
<Limit name="concurrent-instances" max="16" />
<Feature name="can-swap-width-height" value="1" />
<Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
</MediaCodec>
<MediaCodec name="c2.exynos.mpeg4.encoder" type="video/mp4v-es">
<Limit name="size" min="32x32" max="2048x2048" />
@@ -179,6 +181,7 @@
<Limit name="concurrent-instances" max="16" />
<Feature name="can-swap-width-height" value="1" />
<Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
</MediaCodec>
<MediaCodec name="c2.exynos.h263.encoder" type="video/3gpp">
<Limit name="size" min="32x32" max="2048x1152" />
@@ -191,6 +194,7 @@
<Limit name="performance-point-1920x1080" range="120" />
<Limit name="concurrent-instances" max="16" />
<Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
</MediaCodec>
<MediaCodec name="c2.exynos.vp8.encoder" type="video/x-vnd.on2.vp8" >
<Limit name="size" min="32x32" max="3840x2160" />
@@ -204,6 +208,7 @@
<Limit name="concurrent-instances" max="16" />
<Feature name="can-swap-width-height" value="1" />
<Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
</MediaCodec>
<MediaCodec name="c2.exynos.vp9.encoder" type="video/x-vnd.on2.vp9" >
<Limit name="size" min="64x64" max="3840x2176" />
@@ -217,6 +222,7 @@
<Limit name="concurrent-instances" max="16" />
<Feature name="can-swap-width-height" value="1" />
<Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
</MediaCodec>
</Encoders>
</MediaCodecs>
diff --git a/modem/user.mk b/modem/user.mk
index 81f3773..fb01f2c 100644
--- a/modem/user.mk
+++ b/modem/user.mk
@@ -1,2 +1,4 @@
-PRODUCT_PACKAGES += dmd
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+ PRODUCT_PACKAGES += dmd
+endif
BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/modem/user
diff --git a/modem/userdebug.mk b/modem/userdebug.mk
index 87697a7..4fcab64 100644
--- a/modem/userdebug.mk
+++ b/modem/userdebug.mk
@@ -1,2 +1,4 @@
-PRODUCT_PACKAGES += vcd
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+ PRODUCT_PACKAGES += vcd
+endif
BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/modem/userdebug/
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 3c1e38a..5c14b29 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -240,10 +240,18 @@
<!-- Should the pinner service pin the Home application? -->
<bool name="config_pinnerHomeApp">true</bool>
+ <!-- The default intensity level for alarm vibrations. See
+ Settings.System.ALARM_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultAlarmVibrationIntensity">3</integer>
<!-- The default intensity level for haptic feedback. See
Settings.System.HAPTIC_FEEDBACK_INTENSITY more details on the constant values and
meanings. -->
<integer name="config_defaultHapticFeedbackIntensity">3</integer>
+ <!-- The default intensity level for media vibrations. See
+ Settings.System.MEDIA_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultMediaVibrationIntensity">3</integer>
<!-- The default intensity level for notification vibrations. See
Settings.System.NOTIFICATION_VIBRATION_INTENSITY more details on the constant values and
meanings. -->
@@ -260,4 +268,19 @@
<!-- Enable Zram writeback feature to allow unused pages in zram be written to flash. -->
<bool name="config_zramWriteback">true</bool>
+
+ <!-- Configure tcp buffer sizes in the form:
+ rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max
+ If this is configured as an empty string, the system default will be applied.
+
+ For now this config is used by mobile data only. In the future it should be
+ used by Wi-Fi as well.
+
+ Note that starting from Android 13, the TCP buffer size is fixed after boot up, and should
+ never be changed based on carriers or the network types. The value should be configured
+ appropriately based on the device's memory and performance. It is recommended to use lower
+ values if the device has low memory or doesn't support high-speed network such like LTE,
+ NR, or Wifi.
+ -->
+ <string name="config_tcp_buffers" translatable="false">2097152,6291456,16777216,512000,2097152,8388608</string>
</resources>
diff --git a/overlay/frameworks/base/core/res/res/values/dimens.xml b/overlay/frameworks/base/core/res/res/values/dimens.xml
new file mode 100644
index 0000000..fc36aa3
--- /dev/null
+++ b/overlay/frameworks/base/core/res/res/values/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2022, 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.
+*/
+-->
+<resources>
+ <!-- for 20dp of padding at 3.5px/dp at default density -->
+ <dimen name="rounded_corner_content_padding">70px</dimen>
+</resources>
diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
index cea6e90..6d08eb4 100644
--- a/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
+++ b/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
@@ -16,9 +16,6 @@
*/
-->
<resources>
- <!-- for 20dp of padding at 3.5px/dp at default density -->
- <dimen name="rounded_corner_content_padding">70px</dimen>
-
<!-- the padding on the top of the statusbar (usually 0) -->
<dimen name="status_bar_padding_top">1dp</dimen>
diff --git a/pixelstats/pixelstats-vendor.gs101.rc b/pixelstats/pixelstats-vendor.gs101.rc
index 98af5fc..d324b6a 100644
--- a/pixelstats/pixelstats-vendor.gs101.rc
+++ b/pixelstats/pixelstats-vendor.gs101.rc
@@ -1,5 +1,5 @@
on property:sys.boot_completed=1
- start vendor.pixelstats_vendor
+ start vendor.pixelstats_vendor
service vendor.pixelstats_vendor /vendor/bin/pixelstats-vendor
class hal
diff --git a/pkvm/Android.bp b/pkvm/Android.bp
new file mode 100644
index 0000000..dba9601
--- /dev/null
+++ b/pkvm/Android.bp
@@ -0,0 +1,31 @@
+// 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:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_binary {
+ name: "pkvm_enabler",
+ vendor: true,
+ init_rc: ["pkvm_enabler.gs101.rc"],
+ srcs: ["pkvm_enabler.c"],
+ shared_libs: ["liblog"],
+}
diff --git a/pkvm/pkvm_enabler.c b/pkvm/pkvm_enabler.c
new file mode 100644
index 0000000..cb14ba6
--- /dev/null
+++ b/pkvm/pkvm_enabler.c
@@ -0,0 +1,75 @@
+/*
+ * 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 "pkvm_enabler"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <log/log.h>
+
+#define KVM_DEVICE "/dev/kvm"
+#define MISC_WRITER "/vendor/bin/misc_writer"
+
+int main() {
+ char *newargv[] = { MISC_WRITER, "--set-enable-pkvm", NULL };
+ char *newenvp[] = { NULL };
+ pid_t pid;
+ int ret, wstatus;
+
+ /* Check whether KVM device exists. */
+ ret = access(KVM_DEVICE, F_OK);
+
+ /* If KVM device exists, return SUCCESS to continue booting. */
+ if (ret == 0) {
+ exit(EXIT_SUCCESS);
+ }
+
+ if (ret != -ENOENT) {
+ ALOGW("Unexpected error from access(): %d", ret);
+ }
+
+ /*
+ * If KVM device does not exist, run misc_writer and return FAILURE
+ * to force a reboot.
+ */
+ pid = fork();
+ if (pid == -1) {
+ ALOGE("Could not fork: %d", errno);
+ exit(EXIT_FAILURE);
+ }
+
+ if (pid == 0) {
+ execve(MISC_WRITER, newargv, newenvp);
+ ALOGE("Could not execute " MISC_WRITER ": %d", errno);
+ _exit(EXIT_FAILURE);
+ }
+
+ waitpid(pid, &wstatus, 0);
+ if (WIFEXITED(wstatus)) {
+ ret = WEXITSTATUS(wstatus);
+ if (ret) {
+ ALOGE(MISC_WRITER " exit status: %d", ret);
+ }
+ } else {
+ ALOGE(MISC_WRITER " terminated unexpectedly: %d", wstatus);
+ }
+
+ exit(EXIT_FAILURE);
+}
diff --git a/pkvm/pkvm_enabler.gs101.rc b/pkvm/pkvm_enabler.gs101.rc
new file mode 100644
index 0000000..6f329d3
--- /dev/null
+++ b/pkvm/pkvm_enabler.gs101.rc
@@ -0,0 +1,5 @@
+service pkvm_enabler /vendor/bin/pkvm_enabler
+ reboot_on_failure reboot,pkvm-not-enabled
+
+on early-init
+ exec_start pkvm_enabler
\ No newline at end of file
diff --git a/pkvm/pkvm_experiment.rc b/pkvm/pkvm_experiment.rc
new file mode 100644
index 0000000..148f084
--- /dev/null
+++ b/pkvm/pkvm_experiment.rc
@@ -0,0 +1,13 @@
+service vendor.pkvm_enable /vendor/bin/misc_writer --set-enable-pkvm
+ disabled
+ oneshot
+
+service vendor.pkvm_disable /vendor/bin/misc_writer --set-disable-pkvm
+ disabled
+ oneshot
+
+on property:persist.device_config.virtualization_framework_native.isolated_compilation_enabled=true
+ start vendor.pkvm_enable
+
+on property:persist.device_config.virtualization_framework_native.isolated_compilation_enabled=false
+ start vendor.pkvm_disable
diff --git a/powerhint_a0.json b/powerhint_a0.json
index 2136a2b..4787367 100644
--- a/powerhint_a0.json
+++ b/powerhint_a0.json
@@ -55,7 +55,7 @@
},
{
"Name": "TAUClampBoost",
- "Path": "/sys/kernel/vendor_sched/ta_uclamp_min",
+ "Path": "/proc/vendor_sched/ta_uclamp_min",
"Values": [
"0",
"410",
diff --git a/powerhint_a1.json b/powerhint_a1.json
index c3d1581..81b4b65 100644
--- a/powerhint_a1.json
+++ b/powerhint_a1.json
@@ -75,7 +75,7 @@
},
{
"Name": "TAUClampBoost",
- "Path": "/sys/kernel/vendor_sched/ta_uclamp_min",
+ "Path": "/proc/vendor_sched/ta_uclamp_min",
"Values": [
"0",
"410",
diff --git a/powerstats/Android.bp b/powerstats/Android.bp
index 10ecbed..74b7242 100644
--- a/powerstats/Android.bp
+++ b/powerstats/Android.bp
@@ -11,6 +11,14 @@
// 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.
+
+soong_namespace {
+ imports: [
+ "hardware/google/pixel",
+ "device/google/gs-common/powerstats",
+ ],
+}
+
package {
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
@@ -33,6 +41,7 @@
],
shared_libs: [
+ "android.hardware.power.stats-impl.gs-common",
"android.hardware.power.stats-impl.pixel",
],
}
diff --git a/powerstats/AocStateResidencyDataProvider.cpp b/powerstats/AocStateResidencyDataProvider.cpp
deleted file mode 100644
index c64496d..0000000
--- a/powerstats/AocStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,128 +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.
- */
-
-#include "AocStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-AocStateResidencyDataProvider::AocStateResidencyDataProvider(std::vector<std::pair<std::string,
- std::string>> ids, std::vector<std::pair<std::string, std::string>> states) {
- // AoC stats are reported in ticks of 244.140625ns. The transform
- // function converts ticks to milliseconds.
- // 1000000 / 244.140625 = 4096.
- static const uint64_t AOC_CLK = 4096;
- std::function<uint64_t(uint64_t)> aocTickToMs = [](uint64_t a) { return a / AOC_CLK; };
- GenericStateResidencyDataProvider::StateResidencyConfig config = {
- .entryCountSupported = true,
- .entryCountPrefix = "Counter:",
- .totalTimeSupported = true,
- .totalTimePrefix = "Cumulative time:",
- .totalTimeTransform = aocTickToMs,
- .lastEntrySupported = true,
- .lastEntryPrefix = "Time last entered:",
- .lastEntryTransform = aocTickToMs,
- };
- for (const auto &id : ids) {
- for (const auto &state : states) {
- std::vector<std::pair<std::string, std::string>> aocStateHeaders = {
- std::make_pair(state.first, ""),
- };
- std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
- cfgs.emplace_back(generateGenericStateResidencyConfigs(config, aocStateHeaders),
- id.first, "");
- std::unique_ptr<GenericStateResidencyDataProvider> sdp(
- new GenericStateResidencyDataProvider(id.second + state.second, cfgs));
- mProviders[id.first].push_back(std::move(sdp));
- }
- }
-}
-
-bool AocStateResidencyDataProvider::getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
- // States from the same power entity are merged.
- bool ret = true;
- for (const auto &providerList : mProviders) {
- int32_t stateId = 0;
- std::string curEntity = providerList.first;
- std::vector<StateResidency> stateResidencies;
-
- // Iterate over each provider in the providerList, appending each of the states
- for (const auto &provider : providerList.second) {
- std::unordered_map<std::string, std::vector<StateResidency>> residency;
- ret &= provider->getStateResidencies(&residency);
-
- // Each provider should only return data for curEntity but checking anyway
- if (residency.find(curEntity) != residency.end()) {
- for (auto &r : residency.at(curEntity)) {
- /*
- * Modifying stateId here because we are stitching together infos from
- * multiple GenericStateResidencyDataProviders. stateId must be modified
- * to maintain uniqueness for a given entity
- */
- r.id = stateId++;
- stateResidencies.push_back(r);
- }
- }
- }
-
- residencies->emplace(curEntity, stateResidencies);
- }
- return ret;
-}
-
-std::unordered_map<std::string, std::vector<State>> AocStateResidencyDataProvider::getInfo() {
- // States from the same power entity are merged
- std::unordered_map<std::string, std::vector<State>> infos;
- for (const auto &providerList : mProviders) {
- int32_t stateId = 0;
- std::string curEntity = providerList.first;
- std::vector<State> stateInfos;
-
- // Iterate over each provider in the providerList, appending each of the states
- for (const auto &provider : providerList.second) {
- std::unordered_map<std::string, std::vector<State>> info = provider->getInfo();
-
- // Each provider should only return data for curEntity but checking anyway
- if (info.find(curEntity) != info.end()) {
- for (auto &i : info.at(curEntity)) {
- /*
- * Modifying stateId because we are stitching together infos from
- * multiple GenericStateResidencyDataProviders. stateId must be modified
- * to maintain uniqueness for a given entity
- */
- i.id = stateId++;
- stateInfos.push_back(i);
- }
- }
- }
-
- infos.emplace(curEntity, stateInfos);
- }
-
- return infos;
-}
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/powerstats/AocStateResidencyDataProvider.h b/powerstats/AocStateResidencyDataProvider.h
deleted file mode 100644
index 5008912..0000000
--- a/powerstats/AocStateResidencyDataProvider.h
+++ /dev/null
@@ -1,45 +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 <dataproviders/GenericStateResidencyDataProvider.h>
-#include <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class AocStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
- public:
- AocStateResidencyDataProvider(std::vector<std::pair<std::string, std::string>> ids,
- std::vector<std::pair<std::string, std::string>> states);
- ~AocStateResidencyDataProvider() = default;
- bool getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
- std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
- private:
- std::unordered_map<std::string /* entity name */,
- std::vector<std::unique_ptr<GenericStateResidencyDataProvider>> /* providers */> mProviders;
-};
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
\ No newline at end of file
diff --git a/powerstats/DevfreqStateResidencyDataProvider.cpp b/powerstats/DevfreqStateResidencyDataProvider.cpp
deleted file mode 100644
index d59e1e5..0000000
--- a/powerstats/DevfreqStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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 "DevfreqStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-
-static const std::string nameSuffix = "-DVFS";
-static const std::string pathSuffix = "/time_in_state";
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-DevfreqStateResidencyDataProvider::DevfreqStateResidencyDataProvider(const std::string& name,
- const std::string& path) : mName(name + nameSuffix), mPath(path + pathSuffix) {}
-
-bool DevfreqStateResidencyDataProvider::extractNum(const char *str, char **str_end, int base,
- int64_t* num) {
- // errno can be set to any non-zero value by a library function call
- // regardless of whether there was an error, so it needs to be cleared
- // in order to check the error set by strtoll
- errno = 0;
- *num = std::strtoll(str, str_end, base);
- return (errno != ERANGE);
-}
-
-std::vector<std::pair<int64_t, int64_t>> DevfreqStateResidencyDataProvider::parseTimeInState() {
- // Using FILE* instead of std::ifstream for performance reasons
- std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(mPath.c_str(), "r"), fclose);
- if (!fp) {
- PLOG(ERROR) << "Failed to open file " << mPath;
- return {};
- }
-
- std::vector<std::pair<int64_t, int64_t>> timeInState;
-
- char *line = nullptr;
- size_t len = 0;
- while (getline(&line, &len, fp.get()) != -1) {
- char* pEnd;
- int64_t frequencyHz, totalTimeMs;
- if (!extractNum(line, &pEnd, 10, &frequencyHz) ||
- !extractNum(pEnd, &pEnd, 10, &totalTimeMs)) {
- PLOG(ERROR) << "Failed to parse " << mPath;
- free(line);
- return {};
- }
-
- timeInState.push_back({frequencyHz, totalTimeMs});
- }
-
- free(line);
- return timeInState;
-}
-
-bool DevfreqStateResidencyDataProvider::getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
- std::vector<std::pair<int64_t, int64_t>> timeInState = parseTimeInState();
-
- if (timeInState.empty()) {
- return false;
- }
-
- int32_t id = 0;
- std::vector<StateResidency> stateResidencies;
- for (const auto[frequencyHz, totalTimeMs] : timeInState) {
- StateResidency s = {.id = id++, .totalTimeInStateMs = totalTimeMs};
- stateResidencies.push_back(s);
- }
-
- residencies->emplace(mName, stateResidencies);
- return true;
-}
-
-std::unordered_map<std::string, std::vector<State>> DevfreqStateResidencyDataProvider::getInfo() {
- std::vector<std::pair<int64_t, int64_t>> timeInState = parseTimeInState();
-
- if (timeInState.empty()) {
- return {};
- }
-
- int32_t id = 0;
- std::vector<State> states;
- for (const auto[frequencyHz, totalTimeMs] : timeInState) {
- State s = {.id = id++, .name = std::to_string(frequencyHz / 1000) + "MHz"};
- states.push_back(s);
- }
-
- return {{mName, states}};
-}
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/powerstats/DevfreqStateResidencyDataProvider.h b/powerstats/DevfreqStateResidencyDataProvider.h
deleted file mode 100644
index 8341b43..0000000
--- a/powerstats/DevfreqStateResidencyDataProvider.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class DevfreqStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
- public:
- DevfreqStateResidencyDataProvider(const std::string& name, const std::string& path);
- ~DevfreqStateResidencyDataProvider() = default;
-
- /*
- * See IStateResidencyDataProvider::getStateResidencies
- */
- bool getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
-
- /*
- * See IStateResidencyDataProvider::getInfo
- */
- std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
- private:
- bool extractNum(const char *str, char **str_end, int base, int64_t* num);
- std::vector<std::pair<int64_t, int64_t>> parseTimeInState();
- const std::string mName;
- const std::string mPath;
-};
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProvider.cpp b/powerstats/DvfsStateResidencyDataProvider.cpp
deleted file mode 100644
index 511159e..0000000
--- a/powerstats/DvfsStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,149 +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.
- */
-#include "DvfsStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-#include <android-base/parseint.h>
-#include <android-base/strings.h>
-
-#include <string>
-#include <utility>
-
-using android::base::ParseUint;
-using android::base::Split;
-using android::base::StartsWith;
-using android::base::Trim;
-
-static const std::string nameSuffix = "-DVFS";
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-DvfsStateResidencyDataProvider::DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate,
- std::vector<Config> cfgs)
- : mPath(std::move(path)), mClockRate(clockRate), mPowerEntities(std::move(cfgs)) {}
-
-int32_t DvfsStateResidencyDataProvider::matchEntity(char const *line) {
- for (int32_t i = 0; i < mPowerEntities.size(); i++) {
- if (mPowerEntities[i].powerEntityName == Trim(std::string(line))) {
- return i;
- }
- }
- return -1;
-}
-
-int32_t DvfsStateResidencyDataProvider::matchState(char const *line, const Config& powerEntity) {
- for (int32_t i = 0; i < powerEntity.states.size(); i++) {
- if (StartsWith(Trim(std::string(line)), powerEntity.states[i].second)) {
- return i;
- }
- }
- return -1;
-}
-
-bool DvfsStateResidencyDataProvider::parseState(char const *line, uint64_t *duration,
- uint64_t *count) {
- std::vector<std::string> parts = Split(line, " ");
- if (parts.size() != 7) {
- return false;
- }
- if (!ParseUint(Trim(parts[3]), count)) {
- return false;
- }
- if (!ParseUint(Trim(parts[6]), duration)) {
- return false;
- }
- return true;
-}
-
-bool DvfsStateResidencyDataProvider::getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
- std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(mPath.c_str(), "r"), fclose);
- if (!fp) {
- PLOG(ERROR) << __func__ << ":Failed to open file " << mPath;
- return false;
- }
-
- for (const Config &powerEntity : mPowerEntities) {
- std::vector<StateResidency> stateResidency(powerEntity.states.size());
- for (int32_t i = 0; i < stateResidency.size(); i++) {
- stateResidency[i].id = i;
- }
- residencies->emplace(powerEntity.powerEntityName + nameSuffix, stateResidency);
- }
-
- size_t len = 0;
- char *line = nullptr;
-
- int32_t temp, powerEntityIndex, stateId = -1;
- uint64_t duration, count;
- auto it = residencies->end();
-
- while (getline(&line, &len, fp.get()) != -1) {
- temp = matchEntity(line);
- // Assign new index only when a new valid entity is encountered.
- if (temp >= 0) {
- powerEntityIndex = temp;
- it = residencies->find(mPowerEntities[powerEntityIndex].powerEntityName + nameSuffix);
- }
-
- if (it != residencies->end()) {
- stateId = matchState(line, mPowerEntities[powerEntityIndex]);
-
- if (stateId >= 0) {
- if (parseState(line, &duration, &count)) {
- it->second[stateId].totalTimeInStateMs =
- duration / mClockRate;
- it->second[stateId].totalStateEntryCount = count;
- } else {
- LOG(ERROR) << "Failed to parse duration and count from [" << std::string(line)
- << "]";
- return false;
- }
- }
- }
- }
-
- free(line);
-
- return true;
-}
-
-std::unordered_map<std::string, std::vector<State>> DvfsStateResidencyDataProvider::getInfo() {
- std::unordered_map<std::string, std::vector<State>> info;
- for (auto const &entity : mPowerEntities) {
- std::vector<State> stateInfo(entity.states.size());
- int32_t stateId = 0;
- for (auto const &state : entity.states) {
- stateInfo[stateId] = State{
- .id = stateId,
- .name = state.first
- };
- stateId++;
- }
- info.emplace(entity.powerEntityName + nameSuffix, stateInfo);
- }
- return info;
-}
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/powerstats/DvfsStateResidencyDataProvider.h b/powerstats/DvfsStateResidencyDataProvider.h
deleted file mode 100644
index ca8ab22..0000000
--- a/powerstats/DvfsStateResidencyDataProvider.h
+++ /dev/null
@@ -1,68 +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 <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class DvfsStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
- public:
- class Config {
- public:
- // Power entity name to parse.
- std::string powerEntityName;
-
- // List of state pairs (name to display, name to parse).
- std::vector<std::pair<std::string, std::string>> states;
- };
- /*
- * path - path to dvfs sysfs node.
- * clockRate - clock rate in KHz.
- */
- DvfsStateResidencyDataProvider(std::string path, uint64_t clockRate, std::vector<Config> cfgs);
- ~DvfsStateResidencyDataProvider() = default;
-
- /*
- * See IStateResidencyDataProvider::getStateResidencies
- */
- bool getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
-
- /*
- * See IStateResidencyDataProvider::getInfo
- */
- std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
- private:
- int32_t matchEntity(char const *line);
- int32_t matchState(char const *line, const Config& powerEntity);
- bool parseState(char const *line, uint64_t *duration, uint64_t *count);
-
- const std::string mPath;
- const uint64_t mClockRate;
- std::vector<Config> mPowerEntities;
-};
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/powerstats/Gs101CommonDataProviders.cpp b/powerstats/Gs101CommonDataProviders.cpp
index f1e3aa5..13e6b71 100644
--- a/powerstats/Gs101CommonDataProviders.cpp
+++ b/powerstats/Gs101CommonDataProviders.cpp
@@ -605,17 +605,33 @@
}
void addDevfreq(std::shared_ptr<PowerStats> p) {
- p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("INT",
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "INT",
"/sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int"));
- p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("INTCAM",
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "INTCAM",
"/sys/devices/platform/17000030.devfreq_intcam/devfreq/17000030.devfreq_intcam"));
- p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("CAM",
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "DISP",
+ "/sys/devices/platform/17000040.devfreq_disp/devfreq/17000040.devfreq_disp"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "CAM",
"/sys/devices/platform/17000050.devfreq_cam/devfreq/17000050.devfreq_cam"));
- p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("TNR",
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "TNR",
"/sys/devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "MFC",
+ "/sys/devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "BO",
+ "/sys/devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo"));
}
void addTPU(std::shared_ptr<PowerStats> p) {
@@ -630,7 +646,7 @@
p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
EnergyConsumerType::OTHER, "TPU", {"S10M_VDD_TPU"},
- {{UID_TIME_IN_STATE, "/sys/class/edgetpu/abrolhos/device/tpu_usage"}},
+ {{UID_TIME_IN_STATE, "/sys/class/edgetpu/edgetpu-soc/device/tpu_usage"}},
stateCoeffs));
}
diff --git a/powerstats/UfsStateResidencyDataProvider.cpp b/powerstats/UfsStateResidencyDataProvider.cpp
deleted file mode 100644
index aec7724..0000000
--- a/powerstats/UfsStateResidencyDataProvider.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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 "UfsStateResidencyDataProvider.h"
-
-#include <android-base/logging.h>
-#include <android-base/parseint.h>
-#include <android-base/strings.h>
-
-#include <string>
-#include <utility>
-
-using android::base::ParseInt;
-using android::base::Split;
-using android::base::StartsWith;
-using android::base::Trim;
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-const int32_t HIBERNATE_STATE_ID = 0;
-const std::string UFS_NAME = "UFS";
-
-UfsStateResidencyDataProvider::UfsStateResidencyDataProvider(std::string prefix) : kPrefix(prefix) {}
-
-bool UfsStateResidencyDataProvider::getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) {
- StateResidency residency;
- residency.id = HIBERNATE_STATE_ID;
-
- // The transform function converts microseconds to milliseconds.
- std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
-
- residency.totalTimeInStateMs = usecToMs(readStat(kPrefix + "hibern8_total_us"));
- residency.totalStateEntryCount = readStat(kPrefix + "hibern8_exit_cnt");
- residency.lastEntryTimestampMs = usecToMs(readStat(kPrefix + "last_hibern8_enter_time"));
-
- residencies->emplace(UFS_NAME, std::vector<StateResidency>{residency});
- return true;
-}
-
-std::unordered_map<std::string, std::vector<State>> UfsStateResidencyDataProvider::getInfo() {
- return {{UFS_NAME, std::vector<State>{{HIBERNATE_STATE_ID, "HIBERN8"}} }};
-}
-
-int64_t UfsStateResidencyDataProvider::readStat(std::string path) {
- std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(path.c_str(), "r"), fclose);
- if (!fp) {
- PLOG(ERROR) << __func__ << ":Failed to open file " << path
- << " Error = " << strerror(errno);
- return 0;
- }
- const size_t size = 20;
- char buf[size];
- (void)fread(&buf, sizeof(char), size, fp.get());
- int64_t ret;
- if (!ParseInt(Trim(std::string(buf)), &ret)) {
- LOG(ERROR) << "Failed to parse int64 from [" << std::string(buf) << "]";
- }
- return ret;
-}
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/powerstats/UfsStateResidencyDataProvider.h b/powerstats/UfsStateResidencyDataProvider.h
deleted file mode 100644
index f4ef268..0000000
--- a/powerstats/UfsStateResidencyDataProvider.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 <PowerStatsAidl.h>
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace power {
-namespace stats {
-
-class UfsStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider {
- public:
- UfsStateResidencyDataProvider(std::string prefix);
- ~UfsStateResidencyDataProvider() = default;
-
- /*
- * See IStateResidencyDataProvider::getStateResidencies
- */
- bool getStateResidencies(
- std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override;
-
- /*
- * See IStateResidencyDataProvider::getInfo
- */
- std::unordered_map<std::string, std::vector<State>> getInfo() override;
-
- private:
- int64_t readStat(std::string path);
-
- const std::string kPrefix;
-};
-
-} // namespace stats
-} // namespace power
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/radio/config/Pixel_Default.cfg b/radio/config/Pixel_Default.cfg
new file mode 100644
index 0000000..b1a83fd
--- /dev/null
+++ b/radio/config/Pixel_Default.cfg
@@ -0,0 +1 @@
+Pixel_Default.nprf,Pixel_Default_metrics.xml
\ No newline at end of file
diff --git a/radio/config/Pixel_Default.nprf b/radio/config/Pixel_Default.nprf
new file mode 100644
index 0000000..76406e4
--- /dev/null
+++ b/radio/config/Pixel_Default.nprf
Binary files differ
diff --git a/radio/config/Pixel_Default_metrics.xml b/radio/config/Pixel_Default_metrics.xml
new file mode 100644
index 0000000..2549946
--- /dev/null
+++ b/radio/config/Pixel_Default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+ <ITEM NAME="COMMON">
+ <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+ </ITEM>
+ <ITEM NAME="LTE">
+ <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="EDGE">
+ <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="HSPA">
+ <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="true"></ITEM>
+ <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="true"></ITEM>
+ <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="true"></ITEM>
+ <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="CDMA">
+ <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+ </ITEM>
+</NODE>
diff --git a/radio/config/Pixel_stability.cfg b/radio/config/Pixel_stability.cfg
new file mode 100644
index 0000000..db01dd1
--- /dev/null
+++ b/radio/config/Pixel_stability.cfg
@@ -0,0 +1 @@
+Pixel_stability.nprf,Pixel_Default_metrics.xml
diff --git a/radio/config/Pixel_stability.nprf b/radio/config/Pixel_stability.nprf
new file mode 100644
index 0000000..327b8f1
--- /dev/null
+++ b/radio/config/Pixel_stability.nprf
Binary files differ
diff --git a/radio/config/default.cfg b/radio/config/default.cfg
new file mode 100644
index 0000000..58f9cd3
--- /dev/null
+++ b/radio/config/default.cfg
@@ -0,0 +1 @@
+default.nprf,default_metrics.xml
\ No newline at end of file
diff --git a/radio/config/default.nprf b/radio/config/default.nprf
new file mode 100644
index 0000000..e9b3199
--- /dev/null
+++ b/radio/config/default.nprf
Binary files differ
diff --git a/radio/config/default_NAS_RRC.cfg b/radio/config/default_NAS_RRC.cfg
new file mode 100644
index 0000000..2cd3df2
--- /dev/null
+++ b/radio/config/default_NAS_RRC.cfg
@@ -0,0 +1 @@
+default_NAS_RRC.nprf,default_metrics.xml
diff --git a/radio/config/default_NAS_RRC.nprf b/radio/config/default_NAS_RRC.nprf
new file mode 100644
index 0000000..351827f
--- /dev/null
+++ b/radio/config/default_NAS_RRC.nprf
Binary files differ
diff --git a/radio/config/default_metrics.xml b/radio/config/default_metrics.xml
new file mode 100644
index 0000000..5a54933
--- /dev/null
+++ b/radio/config/default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+ <ITEM NAME="COMMON">
+ <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+ </ITEM>
+ <ITEM NAME="LTE">
+ <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="EDGE">
+ <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="HSPA">
+ <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="CDMA">
+ <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+ </ITEM>
+</NODE>
diff --git a/radio/config/default_network.cfg b/radio/config/default_network.cfg
new file mode 100644
index 0000000..fbe5613
--- /dev/null
+++ b/radio/config/default_network.cfg
@@ -0,0 +1 @@
+default_network.nprf,default_metrics.xml
diff --git a/radio/config/default_network.nprf b/radio/config/default_network.nprf
new file mode 100644
index 0000000..f5152cf
--- /dev/null
+++ b/radio/config/default_network.nprf
Binary files differ
diff --git a/radio/config/default_stability.cfg b/radio/config/default_stability.cfg
new file mode 100644
index 0000000..6974dd6
--- /dev/null
+++ b/radio/config/default_stability.cfg
@@ -0,0 +1 @@
+default_stability.nprf,default_metrics.xml
diff --git a/radio/config/default_stability.nprf b/radio/config/default_stability.nprf
new file mode 100644
index 0000000..b9536a1
--- /dev/null
+++ b/radio/config/default_stability.nprf
Binary files differ
diff --git a/radio/config/logging.conf b/radio/config/logging.conf
new file mode 100644
index 0000000..d57c82a
--- /dev/null
+++ b/radio/config/logging.conf
@@ -0,0 +1 @@
+modem_logging_control START -o /data/vendor/radio/logs/always-on -n 10 -s 20 -m /vendor/etc/modem/default.cfg --enable_exmetric --enable_exmetric_internal
\ No newline at end of file
diff --git a/radio/config/teamfood_default.cfg b/radio/config/teamfood_default.cfg
new file mode 100644
index 0000000..608ba54
--- /dev/null
+++ b/radio/config/teamfood_default.cfg
@@ -0,0 +1 @@
+teamfood_default.nprf,teamfood_default_metrics.xml
\ No newline at end of file
diff --git a/radio/config/teamfood_default.nprf b/radio/config/teamfood_default.nprf
new file mode 100644
index 0000000..9f3f1c5
--- /dev/null
+++ b/radio/config/teamfood_default.nprf
Binary files differ
diff --git a/radio/config/teamfood_default_metrics.xml b/radio/config/teamfood_default_metrics.xml
new file mode 100644
index 0000000..5a54933
--- /dev/null
+++ b/radio/config/teamfood_default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+ <ITEM NAME="COMMON">
+ <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+ </ITEM>
+ <ITEM NAME="LTE">
+ <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="EDGE">
+ <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="HSPA">
+ <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="CDMA">
+ <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+ </ITEM>
+</NODE>
diff --git a/rro_overlays/WifiOverlay/res/values/config.xml b/rro_overlays/WifiOverlay/res/values/config.xml
index 4e5d4bf..1a7681e 100644
--- a/rro_overlays/WifiOverlay/res/values/config.xml
+++ b/rro_overlays/WifiOverlay/res/values/config.xml
@@ -132,4 +132,13 @@
<bool translatable="false" name="config_wifiDefaultCoexAlgorithmEnabled">true</bool>
<!-- Whether to use the explicit vendor HAL API: IWifiStaIface.setRoamingState for disabling fw roaming. -->
<bool translatable="false" name="config_wifiUseHalApiToDisableFwRoaming">true</bool>
+
+ <!-- Indicate the driver doesn't support NL80211 Reg changed event -->
+ <bool translatable="false" name="config_wifiDriverSupportedNl80211RegChangedEvent">false</bool>
+
+ <!-- Indicate whether the verbose logging is always on -->
+ <!-- 0: verbose logging controlled by user
+ 1: verbose logging on by default for userdebug
+ 2: verbose logging on by default for all builds -->
+ <integer translatable="false" name="config_wifiVerboseLoggingAlwaysOnLevel">1</integer>
</resources>
diff --git a/task_profiles.json b/task_profiles.json
index 773f986..4bcfe41 100644
--- a/task_profiles.json
+++ b/task_profiles.json
@@ -7,7 +7,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_ta",
+ "FilePath": "/proc/vendor_sched/set_task_group_ta",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_ta",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -21,7 +22,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_cam",
+ "FilePath": "/proc/vendor_sched/set_task_group_cam",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_cam",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -35,7 +37,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_cam_power",
+ "FilePath": "/proc/vendor_sched/set_task_group_cam_power",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_cam_power",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -49,7 +52,23 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_dex2oat",
+ "FilePath": "/proc/vendor_sched/set_task_group_dex2oat",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_dex2oat",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "OtaPerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_ota",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_ota",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -102,7 +121,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_bg",
+ "FilePath": "/proc/vendor_sched/set_task_group_bg",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_bg",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -116,7 +136,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_sys",
+ "FilePath": "/proc/vendor_sched/set_task_group_sys",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_sys",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -130,7 +151,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_fg",
+ "FilePath": "/proc/vendor_sched/set_task_group_fg",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_fg",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -144,7 +166,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_ta",
+ "FilePath": "/proc/vendor_sched/set_task_group_ta",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_ta",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -158,7 +181,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_nnapi",
+ "FilePath": "/proc/vendor_sched/set_task_group_nnapi",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_nnapi",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -172,7 +196,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_sysbg",
+ "FilePath": "/proc/vendor_sched/set_task_group_sysbg",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_sysbg",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -194,7 +219,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_sf",
+ "FilePath": "/proc/vendor_sched/set_task_group_sf",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_sf",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -216,7 +242,8 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/set_task_group_rt",
+ "FilePath": "/proc/vendor_sched/set_task_group_rt",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_rt",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -230,7 +257,7 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/uclamp_fork_reset_set",
+ "FilePath": "/proc/vendor_sched/uclamp_fork_reset_set",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -244,7 +271,7 @@
"Name": "WriteFile",
"Params":
{
- "FilePath": "/sys/kernel/vendor_sched/uclamp_fork_reset_clear",
+ "FilePath": "/proc/vendor_sched/uclamp_fork_reset_clear",
"Value": "<pid>",
"LogFailures": "false"
}
@@ -257,6 +284,10 @@
{
"Name": "Dex2OatBootComplete",
"Profiles": [ "Dex2oatPerformance", "ProcessCapacityNormal", "LowIoPriority", "TimerSlackHigh" ]
+ },
+ {
+ "Name": "OtaProfiles",
+ "Profiles": [ "OtaPerformance", "ServiceCapacityLow", "LowIoPriority", "TimerSlackHigh" ]
}
]
}
diff --git a/telephony/user.mk b/telephony/user.mk
index 983a19a..f75596f 100644
--- a/telephony/user.mk
+++ b/telephony/user.mk
@@ -1,2 +1,2 @@
-PRODUCT_COPY_FILES += vendor/samsung_slsi/telephony/common/device/samsung/init.radio.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.radio.sh
+PRODUCT_COPY_FILES += vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/common/device/samsung/init.radio.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.radio.sh
BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/telephony/user/
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.bp b/usb/gadget/Android.bp
similarity index 67%
rename from usb/Android.bp
rename to usb/gadget/Android.bp
index 5aafe14..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",
- "pixelatoms-cpp",
- "libbinder_ndk",
],
static_libs: [
"libpixelusb",
- "libpixelstats",
- ],
- export_shared_lib_headers: [
- "android.frameworks.stats-V1-ndk",
- "pixelatoms-cpp",
],
proprietary: true,
}
diff --git a/usb/UsbGadget.cpp b/usb/gadget/UsbGadget.cpp
similarity index 100%
rename from usb/UsbGadget.cpp
rename to usb/gadget/UsbGadget.cpp
diff --git a/usb/UsbGadget.h b/usb/gadget/UsbGadget.h
similarity index 100%
rename from usb/UsbGadget.h
rename to usb/gadget/UsbGadget.h
diff --git a/usb/android.hardware.usb@1.3-service.gs101.rc b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
similarity index 94%
rename from usb/android.hardware.usb@1.3-service.gs101.rc
rename to usb/gadget/android.hardware.usb.gadget-service.gs101.rc
index 4112b4e..d0e355c 100644
--- a/usb/android.hardware.usb@1.3-service.gs101.rc
+++ b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
@@ -1,4 +1,4 @@
-service vendor.usb-hal-1-3 /vendor/bin/hw/android.hardware.usb@1.3-service.gs101
+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
@@ -10,6 +10,8 @@
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/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/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
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/Android.bp b/usb/usb/Android.bp
similarity index 60%
copy from usb/Android.bp
copy to usb/usb/Android.bp
index 5aafe14..f0f5069 100644
--- a/usb/Android.bp
+++ b/usb/usb/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.
@@ -12,28 +12,27 @@
// 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:device_google_gs101_license"
+ // 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:device_google_gs101_license",
- ],
+ default_applicable_licenses: ["device_google_gs101_license"],
}
cc_binary {
- name: "android.hardware.usb@1.3-service.gs101",
+ name: "android.hardware.usb-service.gs101",
relative_install_path: "hw",
- init_rc: ["android.hardware.usb@1.3-service.gs101.rc"],
- vintf_fragments: [
- "android.hardware.usb@1.3-service.gs101.xml",
- "android.hardware.usb.gadget@1.2-service.gs101.xml",
+ init_rc: ["android.hardware.usb-service.rc"],
+ vintf_fragments: ["android.hardware.usb-service.xml"],
+ vendor: true,
+ srcs: [
+ "service.cpp",
+ "Usb.cpp",
],
- srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"],
- cflags: ["-Wall", "-Werror"],
shared_libs: [
"libbase",
"libbinder",
@@ -41,19 +40,15 @@
"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",
+ "android.hardware.usb.gadget@1.0",
+ "android.hardware.usb-V1-ndk",
"libcutils",
"android.frameworks.stats-V1-ndk",
"pixelatoms-cpp",
"libbinder_ndk",
+
],
static_libs: [
"libpixelusb",
@@ -63,5 +58,4 @@
"android.frameworks.stats-V1-ndk",
"pixelatoms-cpp",
],
- proprietary: true,
}
diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp
new file mode 100644
index 0000000..b8ad7c5
--- /dev/null
+++ b/usb/usb/Usb.cpp
@@ -0,0 +1,1021 @@
+/*
+ * 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 <cstring>
+#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 kSinkLimitEnable[] = "i2c-max77759tcpc/usb_limit_sink_enable";
+constexpr char kSourceLimitEnable[] = "i2c-max77759tcpc/usb_limit_source_enable";
+constexpr char kSinkLimitCurrent[] = "i2c-max77759tcpc/usb_limit_sink_current";
+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 char kPogoUsbActive[] = "/sys/devices/platform/google,pogo/pogo_usb_active";
+constexpr char KPogoMoveDataToUsb[] = "/sys/devices/platform/google,pogo/move_data_to_usb";
+constexpr char kPowerSupplyUsbType[] = "/sys/class/power_supply/usb/usb_type";
+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 (!mUsbDataEnabled) {
+ 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();
+}
+
+ScopedAStatus Usb::enableUsbDataWhileDocked(const string& in_portName,
+ int64_t in_transactionId) {
+ bool success = true;
+ bool notSupported = true;
+ std::vector<PortStatus> currentPortStatus;
+
+ ALOGI("Userspace enableUsbDataWhileDocked opID:%ld", in_transactionId);
+
+ int flags = O_RDONLY;
+ ::android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(KPogoMoveDataToUsb, flags)));
+ if (fd != -1) {
+ notSupported = false;
+ success = WriteStringToFile("1", KPogoMoveDataToUsb);
+ if (!success) {
+ ALOGE("Write to move_data_to_usb failed");
+ }
+ }
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyEnableUsbDataWhileDockedStatus(
+ in_portName, notSupported ? Status::NOT_SUPPORTED :
+ success ? 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();
+}
+
+ScopedAStatus Usb::resetUsbPort(const std::string& in_portName, int64_t in_transactionId) {
+ bool result = true;
+ std::vector<PortStatus> currentPortStatus;
+
+ ALOGI("Userspace reset USB Port. opID:%ld", in_transactionId);
+
+ if (!WriteStringToFile("none", PULLUP_PATH)) {
+ ALOGI("Gadget cannot be pulled down");
+ result = false;
+ }
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ::ndk::ScopedAStatus ret = mCallback->notifyResetUsbPortStatus(
+ in_portName, result ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyTransactionStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+
+ return ::ndk::ScopedAStatus::ok();
+}
+
+Status getI2cBusHelper(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;
+
+ getI2cBusHelper(&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();
+}
+
+ScopedAStatus Usb::limitPowerTransfer(const string& in_portName, bool in_limit,
+ int64_t in_transactionId) {
+ bool sessionFail = false, success;
+ std::vector<PortStatus> currentPortStatus;
+ string path, sinkLimitEnablePath, currentLimitPath, sourceLimitEnablePath;
+
+ getI2cBusHelper(&path);
+ sinkLimitEnablePath = kI2CPath + path + "/" + kSinkLimitEnable;
+ sourceLimitEnablePath = kI2CPath + path + "/" + kSourceLimitEnable;
+ currentLimitPath = kI2CPath + path + "/" + kSinkLimitCurrent;
+
+ pthread_mutex_lock(&mLock);
+ if (in_limit) {
+ success = WriteStringToFile("0", currentLimitPath);
+ if (!success) {
+ ALOGE("Failed to set sink current limit");
+ sessionFail = true;
+ }
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", sinkLimitEnablePath);
+ if (!success) {
+ ALOGE("Failed to %s sink current limit: %s", in_limit ? "enable" : "disable",
+ sinkLimitEnablePath.c_str());
+ sessionFail = true;
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", sourceLimitEnablePath);
+ if (!success) {
+ ALOGE("Failed to %s source current limit: %s", in_limit ? "enable" : "disable",
+ sourceLimitEnablePath.c_str());
+ sessionFail = true;
+ }
+ ALOGI("limitPowerTransfer limit:%c opId:%ld", in_limit ? 'y' : 'n', in_transactionId);
+ if (mCallback != NULL && in_transactionId >= 0) {
+ ScopedAStatus ret = mCallback->notifyLimitPowerTransferStatus(
+ in_portName, in_limit, sessionFail ? Status::ERROR : Status::SUCCESS,
+ in_transactionId);
+ if (!ret.isOk())
+ ALOGE("limitPowerTransfer 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 queryPowerTransferStatus(std::vector<PortStatus> *currentPortStatus) {
+ string limitedPath, enabled, path;
+
+ getI2cBusHelper(&path);
+ limitedPath = kI2CPath + path + "/" + kSinkLimitEnable;
+ if (!ReadFileToString(limitedPath, &enabled)) {
+ ALOGE("Failed to open limit_sink_enable");
+ return Status::ERROR;
+ }
+
+ enabled = Trim(enabled);
+ (*currentPortStatus)[0].powerTransferLimited = enabled == "1";
+
+ ALOGI("powerTransferLimited:%d", (*currentPortStatus)[0].powerTransferLimited ? 1 : 0);
+ return Status::SUCCESS;
+}
+
+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);
+
+ bool dataEnabled = true;
+ string pogoUsbActive = "0";
+ if (ReadFileToString(string(kPogoUsbActive), &pogoUsbActive) &&
+ stoi(Trim(pogoUsbActive)) == 1) {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_DOCK);
+ dataEnabled = false;
+ }
+ if (!usb->mUsbDataEnabled) {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_FORCE);
+ dataEnabled = false;
+ }
+ if (dataEnabled) {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::ENABLED);
+ }
+
+ // When connected return powerBrickStatus
+ if (port.second) {
+ string usbType;
+ if (ReadFileToString(string(kPowerSupplyUsbType), &usbType)) {
+ if (strstr(usbType.c_str(), "[D")) {
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::CONNECTED;
+ } else if (strstr(usbType.c_str(), "[U")) {
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::UNKNOWN;
+ } else {
+ (*currentPortStatus)[i].powerBrickStatus =
+ PowerBrickStatus::NOT_CONNECTED;
+ }
+ } else {
+ ALOGE("Error while reading usb_type");
+ }
+ } else {
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::NOT_CONNECTED;
+ }
+
+ 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,
+ dataEnabled ? 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);
+ queryPowerTransferStatus(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")) ||
+ !strncmp(cp, "DRIVER=pogo-transport",
+ strlen("DRIVER=pogo-transport")) ||
+ !strncmp(cp, "POWER_SUPPLY_NAME=usb",
+ strlen("POWER_SUPPLY_NAME=usb"))) {
+ 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..1a93e19
--- /dev/null
+++ b/usb/usb/Usb.h
@@ -0,0 +1,99 @@
+/*
+ * 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;
+ ScopedAStatus enableUsbDataWhileDocked(const string& in_portName,
+ int64_t in_transactionId) override;
+ ScopedAStatus limitPowerTransfer(const string& in_portName, bool in_limit,
+ int64_t in_transactionId) override;
+ ScopedAStatus resetUsbPort(const string& in_portName, 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..5b966c6
--- /dev/null
+++ b/usb/usb/android.hardware.usb-service.rc
@@ -0,0 +1,53 @@
+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/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_source_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_source_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_source_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_source_enable
+ 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
+ chown root system /sys/devices/platform/google,pogo/move_data_to_usb
+ 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
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/google,pogo/move_data_to_usb
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
+}
diff --git a/uwb/calibration/init.uwb.calib.sh b/uwb/calibration/init.uwb.calib.sh
new file mode 100644
index 0000000..a604885
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.sh
@@ -0,0 +1,57 @@
+#!/vendor/bin/sh
+if [ -z "$2" ]
+then
+ echo "usage is $0 input-calibration output_calibration"
+ exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+ touch $OUTPUT_CALIB
+ chmod 0600 $OUTPUT_CALIB
+ file="$1"
+ while IFS=, read -r f1 f2
+ do
+ case $f1 in
+ "UWB_cal_tx_xtal_reg_final_value")
+ if [ $((0x$f2)) -gt 63 ]; then
+ f2=63
+ fi
+ echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH5_tx_ant_delay_cal_data")
+ echo 'ant0.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH5_rx_ant_delay_cal_data")
+ echo 'ant1.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH9_tx_ant_delay_cal_data")
+ echo 'ant0.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH9_rx_ant_delay_cal_data")
+ echo 'ant1.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_RX2_CH5_cal_pdoa_data")
+ # float value * 2048
+ #/vendor/bin/sh does not support "bc"
+ base=2048
+ ones=${f2%%.*}
+ dec=${f2#*.}
+ ones="$(($ones*$base))"
+ if [ ${#dec} -eq 2 ]; then
+ dec="$(($dec*$base/100))"
+ echo 'ant1.ant3.ch5.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+ fi
+ ;;
+ "UWB_RX2_CH9_cal_pdoa_data")
+ base=2048
+ ones=${f2%%.*}
+ dec=${f2#*.}
+ ones="$(($ones*$base))"
+ if [ ${#dec} -eq 2 ]; then
+ dec="$(($dec*$base/100))"
+ echo 'ant1.ant3.ch9.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+ fi
+ esac
+ done <"$file"
+ exit 0
+fi
diff --git a/uwb/calibration/init.uwb.calib.xtal.sh b/uwb/calibration/init.uwb.calib.xtal.sh
new file mode 100644
index 0000000..efdfd6b
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.xtal.sh
@@ -0,0 +1,25 @@
+#!/vendor/bin/sh
+# only use xtal_trim from factory calibration
+if [ -z "$2" ]
+then
+ echo "usage is $0 input-calibration output_calibration"
+ exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+ touch $OUTPUT_CALIB
+ chmod 0644 $OUTPUT_CALIB
+ file="$1"
+ while IFS=, read -r f1 f2
+ do
+ case $f1 in
+ "UWB_cal_tx_xtal_reg_final_value")
+ if [ $((0x$f2)) -gt 63 ]; then
+ f2=63
+ fi
+ echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ esac
+ done <"$file"
+ exit 0
+fi
diff --git a/uwb/uwb.mk b/uwb/uwb.mk
index 72663b4..58cdc3c 100644
--- a/uwb/uwb.mk
+++ b/uwb/uwb.mk
@@ -35,7 +35,8 @@
$(LOCAL_UWB_CAL_DIR)/UWB-calibration-tj.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-tj.conf \
$(LOCAL_UWB_CAL_DIR)/UWB-calibration-tm.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-tm.conf \
$(LOCAL_UWB_CAL_DIR)/UWB-calibration-ua.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-ua.conf \
- $(LOCAL_UWB_CAL_DIR)/UWB-calibration-uz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-uz.conf
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-uz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-uz.conf \
+ $(LOCAL_UWB_CAL_DIR)/init.uwb.calib.xtal.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.uwb.calib.sh \
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.uwb.xml:$(TARGET_COPY_OUT_SYSTEM_EXT)/etc/permissions/android.hardware.uwb.xml
diff --git a/vendor_dlkm.blocklist b/vendor_dlkm.blocklist
deleted file mode 100644
index b259ab6..0000000
--- a/vendor_dlkm.blocklist
+++ /dev/null
@@ -1,15 +0,0 @@
-blocklist bcmdhd43752
-blocklist bcmdhd4389
-blocklist cl_dsp
-blocklist drv2624
-blocklist ftm5
-blocklist input-cs40l26-i2c
-blocklist pktgen
-blocklist sec_touch
-blocklist snd-soc-cs35l41-i2c
-blocklist snd-soc-cs35l41-spi
-blocklist st33spi
-blocklist st54spi
-blocklist uwb_desense.ko
-blocklist uwb-hal.ko
-blocklist uwbcore.ko
diff --git a/wifi/BoardConfig-wifi.mk b/wifi/BoardConfig-wifi.mk
new file mode 100644
index 0000000..58a9778
--- /dev/null
+++ b/wifi/BoardConfig-wifi.mk
@@ -0,0 +1,33 @@
+#
+# 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.
+#
+
+# WiFi
+BOARD_WLAN_DEVICE := bcmdhd
+BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
+BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd
+WPA_SUPPLICANT_VERSION := VER_0_8_X
+BOARD_WPA_SUPPLICANT_DRIVER := NL80211
+BOARD_HOSTAPD_DRIVER := NL80211
+# Wifi interface combination - {1 STA + 1 AP} or {1 STA + 1 AP_BRIDGED} or {1 STA + 1 P2P}
+# or {1 STA + 1 NAN} or {2 STA}
+WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{P2P, NAN, AP, AP_BRIDGED}, 1}}, {{{STA}, 2}}
+WIFI_FEATURE_WIFI_EXT_HAL := true
+WIFI_FEATURE_IMU_DETECTION := true
+# Avoid Wifi reset on MAC Address change
+WIFI_AVOID_IFACE_RESET_MAC_CHANGE := true
+WIFI_FEATURE_HOSTAPD_11AX := true
+BOARD_HOSTAPD_CONFIG_80211W_MFP_OPTIONAL := true
+