162306a36Sopenharmony_ci============================ 262306a36Sopenharmony_ciALSA Jack Software Injection 362306a36Sopenharmony_ci============================ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciSimple Introduction On Jack Injection 662306a36Sopenharmony_ci===================================== 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciHere jack injection means users could inject plugin or plugout events 962306a36Sopenharmony_cito the audio jacks through debugfs interface, it is helpful to 1062306a36Sopenharmony_civalidate ALSA userspace changes. For example, we change the audio 1162306a36Sopenharmony_ciprofile switching code in the pulseaudio, and we want to verify if the 1262306a36Sopenharmony_cichange works as expected and if the change introduce the regression, 1362306a36Sopenharmony_ciin this case, we could inject plugin or plugout events to an audio 1462306a36Sopenharmony_cijack or to some audio jacks, we don't need to physically access the 1562306a36Sopenharmony_cimachine and plug/unplug physical devices to the audio jack. 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciIn this design, an audio jack doesn't equal to a physical audio jack. 1862306a36Sopenharmony_ciSometimes a physical audio jack contains multi functions, and the 1962306a36Sopenharmony_ciALSA driver creates multi ``jack_kctl`` for a ``snd_jack``, here the 2062306a36Sopenharmony_ci``snd_jack`` represents a physical audio jack and the ``jack_kctl`` 2162306a36Sopenharmony_cirepresents a function, for example a physical jack has two functions: 2262306a36Sopenharmony_ciheadphone and mic_in, the ALSA ASoC driver will build 2 ``jack_kctl`` 2362306a36Sopenharmony_cifor this jack. The jack injection is implemented based on the 2462306a36Sopenharmony_ci``jack_kctl`` instead of ``snd_jack``. 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ciTo inject events to audio jacks, we need to enable the jack injection 2762306a36Sopenharmony_civia ``sw_inject_enable`` first, once it is enabled, this jack will not 2862306a36Sopenharmony_cichange the state by hardware events anymore, we could inject plugin or 2962306a36Sopenharmony_ciplugout events via ``jackin_inject`` and check the jack state via 3062306a36Sopenharmony_ci``status``, after we finish our test, we need to disable the jack 3162306a36Sopenharmony_ciinjection via ``sw_inject_enable`` too, once it is disabled, the jack 3262306a36Sopenharmony_cistate will be restored according to the last reported hardware events 3362306a36Sopenharmony_ciand will change by future hardware events. 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ciThe Layout of Jack Injection Interface 3662306a36Sopenharmony_ci====================================== 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciIf users enable the SND_JACK_INJECTION_DEBUG in the kernel, the audio 3962306a36Sopenharmony_cijack injection interface will be created as below: 4062306a36Sopenharmony_ci:: 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci $debugfs_mount_dir/sound 4362306a36Sopenharmony_ci |-- card0 4462306a36Sopenharmony_ci |-- |-- HDMI_DP_pcm_10_Jack 4562306a36Sopenharmony_ci |-- |-- |-- jackin_inject 4662306a36Sopenharmony_ci |-- |-- |-- kctl_id 4762306a36Sopenharmony_ci |-- |-- |-- mask_bits 4862306a36Sopenharmony_ci |-- |-- |-- status 4962306a36Sopenharmony_ci |-- |-- |-- sw_inject_enable 5062306a36Sopenharmony_ci |-- |-- |-- type 5162306a36Sopenharmony_ci ... 5262306a36Sopenharmony_ci |-- |-- HDMI_DP_pcm_9_Jack 5362306a36Sopenharmony_ci |-- |-- jackin_inject 5462306a36Sopenharmony_ci |-- |-- kctl_id 5562306a36Sopenharmony_ci |-- |-- mask_bits 5662306a36Sopenharmony_ci |-- |-- status 5762306a36Sopenharmony_ci |-- |-- sw_inject_enable 5862306a36Sopenharmony_ci |-- |-- type 5962306a36Sopenharmony_ci |-- card1 6062306a36Sopenharmony_ci |-- HDMI_DP_pcm_5_Jack 6162306a36Sopenharmony_ci |-- |-- jackin_inject 6262306a36Sopenharmony_ci |-- |-- kctl_id 6362306a36Sopenharmony_ci |-- |-- mask_bits 6462306a36Sopenharmony_ci |-- |-- status 6562306a36Sopenharmony_ci |-- |-- sw_inject_enable 6662306a36Sopenharmony_ci |-- |-- type 6762306a36Sopenharmony_ci ... 6862306a36Sopenharmony_ci |-- Headphone_Jack 6962306a36Sopenharmony_ci |-- |-- jackin_inject 7062306a36Sopenharmony_ci |-- |-- kctl_id 7162306a36Sopenharmony_ci |-- |-- mask_bits 7262306a36Sopenharmony_ci |-- |-- status 7362306a36Sopenharmony_ci |-- |-- sw_inject_enable 7462306a36Sopenharmony_ci |-- |-- type 7562306a36Sopenharmony_ci |-- Headset_Mic_Jack 7662306a36Sopenharmony_ci |-- jackin_inject 7762306a36Sopenharmony_ci |-- kctl_id 7862306a36Sopenharmony_ci |-- mask_bits 7962306a36Sopenharmony_ci |-- status 8062306a36Sopenharmony_ci |-- sw_inject_enable 8162306a36Sopenharmony_ci |-- type 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciThe Explanation Of The Nodes 8462306a36Sopenharmony_ci====================================== 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cikctl_id 8762306a36Sopenharmony_ci read-only, get jack_kctl->kctl's id 8862306a36Sopenharmony_ci :: 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci sound/card1/Headphone_Jack# cat kctl_id 9162306a36Sopenharmony_ci Headphone Jack 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cimask_bits 9462306a36Sopenharmony_ci read-only, get jack_kctl's supported events mask_bits 9562306a36Sopenharmony_ci :: 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci sound/card1/Headphone_Jack# cat mask_bits 9862306a36Sopenharmony_ci 0x0001 HEADPHONE(0x0001) 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatus 10162306a36Sopenharmony_ci read-only, get jack_kctl's current status 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci- headphone unplugged: 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci :: 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci sound/card1/Headphone_Jack# cat status 10862306a36Sopenharmony_ci Unplugged 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci- headphone plugged: 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci :: 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci sound/card1/Headphone_Jack# cat status 11562306a36Sopenharmony_ci Plugged 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_citype 11862306a36Sopenharmony_ci read-only, get snd_jack's supported events from type (all supported events on the physical audio jack) 11962306a36Sopenharmony_ci :: 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci sound/card1/Headphone_Jack# cat type 12262306a36Sopenharmony_ci 0x7803 HEADPHONE(0x0001) MICROPHONE(0x0002) BTN_3(0x0800) BTN_2(0x1000) BTN_1(0x2000) BTN_0(0x4000) 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cisw_inject_enable 12562306a36Sopenharmony_ci read-write, enable or disable injection 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci- injection disabled: 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci :: 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci sound/card1/Headphone_Jack# cat sw_inject_enable 13262306a36Sopenharmony_ci Jack: Headphone Jack Inject Enabled: 0 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci- injection enabled: 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci :: 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci sound/card1/Headphone_Jack# cat sw_inject_enable 13962306a36Sopenharmony_ci Jack: Headphone Jack Inject Enabled: 1 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci- to enable jack injection: 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci :: 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci sound/card1/Headphone_Jack# echo 1 > sw_inject_enable 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci- to disable jack injection: 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci :: 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci sound/card1/Headphone_Jack# echo 0 > sw_inject_enable 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cijackin_inject 15462306a36Sopenharmony_ci write-only, inject plugin or plugout 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci- to inject plugin: 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci :: 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci sound/card1/Headphone_Jack# echo 1 > jackin_inject 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci- to inject plugout: 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci :: 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci sound/card1/Headphone_Jack# echo 0 > jackin_inject 167