1 ============================ 1 ============================ 2 ALSA Jack Software Injection 2 ALSA Jack Software Injection 3 ============================ 3 ============================ 4 4 5 Simple Introduction On Jack Injection 5 Simple Introduction On Jack Injection 6 ===================================== 6 ===================================== 7 7 8 Here jack injection means users could inject p 8 Here jack injection means users could inject plugin or plugout events 9 to the audio jacks through debugfs interface, 9 to the audio jacks through debugfs interface, it is helpful to 10 validate ALSA userspace changes. For example, 10 validate ALSA userspace changes. For example, we change the audio 11 profile switching code in the pulseaudio, and 11 profile switching code in the pulseaudio, and we want to verify if the 12 change works as expected and if the change int 12 change works as expected and if the change introduce the regression, 13 in this case, we could inject plugin or plugou 13 in this case, we could inject plugin or plugout events to an audio 14 jack or to some audio jacks, we don't need to 14 jack or to some audio jacks, we don't need to physically access the 15 machine and plug/unplug physical devices to th 15 machine and plug/unplug physical devices to the audio jack. 16 16 17 In this design, an audio jack doesn't equal to 17 In this design, an audio jack doesn't equal to a physical audio jack. 18 Sometimes a physical audio jack contains multi 18 Sometimes a physical audio jack contains multi functions, and the 19 ALSA driver creates multi ``jack_kctl`` for a 19 ALSA driver creates multi ``jack_kctl`` for a ``snd_jack``, here the 20 ``snd_jack`` represents a physical audio jack 20 ``snd_jack`` represents a physical audio jack and the ``jack_kctl`` 21 represents a function, for example a physical 21 represents a function, for example a physical jack has two functions: 22 headphone and mic_in, the ALSA ASoC driver wil 22 headphone and mic_in, the ALSA ASoC driver will build 2 ``jack_kctl`` 23 for this jack. The jack injection is implement 23 for this jack. The jack injection is implemented based on the 24 ``jack_kctl`` instead of ``snd_jack``. 24 ``jack_kctl`` instead of ``snd_jack``. 25 25 26 To inject events to audio jacks, we need to en 26 To inject events to audio jacks, we need to enable the jack injection 27 via ``sw_inject_enable`` first, once it is ena 27 via ``sw_inject_enable`` first, once it is enabled, this jack will not 28 change the state by hardware events anymore, w 28 change the state by hardware events anymore, we could inject plugin or 29 plugout events via ``jackin_inject`` and check 29 plugout events via ``jackin_inject`` and check the jack state via 30 ``status``, after we finish our test, we need 30 ``status``, after we finish our test, we need to disable the jack 31 injection via ``sw_inject_enable`` too, once i 31 injection via ``sw_inject_enable`` too, once it is disabled, the jack 32 state will be restored according to the last r 32 state will be restored according to the last reported hardware events 33 and will change by future hardware events. 33 and will change by future hardware events. 34 34 35 The Layout of Jack Injection Interface 35 The Layout of Jack Injection Interface 36 ====================================== 36 ====================================== 37 37 38 If users enable the SND_JACK_INJECTION_DEBUG i 38 If users enable the SND_JACK_INJECTION_DEBUG in the kernel, the audio 39 jack injection interface will be created as be 39 jack injection interface will be created as below: 40 :: 40 :: 41 41 42 $debugfs_mount_dir/sound 42 $debugfs_mount_dir/sound 43 |-- card0 43 |-- card0 44 |-- |-- HDMI_DP_pcm_10_Jack 44 |-- |-- HDMI_DP_pcm_10_Jack 45 |-- |-- |-- jackin_inject 45 |-- |-- |-- jackin_inject 46 |-- |-- |-- kctl_id 46 |-- |-- |-- kctl_id 47 |-- |-- |-- mask_bits 47 |-- |-- |-- mask_bits 48 |-- |-- |-- status 48 |-- |-- |-- status 49 |-- |-- |-- sw_inject_enable 49 |-- |-- |-- sw_inject_enable 50 |-- |-- |-- type 50 |-- |-- |-- type 51 ... 51 ... 52 |-- |-- HDMI_DP_pcm_9_Jack 52 |-- |-- HDMI_DP_pcm_9_Jack 53 |-- |-- jackin_inject 53 |-- |-- jackin_inject 54 |-- |-- kctl_id 54 |-- |-- kctl_id 55 |-- |-- mask_bits 55 |-- |-- mask_bits 56 |-- |-- status 56 |-- |-- status 57 |-- |-- sw_inject_enable 57 |-- |-- sw_inject_enable 58 |-- |-- type 58 |-- |-- type 59 |-- card1 59 |-- card1 60 |-- HDMI_DP_pcm_5_Jack 60 |-- HDMI_DP_pcm_5_Jack 61 |-- |-- jackin_inject 61 |-- |-- jackin_inject 62 |-- |-- kctl_id 62 |-- |-- kctl_id 63 |-- |-- mask_bits 63 |-- |-- mask_bits 64 |-- |-- status 64 |-- |-- status 65 |-- |-- sw_inject_enable 65 |-- |-- sw_inject_enable 66 |-- |-- type 66 |-- |-- type 67 ... 67 ... 68 |-- Headphone_Jack 68 |-- Headphone_Jack 69 |-- |-- jackin_inject 69 |-- |-- jackin_inject 70 |-- |-- kctl_id 70 |-- |-- kctl_id 71 |-- |-- mask_bits 71 |-- |-- mask_bits 72 |-- |-- status 72 |-- |-- status 73 |-- |-- sw_inject_enable 73 |-- |-- sw_inject_enable 74 |-- |-- type 74 |-- |-- type 75 |-- Headset_Mic_Jack 75 |-- Headset_Mic_Jack 76 |-- jackin_inject 76 |-- jackin_inject 77 |-- kctl_id 77 |-- kctl_id 78 |-- mask_bits 78 |-- mask_bits 79 |-- status 79 |-- status 80 |-- sw_inject_enable 80 |-- sw_inject_enable 81 |-- type 81 |-- type 82 82 83 The Explanation Of The Nodes 83 The Explanation Of The Nodes 84 ====================================== 84 ====================================== 85 85 86 kctl_id 86 kctl_id 87 read-only, get jack_kctl->kctl's id 87 read-only, get jack_kctl->kctl's id 88 :: 88 :: 89 89 90 sound/card1/Headphone_Jack# cat kctl_id 90 sound/card1/Headphone_Jack# cat kctl_id 91 Headphone Jack 91 Headphone Jack 92 92 93 mask_bits 93 mask_bits 94 read-only, get jack_kctl's supported events 94 read-only, get jack_kctl's supported events mask_bits 95 :: 95 :: 96 96 97 sound/card1/Headphone_Jack# cat mask_bits 97 sound/card1/Headphone_Jack# cat mask_bits 98 0x0001 HEADPHONE(0x0001) 98 0x0001 HEADPHONE(0x0001) 99 99 100 status 100 status 101 read-only, get jack_kctl's current status 101 read-only, get jack_kctl's current status 102 102 103 - headphone unplugged: 103 - headphone unplugged: 104 104 105 :: 105 :: 106 106 107 sound/card1/Headphone_Jack# cat status 107 sound/card1/Headphone_Jack# cat status 108 Unplugged 108 Unplugged 109 109 110 - headphone plugged: 110 - headphone plugged: 111 111 112 :: 112 :: 113 113 114 sound/card1/Headphone_Jack# cat status 114 sound/card1/Headphone_Jack# cat status 115 Plugged 115 Plugged 116 116 117 type 117 type 118 read-only, get snd_jack's supported events f 118 read-only, get snd_jack's supported events from type (all supported events on the physical audio jack) 119 :: 119 :: 120 120 121 sound/card1/Headphone_Jack# cat type 121 sound/card1/Headphone_Jack# cat type 122 0x7803 HEADPHONE(0x0001) MICROPHONE(0x000 122 0x7803 HEADPHONE(0x0001) MICROPHONE(0x0002) BTN_3(0x0800) BTN_2(0x1000) BTN_1(0x2000) BTN_0(0x4000) 123 123 124 sw_inject_enable 124 sw_inject_enable 125 read-write, enable or disable injection 125 read-write, enable or disable injection 126 126 127 - injection disabled: 127 - injection disabled: 128 128 129 :: 129 :: 130 130 131 sound/card1/Headphone_Jack# cat sw_inject 131 sound/card1/Headphone_Jack# cat sw_inject_enable 132 Jack: Headphone Jack Inject 132 Jack: Headphone Jack Inject Enabled: 0 133 133 134 - injection enabled: 134 - injection enabled: 135 135 136 :: 136 :: 137 137 138 sound/card1/Headphone_Jack# cat sw_inject 138 sound/card1/Headphone_Jack# cat sw_inject_enable 139 Jack: Headphone Jack Inject 139 Jack: Headphone Jack Inject Enabled: 1 140 140 141 - to enable jack injection: 141 - to enable jack injection: 142 142 143 :: 143 :: 144 144 145 sound/card1/Headphone_Jack# echo 1 > sw_i 145 sound/card1/Headphone_Jack# echo 1 > sw_inject_enable 146 146 147 - to disable jack injection: 147 - to disable jack injection: 148 148 149 :: 149 :: 150 150 151 sound/card1/Headphone_Jack# echo 0 > sw_i 151 sound/card1/Headphone_Jack# echo 0 > sw_inject_enable 152 152 153 jackin_inject 153 jackin_inject 154 write-only, inject plugin or plugout 154 write-only, inject plugin or plugout 155 155 156 - to inject plugin: 156 - to inject plugin: 157 157 158 :: 158 :: 159 159 160 sound/card1/Headphone_Jack# echo 1 > jack 160 sound/card1/Headphone_Jack# echo 1 > jackin_inject 161 161 162 - to inject plugout: 162 - to inject plugout: 163 163 164 :: 164 :: 165 165 166 sound/card1/Headphone_Jack# echo 0 > jack 166 sound/card1/Headphone_Jack# echo 0 > jackin_inject
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.