diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-08-25 07:42:37 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-08-25 07:42:37 +0000 |
commit | 602ac7a9d4626c955b9a6c097b26acf974b969f7 (patch) | |
tree | 0294f12a03677507362b6e2f990bda8b49283ca6 | |
parent | 6b26b08b6b60b3242d5d640ce8f78f3d2de32cea (diff) | |
parent | 1656b09fb0bc4f57d43721c5bb9481bce5107e9d (diff) | |
download | redfin-gki13-boot-release.tar.gz |
Snap for 8992082 from 1656b09fb0bc4f57d43721c5bb9481bce5107e9d to gki13-boot-releasegki13-boot-release
Change-Id: Ifebc2f8b746d9b0c46c5ba8b1ef0b4ed496e4329
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, ¤tPortStatus_1_2); - return Void(); -} - -Return<void> Usb::enableContaminantPresenceProtection(const hidl_string & /*portName*/, - bool /*enable*/) { - hidl_vec<PortStatus> currentPortStatus_1_2; - - queryVersionHelper(this, ¤tPortStatus_1_2); - return Void(); -} - -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, - ¤tRole) == 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, - ¤tRole) == 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, ¤tRole) == - Status::SUCCESS) { - (*currentPortStatus_1_2)[i].status_1_1.currentMode = - static_cast<PortMode_1_1>(currentRole); - (*currentPortStatus_1_2)[i].status_1_1.status.currentMode = - static_cast<V1_0::PortMode>(currentRole); - } else { - ALOGE("Error while 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, ¤tPortStatus_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, ¤tPortStatus_1_2); - - // Role switch is not in progress and port is in disconnected state - if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) { - for (unsigned long i = 0; i < currentPortStatus_1_2.size(); i++) { - DIR *dp = - opendir(std::string("/sys/class/typec/" + - std::string(currentPortStatus_1_2[i] - .status_1_1.status.portName.c_str()) + - "-partner") - .c_str()); - if (dp == NULL) { - // PortRole role = {.role = static_cast<uint32_t>(PortMode::UFP)}; - switchToDrp(currentPortStatus_1_2[i].status_1_1.status.portName); - } else { - closedir(dp); - } - } - pthread_mutex_unlock(&payload->usb->mRoleSwitchLock); - } - break; - } - /* 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, ¤tPortStatus); + + 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, ¤tPortStatus); + + return ScopedAStatus::ok(); +} + +ScopedAStatus Usb::resetUsbPort(const std::string& in_portName, int64_t in_transactionId) { + bool result = true; + std::vector<PortStatus> currentPortStatus; + + ALOGI("Userspace reset USB Port. opID:%ld", in_transactionId); + + if (!WriteStringToFile("none", PULLUP_PATH)) { + ALOGI("Gadget cannot be pulled down"); + result = false; + } + + pthread_mutex_lock(&mLock); + if (mCallback != NULL) { + ::ndk::ScopedAStatus ret = mCallback->notifyResetUsbPortStatus( + in_portName, result ? Status::SUCCESS : Status::ERROR, in_transactionId); + if (!ret.isOk()) + ALOGE("notifyTransactionStatus error %s", ret.getDescription().c_str()); + } else { + ALOGE("Not notifying the userspace. Callback is not set"); + } + pthread_mutex_unlock(&mLock); + + return ::ndk::ScopedAStatus::ok(); +} + +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, ¤tPortStatus); + + 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, ¤tRole) == Status::SUCCESS){ + (*currentPortStatus)[i].currentPowerRole = currentRole.get<PortRole::powerRole>(); + } else { + ALOGE("Error while retrieving portNames"); + goto done; + } + + currentRole.set<PortRole::dataRole>(PortDataRole::NONE); + if (getCurrentRoleHelper(port.first, port.second, ¤tRole) == Status::SUCCESS) { + (*currentPortStatus)[i].currentDataRole = currentRole.get<PortRole::dataRole>(); + } else { + ALOGE("Error while retrieving current port role"); + goto done; + } + + currentRole.set<PortRole::mode>(PortMode::NONE); + if (getCurrentRoleHelper(port.first, port.second, ¤tRole) == Status::SUCCESS) { + (*currentPortStatus)[i].currentMode = currentRole.get<PortRole::mode>(); + } else { + ALOGE("Error while retrieving current data role"); + goto done; + } + + (*currentPortStatus)[i].canChangeMode = true; + (*currentPortStatus)[i].canChangeDataRole = + port.second ? canSwitchRoleHelper(port.first) : false; + (*currentPortStatus)[i].canChangePowerRole = + port.second ? canSwitchRoleHelper(port.first) : false; + + (*currentPortStatus)[i].supportedModes.push_back(PortMode::DRP); + + 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, ¤tPortStatus); + pthread_mutex_lock(&mLock); + if (mCallback != NULL) { + ScopedAStatus ret = mCallback->notifyQueryPortStatus( + "all", Status::SUCCESS, in_transactionId); + if (!ret.isOk()) + ALOGE("notifyQueryPortStatus error %s", ret.getDescription().c_str()); + } else { + ALOGE("Not notifying the userspace. Callback is not set"); + } + pthread_mutex_unlock(&mLock); + + return ScopedAStatus::ok(); +} + +ScopedAStatus Usb::enableContaminantPresenceDetection(const string& in_portName, + bool in_enable, int64_t in_transactionId) { + string disable = GetProperty(kDisableContatminantDetection, ""); + std::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, ¤tPortStatus); + 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, ¤tPortStatus); + + // Role switch is not in progress and port is in disconnected state + if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) { + for (unsigned long i = 0; i < currentPortStatus.size(); i++) { + DIR *dp = + opendir(string("/sys/class/typec/" + + string(currentPortStatus[i].portName.c_str()) + + "-partner").c_str()); + if (dp == NULL) { + switchToDrp(currentPortStatus[i].portName); + } else { + closedir(dp); + } + } + pthread_mutex_unlock(&payload->usb->mRoleSwitchLock); + } + break; + } + /* 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> |