123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- ============================
- ALSA Jack Software Injection
- ============================
- Simple Introduction On Jack Injection
- =====================================
- Here jack injection means users could inject plugin or plugout events
- to the audio jacks through debugfs interface, it is helpful to
- validate ALSA userspace changes. For example, we change the audio
- profile switching code in the pulseaudio, and we want to verify if the
- change works as expected and if the change introduce the regression,
- in this case, we could inject plugin or plugout events to an audio
- jack or to some audio jacks, we don't need to physically access the
- machine and plug/unplug physical devices to the audio jack.
- In this design, an audio jack doesn't equal to a physical audio jack.
- Sometimes a physical audio jack contains multi functions, and the
- ALSA driver creates multi ``jack_kctl`` for a ``snd_jack``, here the
- ``snd_jack`` represents a physical audio jack and the ``jack_kctl``
- represents a function, for example a physical jack has two functions:
- headphone and mic_in, the ALSA ASoC driver will build 2 ``jack_kctl``
- for this jack. The jack injection is implemented based on the
- ``jack_kctl`` instead of ``snd_jack``.
- To inject events to audio jacks, we need to enable the jack injection
- via ``sw_inject_enable`` first, once it is enabled, this jack will not
- change the state by hardware events anymore, we could inject plugin or
- plugout events via ``jackin_inject`` and check the jack state via
- ``status``, after we finish our test, we need to disable the jack
- injection via ``sw_inject_enable`` too, once it is disabled, the jack
- state will be restored according to the last reported hardware events
- and will change by future hardware events.
- The Layout of Jack Injection Interface
- ======================================
- If users enable the SND_JACK_INJECTION_DEBUG in the kernel, the audio
- jack injection interface will be created as below:
- ::
- $debugfs_mount_dir/sound
- |-- card0
- |-- |-- HDMI_DP_pcm_10_Jack
- |-- |-- |-- jackin_inject
- |-- |-- |-- kctl_id
- |-- |-- |-- mask_bits
- |-- |-- |-- status
- |-- |-- |-- sw_inject_enable
- |-- |-- |-- type
- ...
- |-- |-- HDMI_DP_pcm_9_Jack
- |-- |-- jackin_inject
- |-- |-- kctl_id
- |-- |-- mask_bits
- |-- |-- status
- |-- |-- sw_inject_enable
- |-- |-- type
- |-- card1
- |-- HDMI_DP_pcm_5_Jack
- |-- |-- jackin_inject
- |-- |-- kctl_id
- |-- |-- mask_bits
- |-- |-- status
- |-- |-- sw_inject_enable
- |-- |-- type
- ...
- |-- Headphone_Jack
- |-- |-- jackin_inject
- |-- |-- kctl_id
- |-- |-- mask_bits
- |-- |-- status
- |-- |-- sw_inject_enable
- |-- |-- type
- |-- Headset_Mic_Jack
- |-- jackin_inject
- |-- kctl_id
- |-- mask_bits
- |-- status
- |-- sw_inject_enable
- |-- type
- The Explanation Of The Nodes
- ======================================
- kctl_id
- read-only, get jack_kctl->kctl's id
- ::
- sound/card1/Headphone_Jack# cat kctl_id
- Headphone Jack
- mask_bits
- read-only, get jack_kctl's supported events mask_bits
- ::
- sound/card1/Headphone_Jack# cat mask_bits
- 0x0001 HEADPHONE(0x0001)
- status
- read-only, get jack_kctl's current status
- - headphone unplugged:
- ::
- sound/card1/Headphone_Jack# cat status
- Unplugged
- - headphone plugged:
- ::
- sound/card1/Headphone_Jack# cat status
- Plugged
- type
- read-only, get snd_jack's supported events from type (all supported events on the physical audio jack)
- ::
- sound/card1/Headphone_Jack# cat type
- 0x7803 HEADPHONE(0x0001) MICROPHONE(0x0002) BTN_3(0x0800) BTN_2(0x1000) BTN_1(0x2000) BTN_0(0x4000)
- sw_inject_enable
- read-write, enable or disable injection
- - injection disabled:
- ::
- sound/card1/Headphone_Jack# cat sw_inject_enable
- Jack: Headphone Jack Inject Enabled: 0
- - injection enabled:
- ::
- sound/card1/Headphone_Jack# cat sw_inject_enable
- Jack: Headphone Jack Inject Enabled: 1
- - to enable jack injection:
- ::
- sound/card1/Headphone_Jack# echo 1 > sw_inject_enable
- - to disable jack injection:
- ::
- sound/card1/Headphone_Jack# echo 0 > sw_inject_enable
- jackin_inject
- write-only, inject plugin or plugout
- - to inject plugin:
- ::
- sound/card1/Headphone_Jack# echo 1 > jackin_inject
- - to inject plugout:
- ::
- sound/card1/Headphone_Jack# echo 0 > jackin_inject
|