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