diff --git a/OWNERS b/OWNERS index 5524a1f..b511997 100644 --- a/OWNERS +++ b/OWNERS @@ -1,4 +1,4 @@ per-file powerhint.json = jychen@google.com,jenhaochen@google.com,wvw@google.com,joaodias@google.com # per-file for Pixel device makefiles, see go/pixel-device-mk-owner-checklist for details. -per-file *.mk,*/BoardConfig.mk=file:device/google/gs-common:main:/MK_OWNERS +per-file *.mk,*/BoardConfig.mk,{**/,}Android.bp=file:device/google/gs-common:main:/MK_OWNERS diff --git a/device-felix.mk b/device-felix.mk index 80ac10f..0812269 100644 --- a/device-felix.mk +++ b/device-felix.mk @@ -217,9 +217,34 @@ PRODUCT_SOONG_NAMESPACES += \ device/google/felix # Increment the SVN for any official public releases -PRODUCT_VENDOR_PROPERTIES += \ - ro.vendor.build.svn=53 +ifdef RELEASE_SVN_FELIX +TARGET_SVN ?= $(RELEASE_SVN_FELIX) +else +# Set this for older releases that don't use build flag +TARGET_SVN ?= 55 +endif +PRODUCT_VENDOR_PROPERTIES += \ + ro.vendor.build.svn=$(TARGET_SVN) + +# Set device family property for SMR +PRODUCT_PROPERTY_OVERRIDES += \ + ro.build.device_family=F10 + +# Set build properties for SMR builds +ifeq ($(RELEASE_IS_SMR), true) + ifneq (,$(RELEASE_BASE_OS_FELIX)) + PRODUCT_BASE_OS := $(RELEASE_BASE_OS_FELIX) + endif +endif + +# Set build properties for EMR builds +ifeq ($(RELEASE_IS_EMR), true) + ifneq (,$(RELEASE_BASE_OS_FELIX)) + PRODUCT_PROPERTY_OVERRIDES += \ + ro.build.version.emergency_base_os=$(RELEASE_BASE_OS_FELIX) + endif +endif # Vibrator HAL $(call soong_config_set,haptics,kernel_ver,v$(subst .,_,$(TARGET_LINUX_KERNEL_VERSION))) PRODUCT_VENDOR_PROPERTIES +=\ @@ -229,6 +254,10 @@ PRODUCT_VENDOR_PROPERTIES +=\ persist.vendor.vibrator.hal.chirp.enabled=0 ACTUATOR_MODEL := luxshare_ict_lt_xlra1906d +# Override Output Distortion Gain +PRODUCT_VENDOR_PROPERTIES += \ + vendor.audio.hapticgenerator.distortion.output.gain=0.52 + # Fingerprint include device/google/gs101/fingerprint/fpc1540/sw42/fpc1540.mk FPC_MODULE_TYPE=1542_C @@ -279,14 +308,26 @@ PRODUCT_COPY_FILES += \ # Location ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) PRODUCT_COPY_FILES += \ - device/google/felix/location/gps.xml.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml \ device/google/felix/location/lhd.conf.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/lhd.conf \ device/google/felix/location/scd.conf.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/scd.conf + ifneq (,$(filter 6.1, $(TARGET_LINUX_KERNEL_VERSION))) + PRODUCT_COPY_FILES += \ + device/google/felix/location/gps.6.1.xml.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml + else + PRODUCT_COPY_FILES += \ + device/google/felix/location/gps.xml.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml + endif else PRODUCT_COPY_FILES += \ - device/google/felix/location/gps_user.xml.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml \ device/google/felix/location/lhd_user.conf.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/lhd.conf \ device/google/felix/location/scd_user.conf.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/scd.conf + ifneq (,$(filter 6.1, $(TARGET_LINUX_KERNEL_VERSION))) + PRODUCT_COPY_FILES += \ + device/google/felix/location/gps_user.6.1.xml.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml + else + PRODUCT_COPY_FILES += \ + device/google/felix/location/gps_user.xml.f10:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml + endif endif PRODUCT_PACKAGES += \ @@ -405,3 +446,6 @@ PRODUCT_PACKAGES += \ NoCutoutOverlay \ AvoidAppsInCutoutOverlay +# Bluetooth device id +PRODUCT_PRODUCT_PROPERTIES += \ + bluetooth.device_id.product_id=20494 diff --git a/device_framework_matrix_product_felix.xml b/device_framework_matrix_product_felix.xml index 475edd2..492724d 100644 --- a/device_framework_matrix_product_felix.xml +++ b/device_framework_matrix_product_felix.xml @@ -1,7 +1,7 @@ com.google.hardware.pixel.display - 12 + 13 IDisplay secondary diff --git a/location/gps.6.1.xml.f10 b/location/gps.6.1.xml.f10 new file mode 100644 index 0000000..fbf2d67 --- /dev/null +++ b/location/gps.6.1.xml.f10 @@ -0,0 +1,106 @@ + + + + + + + + + + diff --git a/location/gps_user.6.1.xml.f10 b/location/gps_user.6.1.xml.f10 new file mode 100644 index 0000000..e4f32da --- /dev/null +++ b/location/gps_user.6.1.xml.f10 @@ -0,0 +1,105 @@ + + + + + + + + + + diff --git a/powerhint.json b/powerhint.json index 926d7c4..96d7cc7 100644 --- a/powerhint.json +++ b/powerhint.json @@ -1959,18 +1959,6 @@ "Duration": 50, "Value": "1" }, - { - "PowerHint": "THERMAL_FLASH_LED_REDUCE_CRITICAL", - "Node": "LimitFlashCurrent", - "Duration": 0, - "Value": "100" - }, - { - "PowerHint": "THERMAL_FLASH_LED_REDUCE_NONE", - "Node": "LimitFlashCurrent", - "Duration": 0, - "Value": "1500" - }, { "PowerHint": "EXPENSIVE_RENDERING", "Node": "PowerHALRenderingState", @@ -2209,11 +2197,12 @@ "TargetTimeFactor": 1.0, "StaleTimeFactor": 15.0, "HeuristicBoost_On": true, - "HBoostOnMissedCycles": 8, - "HBoostOffMaxAvgRatio": 4.0, - "HBoostOffMissedCycles": 5, - "HBoostPidPuFactor": 0.5, - "HBoostUclampMin": 722, + "HBoostModerateJankThreshold": 2, + "HBoostOffMaxAvgDurRatio": 4.0, + "HBoostSevereJankPidPu": 0.5, + "HBoostSevereJankThreshold": 8, + "HBoostUclampMinCeilingRange": [480, 722], + "HBoostUclampMinFloorRange": [230, 410], "JankCheckTimeFactor": 1.2, "LowFrameRateThreshold": 25, "MaxRecordsNum": 300 @@ -2244,11 +2233,12 @@ "TargetTimeFactor": 1.0, "StaleTimeFactor": 15.0, "HeuristicBoost_On": true, - "HBoostOnMissedCycles": 8, - "HBoostOffMaxAvgRatio": 4.0, - "HBoostOffMissedCycles": 5, - "HBoostPidPuFactor": 0.5, - "HBoostUclampMin": 722, + "HBoostModerateJankThreshold": 2, + "HBoostOffMaxAvgDurRatio": 4.0, + "HBoostSevereJankPidPu": 0.5, + "HBoostSevereJankThreshold": 8, + "HBoostUclampMinCeilingRange": [480, 722], + "HBoostUclampMinFloorRange": [230, 410], "JankCheckTimeFactor": 1.2, "LowFrameRateThreshold": 25, "MaxRecordsNum": 300 @@ -2279,11 +2269,12 @@ "TargetTimeFactor": 1.0, "StaleTimeFactor": 15.0, "HeuristicBoost_On": true, - "HBoostOnMissedCycles": 8, - "HBoostOffMaxAvgRatio": 4.0, - "HBoostOffMissedCycles": 5, - "HBoostPidPuFactor": 0.5, - "HBoostUclampMin": 722, + "HBoostModerateJankThreshold": 2, + "HBoostOffMaxAvgDurRatio": 4.0, + "HBoostSevereJankPidPu": 0.5, + "HBoostSevereJankThreshold": 8, + "HBoostUclampMinCeilingRange": [480, 722], + "HBoostUclampMinFloorRange": [230, 410], "JankCheckTimeFactor": 1.2, "LowFrameRateThreshold": 25, "MaxRecordsNum": 300 diff --git a/rro_overlays/NfcOverlay/res/values/config.xml b/rro_overlays/NfcOverlay/res/values/config.xml index 135ed8a..b90278e 100644 --- a/rro_overlays/NfcOverlay/res/values/config.xml +++ b/rro_overlays/NfcOverlay/res/values/config.xml @@ -29,8 +29,8 @@ 30 - 103 - 103 + 44 + 44 true diff --git a/thermal_info_config_felix.json b/thermal_info_config_felix.json index a0bc0f2..a565c93 100644 --- a/thermal_info_config_felix.json +++ b/thermal_info_config_felix.json @@ -550,318 +550,28 @@ "Type":"NPU", "HotThreshold":["NAN", "NAN", "NAN", "NAN", "NAN", "NAN", "NAN"], "Multiplier":0.001 - }, - { - "Name":"battery_cycle", - "Type":"BCL_VOLTAGE", - "Multiplier":1, - "SendCallback":false - }, - { - "Name":"critical-battery-cell", - "Type":"BCL_VOLTAGE", - "VirtualSensor":true, - "Formula":"COUNT_THRESHOLD", - "TriggerSensor": "vdroop1", - "Combination":["battery", "battery_cycle", "vdroop1"], - "Coefficient":[-10000, 400, 1000], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", "NAN", 3.00, "NAN"], - "Multiplier":1, - "SendCallback":true - }, - { - "Name":"FLASH_LED_REDUCE", - "Type":"UNKNOWN", - "VirtualSensor":true, - "Formula":"COUNT_THRESHOLD", - "TriggerSensor": "vdroop1", - "Combination":["battery", "battery_cycle", "vdroop1"], - "Coefficient":[-10000, 400, 1000], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 3.00, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true, - "SendPowerHint":true - }, - { - "Name":"soc", - "Type":"BCL_PERCENTAGE", - "HotThreshold":["NAN", "NAN", 80, "NAN", "NAN", "NAN", "NAN"], - "Multiplier":1 - }, - { - "Name":"BCL_TPU_LOW_TEMP", - "Type":"BCL_CURRENT", - "VirtualSensor":true, - "Formula":"WEIGHTED_AVG", - "TriggerSensor": "ocp_tpu", - "Combination":["ocp_tpu", "battery"], - "Coefficient":[1, -10], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 13000, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true, - "BindedCdevInfo": [ - { - "CdevRequest": "tpu_cooling", - "LimitInfo": [0, 0, 0, 0, 7, 7, 7] - } - ] - }, - { - "Name":"BCL_GPU_LOW_TEMP", - "Type":"BCL_CURRENT", - "VirtualSensor":true, - "Formula":"WEIGHTED_AVG", - "TriggerSensor": "ocp_gpu", - "Combination":["ocp_gpu", "battery"], - "Coefficient":[1, -10], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 13000, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true, - "BindedCdevInfo": [ - { - "CdevRequest": "thermal-gpufreq-0", - "LimitInfo": [0, 0, 0, 0, 9, 9, 9] - } - ] - }, - { - "Name":"BCL_BATOILO_GPU_LOW_TEMP", - "Type":"BCL_CURRENT", - "VirtualSensor":true, - "Formula":"COUNT_THRESHOLD", - "TriggerSensor": "batoilo", - "Combination":["batoilo", "ocp_gpu", "battery"], - "Coefficient":[5000, 12000, -1000 ], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 3.0, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true, - "BindedCdevInfo": [ - { - "CdevRequest": "thermal-gpufreq-0", - "LimitInfo": [0, 0, 0, 0, 9, 9, 9] - } - ] - }, - { - "Name":"BCL_BATOILO_TPU_LOW_TEMP", - "Type":"BCL_CURRENT", - "VirtualSensor":true, - "Formula":"COUNT_THRESHOLD", - "TriggerSensor": "batoilo", - "Combination":["batoilo", "ocp_tpu", "battery"], - "Coefficient":[5000, 12000, -1000], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 3.0, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true, - "BindedCdevInfo": [ - { - "CdevRequest": "tpu_cooling", - "LimitInfo": [0, 0, 0, 0, 7, 7, 7] - } - ] - }, - { - "Name":"BCL_BATOILO_GPU", - "Type":"BCL_CURRENT", - "VirtualSensor":true, - "Formula":"COUNT_THRESHOLD", - "TriggerSensor": "batoilo", - "Combination":["batoilo", "ocp_gpu"], - "Coefficient":[5000, 12000], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 2.0, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true, - "BindedCdevInfo": [ - { - "CdevRequest": "thermal-gpufreq-0", - "LimitInfo": [0, 0, 0, 0, 4, 4, 4] - } - ] - }, - { - "Name":"BCL_BATOILO_TPU", - "Type":"BCL_CURRENT", - "VirtualSensor":true, - "Formula":"COUNT_THRESHOLD", - "TriggerSensor": "batoilo", - "Combination":[ - "batoilo", - "ocp_tpu" - ], - "Coefficient":[5000, 12000], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 2.0, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true, - "BindedCdevInfo": [ - { - "CdevRequest": "tpu_cooling", - "LimitInfo": [0, 0, 0, 0, 6, 6, 6] - } - ] - }, - { - "Name":"batoilo", - "Type":"BCL_CURRENT", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 5000, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1, - "SendCallback":true, - "PollingDelay":0, - "PassiveDelay":60000, - "BindedCdevInfo": [ - { - "CdevRequest": "thermal-cpufreq-2", - "LimitInfo": [0, 0, 0, 0, 7, 7, 7] - }, - { - "CdevRequest": "thermal-gpufreq-0", - "LimitInfo": [0, 0, 0, 0, 3, 3, 3] - }, - { - "CdevRequest": "tpu_cooling", - "LimitInfo": [0, 0, 0, 0, 5, 5, 5] - } - ] - }, - { - "Name":"BCL_AUDIO_BAACL", - "Type":"BCL_VOLTAGE", - "VirtualSensor":true, - "Formula":"COUNT_THRESHOLD", - "TriggerSensor": "soc", - "Combination":["battery", "soc"], - "Coefficient":[-10000, 80], - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 2.0, "NAN", "NAN"], - "Multiplier":1, - "SendCallback":true - }, - { - "Name":"vdroop1", - "Type":"BCL_VOLTAGE", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 1000, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1, - "SendCallback":true, - "PollingDelay":0, - "PassiveDelay":60000, - "BindedCdevInfo": [ - { - "CdevRequest": "thermal-cpufreq-2", - "LimitInfo": [0, 0, 0, 0, 7, 7, 7] - }, - { - "CdevRequest": "thermal-gpufreq-0", - "LimitInfo": [0, 0, 0, 0, 2, 2, 2] - }, - { - "CdevRequest": "tpu_cooling", - "LimitInfo": [0, 0, 0, 0, 3, 3, 3] - } - ] - }, - { - "Name":"vdroop2", - "Type":"BCL_VOLTAGE", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 1200, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1, - "SendCallback":true, - "PollingDelay":0, - "PassiveDelay":60000, - "BindedCdevInfo": [ - { - "CdevRequest": "thermal-cpufreq-2", - "LimitInfo": [0, 0, 0, 0, 7, 7, 7] - }, - { - "CdevRequest": "thermal-gpufreq-0", - "LimitInfo": [0, 0, 0, 0, 4, 4, 4] - }, - { - "CdevRequest": "tpu_cooling", - "LimitInfo": [0, 0, 0, 0, 3, 3, 3] - } - ] - }, - { - "Name":"smpl_gm", - "Type":"BCL_VOLTAGE", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 1100, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1, - "SendCallback":true, - "PollingDelay":0, - "PassiveDelay":60000, - "BindedCdevInfo": [ - { - "CdevRequest": "thermal-cpufreq-2", - "LimitInfo": [0, 0, 0, 0, 7, 7, 7] - }, - { - "CdevRequest": "thermal-gpufreq-0", - "LimitInfo": [0, 0, 0, 0, 3, 3, 3] - }, - { - "CdevRequest": "tpu_cooling", - "LimitInfo": [0, 0, 0, 0, 3, 3, 3] - } - ] - }, - { - "Name":"ocp_cpu1", - "Type":"BCL_CURRENT", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 8000, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1, - "Hidden":true - }, - { - "Name":"ocp_cpu2", - "Type":"BCL_CURRENT", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 12000, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1, - "Hidden":true - }, - { - "Name":"ocp_tpu", - "Type":"BCL_CURRENT", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 12000, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1 - }, - { - "Name":"ocp_gpu", - "Type":"BCL_CURRENT", - "HotThreshold":["NAN", "NAN", "NAN", "NAN", 12000, "NAN", "NAN"], - "HotHysteresis":[0.0, 0.0, 0.0, 0.0, 100, 0.0, 0.0], - "Multiplier":1 } ], "CoolingDevices":[ { "Name":"thermal-cpufreq-0", "Type":"CPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-0/user_vote", - "State2Power":[516, 456, 392, 296, 264, 216, 184, 140, 100, 68, 28] + "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-0/user_vote" }, { "Name":"thermal-cpufreq-1", "Type":"CPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-1/user_vote", - "State2Power":[2466, 2166, 1840, 1544, 1260, 1024, 816, 642, 538, 410, 342, 276, 224, 162, 104] + "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-1/user_vote" }, { "Name":"thermal-cpufreq-2", "Type":"CPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-2/user_vote", - "State2Power":[4920, 4614, 4092, 3684, 3198, 2820, 2354, 2184, 1862, 1476, 1338, 1110, 928, 738, 552, 450, 362, 188] + "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-2/user_vote" }, { "Name":"thermal-gpufreq-0", "Type":"GPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-gpufreq-0/user_vote", - "State2Power":[1925, 1528, 1258, 928, 795, 703, 573, 481, 396, 314, 236] + "WritePath":"/dev/thermal/cdev-by-name/thermal-gpufreq-0/user_vote" }, { "Name":"chg_mdis", diff --git a/thermal_info_config_proactive_skin_felix.json b/thermal_info_config_proactive_skin_felix.json index 5c10f4b..e45ecb5 100644 --- a/thermal_info_config_proactive_skin_felix.json +++ b/thermal_info_config_proactive_skin_felix.json @@ -872,26 +872,22 @@ { "Name":"thermal-cpufreq-0", "Type":"CPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-0/user_vote", - "State2Power":[516, 456, 392, 296, 264, 216, 184, 140, 100, 68, 28] + "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-0/user_vote" }, { "Name":"thermal-cpufreq-1", "Type":"CPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-1/user_vote", - "State2Power":[2466, 2166, 1840, 1544, 1260, 1024, 816, 642, 538, 410, 342, 276, 224, 162, 104] + "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-1/user_vote" }, { "Name":"thermal-cpufreq-2", "Type":"CPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-2/user_vote", - "State2Power":[4920, 4614, 4092, 3684, 3198, 2820, 2354, 2184, 1862, 1476, 1338, 1110, 928, 738, 552, 450, 362, 188] + "WritePath":"/dev/thermal/cdev-by-name/thermal-cpufreq-2/user_vote" }, { "Name":"thermal-gpufreq-0", "Type":"GPU", - "WritePath":"/dev/thermal/cdev-by-name/thermal-gpufreq-0/user_vote", - "State2Power":[1925, 1528, 1258, 928, 795, 703, 573, 481, 396, 314, 236] + "WritePath":"/dev/thermal/cdev-by-name/thermal-gpufreq-0/user_vote" }, { "Name":"chg_mdis", diff --git a/vibrator/common/HardwareBase.cpp b/vibrator/common/HardwareBase.cpp index 7d61b57..329293a 100644 --- a/vibrator/common/HardwareBase.cpp +++ b/vibrator/common/HardwareBase.cpp @@ -40,10 +40,6 @@ void HwApiBase::saveName(const std::string &name, const std::ios *stream) { mNames[stream] = name; } -bool HwApiBase::has(const std::ios &stream) { - return !!stream; -} - void HwApiBase::debug(int fd) { dprintf(fd, "Kernel:\n"); diff --git a/vibrator/common/HardwareBase.h b/vibrator/common/HardwareBase.h index 448d29c..a957848 100644 --- a/vibrator/common/HardwareBase.h +++ b/vibrator/common/HardwareBase.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "utils.h" @@ -67,7 +68,8 @@ class HwApiBase { void saveName(const std::string &name, const std::ios *stream); template void open(const std::string &name, T *stream); - bool has(const std::ios &stream); + template + bool has(const T &stream); template bool get(T *value, std::istream *stream); template @@ -93,6 +95,16 @@ void HwApiBase::open(const std::string &name, T *stream) { utils::openNoCreate(mPathPrefix + name, stream); } +template +bool HwApiBase::has(const T &stream) { + if constexpr (std::is_same::value || std::is_same::value || + std::is_same::value) + return stream.is_open() && !stream.fail(); + + ALOGE("File stream is not of the correct type"); + return false; +} + template bool HwApiBase::get(T *value, std::istream *stream) { ATRACE_NAME("HwApi::get"); diff --git a/vibrator/common/utils.h b/vibrator/common/utils.h index 188554d..86dd37e 100644 --- a/vibrator/common/utils.h +++ b/vibrator/common/utils.h @@ -110,10 +110,12 @@ inline bool getProperty(const std::string &key, const bool def) { template static void openNoCreate(const std::string &file, T *outStream) { - auto mode = std::is_base_of_v ? std::ios_base::out : std::ios_base::in; + if (!std::filesystem::exists(file)) { + ALOGE("File does not exist: %s", file.c_str()); + return; + } - // Force 'in' mode to prevent file creation - outStream->open(file, mode | std::ios_base::in); + outStream->open(file); if (!*outStream) { ALOGE("Failed to open %s (%d): %s", file.c_str(), errno, strerror(errno)); } diff --git a/vibrator/cs40l26/Hardware.h b/vibrator/cs40l26/Hardware.h index 69cf9ae..e2c2d36 100644 --- a/vibrator/cs40l26/Hardware.h +++ b/vibrator/cs40l26/Hardware.h @@ -78,6 +78,9 @@ class HwApi : public Vibrator::HwApi, private HwApiBase { open("calibration/q_stored", &mQ); open("default/vibe_state", &mVibeState); open("default/num_waves", &mEffectCount); + open("default/braking_time_bank", &mEffectBrakingTimeBank); + open("default/braking_time_index", &mEffectBrakingTimeIndex); + open("default/braking_time_ms", &mEffectBrakingTimeMs); open("default/owt_free_space", &mOwtFreeSpace); open("default/f0_comp_enable", &mF0CompEnable); open("default/redc_comp_enable", &mRedcCompEnable); @@ -89,6 +92,16 @@ class HwApi : public Vibrator::HwApi, private HwApiBase { bool setRedc(std::string value) override { return set(value, &mRedc); } bool setQ(std::string value) override { return set(value, &mQ); } bool getEffectCount(uint32_t *value) override { return get(value, &mEffectCount); } + bool hasEffectBrakingTimeBank() override { return has(mEffectBrakingTimeBank); } + bool setEffectBrakingTimeBank(uint32_t value) override { + return set(value, &mEffectBrakingTimeBank); + } + bool setEffectBrakingTimeIndex(uint32_t value) override { + return set(value, &mEffectBrakingTimeIndex); + } + bool getEffectBrakingTimeMs(uint32_t *value) override { + return get(value, &mEffectBrakingTimeMs); + } bool pollVibeState(uint32_t value, int32_t timeoutMs) override { return poll(value, &mVibeState, timeoutMs); } @@ -282,6 +295,9 @@ class HwApi : public Vibrator::HwApi, private HwApiBase { std::ofstream mRedc; std::ofstream mQ; std::ifstream mEffectCount; + std::ofstream mEffectBrakingTimeBank; + std::ofstream mEffectBrakingTimeIndex; + std::ifstream mEffectBrakingTimeMs; std::ifstream mVibeState; std::ifstream mOwtFreeSpace; std::ofstream mF0CompEnable; diff --git a/vibrator/cs40l26/Vibrator.cpp b/vibrator/cs40l26/Vibrator.cpp index b3ce88e..03f3646 100644 --- a/vibrator/cs40l26/Vibrator.cpp +++ b/vibrator/cs40l26/Vibrator.cpp @@ -58,7 +58,7 @@ static constexpr int8_t MAX_PAUSE_TIMING_ERROR_MS = 1; // ALERT Irq Handling static constexpr uint32_t MAX_TIME_MS = UINT16_MAX; static constexpr auto ASYNC_COMPLETION_TIMEOUT = std::chrono::milliseconds(100); -static constexpr auto POLLING_TIMEOUT = 20; +static constexpr auto POLLING_TIMEOUT = 50; static constexpr int32_t COMPOSE_DELAY_MAX_MS = 10000; /* nsections is 8 bits. Need to preserve 1 section for the first delay before the first effect. */ @@ -485,8 +485,9 @@ Vibrator::Vibrator(std::unique_ptr hwApiDefault, std::unique_ptr h mFfEffects.resize(WAVEFORM_MAX_INDEX); mEffectDurations.resize(WAVEFORM_MAX_INDEX); mEffectDurations = { - 1000, 100, 12, 1000, 300, 130, 150, 500, 100, 5, 12, 1000, 1000, 1000, + 1000, 100, 9, 1000, 300, 130, 150, 500, 100, 5, 12, 1000, 1000, 1000, }; /* 11+3 waveforms. The duration must < UINT16_MAX */ + mEffectBrakingDurations.resize(WAVEFORM_MAX_INDEX); mEffectCustomData.reserve(WAVEFORM_MAX_INDEX); uint8_t effectIndex; @@ -519,6 +520,11 @@ Vibrator::Vibrator(std::unique_ptr hwApiDefault, std::unique_ptr h if (mFfEffects[effectIndex].id != effectIndex) { ALOGW("Unexpected effect index: %d -> %d", effectIndex, mFfEffects[effectIndex].id); } + + if (mHwApiDef->hasEffectBrakingTimeBank()) { + mHwApiDef->setEffectBrakingTimeIndex(effectIndex); + mHwApiDef->getEffectBrakingTimeMs(&mEffectBrakingDurations[effectIndex]); + } } else { /* Initiate placeholders for OWT effects. */ numBytes = effectIndex == WAVEFORM_COMPOSE ? FF_CUSTOM_DATA_LEN_MAX_COMP @@ -677,8 +683,21 @@ Vibrator::Vibrator(std::unique_ptr hwApiDefault, std::unique_ptr h mSupportedPrimitives = defaultSupportedPrimitives; } - mPrimitiveMaxScale = {1.0f, 0.95f, 0.75f, 0.9f, 1.0f, 1.0f, 1.0f, 0.75f, 0.75f}; - mPrimitiveMinScale = {0.0f, 0.01f, 0.11f, 0.23f, 0.0f, 0.25f, 0.02f, 0.03f, 0.16f}; + mPrimitiveMaxScale.resize(WAVEFORM_MAX_INDEX, 100); + mPrimitiveMaxScale[WAVEFORM_CLICK_INDEX] = 95; + mPrimitiveMaxScale[WAVEFORM_THUD_INDEX] = 75; + mPrimitiveMaxScale[WAVEFORM_SPIN_INDEX] = 90; + mPrimitiveMaxScale[WAVEFORM_LIGHT_TICK_INDEX] = 75; + mPrimitiveMaxScale[WAVEFORM_LOW_TICK_INDEX] = 75; + + mPrimitiveMinScale.resize(WAVEFORM_MAX_INDEX, 0); + mPrimitiveMinScale[WAVEFORM_CLICK_INDEX] = 1; + mPrimitiveMinScale[WAVEFORM_THUD_INDEX] = 11; + mPrimitiveMinScale[WAVEFORM_SPIN_INDEX] = 23; + mPrimitiveMinScale[WAVEFORM_SLOW_RISE_INDEX] = 25; + mPrimitiveMinScale[WAVEFORM_QUICK_FALL_INDEX] = 2; + mPrimitiveMinScale[WAVEFORM_LIGHT_TICK_INDEX] = 3; + mPrimitiveMinScale[WAVEFORM_LOW_TICK_INDEX] = 16; // ====== Get GPIO status and init it ================ mGPIOStatus = mHwGPIO->getGPIO(); @@ -850,7 +869,7 @@ ndk::ScopedAStatus Vibrator::getPrimitiveDuration(CompositePrimitive primitive, return status; } - *durationMs = mEffectDurations[effectIndex]; + *durationMs = mEffectDurations[effectIndex] + mEffectBrakingDurations[effectIndex]; } else { *durationMs = 0; } @@ -863,7 +882,6 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector &composi ALOGD("Vibrator::compose"); uint16_t size; uint16_t nextEffectDelay; - uint16_t totalDuration = 0; if (composite.size() > COMPOSE_SIZE_MAX || composite.empty()) { return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); @@ -871,7 +889,6 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector &composi /* Check if there is a wait before the first effect. */ nextEffectDelay = composite.front().delayMs; - totalDuration += nextEffectDelay; if (nextEffectDelay > COMPOSE_DELAY_MAX_MS || nextEffectDelay < 0) { return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); } else if (nextEffectDelay > 0) { @@ -904,16 +921,7 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector &composi if (!status.isOk()) { return status; } - // Add a max and min threshold to prevent the device crash(overcurrent) or no - // feeling - if (effectScale > mPrimitiveMaxScale[static_cast(e_curr.primitive)]) { - effectScale = mPrimitiveMaxScale[static_cast(e_curr.primitive)]; - } - if (effectScale < mPrimitiveMinScale[static_cast(e_curr.primitive)]) { - effectScale = mPrimitiveMinScale[static_cast(e_curr.primitive)]; - } effectVolLevel = intensityToVolLevel(effectScale, effectIndex); - totalDuration += mEffectDurations[effectIndex]; } /* Fetch the next composite effect delay and fill into the current section */ @@ -926,13 +934,14 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector &composi return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); } nextEffectDelay = delay; - totalDuration += delay; } if (effectIndex == 0 && nextEffectDelay == 0) { return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); } + nextEffectDelay += mEffectBrakingDurations[effectIndex]; + ch.constructComposeSegment(effectVolLevel, effectIndex, 0 /*repeat*/, 0 /*flags*/, nextEffectDelay /*delay*/); } @@ -1395,24 +1404,31 @@ binder_status_t Vibrator::dump(int fd, const char **args, uint32_t numArgs) { dprintf(fd, " FF effect:\n"); dprintf(fd, " Physical waveform:\n"); - dprintf(fd, "==== Base ====\n\tId\tIndex\tt ->\tt'\ttrigger button\n"); + dprintf(fd, "==== Base ====\n\tId\tIndex\tt ->\tt'\tBrake\ttrigger button\n"); uint8_t effectId; for (effectId = 0; effectId < WAVEFORM_MAX_PHYSICAL_INDEX; effectId++) { - dprintf(fd, "\t%d\t%d\t%d\t%d\t%X\n", mFfEffects[effectId].id, + dprintf(fd, "\t%d\t%d\t%d\t%d\t%d\t%X\n", mFfEffects[effectId].id, mFfEffects[effectId].u.periodic.custom_data[1], mEffectDurations[effectId], - mFfEffects[effectId].replay.length, mFfEffects[effectId].trigger.button); + mFfEffects[effectId].replay.length, mEffectBrakingDurations[effectId], + mFfEffects[effectId].trigger.button); } if (mIsDual) { - dprintf(fd, "==== Flip ====\n\tId\tIndex\tt ->\tt'\ttrigger button\n"); + dprintf(fd, "==== Flip ====\n\tId\tIndex\tt ->\tt'\tBrake\ttrigger button\n"); for (effectId = 0; effectId < WAVEFORM_MAX_PHYSICAL_INDEX; effectId++) { - dprintf(fd, "\t%d\t%d\t%d\t%d\t%X\n", mFfEffectsDual[effectId].id, + dprintf(fd, "\t%d\t%d\t%d\t%d\t%d\t%X\n", mFfEffectsDual[effectId].id, mFfEffectsDual[effectId].u.periodic.custom_data[1], mEffectDurations[effectId], - mFfEffectsDual[effectId].replay.length, + mFfEffectsDual[effectId].replay.length, mEffectBrakingDurations[effectId], mFfEffectsDual[effectId].trigger.button); } } - dprintf(fd, "Base: OWT waveform:\n"); + dprintf(fd, "==== Scales ====\n\tId\tMinScale\tMaxScale\n"); + for (effectId = 0; effectId < WAVEFORM_MAX_PHYSICAL_INDEX; effectId++) { + dprintf(fd, "\t%d\t%d\t\t%d\n", effectId, mPrimitiveMinScale[effectId], + mPrimitiveMaxScale[effectId]); + } + + dprintf(fd, "\nBase: OWT waveform:\n"); dprintf(fd, "\tId\tBytes\tData\tt\ttrigger button\n"); for (effectId = WAVEFORM_MAX_PHYSICAL_INDEX; effectId < WAVEFORM_MAX_INDEX; effectId++) { uint32_t numBytes = mFfEffects[effectId].u.periodic.custom_len * 2; @@ -1520,10 +1536,6 @@ ndk::ScopedAStatus Vibrator::getSimpleDetails(Effect effect, EffectStrength stre case Effect::HEAVY_CLICK: effectIndex = WAVEFORM_CLICK_INDEX; intensity *= 1.0f; - // WAVEFORM_CLICK_INDEX is 2, but the primitive CLICK index is 1. - if (intensity > mPrimitiveMaxScale[WAVEFORM_CLICK_INDEX - 1]) { - intensity = mPrimitiveMaxScale[WAVEFORM_CLICK_INDEX - 1]; - } break; default: return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); @@ -1765,6 +1777,17 @@ uint32_t Vibrator::intensityToVolLevel(float intensity, uint32_t effectIndex) { volLevel = calc(intensity, mClickEffectVol); break; } + + // The waveform being played must fall within the allowable scale range + if (effectIndex < WAVEFORM_MAX_INDEX) { + if (volLevel > mPrimitiveMaxScale[effectIndex]) { + volLevel = mPrimitiveMaxScale[effectIndex]; + } + if (volLevel < mPrimitiveMinScale[effectIndex]) { + volLevel = mPrimitiveMinScale[effectIndex]; + } + } + return volLevel; } diff --git a/vibrator/cs40l26/Vibrator.h b/vibrator/cs40l26/Vibrator.h index 8f89713..b1d4e5d 100644 --- a/vibrator/cs40l26/Vibrator.h +++ b/vibrator/cs40l26/Vibrator.h @@ -62,6 +62,15 @@ class Vibrator : public BnVibrator { virtual bool setQ(std::string value) = 0; // Reports the number of effect waveforms loaded in firmware. virtual bool getEffectCount(uint32_t *value) = 0; + // Checks whether braking time bank is supported. + virtual bool hasEffectBrakingTimeBank() = 0; + // Specifies the bank of the effect for querying braking time. + // 0: RAM bank, 2: OWT bank + virtual bool setEffectBrakingTimeBank(uint32_t value) = 0; + // Specifies the index of an effect whose braking time is to be read. + virtual bool setEffectBrakingTimeIndex(uint32_t value) = 0; + // Gets the braking time duration of SVC effects (returns 0 if not SVC). + virtual bool getEffectBrakingTimeMs(uint32_t *value) = 0; // Blocks until timeout or vibrator reaches desired state // (2 = ASP enabled, 1 = haptic enabled, 0 = disabled). virtual bool pollVibeState(uint32_t value, int32_t timeoutMs = -1) = 0; @@ -218,6 +227,7 @@ class Vibrator : public BnVibrator { std::vector mFfEffects; std::vector mFfEffectsDual; std::vector mEffectDurations; + std::vector mEffectBrakingDurations; std::vector> mEffectCustomData; std::vector> mEffectCustomDataDual; std::future mAsyncHandle; @@ -233,8 +243,8 @@ class Vibrator : public BnVibrator { bool mIsChirpEnabled; uint32_t mSupportedPrimitivesBits = 0x0; std::vector mSupportedPrimitives; - std::vector mPrimitiveMaxScale; - std::vector mPrimitiveMinScale; + std::vector mPrimitiveMaxScale; + std::vector mPrimitiveMinScale; bool mConfigHapticAlsaDeviceDone{false}; bool mGPIOStatus; bool mIsDual{false}; diff --git a/vibrator/cs40l26/android.hardware.vibrator-service.cs40l26-private.rc b/vibrator/cs40l26/android.hardware.vibrator-service.cs40l26-private.rc index e45356e..01b37bb 100644 --- a/vibrator/cs40l26/android.hardware.vibrator-service.cs40l26-private.rc +++ b/vibrator/cs40l26/android.hardware.vibrator-service.cs40l26-private.rc @@ -14,6 +14,9 @@ on property:vendor.all.modules.ready=1 chown system system /sys/bus/i2c/devices/15-0043/calibration/redc_stored chown system system /sys/bus/i2c/devices/15-0043/default/vibe_state chown system system /sys/bus/i2c/devices/15-0043/default/num_waves + chown system system /sys/bus/i2c/devices/15-0043/default/braking_time_bank + chown system system /sys/bus/i2c/devices/15-0043/default/braking_time_index + chown system system /sys/bus/i2c/devices/15-0043/default/braking_time_ms chown system system /sys/bus/i2c/devices/15-0043/default/f0_offset chown system system /sys/bus/i2c/devices/15-0043/default/owt_free_space chown system system /sys/bus/i2c/devices/15-0043/default/f0_comp_enable @@ -25,6 +28,9 @@ on property:vendor.all.modules.ready=1 chown system system /sys/bus/i2c/devices/15-0042/calibration/redc_stored chown system system /sys/bus/i2c/devices/15-0042/default/vibe_state chown system system /sys/bus/i2c/devices/15-0042/default/num_waves + chown system system /sys/bus/i2c/devices/15-0042/default/braking_time_bank + chown system system /sys/bus/i2c/devices/15-0042/default/braking_time_index + chown system system /sys/bus/i2c/devices/15-0042/default/braking_time_ms chown system system /sys/bus/i2c/devices/15-0042/default/f0_offset chown system system /sys/bus/i2c/devices/15-0042/default/owt_free_space chown system system /sys/bus/i2c/devices/15-0042/default/f0_comp_enable @@ -56,6 +62,9 @@ service vendor.vibrator.cs40l26 /vendor/bin/hw/android.hardware.vibrator-service calibration/q_stored default/vibe_state default/num_waves + default/braking_time_bank + default/braking_time_index + default/braking_time_ms default/f0_offset default/owt_free_space default/f0_comp_enable diff --git a/vibrator/cs40l26/tests/mocks.h b/vibrator/cs40l26/tests/mocks.h index 641aba8..c521b02 100644 --- a/vibrator/cs40l26/tests/mocks.h +++ b/vibrator/cs40l26/tests/mocks.h @@ -39,6 +39,10 @@ class MockApi : public ::aidl::android::hardware::vibrator::Vibrator::HwApi { MOCK_METHOD1(setRedc, bool(std::string value)); MOCK_METHOD1(setQ, bool(std::string value)); MOCK_METHOD1(getEffectCount, bool(uint32_t *value)); + MOCK_METHOD0(hasEffectBrakingTimeBank, bool()); + MOCK_METHOD1(setEffectBrakingTimeBank, bool(uint32_t value)); + MOCK_METHOD1(setEffectBrakingTimeIndex, bool(uint32_t value)); + MOCK_METHOD1(getEffectBrakingTimeMs, bool(uint32_t *value)); MOCK_METHOD2(pollVibeState, bool(uint32_t value, int32_t timeoutMs)); MOCK_METHOD0(hasOwtFreeSpace, bool()); MOCK_METHOD1(getOwtFreeSpace, bool(uint32_t *value)); diff --git a/vibrator/cs40l26/tests/test-vibrator.cpp b/vibrator/cs40l26/tests/test-vibrator.cpp index 3ea6bda..6c8cebb 100644 --- a/vibrator/cs40l26/tests/test-vibrator.cpp +++ b/vibrator/cs40l26/tests/test-vibrator.cpp @@ -74,7 +74,7 @@ static constexpr std::array V_TICK_DEFAULT = {1, 100}; static constexpr std::array V_CLICK_DEFAULT{1, 100}; static constexpr std::array V_LONG_DEFAULT{1, 100}; static constexpr std::array EFFECT_DURATIONS{ - 0, 100, 30, 1000, 300, 130, 150, 500, 100, 15, 20, 1000, 1000, 1000}; + 1000, 100, 9, 1000, 300, 130, 150, 500, 100, 5, 12, 1000, 1000, 1000}; // Constants With Prescribed Values @@ -375,6 +375,11 @@ TEST_F(VibratorTest, Constructor) { .WillOnce(DoAll(SetArgPointee<0>(supportedPrimitivesBits), Return(true))); EXPECT_CALL(*mMockApi, setMinOnOffInterval(MIN_ON_OFF_INTERVAL_US)).WillOnce(Return(true)); + EXPECT_CALL(*mMockApi, setEffectBrakingTimeBank(0)).WillRepeatedly(Return(true)); + for (uint32_t i = 0; i < WAVEFORM_MAX_PHYSICAL_INDEX; i++) { + EXPECT_CALL(*mMockApi, setEffectBrakingTimeIndex(i)).WillRepeatedly(Return(true)); + EXPECT_CALL(*mMockApi, getEffectBrakingTimeMs(_)).WillRepeatedly(Return(true)); + } createVibrator(std::move(mockapi), std::move(mockcal), std::move(mockgpio), false); }