diff --git a/device-felix.mk b/device-felix.mk index a83c16a..69e4375 100644 --- a/device-felix.mk +++ b/device-felix.mk @@ -221,12 +221,30 @@ ifdef RELEASE_SVN_FELIX TARGET_SVN ?= $(RELEASE_SVN_FELIX) else # Set this for older releases that don't use build flag -TARGET_SVN ?= 54 +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 +=\ @@ -236,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 @@ -286,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 += \ @@ -389,7 +423,7 @@ PRODUCT_COPY_FILES += \ # LE Audio Unicast Allowlist PRODUCT_PRODUCT_PROPERTIES += \ - persist.bluetooth.leaudio.allow_list=SM-R510 + persist.bluetooth.leaudio.allow_list=SM-R510,WF-1000XM5 # Bluetooth EWP test tool PRODUCT_PACKAGES_DEBUG += \ @@ -412,3 +446,7 @@ PRODUCT_PACKAGES += \ NoCutoutOverlay \ AvoidAppsInCutoutOverlay +# Bluetooth device id +# Felix: 0x410C +PRODUCT_PRODUCT_PROPERTIES += \ + bluetooth.device_id.product_id=16652 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/felix/BoardConfig.mk b/felix/BoardConfig.mk index fdd4c79..98459d7 100644 --- a/felix/BoardConfig.mk +++ b/felix/BoardConfig.mk @@ -39,6 +39,7 @@ USES_IDISPLAY_INTF_SEC := true include device/google/gs201/BoardConfig-common.mk -include vendor/google_devices/gs201/prebuilts/BoardConfigVendor.mk +include device/google/gs-common/check_current_prebuilt/check_current_prebuilt.mk -include vendor/google_devices/felix/proprietary/BoardConfigVendor.mk include device/google/felix-sepolicy/felix-sepolicy.mk include device/google/felix/wifi/BoardConfig-wifi.mk diff --git a/location/gps.6.1.xml.f10 b/location/gps.6.1.xml.f10 new file mode 100644 index 0000000..69cb18e --- /dev/null +++ b/location/gps.6.1.xml.f10 @@ -0,0 +1,107 @@ + + + + + + + + + + diff --git a/location/gps.xml.f10 b/location/gps.xml.f10 index da3e110..92d3316 100644 --- a/location/gps.xml.f10 +++ b/location/gps.xml.f10 @@ -49,6 +49,7 @@ LtoSyncThresholdDays="1" GnssYearOfHardware="2020" + CpEarlyFixGuardTimeSec="1" CpGuardTimeSec="1" CpLppGuardTimeSec="1" IgnoreInjectedSystemTime="true" @@ -100,6 +101,7 @@ diff --git a/location/gps_user.6.1.xml.f10 b/location/gps_user.6.1.xml.f10 new file mode 100644 index 0000000..db68a27 --- /dev/null +++ b/location/gps_user.6.1.xml.f10 @@ -0,0 +1,106 @@ + + + + + + + + + + diff --git a/location/gps_user.xml.f10 b/location/gps_user.xml.f10 index 19842ca..9ddd3aa 100644 --- a/location/gps_user.xml.f10 +++ b/location/gps_user.xml.f10 @@ -48,6 +48,7 @@ LtoSyncThresholdDays="1" GnssYearOfHardware="2020" + CpEarlyFixGuardTimeSec="1" CpGuardTimeSec="1" CpLppGuardTimeSec="1" IgnoreInjectedSystemTime="true" @@ -99,6 +100,7 @@ diff --git a/manifest.xml b/manifest.xml index ae2f526..a287416 100644 --- a/manifest.xml +++ b/manifest.xml @@ -48,15 +48,6 @@ default - - android.hardware.graphics.mapper - passthrough - 4.0 - - IMapper - default - - android.hardware.graphics.composer hwbinder diff --git a/powerhint.json b/powerhint.json index 926d7c4..1c88dd5 100644 --- a/powerhint.json +++ b/powerhint.json @@ -21,7 +21,8 @@ "1539000", "1352000", "1014000", - "421000" + "421000", + "546000" ], "ResetOnInit": true }, @@ -884,6 +885,12 @@ "Duration": 50, "Value": "302000" }, + { + "PowerHint": "DISPLAY_INACTIVE", + "Node": "MemFreq", + "Duration": 0, + "Value": "421000" + }, { "PowerHint": "CPU_LOAD_RESET", "Node": "MemFreq", @@ -1959,18 +1966,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 +2204,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 +2240,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 +2276,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_charge_felix.json b/thermal_info_config_charge_felix.json index b3731fc..2653344 100644 --- a/thermal_info_config_charge_felix.json +++ b/thermal_info_config_charge_felix.json @@ -3,20 +3,17 @@ { "Name":"neutral_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/neutral_therm/tz_temp", "Multiplier":0.001 }, { "Name":"quiet_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/quiet_therm/tz_temp", "Multiplier":0.001 }, { "Name":"skin_therm", "Type":"UNKNOWN", "HotThreshold":["NAN", 32.0, "NAN", "NAN", "NAN", "NAN", "NAN"], - "TempPath":"/dev/thermal/tz-by-name/skin_therm/tz_temp", "Multiplier":0.001, "PollingDelay":300000, "PassiveDelay":7000 @@ -24,14 +21,12 @@ { "Name":"usb_pwr_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/usb_pwr_therm/tz_temp", "Multiplier":0.001 }, { "Name":"usb_pwr_therm2", "Type":"UNKNOWN", "HotThreshold":["NAN", 40.0, "NAN", "NAN", "NAN", "NAN", "NAN"], - "TempPath":"/dev/thermal/tz-by-name/usb_pwr_therm2/tz_temp", "Multiplier":0.001, "PollingDelay":300000, "PassiveDelay":7000 @@ -39,19 +34,16 @@ { "Name":"inner_disp_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/inner_disp_therm/tz_temp", "Multiplier":0.001 }, { "Name":"outer_disp_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/outer_disp_therm/tz_temp", "Multiplier":0.001 }, { "Name":"gnss_tcxo_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/gnss_tcxo_therm/tz_temp", "Multiplier":0.001 }, { diff --git a/thermal_info_config_felix.json b/thermal_info_config_felix.json index a0bc0f2..ca75170 100644 --- a/thermal_info_config_felix.json +++ b/thermal_info_config_felix.json @@ -9,20 +9,17 @@ { "Name":"neutral_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/neutral_therm/tz_temp", "Multiplier":0.001 }, { "Name":"quiet_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/quiet_therm/tz_temp", "Multiplier":0.001 }, { "Name":"skin_therm", "Type":"UNKNOWN", "HotThreshold":["NAN", 32.0, "NAN", "NAN", "NAN", "NAN", "NAN"], - "TempPath":"/dev/thermal/tz-by-name/skin_therm/tz_temp", "Multiplier":0.001, "PollingDelay":300000, "PassiveDelay":7000 @@ -30,14 +27,12 @@ { "Name":"usb_pwr_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/usb_pwr_therm/tz_temp", "Multiplier":0.001 }, { "Name":"usb_pwr_therm2", "Type":"UNKNOWN", "HotThreshold":["NAN", 40.0, "NAN", "NAN", "NAN", "NAN", "NAN"], - "TempPath":"/dev/thermal/tz-by-name/usb_pwr_therm2/tz_temp", "Multiplier":0.001, "PollingDelay":300000, "PassiveDelay":7000 @@ -45,19 +40,16 @@ { "Name":"inner_disp_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/inner_disp_therm/tz_temp", "Multiplier":0.001 }, { "Name":"outer_disp_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/outer_disp_therm/tz_temp", "Multiplier":0.001 }, { "Name":"gnss_tcxo_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/gnss_tcxo_therm/tz_temp", "Multiplier":0.001 }, { @@ -550,318 +542,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..2fb9bbd 100644 --- a/thermal_info_config_proactive_skin_felix.json +++ b/thermal_info_config_proactive_skin_felix.json @@ -9,20 +9,17 @@ { "Name":"neutral_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/neutral_therm/tz_temp", "Multiplier":0.001 }, { "Name":"quiet_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/quiet_therm/tz_temp", "Multiplier":0.001 }, { "Name":"skin_therm", "Type":"UNKNOWN", "HotThreshold":["NAN", 32.0, "NAN", "NAN", "NAN", "NAN", "NAN"], - "TempPath":"/dev/thermal/tz-by-name/skin_therm/tz_temp", "Multiplier":0.001, "PollingDelay":300000, "PassiveDelay":7000 @@ -30,14 +27,12 @@ { "Name":"usb_pwr_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/usb_pwr_therm/tz_temp", "Multiplier":0.001 }, { "Name":"usb_pwr_therm2", "Type":"UNKNOWN", "HotThreshold":["NAN", 40.0, "NAN", "NAN", "NAN", "NAN", "NAN"], - "TempPath":"/dev/thermal/tz-by-name/usb_pwr_therm2/tz_temp", "Multiplier":0.001, "PollingDelay":300000, "PassiveDelay":7000 @@ -45,19 +40,16 @@ { "Name":"inner_disp_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/inner_disp_therm/tz_temp", "Multiplier":0.001 }, { "Name":"outer_disp_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/outer_disp_therm/tz_temp", "Multiplier":0.001 }, { "Name":"gnss_tcxo_therm", "Type":"UNKNOWN", - "TempPath":"/dev/thermal/tz-by-name/gnss_tcxo_therm/tz_temp", "Multiplier":0.001 }, { @@ -872,26 +864,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..f09fada 100644 --- a/vibrator/common/HardwareBase.h +++ b/vibrator/common/HardwareBase.h @@ -20,10 +20,12 @@ #include #include +#include #include #include #include #include +#include #include "utils.h" @@ -47,17 +49,19 @@ class HwApiBase { class Record : public RecordInterface { public: Record(const char *func, const T &value, const std::ios *stream) - : mFunc(func), mValue(value), mStream(stream) {} + : mFunc(func), mValue(value), mStream(stream), + mTp(std::chrono::system_clock::system_clock::now()) {} std::string toString(const NamesMap &names) override; private: const char *mFunc; const T mValue; const std::ios *mStream; + const std::chrono::system_clock::time_point mTp; }; using Records = std::list>; - static constexpr uint32_t RECORDS_SIZE = 32; + static constexpr uint32_t RECORDS_SIZE = 2048; public: HwApiBase(); @@ -67,7 +71,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 +98,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"); @@ -169,9 +184,14 @@ template std::string HwApiBase::Record::toString(const NamesMap &names) { using utils::operator<<; std::stringstream ret; + auto lTp = std::chrono::system_clock::to_time_t(mTp); + struct tm buf; + auto lTime = localtime_r(&lTp, &buf); - ret << mFunc << " '" << names.at(mStream) << "' = '" << mValue << "'"; - + ret << std::put_time(lTime, "%Y-%m-%d %H:%M:%S.") << std::setfill('0') << std::setw(3) + << (std::chrono::duration_cast(mTp.time_since_epoch()) % 1000) + .count() + << " " << mFunc << " '" << names.at(mStream) << "' = '" << mValue << "'"; return ret.str(); } 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..0fe4880 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. */ @@ -71,6 +71,14 @@ static constexpr int32_t COMPOSE_PWLE_SIZE_MAX_DEFAULT = 127; // See the LRA Calibration Support documentation for more details. static constexpr int32_t Q14_BIT_SHIFT = 14; +// Measured ReDC. The LRA series resistance (ReDC), expressed as follows +// redc(ohms) = redc_measured / 2^Q15_BIT_SHIFT. +// This value represents the unit-specific ReDC input to the click compensation +// algorithm. It can be overwritten at a later time by writing to the redc_stored +// sysfs control. +// See the LRA Calibration Support documentation for more details. +static constexpr int32_t Q15_BIT_SHIFT = 15; + // Measured Q factor, q_measured, is represented by Q8.16 fixed // point format on cs40l26 devices. The expression to calculate q is: // q = q_measured / 2^Q16_BIT_SHIFT @@ -115,6 +123,10 @@ static uint16_t amplitudeToScale(float amplitude, float maximum) { return std::round(ratio); } +static float redcToFloat(std::string *caldata) { + return static_cast(std::stoul(*caldata, nullptr, 16)) / (1 << Q15_BIT_SHIFT); +} + enum WaveformBankID : uint8_t { RAM_WVFRM_BANK, ROM_WVFRM_BANK, @@ -485,8 +497,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 +532,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 @@ -592,9 +610,12 @@ Vibrator::Vibrator(std::unique_ptr hwApiDefault, std::unique_ptr h if (mHwCalDef->getF0(&caldata)) { mHwApiDef->setF0(caldata); + mResonantFrequency = + static_cast(std::stoul(caldata, nullptr, 16)) / (1 << Q14_BIT_SHIFT); } if (mHwCalDef->getRedc(&caldata)) { mHwApiDef->setRedc(caldata); + mRedc = redcToFloat(&caldata); } if (mHwCalDef->getQ(&caldata)) { mHwApiDef->setQ(caldata); @@ -677,8 +698,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 +884,7 @@ ndk::ScopedAStatus Vibrator::getPrimitiveDuration(CompositePrimitive primitive, return status; } - *durationMs = mEffectDurations[effectIndex]; + *durationMs = mEffectDurations[effectIndex] + mEffectBrakingDurations[effectIndex]; } else { *durationMs = 0; } @@ -863,7 +897,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 +904,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 +936,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 +949,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*/); } @@ -1129,12 +1153,7 @@ ndk::ScopedAStatus Vibrator::alwaysOnDisable(int32_t /*id*/) { } ndk::ScopedAStatus Vibrator::getResonantFrequency(float *resonantFreqHz) { - std::string caldata{8, '0'}; - if (!mHwCalDef->getF0(&caldata)) { - ALOGE("Failed to get resonant frequency (%d): %s", errno, strerror(errno)); - return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE); - } - *resonantFreqHz = static_cast(std::stoul(caldata, nullptr, 16)) / (1 << Q14_BIT_SHIFT); + *resonantFreqHz = mResonantFrequency; return ndk::ScopedAStatus::ok(); } @@ -1383,7 +1402,10 @@ binder_status_t Vibrator::dump(int fd, const char **args, uint32_t numArgs) { dprintf(fd, "AIDL:\n"); + dprintf(fd, " Active Effect ID: %" PRId32 "\n", mActiveId); + dprintf(fd, " F0: %.02f\n", mResonantFrequency); dprintf(fd, " F0 Offset: base: %" PRIu32 " flip: %" PRIu32 "\n", mF0Offset, mF0OffsetDual); + dprintf(fd, " Redc: %.02f\n", mRedc); dprintf(fd, " Voltage Levels:\n"); dprintf(fd, " Tick Effect Min: %" PRIu32 " Max: %" PRIu32 "\n", mTickEffectVol[0], @@ -1395,24 +1417,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; @@ -1448,7 +1477,73 @@ binder_status_t Vibrator::dump(int fd, const char **args, uint32_t numArgs) { } } dprintf(fd, "\n"); - dprintf(fd, "\n"); + + dprintf(fd, "Versions:\n"); + std::ifstream verFile; + const auto verBinFileMode = std::ifstream::in | std::ifstream::binary; + std::string ver; + verFile.open("/sys/module/cs40l26_core/version"); + if (verFile.is_open()) { + getline(verFile, ver); + dprintf(fd, " Haptics Driver: %s\n", ver.c_str()); + verFile.close(); + } + verFile.open("/sys/module/cl_dsp_core/version"); + if (verFile.is_open()) { + getline(verFile, ver); + dprintf(fd, " DSP Driver: %s\n", ver.c_str()); + verFile.close(); + } + verFile.open("/vendor/firmware/cs40l26.wmfw", verBinFileMode); + if (verFile.is_open()) { + verFile.seekg(113); + dprintf(fd, " cs40l26.wmfw: %d.%d.%d\n", verFile.get(), verFile.get(), verFile.get()); + verFile.close(); + } + verFile.open("/vendor/firmware/cs40l26-calib.wmfw", verBinFileMode); + if (verFile.is_open()) { + verFile.seekg(113); + dprintf(fd, " cs40l26-calib.wmfw: %d.%d.%d\n", verFile.get(), verFile.get(), + verFile.get()); + verFile.close(); + } + verFile.open("/vendor/firmware/cs40l26.bin", verBinFileMode); + if (verFile.is_open()) { + while (getline(verFile, ver)) { + auto pos = ver.find("Date: "); + if (pos != std::string::npos) { + ver = ver.substr(pos + 6, pos + 15); + dprintf(fd, " cs40l26.bin: %s\n", ver.c_str()); + break; + } + } + verFile.close(); + } + verFile.open("/vendor/firmware/cs40l26-svc.bin", verBinFileMode); + if (verFile.is_open()) { + verFile.seekg(36); + getline(verFile, ver); + ver = ver.substr(ver.rfind('\\') + 1); + dprintf(fd, " cs40l26-svc.bin: %s\n", ver.c_str()); + verFile.close(); + } + verFile.open("/vendor/firmware/cs40l26-calib.bin", verBinFileMode); + if (verFile.is_open()) { + verFile.seekg(36); + getline(verFile, ver); + ver = ver.substr(ver.rfind('\\') + 1); + dprintf(fd, " cs40l26-calib.bin: %s\n", ver.c_str()); + verFile.close(); + } + verFile.open("/vendor/firmware/cs40l26-dvl.bin", verBinFileMode); + if (verFile.is_open()) { + verFile.seekg(36); + getline(verFile, ver); + ver = ver.substr(0, ver.find('\0') + 1); + ver = ver.substr(ver.rfind('\\') + 1); + dprintf(fd, " cs40l26-dvl.bin: %s\n", ver.c_str()); + verFile.close(); + } mHwApiDef->debug(fd); @@ -1520,10 +1615,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 +1856,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..a61cea9 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; @@ -232,9 +242,11 @@ class Vibrator : public BnVibrator { float mLongEffectScale{1.0}; bool mIsChirpEnabled; uint32_t mSupportedPrimitivesBits = 0x0; + float mRedc{0.0f}; + float mResonantFrequency{0.0f}; 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); }