From 688c61494314eb3538610e2c097b25bc3fb0cd83 Mon Sep 17 00:00:00 2001 From: Dominig ar Foll Intel Open Source Date: Wed, 13 Dec 2017 10:43:35 +0100 Subject: 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 --- intel-minnow/CMakeLists.txt | 39 +++++++ intel-minnow/IntelHdaHAL.c | 237 ++++++++++++++++++++++++++++++++++++++ intel-minnow/amixer-output-pc.txt | 41 +++++++ 3 files changed, 317 insertions(+) create mode 100644 intel-minnow/CMakeLists.txt create mode 100644 intel-minnow/IntelHdaHAL.c create mode 100644 intel-minnow/amixer-output-pc.txt (limited to 'intel-minnow') diff --git a/intel-minnow/CMakeLists.txt b/intel-minnow/CMakeLists.txt new file mode 100644 index 0000000..fc67013 --- /dev/null +++ b/intel-minnow/CMakeLists.txt @@ -0,0 +1,39 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# +# 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-minnow) + + # 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-minnow/IntelHdaHAL.c b/intel-minnow/IntelHdaHAL.c new file mode 100644 index 0000000..99412f0 --- /dev/null +++ b/intel-minnow/IntelHdaHAL.c @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2016 "IoT.bzh" + * Author Fulup Ar Foll + * + * 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 1001 +#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, +}; + +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_Volume, + .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, + .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, + .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 numid and optionally with a custom callback for non Alsa supported functionalities. +STATIC alsaHalMapT alsaHalMap[]= { + { .tag=Video_Playback_Volume, .ctl={.name="Video_Volume", .value=100 } }, + { .tag=Phone_Playback_Volume, .ctl={.name="Phone_Volume", .value=100 } }, + { .tag=PCM_Playback_Volume , .ctl={.name="PCM Playback Volume", .value=100 } }, + { .tag=IEC958 Playback Switch, .ctl={.name="IEC958 Playback Switch" } }, + + // 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-1amixer -D hw:0 controls00) + { .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=SND_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=SND_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 } + }, + { .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 Minnowboard sound card", + .ctls = alsaHalMap, +}; + +STATIC int sndServiceInit() { + int err; + AFB_DEBUG("IntelHal Minnow Board 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-minnow", + .init = sndServiceInit, + .verbs = halServiceApi, + .onevent = halServiceEvent, +}; diff --git a/intel-minnow/amixer-output-pc.txt b/intel-minnow/amixer-output-pc.txt new file mode 100644 index 0000000..08b89bd --- /dev/null +++ b/intel-minnow/amixer-output-pc.txt @@ -0,0 +1,41 @@ + +amixer -D hw:0 controls + +numid=1,iface=CARD,name='HDMI/DP,pcm=3 Jack' +numid=7,iface=CARD,name='HDMI/DP,pcm=7 Jack' +numid=19,iface=MIXER,name='Phone_Volume' +numid=22,iface=MIXER,name='Video_Volume' +numid=2,iface=MIXER,name='IEC958 Playback Con Mask' +numid=8,iface=MIXER,name='IEC958 Playback Con Mask',index=1 +numid=3,iface=MIXER,name='IEC958 Playback Pro Mask' +numid=9,iface=MIXER,name='IEC958 Playback Pro Mask',index=1 +numid=4,iface=MIXER,name='IEC958 Playback Default' +numid=10,iface=MIXER,name='IEC958 Playback Default',index=1 +numid=5,iface=MIXER,name='IEC958 Playback Switch' +numid=11,iface=MIXER,name='IEC958 Playback Switch',index=1 +numid=18,iface=MIXER,name='CustomHigh_Volume' +numid=26,iface=MIXER,name='CustomLow_Volume' +numid=21,iface=MIXER,name='CustomMedium_Volume' +numid=15,iface=MIXER,name='Emergency_Volume' +numid=16,iface=MIXER,name='Fallback_Volume' +numid=24,iface=MIXER,name='Multimedia_Volume' +numid=20,iface=MIXER,name='Navigation_Volume' +numid=25,iface=MIXER,name='Radio_Volume' +numid=23,iface=MIXER,name='Streaming_Volume' +numid=17,iface=MIXER,name='Warning_Volume' +numid=6,iface=PCM,name='ELD',device=3 +numid=13,iface=PCM,name='Playback Channel Map',device=3 +numid=12,iface=PCM,name='ELD',device=7 +numid=14,iface=PCM,name='Playback Channel Map',device=7 + + + aplay -l + + **** Liste des Périphériques Matériels PLAYBACK **** +**** List of PLAYBACK Hardware Devices **** +card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0] + Subdevices: 1/1 + Subdevice #0: subdevice #0 +card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1] + Subdevices: 1/1 + Subdevice #0: subdevice #0 -- cgit 1.2.3-korg