summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-08-25 07:42:37 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-08-25 07:42:37 +0000
commit602ac7a9d4626c955b9a6c097b26acf974b969f7 (patch)
tree0294f12a03677507362b6e2f990bda8b49283ca6
parent6b26b08b6b60b3242d5d640ce8f78f3d2de32cea (diff)
parent1656b09fb0bc4f57d43721c5bb9481bce5107e9d (diff)
downloadredfin-gki13-boot-release.tar.gz
Snap for 8992082 from 1656b09fb0bc4f57d43721c5bb9481bce5107e9d to gki13-boot-releasegki13-boot-release
Change-Id: Ifebc2f8b746d9b0c46c5ba8b1ef0b4ed496e4329
-rw-r--r--audio/audio_platform_info_noextcodec_snd.xml8
-rw-r--r--audio/mixer_paths_noextcodec_snd.xml264
-rw-r--r--audio/sound_trigger_mixer_paths.xml52
-rw-r--r--device-redfin.mk8
-rwxr-xr-xdumpstate/DumpstateDevice.cpp2
-rw-r--r--init.recovery.device.rc4
-rwxr-xr-xredfin/overlay/frameworks/base/core/res/res/values/config.xml2
-rw-r--r--redfin/overlay/frameworks/base/core/res/res/values/dimens.xml22
-rw-r--r--redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml2
-rw-r--r--redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml2
-rw-r--r--self-extractors/extract-lists.txt1
-rw-r--r--self-extractors/qcom/staging/Android.bp.txt21
-rw-r--r--self-extractors/qcom/staging/device-partial.mk1
-rw-r--r--usb/Usb.cpp840
-rw-r--r--usb/Usb.h103
-rw-r--r--usb/gadget/Android.bp (renamed from usb/Android.bp)13
-rw-r--r--usb/gadget/UsbGadget.cpp (renamed from usb/UsbGadget.cpp)0
-rw-r--r--usb/gadget/UsbGadget.h (renamed from usb/UsbGadget.h)0
-rw-r--r--usb/gadget/android.hardware.usb.gadget-service.redfin.rc (renamed from usb/android.hardware.usb@1.3-service.redfin.rc)2
-rw-r--r--usb/gadget/android.hardware.usb.gadget@1.1-service.redfin.xml (renamed from usb/android.hardware.usb.gadget@1.1-service.redfin.xml)0
-rw-r--r--usb/gadget/service_gadget.cpp (renamed from usb/service.cpp)22
-rw-r--r--usb/usb/Android.bp54
-rw-r--r--usb/usb/Usb.cpp876
-rw-r--r--usb/usb/Usb.h93
-rw-r--r--usb/usb/android.hardware.usb-service.rc12
-rw-r--r--usb/usb/android.hardware.usb-service.xml (renamed from usb/android.hardware.usb@1.3-service.redfin.xml)6
-rw-r--r--usb/usb/service.cpp37
-rw-r--r--vf/device_framework_matrix_product.R.5.xml2
-rw-r--r--vf/device_framework_matrix_product.S.5.xml6
29 files changed, 1137 insertions, 1318 deletions
diff --git a/audio/audio_platform_info_noextcodec_snd.xml b/audio/audio_platform_info_noextcodec_snd.xml
index ac1926a..82baa18 100644
--- a/audio/audio_platform_info_noextcodec_snd.xml
+++ b/audio/audio_platform_info_noextcodec_snd.xml
@@ -34,7 +34,7 @@
<device name="SND_DEVICE_OUT_VOICE_MUSIC_TX" acdb_id="3"/>
<device name="SND_DEVICE_OUT_VOICE_HANDSET_TMUS" acdb_id="98"/>
<device name="SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET" acdb_id="14"/>
- <device name="SND_DEVICE_OUT_VOICE_TTY_HCO_SPEAKER" acdb_id="14"/>
+<!-- <device name="SND_DEVICE_OUT_VOICE_TTY_HCO_SPEAKER" acdb_id="14"/> -->
<device name="SND_DEVICE_OUT_VOICE_HAC_HANDSET" acdb_id="201"/>
<device name="SND_DEVICE_OUT_SPEAKER_SAFE_AND_USB_HEADSET" acdb_id="514"/>
<device name="SND_DEVICE_OUT_VOICE_USB_HEADPHONES" acdb_id="56"/>
@@ -81,7 +81,7 @@
<device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
<device name="SND_DEVICE_IN_USB_HEADSET_MIC" acdb_id="44"/>
<device name="SND_DEVICE_IN_VOICE_RECOG_USB_HEADSET_MIC" acdb_id="143"/>
- <device name="SND_DEVICE_IN_VOICE_TTY_VCO_SPEAKER_MIC" acdb_id="19"/>
+<!-- <device name="SND_DEVICE_IN_VOICE_TTY_VCO_SPEAKER_MIC" acdb_id="19"/> -->
<device name="SND_DEVICE_IN_VOICE_REC_DMIC_STEREO" acdb_id="144"/>
</acdb_ids>
@@ -303,8 +303,8 @@
<device name="SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE" backend="handset-mic" interface="PRI_TDM_TX_0"/>
<device name="SND_DEVICE_IN_AANC_HANDSET_MIC" backend="handset-mic" interface="PRI_TDM_TX_0"/>
<device name="SND_DEVICE_IN_QUAD_MIC" backend="handset-mic" interface="PRI_TDM_TX_0"/>
- <device name="SND_DEVICE_IN_HANDSET_STEREO_DMIC" backend="handset-mic" interface="PRI_TDM_TX_0"/>
- <device name="SND_DEVICE_IN_SPEAKER_STEREO_DMIC" backend="speaker-mic" interface="PRI_TDM_TX_0"/>
+<!-- <device name="SND_DEVICE_IN_HANDSET_STEREO_DMIC" backend="handset-mic" interface="PRI_TDM_TX_0"/> -->
+ <device name="SND_DEVICE_IN_SPEAKER_DMIC_STEREO" backend="speaker-mic" interface="PRI_TDM_TX_0"/>
<device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK" interface="WSA_CDC_DMA_TX_0"/>
<device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1" interface="WSA_CDC_DMA_TX_0"/>
<device name="SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2" interface="WSA_CDC_DMA_TX_0"/>
diff --git a/audio/mixer_paths_noextcodec_snd.xml b/audio/mixer_paths_noextcodec_snd.xml
index 36fb01b..7c48914 100644
--- a/audio/mixer_paths_noextcodec_snd.xml
+++ b/audio/mixer_paths_noextcodec_snd.xml
@@ -47,6 +47,7 @@
<ctl name="Voip Dtx Mode" value="0" />
<ctl name="TTY Mode" value="OFF" />
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia1" value="0" />
+ <ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia2" value="0" />
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia4" value="0" />
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia5" value="0" />
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia7" value="0" />
@@ -58,6 +59,7 @@
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia14" value="0" />
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia15" value="0" />
<ctl name="SLIMBUS_7_RX Audio Mixer MultiMedia16" value="0" />
+ <ctl name="MultiMedia2 Mixer TX_CDC_DMA_TX_3" value="0" />
<ctl name="MultiMedia5 Mixer AFE_PCM_TX" value="0" />
<ctl name="MultiMedia5 Mixer TX_CDC_DMA_TX_3" value="0" />
<ctl name="MultiMedia1 Mixer TX_CDC_DMA_TX_3" value="0" />
@@ -129,16 +131,7 @@
<ctl name="MultiMedia5 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia10 Mixer USB_AUDIO_TX" value="0" />
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="WSA_CDC_DMA_RX_0 Channels" value="One" />
- <ctl name="RX_CDC_DMA_RX_0 Channels" value="One" />
<ctl name="VI_FEED_TX Channels" value="Two" />
- <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="0" />
- <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="0" />
- <ctl name="WSA_CDC_DMA_RX_0 Format" value="UNPACKED" />
- <ctl name="WSA_CDC_DMA_TX_0 Format" value="UNPACKED" />
- <ctl name="RX_CDC_DMA_RX_0 Format" value="UNPACKED" />
- <ctl name="TX_CDC_DMA_TX_3 Format" value="UNPACKED" />
<ctl name="MultiMedia1 Mixer PRI_TDM_TX_0" value="0" />
<ctl name="MultiMedia2 Mixer PRI_TDM_TX_0" value="0" />
@@ -147,14 +140,8 @@
<ctl name="MultiMedia5 Mixer PRI_TDM_TX_0" value="0" />
<ctl name="MultiMedia6 Mixer PRI_TDM_TX_0" value="0" />
<ctl name="MultiMedia8 Mixer PRI_TDM_TX_0" value="0" />
- <ctl name="MultiMedia9 Mixer PRI_TDM_TX_0" value="0" />
<ctl name="MultiMedia10 Mixer PRI_TDM_TX_0" value="0" />
<ctl name="MultiMedia16 Mixer PRI_TDM_TX_0" value="0" />
- <ctl name="MultiMedia17 Mixer PRI_TDM_TX_0" value="0" />
- <ctl name="MultiMedia18 Mixer PRI_TDM_TX_0" value="0" />
- <ctl name="MultiMedia19 Mixer PRI_TDM_TX_0" value="0" />
- <ctl name="MultiMedia28 Mixer PRI_TDM_TX_0" value="0" />
- <ctl name="MultiMedia29 Mixer PRI_TDM_TX_0" value="0" />
<ctl name="QUIN_TDM_RX_0 Audio Mixer MultiMedia1" value="0"/>
<ctl name="QUIN_TDM_RX_0 Audio Mixer MultiMedia2" value="0"/>
@@ -173,8 +160,6 @@
<!-- HFP start -->
<ctl name="HFP_SLIM7_UL_HL Switch" value="0" />
- <ctl name="WSA_CDC_DMA_RX_0 Port Mixer SLIM_7_TX" value="0" />
- <ctl name="RX_CDC_DMA_RX_0 Port Mixer SLIM_7_TX" value="0" />
<!-- HFP end -->
<!-- echo reference -->
<ctl name="AUDIO_REF_EC_UL1 MUX" value="None" />
@@ -185,6 +170,7 @@
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia2" value="0" />
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia4" value="0" />
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia7" value="0" />
+ <ctl name="AFE_PCM_RX Audio Mixer MultiMedia8" value="0" />
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia10" value="0" />
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia11" value="0" />
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia12" value="0" />
@@ -266,6 +252,7 @@
<!-- Incall Music -->
<ctl name="Incall_Music Audio Mixer MultiMedia2" value="0" />
<ctl name="Incall_Music Audio Mixer MultiMedia9" value="0" />
+ <ctl name="Incall_Music_2 Audio Mixer MultiMedia9" value="0" />
<!-- Incall Music End -->
<!-- compress-voip-call start -->
@@ -307,168 +294,29 @@
<!-- Codec controls -->
<!-- WSA controls -->
- <ctl name="WSA RX0 MUX" value="ZERO" />
- <ctl name="WSA RX1 MUX" value="ZERO" />
- <ctl name="WSA_RX0 INP0" value="ZERO" />
- <ctl name="WSA_RX1 INP0" value="ZERO" />
- <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_1" value="0" />
- <ctl name="WSA_AIF_VI Mixer WSA_SPKR_VI_2" value="0" />
<ctl name="WSA_RX_0_VI_FB_LCH_MUX" value="ZERO" />
<ctl name="WSA_RX_0_VI_FB_RCH_MUX" value="ZERO" />
- <ctl name="SpkrLeft COMP Switch" value="0" />
- <ctl name="SpkrRight COMP Switch" value="0" />
- <ctl name="SpkrLeft BOOST Switch" value="0" />
- <ctl name="SpkrRight BOOST Switch" value="0" />
- <ctl name="SpkrLeft VISENSE Switch" value="0" />
- <ctl name="SpkrRight VISENSE Switch" value="0" />
- <ctl name="SpkrLeft SWR DAC_Port Switch" value="0" />
- <ctl name="SpkrRight SWR DAC_Port Switch" value="0" />
<!-- RX Controls -->
- <ctl name="RX_MACRO RX0 MUX" value="ZERO" />
- <ctl name="RX_MACRO RX1 MUX" value="ZERO" />
- <ctl name="RX_CDC_DMA_RX_0 Channels" value="One" />
- <ctl name="RX INT0_1 MIX1 INP0" value="ZERO" />
- <ctl name="RX INT0_1 MIX1 INP1" value="ZERO" />
- <ctl name="RX INT0_1 MIX1 INP2" value="ZERO" />
- <ctl name="RX INT1_1 MIX1 INP0" value="ZERO" />
- <ctl name="RX INT1_1 MIX1 INP1" value="ZERO" />
- <ctl name="RX INT1_1 MIX1 INP2" value="ZERO" />
<ctl name="RX_CDC_DMA_RX_0 Audio Mixer MultiMedia1" value="0" />
- <ctl name="RX INT0 DEM MUX" value="NORMAL_DSM_OUT" />
- <ctl name="RX INT1 DEM MUX" value="NORMAL_DSM_OUT" />
- <ctl name="RX_COMP1 Switch" value="0" />
- <ctl name="RX_COMP2 Switch" value="0" />
- <ctl name="HPHL_COMP Switch" value="0" />
- <ctl name="HPHR_COMP Switch" value="0" />
- <ctl name="EAR_RDAC Switch" value="0" />
- <ctl name="HPHL_RDAC Switch" value="0" />
- <ctl name="HPHR_RDAC Switch" value="0" />
- <ctl name="AUX_RDAC Switch" value="0" />
- <ctl name="RDAC3_MUX" value="ZERO" />
- <ctl name="RX_EAR Mode" value="OFF" />
<!-- TX Controls -->
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
<ctl name="MultiMedia1 Mixer TX_CDC_DMA_TX_3" value="0" />
- <ctl name="ADC2_MIXER Switch" value="0" />
- <ctl name="ADC2 MUX" value="INP2" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="0" />
- <ctl name="TX_AIF1_CAP Mixer DEC1" value="0" />
- <ctl name="TX_AIF1_CAP Mixer DEC2" value="0" />
- <ctl name="TX_AIF1_CAP Mixer DEC3" value="0" />
- <ctl name="TX_AIF1_CAP Mixer DEC4" value="0" />
- <ctl name="TX_AIF1_CAP Mixer DEC5" value="0" />
- <ctl name="TX_AIF1_CAP Mixer DEC6" value="0" />
- <ctl name="TX_AIF1_CAP Mixer DEC7" value="0" />
- <ctl name="TX DEC0 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX0" value="ZERO" />
- <ctl name="TX SMIC MUX0" value="ZERO" />
- <ctl name="TX DEC1 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX1" value="ZERO" />
- <ctl name="TX SMIC MUX1" value="ZERO" />
- <ctl name="TX DEC2 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX2" value="ZERO" />
- <ctl name="TX SMIC MUX2" value="ZERO" />
- <ctl name="TX DEC3 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX3" value="ZERO" />
- <ctl name="TX SMIC MUX3" value="ZERO" />
- <ctl name="TX DEC4 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX4" value="ZERO" />
- <ctl name="TX SMIC MUX4" value="ZERO" />
- <ctl name="TX DEC5 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX5" value="ZERO" />
- <ctl name="TX SMIC MUX5" value="ZERO" />
- <ctl name="TX DEC6 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX6" value="ZERO" />
- <ctl name="TX SMIC MUX6" value="ZERO" />
- <ctl name="TX DEC7 MUX" value="MSM_DMIC" />
- <ctl name="TX DMIC MUX7" value="ZERO" />
- <ctl name="TX SMIC MUX7" value="ZERO" />
<!-- Volume controls -->
- <ctl name="WSA_RX0 Digital Volume" value="84" />
- <ctl name="WSA_RX1 Digital Volume" value="84" />
- <ctl name="RX_RX0 Digital Volume" value="84" />
- <ctl name="RX_RX1 Digital Volume" value="84" />
- <ctl name="RX_RX2 Digital Volume" value="84" />
- <ctl name="HPHL Volume" value="20" />
- <ctl name="HPHR Volume" value="20" />
- <ctl name="EAR SPKR PA Gain" value="G_DEFAULT" />
-
- <ctl name="TX_DEC0 Volume" value="102" />
- <ctl name="TX_DEC1 Volume" value="102" />
- <ctl name="TX_DEC2 Volume" value="102" />
- <ctl name="TX_DEC3 Volume" value="102" />
- <ctl name="TX_DEC4 Volume" value="84" />
- <ctl name="TX_DEC5 Volume" value="84" />
- <ctl name="TX_DEC6 Volume" value="84" />
- <ctl name="TX_DEC7 Volume" value="84" />
-
- <ctl name="ADC1 Volume" value="12" />
- <ctl name="ADC2 Volume" value="12" />
- <ctl name="ADC3 Volume" value="12" />
<!-- Compander controls -->
- <ctl name="WSA_COMP1 Switch" value="0" />
- <ctl name="WSA_COMP2 Switch" value="0" />
- <ctl name="COMP7 Switch" value="0" />
- <ctl name="COMP8 Switch" value="0" />
<!-- Headphone class-H mode -->
- <ctl name="RX_HPH_PWR_MODE" value="ULP" />
- <ctl name="RX HPH Mode" value="CLS_H_ULP" />
<!-- IIR/voice anc -->
- <ctl name="IIR0 Band1" id ="0" value="268435456" />
- <ctl name="IIR0 Band1" id ="1" value="0" />
- <ctl name="IIR0 Band1" id ="2" value="0" />
- <ctl name="IIR0 Band1" id ="3" value="0" />
- <ctl name="IIR0 Band1" id ="4" value="0" />
- <ctl name="IIR0 Band2" id ="0" value="268435456" />
- <ctl name="IIR0 Band2" id ="1" value="0" />
- <ctl name="IIR0 Band2" id ="2" value="0" />
- <ctl name="IIR0 Band2" id ="3" value="0" />
- <ctl name="IIR0 Band2" id ="4" value="0" />
- <ctl name="IIR0 Band3" id ="0" value="268435456" />
- <ctl name="IIR0 Band3" id ="1" value="0" />
- <ctl name="IIR0 Band3" id ="2" value="0" />
- <ctl name="IIR0 Band3" id ="3" value="0" />
- <ctl name="IIR0 Band3" id ="4" value="0" />
- <ctl name="IIR0 Band4" id ="0" value="268435456" />
- <ctl name="IIR0 Band4" id ="1" value="0" />
- <ctl name="IIR0 Band4" id ="2" value="0" />
- <ctl name="IIR0 Band4" id ="3" value="0" />
- <ctl name="IIR0 Band4" id ="4" value="0" />
- <ctl name="IIR0 Band5" id ="0" value="268435456" />
- <ctl name="IIR0 Band5" id ="1" value="0" />
- <ctl name="IIR0 Band5" id ="2" value="0" />
- <ctl name="IIR0 Band5" id ="3" value="0" />
- <ctl name="IIR0 Band5" id ="4" value="0" />
- <ctl name="IIR0 Enable Band1" value="0" />
- <ctl name="IIR0 Enable Band2" value="0" />
- <ctl name="IIR0 Enable Band3" value="0" />
- <ctl name="IIR0 Enable Band4" value="0" />
- <ctl name="IIR0 Enable Band5" value="0" />
- <ctl name="IIR0 INP0 Volume" value="54" />
- <ctl name="IIR0 INP0 MUX" value="ZERO" />
- <ctl name="IIR0 INP1 MUX" value="ZERO" />
- <ctl name="IIR0 INP2 MUX" value="ZERO" />
- <ctl name="IIR0 INP3 MUX" value="ZERO" />
<!-- vbat related data -->
- <ctl name="GSM mode Enable" value="OFF" />
- <ctl name="WSA_Softclip0 Enable" value="0" />
- <ctl name="WSA_Softclip1 Enable" value="0" />
- <ctl name="WSA_RX INT0 VBAT WSA RX0 VBAT Enable" value="0" />
- <ctl name="WSA_RX INT1 VBAT WSA RX1 VBAT Enable" value="0" />
<!-- Codec controls end -->
<!-- defaults for mmap record -->
<ctl name="MultiMedia16 Mixer TX_CDC_DMA_TX_3" value="0" />
- <ctl name="MultiMedia16 Mixer SLIM_7_TX" value="0" />
- <ctl name="MultiMedia16 Mixer SLIM_8_TX" value="0" />
<ctl name="MultiMedia16 Mixer USB_AUDIO_TX" value="0" />
<!-- ALC5513 config -->
@@ -570,9 +418,18 @@
<ctl name="HAC AMP EN" value="0" />
+ <!-- add initial value-->
+ <ctl name="HDMI Mixer MultiMedia1" value="0" />
+ <ctl name="HDMI Mixer MultiMedia4" value="0" />
+ <ctl name="HDMI Mixer MultiMedia5" value="0" />
+ <ctl name="HDMI Mixer MultiMedia8" value="0" />
+ <ctl name="HDMI Mixer MultiMedia9" value="0" />
+ <ctl name="HDMI Mixer MultiMedia10" value="0" />
+ <ctl name="HDMI Mixer MultiMedia16" value="0" />
+ <!-- add initial value end-->`
+
<!-- These are audio route (FE to BE) specific mixer settings -->
<path name="gsm-mode">
- <ctl name="GSM mode Enable" value="ON" />
</path>
<path name="echo-reference">
@@ -925,7 +782,6 @@
</path>
<path name="low-latency-playback resume">
- <ctl name="MultiMedia5_RX QOS Vote" value="Enable" />
</path>
<path name="audio-ull-playback">
@@ -1276,7 +1132,6 @@
</path>
<path name="low-latency-record capture-fm">
- <ctl name="MultiMedia8 Mixer SLIM_8_TX" value="1" />
</path>
<path name="spkr-vi-record vi-feedback">
@@ -1915,7 +1770,6 @@
</path>
<path name="spkr-rx-calib">
- <ctl name="QUIN_TDM_RX_DL_HL Switch" value="1" />
</path>
<path name="spkr-vi-record">
@@ -1923,48 +1777,24 @@
<!-- These are actual sound device specific mixer settings -->
<path name="amic2">
- <ctl name="TX DEC0 MUX" value="SWR_MIC" />
- <ctl name="TX SMIC MUX0" value="ADC1" />
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="ADC2_MIXER Switch" value="1" />
- <ctl name="ADC2 MUX" value="INP2" />
</path>
<path name="dmic1">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC0" />
</path>
<path name="dmic2">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC1" />
</path>
<path name="dmic3">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC2" />
</path>
<path name="dmic4">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC3" />
</path>
<path name="dmic5">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC4" />
</path>
<path name="dmic6">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="One" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC5" />
</path>
<path name="dmic-endfire">
@@ -2018,28 +1848,15 @@
<path name="speaker" />
</path>
- <path name="sidetone-iir">
- <ctl name="IIR0 Enable Band1" value="1" />
- <ctl name="IIR0 Enable Band2" value="1" />
- <ctl name="IIR0 Enable Band3" value="1" />
- <ctl name="IIR0 Enable Band4" value="1" />
- <ctl name="IIR0 Enable Band5" value="1" />
+ <path name="sidetone-iir">
</path>
<path name="sidetone-headphones">
<path name="sidetone-iir" />
- <ctl name="IIR0 INP0 Volume" value="54" />
- <ctl name="IIR0 INP0 MUX" value="DEC0" />
- <ctl name="RX INT0 MIX2 INP" value="SRC0" />
- <ctl name="RX INT1 MIX2 INP" value="SRC0" />
</path>
<path name="sidetone-handset">
<path name="sidetone-iir" />
- <ctl name="IIR0 INP0 Volume" value="54" />
- <ctl name="IIR0 INP0 MUX" value="DEC0" />
- <ctl name="RX INT2 MIX2 INP" value="SRC0" />
- <ctl name="WSA_RX0 INT0 SIDETONE MIX" value="SRC0" />
</path>
<path name="afe-sidetone">
@@ -2107,21 +1924,6 @@
</path>
<path name="headphones">
- <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
- <ctl name="RX_MACRO RX1 MUX" value="AIF1_PB" />
- <ctl name="RX_CDC_DMA_RX_0 Channels" value="Two" />
- <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
- <ctl name="RX INT1_1 MIX1 INP0" value="RX1" />
- <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
- <ctl name="RX INT1 DEM MUX" value="CLSH_DSM_OUT" />
- <ctl name="RX_HPH_PWR_MODE" value="LOHIFI" />
- <ctl name="RX HPH Mode" value="CLS_H_LOHIFI" />
- <ctl name="RX_COMP1 Switch" value="1" />
- <ctl name="RX_COMP2 Switch" value="1" />
- <ctl name="HPHL_COMP Switch" value="1" />
- <ctl name="HPHR_COMP Switch" value="1" />
- <ctl name="HPHL_RDAC Switch" value="1" />
- <ctl name="HPHR_RDAC Switch" value="1" />
</path>
<path name="headphones-44.1">
@@ -2143,7 +1945,6 @@
<path name="headset-mic">
<path name="amic2" />
- <ctl name="TX_DEC0 Volume" value="84" />
</path>
<path name="headset-mic-liquid">
@@ -2193,11 +1994,9 @@
</path>
<path name="voice-speaker-vbat">
- <path name="speaker-vbat-mono" />
</path>
<path name="voice-speaker-2-vbat">
- <path name="speaker-vbat-mono-2" />
</path>
<path name="voice-headphones">
@@ -2369,7 +2168,6 @@
<path name="dmic-endfire-liquid">
<path name="handset-dmic-endfire" />
- <ctl name="IIR0 INP0 MUX" value="DEC7" />
</path>
<path name="handset-stereo-dmic-ef">
@@ -2441,16 +2239,10 @@
</path>
<path name="speaker-dmic-broadside">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="Two" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC4" />
- <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
- <ctl name="TX DMIC MUX1" value="DMIC1" />
</path>
<path name="dmic-broadside">
<path name="speaker-dmic-broadside" />
- <ctl name="IIR0 INP0 MUX" value="DEC0" />
</path>
<path name="voice-speaker-dmic-broadside">
@@ -2474,13 +2266,6 @@
</path>
<path name="speaker-tmic">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="Three" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC4" />
- <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
- <ctl name="TX DMIC MUX1" value="DMIC1" />
- <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
- <ctl name="TX DMIC MUX2" value="DMIC3" />
</path>
<path name="voice-speaker-tmic">
@@ -2489,15 +2274,6 @@
<!-- Quad MIC devices -->
<path name="speaker-qmic">
- <ctl name="TX_CDC_DMA_TX_3 Channels" value="Four" />
- <ctl name="TX_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="TX DMIC MUX0" value="DMIC4" />
- <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
- <ctl name="TX DMIC MUX1" value="DMIC1" />
- <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
- <ctl name="TX DMIC MUX2" value="DMIC3" />
- <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
- <ctl name="TX DMIC MUX3" value="DMIC0" />
</path>
<path name="speaker-qmic-liquid">
@@ -2522,12 +2298,6 @@
<!-- TTY devices -->
<path name="tty-headphones">
- <ctl name="RX_MACRO RX0 MUX" value="AIF1_PB" />
- <ctl name="RX INT0_1 MIX1 INP0" value="RX0" />
- <ctl name="RX INT0 DEM MUX" value="CLSH_DSM_OUT" />
- <ctl name="RX_COMP1 Switch" value="1" />
- <ctl name="HPHL_COMP Switch" value="1" />
- <ctl name="HPHL_RDAC Switch" value="1" />
</path>
<path name="voice-tty-full-headphones">
@@ -2552,8 +2322,6 @@
<path name="voice-tty-full-headset-mic">
<path name="amic2" />
- <ctl name="ADC2 Volume" value="0" />
- <ctl name="TX_DEC0 Volume" value="84" />
</path>
<path name="voice-tty-hco-headset-mic">
@@ -2811,7 +2579,6 @@
</path>
<path name="mmap-record bt-sco">
- <ctl name="MultiMedia16 Mixer SLIM_7_TX" value="1" />
</path>
<path name="mmap-record bt-sco-wb">
@@ -2824,7 +2591,6 @@
</path>
<path name="mmap-record capture-fm">
- <ctl name="MultiMedia16 Mixer SLIM_8_TX" value="1" />
</path>
<path name="mmap-record usb-headset-mic">
diff --git a/audio/sound_trigger_mixer_paths.xml b/audio/sound_trigger_mixer_paths.xml
index 6c99e3a..611ec35 100644
--- a/audio/sound_trigger_mixer_paths.xml
+++ b/audio/sound_trigger_mixer_paths.xml
@@ -52,39 +52,6 @@
<ctl name="LSM6 Port" value="None" />
<ctl name="LSM7 Port" value="None" />
<ctl name="LSM8 Port" value="None" />
- <ctl name="VA_CDC_DMA_TX_0 Channels" value="One" />
- <ctl name="VA_AIF1_CAP Mixer DEC0" value="0" />
- <ctl name="VA_AIF1_CAP Mixer DEC1" value="0" />
- <ctl name="VA_AIF1_CAP Mixer DEC2" value="0" />
- <ctl name="VA_AIF1_CAP Mixer DEC3" value="0" />
- <ctl name="VA_AIF1_CAP Mixer DEC4" value="0" />
- <ctl name="VA_AIF1_CAP Mixer DEC5" value="0" />
- <ctl name="VA_AIF1_CAP Mixer DEC6" value="0" />
- <ctl name="VA_AIF1_CAP Mixer DEC7" value="0" />
- <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC2 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC3 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC4 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC5 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC6 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC7 MUX" value="MSM_DMIC" />
- <ctl name="VA DMIC MUX0" value="ZERO" />
- <ctl name="VA DMIC MUX1" value="ZERO" />
- <ctl name="VA DMIC MUX2" value="ZERO" />
- <ctl name="VA DMIC MUX3" value="ZERO" />
- <ctl name="VA DMIC MUX4" value="ZERO" />
- <ctl name="VA DMIC MUX5" value="ZERO" />
- <ctl name="VA DMIC MUX6" value="ZERO" />
- <ctl name="VA DMIC MUX7" value="ZERO" />
- <ctl name="VA SMIC MUX0" value="ZERO" />
- <ctl name="VA SMIC MUX1" value="ZERO" />
- <ctl name="VA SMIC MUX2" value="ZERO" />
- <ctl name="VA SMIC MUX3" value="ZERO" />
- <ctl name="VA SMIC MUX4" value="ZERO" />
- <ctl name="VA SMIC MUX5" value="ZERO" />
- <ctl name="VA SMIC MUX6" value="ZERO" />
- <ctl name="VA SMIC MUX7" value="ZERO" />
<ctl name="AUDIO_REF_EC_UL1 MUX" value="None"/>
<ctl name="EC Reference Channels" value="Zero"/>
<ctl name="EC Reference Bit Format" value="0"/>
@@ -282,28 +249,9 @@
</path>
<path name="listen-ape-handset-qmic">
- <ctl name="VA_CDC_DMA_TX_0 Channels" value="Four" />
- <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
- <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
- <ctl name="VA_AIF1_CAP Mixer DEC3" value="1" />
- <ctl name="VA DEC0 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC1 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC2 MUX" value="MSM_DMIC" />
- <ctl name="VA DEC3 MUX" value="MSM_DMIC" />
- <ctl name="VA DMIC MUX0" value="DMIC4" />
- <ctl name="VA DMIC MUX1" value="DMIC0" />
- <ctl name="VA DMIC MUX2" value="DMIC1" />
- <ctl name="VA DMIC MUX3" value="DMIC2" />
</path>
<path name="listen-ape-headset-mic">
- <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
- <ctl name="VA DEC0 MUX" value="SWR_MIC" />
- <ctl name="VA SMIC MUX0" value="ADC1" />
- <ctl name="ADC2 Volume" value="62" />
- <ctl name="ADC2_MIXER Switch" value="1" />
- <ctl name="ADC2 MUX" value="INP2" />
</path>
<path name="echo-reference">
diff --git a/device-redfin.mk b/device-redfin.mk
index 789eae4..fa45916 100644
--- a/device-redfin.mk
+++ b/device-redfin.mk
@@ -28,10 +28,9 @@ endif
PRODUCT_VENDOR_KERNEL_HEADERS := device/google/redbull-kernel/sm7250/kernel-headers
-include build/make/target/product/iorap_large_memory_config.mk
include device/google/redbull/device-common.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)
# LOCAL_PATH is device/google/redbull before this
LOCAL_PATH := device/google/redfin
@@ -131,8 +130,11 @@ ifeq ($(wildcard vendor/google_devices/redfin/proprietary/device-vendor-redfin.m
BUILD_WITHOUT_VENDOR := true
endif
+# USB HAL
PRODUCT_PACKAGES += \
- android.hardware.usb@1.3-service.redfin
+ android.hardware.usb-service.redfin
+PRODUCT_PACKAGES += \
+ android.hardware.usb.gadget-service.redfin
# Vibrator HAL
PRODUCT_PACKAGES += \
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
index 62f6379..85f8ed0 100755
--- a/dumpstate/DumpstateDevice.cpp
+++ b/dumpstate/DumpstateDevice.cpp
@@ -685,6 +685,7 @@ Return<DumpstateStatus> DumpstateDevice::dumpstateBoard_1_1(const hidl_handle& h
DumpFileToFd(fd, "TTF", "/dev/logbuffer_ttf");
DumpFileToFd(fd, "TTF details", "/sys/class/power_supply/battery/ttf_details");
DumpFileToFd(fd, "TTF stats", "/sys/class/power_supply/battery/ttf_stats");
+ DumpFileToFd(fd, "aacr_state", "/sys/class/power_supply/battery/aacr_state");
DumpFileToFd(fd, "ipc-local-ports", "/d/msm_ipc_router/dump_local_ports");
RunCommandToFd(fd, "TRICKLE-DEFEND Config", {"/vendor/bin/sh", "-c", " cd /sys/devices/platform/soc/soc:google,battery/power_supply/battery/; echo \"bd_trickle_enable: `cat bd_trickle_enable`\"; echo \"bd_trickle_cnt: `cat bd_trickle_cnt`\"; echo \"bd_trickle_recharge_soc: `cat bd_trickle_recharge_soc`\"; echo \"bd_trickle_dry_run: `cat bd_trickle_dry_run`\"; echo \"bd_trickle_reset_sec: `cat bd_trickle_reset_sec`\""});
RunCommandToFd(fd, "DWELL-DEFEND Config", {"/vendor/bin/sh", "-c", " cd /sys/devices/platform/soc/soc:google,charger/; for f in `ls charge_s*` ; do echo \"$f: `cat $f`\" ; done"});
@@ -696,6 +697,7 @@ Return<DumpstateStatus> DumpstateDevice::dumpstateBoard_1_1(const hidl_handle& h
if (!PropertiesHelper::IsUserBuild()) {
RunCommandToFd(fd, "Google Charger", {"/vendor/bin/sh", "-c", "cd /d/google_charger/; for f in `ls pps_*` ; do echo \"$f: `cat $f`\" ; done"});
RunCommandToFd(fd, "Google Battery", {"/vendor/bin/sh", "-c", "cd /d/google_battery/; for f in `ls ssoc_*` ; do echo \"$f: `cat $f`\" ; done"});
+ DumpFileToFd(fd, "Charging table dump", "/d/google_battery/chg_raw_profile");
}
RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/soc/98c000.i2c/i2c-1/1-0050/1-00500/nvmem"});
diff --git a/init.recovery.device.rc b/init.recovery.device.rc
index 474831d..7df16ec 100644
--- a/init.recovery.device.rc
+++ b/init.recovery.device.rc
@@ -9,10 +9,6 @@ on init
# Enable thermal mitigation
write /sys/devices/virtual/thermal/tz-by-name/backup-charge/mode enabled
- # Block layer tuning: discard chunk size up to 128MB
- # Otherwise, contiguous discards can be merged
- write /sys/block/sda/queue/discard_max_bytes 134217728
-
on early-init
# Wait to make sure we do not try to talk too early to the display
wait /sys/class/drm/card0
diff --git a/redfin/overlay/frameworks/base/core/res/res/values/config.xml b/redfin/overlay/frameworks/base/core/res/res/values/config.xml
index 68b13d7..2eb7f2c 100755
--- a/redfin/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/redfin/overlay/frameworks/base/core/res/res/values/config.xml
@@ -238,7 +238,7 @@
Do not read this dimen directly. Use {@link SystemBarUtils#getStatusBarHeight} instead.
-->
<dimen name="status_bar_height_default">28dp</dimen>
- <dimen name="status_bar_height_portrait">145px</dimen>
+ <dimen name="status_bar_height_portrait">136px</dimen>
<dimen name="status_bar_height_landscape">28dp</dimen>
<!-- Not allow to switch to higher refresh rate when display brightness setting is
diff --git a/redfin/overlay/frameworks/base/core/res/res/values/dimens.xml b/redfin/overlay/frameworks/base/core/res/res/values/dimens.xml
new file mode 100644
index 0000000..1188e6c
--- /dev/null
+++ b/redfin/overlay/frameworks/base/core/res/res/values/dimens.xml
@@ -0,0 +1,22 @@
+<?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">50px</dimen>
+</resources>
+
diff --git a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
index 1dcedb0..934f30a 100644
--- a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
+++ b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
@@ -91,8 +91,6 @@
<string name="config_rounded_mask" translatable="false">M156,0 C76,4 58,5 31,31 5,58 4,76 0,156</string>
- <bool name="config_roundedCornerMultipleRadius">true</bool>
-
<!-- Configure 13px of extra protection around the front-facing camera -->
<string translatable="false" name="config_frontBuiltInDisplayCutoutProtection">
M 29,77
diff --git a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
index bf54bb4..0823379 100644
--- a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
+++ b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
@@ -16,8 +16,6 @@
*/
-->
<resources>
- <!-- for 20dp of padding at 3.5px/dp at default density -->
- <dimen name="rounded_corner_content_padding">50px</dimen>
<!-- the padding on the top of the statusbar (usually 0) -->
<dimen name="status_bar_padding_top">2dp</dimen>
<!-- Padding for the system icons on the keyguard (when no multi user switch is showing).
diff --git a/self-extractors/extract-lists.txt b/self-extractors/extract-lists.txt
index 85b49b1..5270ee3 100644
--- a/self-extractors/extract-lists.txt
+++ b/self-extractors/extract-lists.txt
@@ -43,7 +43,6 @@
system_ext/lib/lib-imsvideocodec.so \
system_ext/lib/liblistensoundmodel2.qti.so \
system_ext/lib/libmmosal.so \
- system_ext/lib/libqct_resampler.so \
system_ext/lib/libvr_amb_engine.so \
system_ext/lib/libvr_object_engine.so \
system_ext/app/QtiTelephonyService/QtiTelephonyService.apk \
diff --git a/self-extractors/qcom/staging/Android.bp.txt b/self-extractors/qcom/staging/Android.bp.txt
index bce9641..7364be8 100644
--- a/self-extractors/qcom/staging/Android.bp.txt
+++ b/self-extractors/qcom/staging/Android.bp.txt
@@ -243,27 +243,6 @@ cc_prebuilt_library_shared {
}
cc_prebuilt_library_shared {
- name: "libqct_resampler",
- arch: {
- arm: {
- srcs: ["libqct_resampler.so"],
- shared_libs: [
- "libcutils",
- "libc++",
- "libc",
- "libm",
- "libdl",
- ],
- },
- },
- compile_multilib: "32",
- system_ext_specific: true,
- strip: {
- none: true,
- },
-}
-
-cc_prebuilt_library_shared {
name: "libvr_amb_engine",
arch: {
arm: {
diff --git a/self-extractors/qcom/staging/device-partial.mk b/self-extractors/qcom/staging/device-partial.mk
index 7ab7c45..d7c3a7a 100644
--- a/self-extractors/qcom/staging/device-partial.mk
+++ b/self-extractors/qcom/staging/device-partial.mk
@@ -28,7 +28,6 @@ PRODUCT_PACKAGES += \
lib-imsvideocodec \
liblistensoundmodel2.qti \
libmmosal \
- libqct_resampler \
libvr_amb_engine \
libvr_object_engine \
diff --git a/usb/Usb.cpp b/usb/Usb.cpp
deleted file mode 100644
index dde01ce..0000000
--- a/usb/Usb.cpp
+++ /dev/null
@@ -1,840 +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.
- */
-
-#define LOG_TAG "android.hardware.usb@1.3-service.redfin"
-
-#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"
-
-using android::base::GetProperty;
-
-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 on 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;
-
-constexpr char kEnabledPath[] = "/sys/class/power_supply/usb/moisture_detection_enabled";
-constexpr char kDetectedPath[] = "/sys/class/power_supply/usb/moisture_detected";
-constexpr char kConsole[] = "init.svc.console";
-constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
-
-void queryVersionHelper(implementation::Usb *usb, hidl_vec<PortStatus> *currentPortStatus_1_2);
-
-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 queryMoistureDetectionStatus(hidl_vec<PortStatus> *currentPortStatus_1_2) {
- std::string enabled, status;
-
- 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;
-
- if (readFile(kEnabledPath, &enabled)) {
- ALOGE("Failed to open moisture_detection_enabled");
- return Status::ERROR;
- }
-
- if (enabled == "1") {
- if (readFile(kDetectedPath, &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;
-}
-
-Return<void> Usb::enableContaminantPresenceDetection(const hidl_string & /*portName*/,
- bool enable) {
-
- std::string status = GetProperty(kConsole, "");
- std::string disable = GetProperty(kDisableContatminantDetection, "");
-
- if (status != "running" && disable != "true")
- writeFile(kEnabledPath, enable ? "1" : "0");
-
- hidl_vec<PortStatus> currentPortStatus_1_2;
-
- queryVersionHelper(this, &currentPortStatus_1_2);
- return Void();
-}
-
-Return<void> Usb::enableContaminantPresenceProtection(const hidl_string & /*portName*/,
- bool /*enable*/) {
- hidl_vec<PortStatus> currentPortStatus_1_2;
-
- queryVersionHelper(this, &currentPortStatus_1_2);
- return Void();
-}
-
-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");
- // Sanity 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) {
- 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 isnt none.
- */
- return Status::UNRECOGNIZED_ROLE;
- }
-
- return Status::SUCCESS;
-}
-
-Status getTypeCPortNamesHelper(std::unordered_map<std::string, bool> *names) {
- DIR *dp;
-
- dp = opendir("/sys/class/typec");
- 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) {
- 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,
- &currentRole) == Status::SUCCESS) {
- (*currentPortStatus_1_2)[i].status_1_1.status.currentPowerRole =
- static_cast<PortPowerRole>(currentRole);
- } else {
- ALOGE("Error while retreiving portNames");
- goto done;
- }
-
- if (getCurrentRoleHelper(port.first, port.second, PortRoleType::DATA_ROLE,
- &currentRole) == Status::SUCCESS) {
- (*currentPortStatus_1_2)[i].status_1_1.status.currentDataRole =
- static_cast<PortDataRole>(currentRole);
- } else {
- ALOGE("Error while retreiving current port role");
- goto done;
- }
-
- if (getCurrentRoleHelper(port.first, port.second, PortRoleType::MODE, &currentRole) ==
- 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 retreiving 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;
- }
-
- 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(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);
- if (status == Status::SUCCESS)
- queryMoistureDetectionStatus(currentPortStatus_1_2);
- } else if (callback_V1_1 != NULL) {
- status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_1);
- 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);
- 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, &currentPortStatus_1_2);
- return Void();
-}
-
-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);
- } else if (!strncmp(cp, "DEVTYPE=typec_", strlen("DEVTYPE=typec_")) ||
- !strncmp(cp, "POWER_SUPPLY_MOISTURE_DETECTED",
- strlen("POWER_SUPPLY_MOISTURE_DETECTED"))) {
- hidl_vec<PortStatus> currentPortStatus_1_2;
- queryVersionHelper(payload->usb, &currentPortStatus_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;
- }
- /* 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 5ff110d..0000000
--- a/usb/Usb.h
+++ /dev/null
@@ -1,103 +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 <android-base/file.h>
-#include <android/hardware/usb/1.2/IUsbCallback.h>
-#include <android/hardware/usb/1.2/types.h>
-#include <android/hardware/usb/1.3/IUsb.h>
-#include <hidl/Status.h>
-#include <pixelusb/UsbGadgetCommon.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::sp;
-using ::android::base::WriteStringToFile;
-using ::android::hardware::hidl_array;
-using ::android::hardware::hidl_memory;
-using ::android::hardware::hidl_string;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::usb::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_1::PortMode_1_1;
-using ::android::hardware::usb::V1_1::PortStatus_1_1;
-using ::android::hardware::usb::V1_2::PortStatus;
-using ::android::hardware::usb::V1_2::IUsbCallback;
-using ::android::hardware::usb::V1_3::IUsb;
-using ::android::hidl::base::V1_0::DebugInfo;
-using ::android::hidl::base::V1_0::IBase;
-
-enum class HALVersion{
- V1_0,
- V1_1,
- V1_2,
- V1_3
-};
-
-constexpr char kGadgetName[] = "a600000.dwc3";
-#define SOC_PATH "/sys/devices/platform/soc/a600000.ssusb/"
-#define ID_PATH SOC_PATH "id"
-#define VBUS_PATH SOC_PATH "b_sess"
-#define USB_DATA_PATH SOC_PATH "usb_data_enabled"
-
-struct Usb : public IUsb {
- Usb();
-
- Return<void> switchRole(const hidl_string &portName, const V1_0::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;
-
- 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
index 03b0c92..756b9eb 100644
--- a/usb/Android.bp
+++ b/usb/gadget/Android.bp
@@ -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.
@@ -18,19 +18,14 @@ package {
}
cc_binary {
- name: "android.hardware.usb@1.3-service.redfin",
+ name: "android.hardware.usb.gadget-service.redfin",
relative_install_path: "hw",
- init_rc: ["android.hardware.usb@1.3-service.redfin.rc"],
+ init_rc: ["android.hardware.usb.gadget-service.redfin.rc"],
vintf_fragments: [
- "android.hardware.usb@1.3-service.redfin.xml",
"android.hardware.usb.gadget@1.1-service.redfin.xml",
],
- srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"],
+ srcs: ["service_gadget.cpp", "UsbGadget.cpp"],
shared_libs: [
- "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",
"libbase",
diff --git a/usb/UsbGadget.cpp b/usb/gadget/UsbGadget.cpp
index 97535f0..97535f0 100644
--- a/usb/UsbGadget.cpp
+++ b/usb/gadget/UsbGadget.cpp
diff --git a/usb/UsbGadget.h b/usb/gadget/UsbGadget.h
index 93c7d66..93c7d66 100644
--- a/usb/UsbGadget.h
+++ b/usb/gadget/UsbGadget.h
diff --git a/usb/android.hardware.usb@1.3-service.redfin.rc b/usb/gadget/android.hardware.usb.gadget-service.redfin.rc
index fffa93a..5e61e87 100644
--- a/usb/android.hardware.usb@1.3-service.redfin.rc
+++ b/usb/gadget/android.hardware.usb.gadget-service.redfin.rc
@@ -1,4 +1,4 @@
-service vendor.usb-hal-1-3 /vendor/bin/hw/android.hardware.usb@1.3-service.redfin
+service vendor.usb-gadget-hal-1-1 /vendor/bin/hw/android.hardware.usb.gadget-service.redfin
class hal
user system
group system shell mtp
diff --git a/usb/android.hardware.usb.gadget@1.1-service.redfin.xml b/usb/gadget/android.hardware.usb.gadget@1.1-service.redfin.xml
index a6f9a1f..a6f9a1f 100644
--- a/usb/android.hardware.usb.gadget@1.1-service.redfin.xml
+++ b/usb/gadget/android.hardware.usb.gadget@1.1-service.redfin.xml
diff --git a/usb/service.cpp b/usb/gadget/service_gadget.cpp
index 570beef..159e8f2 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) 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.
@@ -14,10 +14,9 @@
* limitations under the License.
*/
-#define LOG_TAG "android.hardware.usb@1.3-service.redfin"
+#define LOG_TAG "android.hardware.usb.gadget-service.redfin"
#include <hidl/HidlTransportSupport.h>
-#include "Usb.h"
#include "UsbGadget.h"
using android::sp;
@@ -29,34 +28,23 @@ using android::hardware::joinRpcThreadpool;
// Generated HIDL files
using android::hardware::usb::gadget::V1_1::IUsbGadget;
using android::hardware::usb::gadget::V1_1::implementation::UsbGadget;
-using android::hardware::usb::V1_3::IUsb;
-using android::hardware::usb::V1_3::implementation::Usb;
using android::OK;
using android::status_t;
int main() {
- android::sp<IUsb> service = new Usb();
- android::sp<IUsbGadget> service2 = new UsbGadget();
-
+ android::sp<IUsbGadget> service = new UsbGadget();
configureRpcThreadpool(2, true /*callerWillJoin*/);
status_t status = service->registerAsService();
if (status != OK) {
- ALOGE("Cannot register USB HAL service");
- return 1;
- }
-
- status = service2->registerAsService();
-
- if (status != OK) {
ALOGE("Cannot register USB Gadget HAL service");
return 1;
}
- ALOGI("USB HAL Ready.");
+ ALOGI("USB gadget HAL Ready.");
joinRpcThreadpool();
// Under noraml cases, execution will not reach this line.
- ALOGI("USB HAL failed to join thread pool.");
+ ALOGI("USB gadget HAL failed to join thread pool.");
return 1;
}
diff --git a/usb/usb/Android.bp b/usb/usb/Android.bp
new file mode 100644
index 0000000..80a2824
--- /dev/null
+++ b/usb/usb/Android.bp
@@ -0,0 +1,54 @@
+//
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+cc_binary {
+ name: "android.hardware.usb-service.redfin",
+ relative_install_path: "hw",
+ init_rc: ["android.hardware.usb-service.rc"],
+ vintf_fragments: ["android.hardware.usb-service.xml"],
+ vendor: true,
+ srcs: [
+ "service.cpp",
+ "Usb.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libhidlbase",
+ "liblog",
+ "libutils",
+ "libhardware",
+ "android.hardware.usb.gadget@1.0",
+ "android.hardware.usb-V1-ndk",
+ "libcutils",
+ "android.frameworks.stats-V1-ndk",
+ "pixelatoms-cpp",
+ "libbinder_ndk",
+
+ ],
+ static_libs: [
+ "libpixelusb",
+ "libpixelstats",
+ ],
+ export_shared_lib_headers: [
+ "android.frameworks.stats-V1-ndk",
+ "pixelatoms-cpp",
+ ],
+}
diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp
new file mode 100644
index 0000000..ed358cd
--- /dev/null
+++ b/usb/usb/Usb.cpp
@@ -0,0 +1,876 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "android.hardware.usb.aidl-service"
+
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <assert.h>
+#include <dirent.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <chrono>
+#include <regex>
+#include <thread>
+#include <unordered_map>
+
+#include <cutils/uevent.h>
+#include <sys/epoll.h>
+#include <utils/Errors.h>
+#include <utils/StrongPointer.h>
+
+#include "Usb.h"
+
+using android::base::GetProperty;
+using android::base::Trim;
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace usb {
+
+// Set by the signal handler to destroy the thread
+volatile bool destroyThread;
+
+constexpr char kConsole[] = "init.svc.console";
+constexpr char kDetectedPath[] = "/sys/class/power_supply/usb/moisture_detected";
+constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
+constexpr char kEnabledPath[] = "/sys/class/power_supply/usb/moisture_detection_enabled";
+constexpr char kTypecPath[] = "/sys/class/typec";
+
+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;
+ string pullup;
+
+ ALOGI("Userspace turn %s USB data signaling. opID:%ld", in_enable ? "on" : "off",
+ in_transactionId);
+
+ if (in_enable) {
+ if (ReadFileToString(PULLUP_PATH, &pullup)) {
+ pullup = Trim(pullup);
+ if (pullup != kGadgetName) {
+ if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
+ ALOGE("Gadget cannot be pulled up");
+ result = false;
+ }
+ }
+ }
+
+ if (!WriteStringToFile("1", USB_DATA_PATH)) {
+ ALOGE("Not able to turn on usb connection notification");
+ result = false;
+ }
+ } else {
+ if (ReadFileToString(PULLUP_PATH, &pullup)) {
+ pullup = Trim(pullup);
+ if (pullup == kGadgetName) {
+ if (!WriteStringToFile("none", PULLUP_PATH)) {
+ ALOGE("Gadget cannot be pulled down");
+ result = false;
+ }
+ }
+ }
+
+ if (!WriteStringToFile("0", USB_DATA_PATH)) {
+ ALOGE("Not able to turn on usb connection notification");
+ 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, &currentPortStatus);
+
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::enableUsbDataWhileDocked(const string& in_portName,
+ int64_t in_transactionId) {
+ std::vector<PortStatus> currentPortStatus;
+
+ ALOGI("Userspace enableUsbDataWhileDocked opID:%ld", in_transactionId);
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyEnableUsbDataWhileDockedStatus(
+ in_portName, Status::NOT_SUPPORTED, 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, &currentPortStatus);
+
+ 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();
+}
+
+ScopedAStatus Usb::limitPowerTransfer(const string& in_portName, bool in_limit,
+ int64_t in_transactionId) {
+ std::vector<PortStatus> currentPortStatus;
+ bool sessionFail = false, success;
+
+ pthread_mutex_lock(&mLock);
+ ALOGI("limitPowerTransfer limit:%c opId:%ld", in_limit ? 'y' : 'n', in_transactionId);
+
+ if (in_limit) {
+ success = WriteStringToFile("0", SINK_CURRENT_LIMIT_PATH);
+ if (!success) {
+ ALOGE("Failed to set sink current limit");
+ sessionFail = true;
+ }
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", SINK_LIMIT_ENABLE_PATH);
+ if (!success) {
+ ALOGE("Failed to %s sink current limit: %s", in_limit ? "enable" : "disable",
+ SINK_LIMIT_ENABLE_PATH);
+ sessionFail = true;
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", SOURCE_LIMIT_ENABLE_PATH);
+ if (!success) {
+ ALOGE("Failed to %s source current limit: %s", in_limit ? "enable" : "disable",
+ SOURCE_LIMIT_ENABLE_PATH);
+ sessionFail = true;
+ }
+
+ 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, &currentPortStatus);
+
+ return ScopedAStatus::ok();
+}
+
+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;
+
+ if (!ReadFileToString(kEnabledPath, &enabled)) {
+ ALOGE("Failed to open moisture_detection_enabled");
+ return Status::ERROR;
+ }
+
+ enabled = Trim(enabled);
+ if (enabled == "1") {
+ if (!ReadFileToString(kDetectedPath, &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),
+ mUsbDataEnabled(true) {
+ pthread_condattr_t attr;
+ if (pthread_condattr_init(&attr)) {
+ ALOGE("pthread_condattr_init failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) {
+ ALOGE("pthread_condattr_setclock failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_cond_init(&mPartnerCV, &attr)) {
+ ALOGE("pthread_cond_init failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_condattr_destroy(&attr)) {
+ ALOGE("pthread_condattr_destroy failed: %s", strerror(errno));
+ abort();
+ }
+}
+
+ScopedAStatus Usb::switchRole(const string& in_portName, const PortRole& in_role,
+ int64_t in_transactionId) {
+ string filename = appendRoleNodeHelper(string(in_portName.c_str()), in_role.getTag());
+ string written;
+ FILE *fp;
+ bool roleSwitch = false;
+
+ if (filename == "") {
+ ALOGE("Fatal: invalid node type");
+ return ScopedAStatus::ok();
+ }
+
+ pthread_mutex_lock(&mRoleSwitchLock);
+
+ ALOGI("filename write: %s role:%s", filename.c_str(), convertRoletoString(in_role).c_str());
+
+ if (in_role.getTag() == PortRole::mode) {
+ roleSwitch = switchMode(in_portName, in_role, this);
+ } else {
+ fp = fopen(filename.c_str(), "w");
+ if (fp != NULL) {
+ int ret = fputs(convertRoletoString(in_role).c_str(), fp);
+ fclose(fp);
+ if ((ret != EOF) && ReadFileToString(filename, &written)) {
+ written = Trim(written);
+ extractRole(&written);
+ ALOGI("written: %s", written.c_str());
+ if (written == convertRoletoString(in_role)) {
+ roleSwitch = true;
+ } else {
+ ALOGE("Role switch failed");
+ }
+ } else {
+ ALOGE("failed to update the new role");
+ }
+ } else {
+ ALOGE("fopen failed");
+ }
+ }
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyRoleSwitchStatus(
+ in_portName, in_role, roleSwitch ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("RoleSwitchStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+ pthread_mutex_unlock(&mRoleSwitchLock);
+
+ return ScopedAStatus::ok();
+}
+
+Status getAccessoryConnected(const string &portName, string *accessory) {
+ string filename = "/sys/class/typec/" + portName + "-partner/accessory_mode";
+
+ if (!ReadFileToString(filename, accessory)) {
+ ALOGE("getAccessoryConnected: Failed to open filesystem node: %s", filename.c_str());
+ return Status::ERROR;
+ }
+ *accessory = Trim(*accessory);
+
+ return Status::SUCCESS;
+}
+
+Status getCurrentRoleHelper(const string &portName, bool connected, PortRole *currentRole) {
+ string filename;
+ string roleName;
+ string accessory;
+
+ 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, &currentRole) == 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, &currentRole) == 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, &currentRole) == 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);
+
+ if (!usb->mUsbDataEnabled) {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_FORCE);
+ } else {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::ENABLED);
+ }
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::UNKNOWN;
+
+ 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,
+ usb->mUsbDataEnabled ? 1 : 0);
+ }
+ return Status::SUCCESS;
+ }
+done:
+ return Status::ERROR;
+}
+
+Status queryPowerTransferStatus(std::vector<PortStatus> *currentPortStatus) {
+ string enabled;
+
+ if (!ReadFileToString(SINK_LIMIT_ENABLE_PATH, &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;
+}
+
+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, &currentPortStatus);
+ 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::string status = GetProperty(kConsole, "");
+ std::vector<PortStatus> currentPortStatus;
+ bool success = true;
+
+ if (status != "running" && disable != "true")
+ success = WriteStringToFile(in_enable ? "1" : "0", kEnabledPath);
+
+ 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, &currentPortStatus);
+ return ScopedAStatus::ok();
+}
+
+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, "POWER_SUPPLY_MOISTURE_DETECTED",
+ strlen("POWER_SUPPLY_MOISTURE_DETECTED"))) {
+ std::vector<PortStatus> currentPortStatus;
+ queryVersionHelper(payload->usb, &currentPortStatus);
+
+ // 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;
+ }
+ /* 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..36a23bc
--- /dev/null
+++ b/usb/usb/Usb.h
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <android-base/file.h>
+#include <aidl/android/hardware/usb/BnUsb.h>
+#include <aidl/android/hardware/usb/BnUsbCallback.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::sp;
+using ::ndk::ScopedAStatus;
+using ::std::shared_ptr;
+using ::std::string;
+
+constexpr char kGadgetName[] = "a600000.dwc3";
+#define PULLUP_PATH "/config/usb_gadget/g1/UDC"
+#define SOC_PATH "/sys/devices/platform/soc/a600000.ssusb/"
+#define USB_DATA_PATH SOC_PATH "usb_data_enabled"
+
+#define USB_POWER_LIMIT_PATH "/sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/"
+#define SINK_CURRENT_LIMIT_PATH USB_POWER_LIMIT_PATH "usb_limit_sink_current"
+#define SINK_LIMIT_ENABLE_PATH USB_POWER_LIMIT_PATH "usb_limit_sink_enable"
+#define SOURCE_LIMIT_ENABLE_PATH USB_POWER_LIMIT_PATH "usb_limit_source_enable"
+
+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 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..2801dd4
--- /dev/null
+++ b/usb/usb/android.hardware.usb-service.rc
@@ -0,0 +1,12 @@
+service vendor.usb /vendor/bin/hw/android.hardware.usb-service.redfin
+ class hal
+ user system
+ group system shell
+
+on boot
+ chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_enable
+ chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_source_enable
+ chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_current
diff --git a/usb/android.hardware.usb@1.3-service.redfin.xml b/usb/usb/android.hardware.usb-service.xml
index cd54268..6088194 100644
--- a/usb/android.hardware.usb@1.3-service.redfin.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/vf/device_framework_matrix_product.R.5.xml b/vf/device_framework_matrix_product.R.5.xml
index a3ad2be..2d7ba29 100644
--- a/vf/device_framework_matrix_product.R.5.xml
+++ b/vf/device_framework_matrix_product.R.5.xml
@@ -92,7 +92,7 @@
</hal>
<hal format="hidl" optional="false">
<name>vendor.google.google_battery</name>
- <version>1.1</version>
+ <version>1.1-2</version>
<interface>
<name>IGoogleBattery</name>
<instance>default</instance>
diff --git a/vf/device_framework_matrix_product.S.5.xml b/vf/device_framework_matrix_product.S.5.xml
index 6d1e32e..ca45b30 100644
--- a/vf/device_framework_matrix_product.S.5.xml
+++ b/vf/device_framework_matrix_product.S.5.xml
@@ -9,7 +9,7 @@
</hal>
<hal format="hidl" optional="false">
<name>com.qualcomm.qti.uceservice</name>
- <version>2.2</version>
+ <version>2.3</version>
<interface>
<name>IUceService</name>
<instance>com.qualcomm.qti.uceservice</instance>
@@ -25,7 +25,7 @@
</hal>
<hal format="hidl" optional="false">
<name>vendor.qti.data.factory</name>
- <version>2.1</version>
+ <version>2.2</version>
<interface>
<name>IFactory</name>
<instance>default</instance>
@@ -92,7 +92,7 @@
</hal>
<hal format="hidl" optional="false">
<name>vendor.google.google_battery</name>
- <version>1.1</version>
+ <version>1.1-2</version>
<interface>
<name>IGoogleBattery</name>
<instance>default</instance>