diff options
author | Dominig ar Foll Intel Open Source <dominig.arfoll@fridu.net> | 2017-12-13 10:43:35 +0100 |
---|---|---|
committer | Jan-Simon Moeller <jsmoeller@linuxfoundation.org> | 2017-12-14 00:26:48 +0000 |
commit | 688c61494314eb3538610e2c097b25bc3fb0cd83 (patch) | |
tree | e673de0dd8db15dd53b26909339c86d465c114ef /intel-pc | |
parent | d78ffe27c567b7180733bf9a6211da476bb80ee6 (diff) |
HAL(s) need to match the exact HW palform alsa controls which are different even for similar platforms #SPEC-1184
Change-Id: Id962ea5365af7539277f335b83169712291aa3df
Signed-off-by: Dominig ar Foll Intel Open Source <dominig.arfoll@fridu.net>
Diffstat (limited to 'intel-pc')
-rw-r--r-- | intel-pc/CMakeLists.txt | 39 | ||||
-rw-r--r-- | intel-pc/IntelHdaHAL.c | 237 | ||||
-rw-r--r-- | intel-pc/amixer-output-pc.txt | 62 |
3 files changed, 338 insertions, 0 deletions
diff --git a/intel-pc/CMakeLists.txt b/intel-pc/CMakeLists.txt new file mode 100644 index 0000000..68cc902 --- /dev/null +++ b/intel-pc/CMakeLists.txt @@ -0,0 +1,39 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll <fulup@iot.bzh> +# +# 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. +########################################################################### + +if(HAL_INTEL_HDA) + # Add target to project dependency list + PROJECT_TARGET_ADD(hal-intel-pc) + + # Define project Targets + ADD_LIBRARY(${TARGET_NAME} MODULE IntelHdaHAL.c) + + # Binder exposes a unique public entry point + SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + PREFIX "afb-" + LABELS "BINDING" + LINK_FLAGS ${BINDINGS_LINK_FLAG} + OUTPUT_NAME ${TARGET_NAME} + ) + + # Library dependencies (include updates automatically) + TARGET_LINK_LIBRARIES(${TARGET_NAME} + hal-utilities-4a + ${link_libraries} + ) +endif() diff --git a/intel-pc/IntelHdaHAL.c b/intel-pc/IntelHdaHAL.c new file mode 100644 index 0000000..e2be738 --- /dev/null +++ b/intel-pc/IntelHdaHAL.c @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2016 "IoT.bzh" + * Author Fulup Ar Foll <fulup@iot.bzh> + * + * 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. + * + * + * To find out which control your sound card uses + * aplay -l # Check sndcard name name in between [] + * amixer -D hw:xx controls # get supported controls + * amixer -D "hw:3" cget numid=xx # get control settings + * + */ +#define _GNU_SOURCE +#include "hal-interface.h" + +// Define few private tag for not standard functions +#define PCM_Volume_Multimedia 1000 +#define PCM_Volume_Navigation 1001Laptop +#define PCM_Volume_Emergency 1002 + +// Default Values for MasterVolume Ramping +STATIC halVolRampT volRampMaster= { + .mode = RAMP_VOL_NORMAL, + .slave = Master_Playback_Volume, + .delay = 100*1000, // ramping delay in us + .stepDown=1, + .stepUp =1, +}; + +//Solvol Ramping Value can be customize by Audio Role and Hardwar card +STATIC halVolRampT volRampEmergency= { + .slave = Emergency_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 10, +}; + +STATIC halVolRampT volRampWarning= { + .slave = Warning_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 6, + .stepUp = 10, +}; + +STATIC halVolRampT volRampCustomHigh= { + .slave = CustomHigh_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 4, +}; + +STATIC halVolRampT volRampPhone= { + .slave = Phone_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 2, +};Laptop + +STATIC halVolRampT volRampNavigation= { + .slave = Navigation_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 4, +}; + +STATIC halVolRampT volRampCustomMedium= { + .slave = CustomMedium_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 4, +}; + +STATIC halVolRampT volRampVideo= { + .slave = Video_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 4, +}; + +STATIC halVolRampT volRampStreaming= { + .slave = Streaming_Playback_VoluLaptopme, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 4, +}; + +STATIC halVolRampT volRampMultimedia= { + .slave = Multimedia_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2,Laptop + .stepUp = 4, +}; + +STATIC halVolRampT volRampRadio= { + .slave = Radio_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 4, +}; + +STATIC halVolRampT volRampCustomLow= { + .slave = CustomLow_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2,Laptop + .stepUp = 4, +}; + +STATIC halVolRampT volRampFallback= { + .slave = Fallback_Playback_Volume, + .delay = 50*1000, // ramping delay in us + .stepDown= 2, + .stepUp = 4, +}; + + +// Map HAL hight sndctl with Alsa numidLaptop and optionally with a custom callback for non Alsa supported functionalities. +STATIC alsaHalMapT alsaHalMap[]= { + { .tag=Master_Playback_Volume, .ctl={.name="Master Playback Volume", .value=100 } }, + { .tag=PCM_Playback_Volume , .ctl={.name="PCM Playback Volume", .value=100 } }, + { .tag=PCM_Playback_Switch , .ctl={.name="Master Playback Switch" } }, + { .tag=Capture_Volume , .ctl={.name="Capture Volume" } }, + + // Sound card does not have hardware volume ramping + { .tag=Master_Playback_Ramp , .cb={.callback=volumeRamp, .handle=&volRampMaster}, .info="Master Playback Volume Ramp", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER, .count=1, .minval=0, .maxval=100, .step=1, .name="Master_Ramp"} + }, + + // Implement Rampup Volume for Virtual Channels (0-100) + { .tag=Emergency_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampEmergency}, .info="RampUp Emergency Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Emergency_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=Warning_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampWarning}, .info="RampUp Warning Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Warning_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=CustomHigh_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampCustomHigh}, .info="RampUp CustomHigh Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="CustomHigh_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=Phone_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampPhone}, .info="RampUp Phone Volume", + .ctl={.numid=CTL_AUTO, .type=SNLaptopD_CTL_ELEM_TYPE_INTEGER,.name="Phone_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=Navigation_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampNavigation}, .info="RampUp Navigation Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Navigation_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=CustomMedium_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampCustomMedium}, .info="RampUp CustomMedium Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="CustomMedium_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=Video_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampVideo}, .info="RampUp Video Volume", + .ctl={.numid=CTL_AUTO, .type=SNLaptopD_CTL_ELEM_TYPE_INTEGER,.name="Video_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=Streaming_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampStreaming}, .info="RampUp Streaming Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Streaming_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + },OnErrorExitOnErrorExit + { .tag=Multimedia_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampMultimedia}, .info="RampUp Multimedia Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Multimedia_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=Radio_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampRadio}, .info="RampUp Radio Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Radio_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=CustomLow_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampCustomLow}, .info="RampUp CustomLow Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="CustomLow_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + { .tag=Fallback_Playback_Ramp, .cb={.callback=volumeRamp, .handle=&volRampFallback}, .info="RampUp Fallback Volume", + .ctl={.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.name="Fallback_Ramp", .minval=0, .maxval=100, .step=1, .value=80 } + }, + + // Bind with existing ones created by ALSA configuration (and linked to softvol) [0-255] + { .tag=Emergency_Playback_Volume , + .ctl={.name="Emergency_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Warning_Playback_Volume , + .ctl={.name="Warning_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=CustomHigh_Playback_Volume , + .ctl={.name="CustomHigh_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Phone_Playback_Volume , + .ctl={.name="Phone_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Navigation_Playback_Volume , + .ctl={.name="Navigation_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=CustomMedium_Playback_Volume , + .ctl={.name="CustomMedium_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Video_Playback_Volume , + .ctl={.name="Video_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Streaming_Playback_Volume , + .ctl={.name="Streaming_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Multimedia_Playback_Volume , + .ctl={.name="Multimedia_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Radio_Playback_Volume , + .ctl={.name="Radio_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=CustomLow_Playback_Volume , + .ctl={.name="CustomLow_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=Fallback_Playback_Volume , + .ctl={.name="Fallback_Volume",.numid=CTL_AUTO, .type=SND_CTL_ELEM_TYPE_INTEGER,.count=2, .maxval=255, .value=204 } + }, + { .tag=EndHalCrlTag} /* marker for end of the array */ +} ; + +// HAL sound card mapping info +STATIC alsaHalSndCardT alsaHalSndCard = { + .name = "HDA Intel PCH", // WARNING: name MUST match with 'aplay -l' + .info = "Hardware Abstraction Layer for IntelHDA sound card for PC / Laptop", + .ctls = alsaHalMap, +}; + +STATIC int sndServiceInit() { + int err; + AFB_DEBUG("IntelHal PC-laptop Binding Init"); + err = halServiceInit(afbBindingV2.api, &alsaHalSndCard); + return err; +} + +// API prefix should be unique for each snd card +PUBLIC const struct afb_binding_v2 afbBindingV2 = { + .api = "intel-pc", + .init = sndServiceInit, + .verbs = halServiceApi, + .onevent = halServiceEvent, +}; diff --git a/intel-pc/amixer-output-pc.txt b/intel-pc/amixer-output-pc.txt new file mode 100644 index 0000000..955d817 --- /dev/null +++ b/intel-pc/amixer-output-pc.txt @@ -0,0 +1,62 @@ + +amixer -D hw:0 controls + +numid=18,iface=CARD,name='Dock Headphone Jack' +numid=14,iface=CARD,name='Dock Mic Jack' +numid=22,iface=CARD,name='HDMI/DP,pcm=3 Jack' +numid=28,iface=CARD,name='HDMI/DP,pcm=7 Jack' +numid=34,iface=CARD,name='HDMI/DP,pcm=8 Jack' +numid=19,iface=CARD,name='Headphone Jack' +numid=16,iface=CARD,name='Internal Mic Phantom Jack' +numid=15,iface=CARD,name='Mic Jack' +numid=17,iface=CARD,name='Speaker Phantom Jack' +numid=13,iface=MIXER,name='Master Playback Switch' +numid=12,iface=MIXER,name='Master Playback Volume' +numid=4,iface=MIXER,name='Headphone Playback Switch' +numid=5,iface=MIXER,name='Headphone Playback Switch',index=1 +numid=3,iface=MIXER,name='Headphone Playback Volume' +numid=43,iface=MIXER,name='PCM Playback Volume' +numid=10,iface=MIXER,name='Mic Boost Volume' +numid=8,iface=MIXER,name='Capture Switch' +numid=7,iface=MIXER,name='Capture Volume' +numid=23,iface=MIXER,name='IEC958 Playback Con Mask' +numid=29,iface=MIXER,name='IEC958 Playback Con Mask',index=1 +numid=35,iface=MIXER,name='IEC958 Playback Con Mask',index=2 +numid=24,iface=MIXER,name='IEC958 Playback Pro Mask' +numid=30,iface=MIXER,name='IEC958 Playback Pro Mask',index=1 +numid=36,iface=MIXER,name='IEC958 Playback Pro Mask',index=2 +numid=25,iface=MIXER,name='IEC958 Playback Default' +numid=31,iface=MIXER,name='IEC958 Playback Default',index=1 +numid=37,iface=MIXER,name='IEC958 Playback Default',index=2 +numid=26,iface=MIXER,name='IEC958 Playback Switch' +numid=32,iface=MIXER,name='IEC958 Playback Switch',index=1 +numid=38,iface=MIXER,name='IEC958 Playback Switch',index=2 +numid=6,iface=MIXER,name='Auto-Mute Mode' +numid=9,iface=MIXER,name='Dock Mic Boost Volume' +numid=11,iface=MIXER,name='Internal Mic Boost Volume' +numid=2,iface=MIXER,name='Speaker Playback Switch' +numid=1,iface=MIXER,name='Speaker Playback Volume' +numid=21,iface=PCM,name='Capture Channel Map' +numid=20,iface=PCM,name='Playback Channel Map' +numid=27,iface=PCM,name='ELD',device=3 +numid=40,iface=PCM,name='Playback Channel Map',device=3 +numid=33,iface=PCM,name='ELD',device=7 +numid=41,iface=PCM,name='Playback Channel Map',device=7 +numid=39,iface=PCM,name='ELD',device=8 +numid=42,iface=PCM,name='Playback Channel Map',device=8 + + aplay -l + + **** Liste des Périphériques Matériels PLAYBACK **** +carte 0: PCH [HDA Intel PCH], périphérique 0: ALC293 Analog [ALC293 Analog] + Sous-périphériques: 1/1 + Sous-périphérique #0: subdevice #0 +carte 0: PCH [HDA Intel PCH], périphérique 3: HDMI 0 [HDMI 0] + Sous-périphériques: 1/1 + Sous-périphérique #0: subdevice #0 +carte 0: PCH [HDA Intel PCH], périphérique 7: HDMI 1 [HDMI 1] + Sous-périphériques: 1/1 + Sous-périphérique #0: subdevice #0 +carte 0: PCH [HDA Intel PCH], périphérique 8: HDMI 2 [HDMI 2] + Sous-périphériques: 1/1 + Sous-périphérique #0: subdevice #0 |