blob: bd285ebc00b100328f794981be653aabfe94379a [file] [log] [blame]
/*
* Copyright (C) 2018 Knowles Electronics
*
* 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.
*/
#define LOG_TAG "SoundTriggerHALUtil"
#define LOG_NDEBUG 0
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>
#include <log/log.h>
#include <errno.h>
#include <linux/errno.h>
#include <sys/ioctl.h>
#include "cvq_ioctl.h"
/* Array for ST route */
static const char * const route_table[ST_ROUTE_MAX] = {
/* Input Port routing definition */
[ST_MIC_ROUTE_INT_CLK] = "mic-route-internal-clock",
[ST_MIC_ROUTE_EXT_CLK] = "mic-route-external-clock",
[ST_BARGEIN_AMP_REF] = "bargein-amp-ref",
[ST_BARGEIN_AMP_REF_48K] = "bargein-amp-ref-48k",
/* Plugin routing definition */
[ST_HOTWORD_WITHOUT_BARGEIN] = "hotword-route-without-bargein",
[ST_HOTWORD_WITH_BARGEIN] = "hotword-route-with-bargein",
[ST_HOTWORD_BUFFER_WITHOUT_BARGEIN] = "buffer-route-without-bargein",
[ST_HOTWORD_BUFFER_WITH_BARGEIN] = "buffer-route-with-bargein",
[ST_AMBIENT_WITHOUT_BARGEIN] = "ambient-route-without-bargein",
[ST_AMBIENT_WITH_BARGEIN] = "ambient-route-with-bargein",
[ST_AMBIENT_BUFFER_WITHOUT_BARGEIN] = "downlink-audio-route",
[ST_AMBIENT_BUFFER_WITH_BARGEIN] = "music-audio-route",
[ST_BARGEIN_ROUTE] = "bargein-route",
[ST_CHRE_WITHOUT_BARGEIN] = "chre-route-without-bargein",
[ST_CHRE_WITH_BARGEIN] = "chre-route-with-bargein",
[ST_SRC_ROUTE_MIC] = "src-route-mic",
[ST_SRC_ROUTE_AMP_REF] = "src-route-amp-ref",
[ST_SENSOR_ROUTE] = "oslo-route",
};
int write_model(struct iaxxx_odsp_hw *odsp_hdl, unsigned char *data,
int length, int kw_type)
{
int err = 0;
switch(kw_type)
{
case 0: //HOTWORD
ALOGV("+%s+ OK_GOOGLE_KW_ID", __func__);
err = iaxxx_odsp_plugin_set_parameter_blk(odsp_hdl,
HOTWORD_INSTANCE_ID, HOTWORD_SLOT_ID,
IAXXX_HMD_BLOCK_ID, data, length);
break;
case 1: //AMBIENT
ALOGV("+%s+ AMBIENT_KW_ID", __func__);
err = iaxxx_odsp_plugin_set_parameter_blk(odsp_hdl,
AMBIENT_INSTANCE_ID, AMBIENT_SLOT_ID,
IAXXX_HMD_BLOCK_ID, data, length);
break;
case 2: //ENTITY
ALOGV("+%s+ Entity_KW_ID", __func__);
err = iaxxx_odsp_plugin_set_parameter_blk(odsp_hdl,
AMBIENT_INSTANCE_ID, ENTITY_SLOT_ID,
IAXXX_HMD_BLOCK_ID, data, length);
break;
case 3: //WAKEUP
ALOGV("+%s+ WAKEUP_KW_ID", __func__);
err = iaxxx_odsp_plugin_set_parameter_blk(odsp_hdl,
HOTWORD_INSTANCE_ID, WAKEUP_SLOT_ID,
IAXXX_HMD_BLOCK_ID, data, length);
break;
default:
ALOGE("%s: Unknown KW_ID\n", __func__);
err = -EINVAL;
goto exit;
}
if (err < 0) {
ALOGE("%s: Failed to load the keyword with error %s\n",
__func__, strerror(errno));
goto exit;
}
ALOGV("-%s-", __func__);
exit:
return err;
}
int get_model_state(struct iaxxx_odsp_hw *odsp_hdl, const uint32_t inst_id,
const uint32_t param_val)
{
int err = 0;
const uint32_t param_id = AMBIENT_GET_MODEL_STATE_PARAM_ID;
const uint32_t block_id = IAXXX_HMD_BLOCK_ID;
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl, inst_id, param_id,
param_val, block_id);
if (err != 0) {
ALOGE("%s: ERROR: Failed to get the model state", __func__);
}
return err;
}
int get_event(struct iaxxx_odsp_hw *odsp_hdl, struct iaxxx_get_event_info *ge)
{
int err = 0;
ALOGV("+%s+", __func__);
err = iaxxx_odsp_evt_getevent(odsp_hdl, ge);
if (err != 0) {
ALOGE("%s: ERROR Failed to get event with error %d(%s)",
__func__, errno, strerror(errno));
}
ALOGV("-%s-", __func__);
return err;
}
int reset_ambient_plugin(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGV("+%s+", __func__);
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
AMBIENT_INSTANCE_ID,
AMBIENT_RESET_PARAM_ID,
AMBIENT_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Set param for ambient lib reset failed %d(%s)",
__func__, errno, strerror(errno));
}
ALOGV("-%s-", __func__);
return err;
}
int set_sensor_route(struct audio_route *route_hdl, bool enable)
{
int err = 0;
ALOGV("+%s+", __func__);
if (enable)
err = audio_route_apply_and_update_path(route_hdl, route_table[ST_SENSOR_ROUTE]);
else
err = audio_route_reset_and_update_path(route_hdl, route_table[ST_SENSOR_ROUTE]);
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGV("-%s-", __func__);
return err;
}
int set_ambient_state(struct iaxxx_odsp_hw *odsp_hdl,
unsigned int current)
{
int err = 0;
ALOGV("+%s+ enable models %x", __func__, current & PLUGIN2_MASK);
err = iaxxx_odsp_plugin_setevent(odsp_hdl, AMBIENT_INSTANCE_ID,
current & PLUGIN2_MASK, IAXXX_HMD_BLOCK_ID);
if (err < 0) {
ALOGE("%s: ERROR: ambient set event failed with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
if (current & AMBIENT_MASK) {
err = iaxxx_odsp_evt_subscribe(odsp_hdl, AMBIENT_EVT_SRC_ID,
AMBIENT_DETECTION, IAXXX_SYSID_HOST, 0);
if (err < 0) {
ALOGE("%s: ERROR: Ambient subscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
}
if (current & ENTITY_MASK) {
err = iaxxx_odsp_evt_subscribe(odsp_hdl, AMBIENT_EVT_SRC_ID,
ENTITY_DETECTION, IAXXX_SYSID_HOST, 0);
if (err < 0) {
ALOGE("%s: ERROR: Entity subscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
}
exit:
ALOGV("-%s-", __func__);
return err;
}
int tear_ambient_state(struct iaxxx_odsp_hw *odsp_hdl,
unsigned int current)
{
int err = 0;
ALOGV("+%s+ current %x", __func__, current & PLUGIN2_MASK);
if (current & AMBIENT_MASK) {
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, AMBIENT_EVT_SRC_ID,
AMBIENT_DETECTION, IAXXX_SYSID_HOST);
if (err < 0) {
ALOGE("%s: ERROR: Ambient unsubscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
AMBIENT_INSTANCE_ID,
AMBIENT_UNLOAD_PARAM_ID,
AMBIENT_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
if (err < 0) {
ALOGE("%s: ERROR: Ambient model unload failed with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
}
if (current & ENTITY_MASK) {
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, AMBIENT_EVT_SRC_ID,
ENTITY_DETECTION, IAXXX_SYSID_HOST);
if (err < 0) {
ALOGE("%s: ERROR: Entity unsubscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
AMBIENT_INSTANCE_ID,
AMBIENT_UNLOAD_PARAM_ID,
ENTITY_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
if (err < 0) {
ALOGE("%s: ERROR: Entity model unload failed with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
}
exit:
ALOGV("-%s-", __func__);
return err;
}
int set_ambient_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGV("+%s bargein %d+", __func__, bargein);
if (bargein == true)
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_AMBIENT_WITH_BARGEIN]);
else
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_AMBIENT_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route apply fail %d", __func__, err);
ALOGV("-%s-", __func__);
return err;
}
int tear_ambient_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGV("+%s bargein %d+", __func__, bargein);
/* check cvq node to send ioctl */
if (bargein == true)
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_AMBIENT_WITH_BARGEIN]);
else
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_AMBIENT_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route reset fail %d", __func__, err);
ALOGV("-%s-", __func__);
return err;
}
int set_hotword_state(struct iaxxx_odsp_hw *odsp_hdl, unsigned int current)
{
int err = 0;
ALOGV("+%s+ current %x", __func__, current & PLUGIN1_MASK);
// Set the events and params
err = iaxxx_odsp_plugin_setevent(odsp_hdl, HOTWORD_INSTANCE_ID,
current & PLUGIN1_MASK, IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Hotword set event failed with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
if (current & HOTWORD_MASK) {
ALOGD("Registering for Hotword event\n");
err = iaxxx_odsp_evt_subscribe(odsp_hdl, HOTWORD_EVT_SRC_ID,
HOTWORD_DETECTION, IAXXX_SYSID_HOST, 0);
if (err < 0) {
ALOGE("%s: ERROR: HOTWORD subscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
}
if (current & WAKEUP_MASK) {
ALOGD("Registering for Wakeup event\n");
err = iaxxx_odsp_evt_subscribe(odsp_hdl, HOTWORD_EVT_SRC_ID,
WAKEUP_DETECTION, IAXXX_SYSID_HOST, 0);
if (err < 0) {
ALOGE("%s: ERROR: WAKEUP subscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
}
ALOGV("-%s-", __func__);
exit:
return err;
}
int tear_hotword_state(struct iaxxx_odsp_hw *odsp_hdl, unsigned int current)
{
int err = 0;
ALOGV("+%s+ current %x", __func__, current & PLUGIN1_MASK);
if (current & HOTWORD_MASK) {
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, HOTWORD_EVT_SRC_ID,
HOTWORD_DETECTION, IAXXX_SYSID_HOST);
if (err < 0) {
ALOGE("%s: ERROR: Hotword unsubscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
HOTWORD_INSTANCE_ID,
HOTWORD_UNLOAD_PARAM_ID,
HOTWORD_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
if (err < 0) {
ALOGE("%s: ERROR: Ambient model unload failed with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
}
if (current & WAKEUP_MASK) {
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, HOTWORD_EVT_SRC_ID,
WAKEUP_DETECTION, IAXXX_SYSID_HOST);
if (err < 0) {
ALOGE("%s: ERROR: WAKEUP unsubscribe event failed"
" with error %d(%s)", __func__,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
HOTWORD_INSTANCE_ID,
HOTWORD_UNLOAD_PARAM_ID,
WAKEUP_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
if (err < 0) {
ALOGE("%s: ERROR: WAKEUP model unload failed with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
}
ALOGV("-%s-", __func__);
exit:
return err;
}
int set_hotword_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGV("+%s bargein %d+", __func__, bargein);
if (bargein == true)
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_HOTWORD_WITH_BARGEIN]);
else
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_HOTWORD_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route apply fail %d", __func__, err);
ALOGV("-%s-", __func__);
return err;
}
int tear_hotword_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGV("+%s bargein %d+", __func__, bargein);
/* check cvq node to send ioctl */
if (bargein == true)
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_HOTWORD_WITH_BARGEIN]);
else
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_HOTWORD_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route reset fail %d", __func__, err);
ALOGV("-%s-", __func__);
return err;
}
int set_chre_audio_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGV("+%s+", __func__);
if (bargein)
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_CHRE_WITH_BARGEIN]);
else
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_CHRE_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route apply fail %d", __func__, err);
ALOGV("-%s-", __func__);
return err;
}
int tear_chre_audio_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGV("+%s+", __func__);
if (bargein == true)
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_CHRE_WITH_BARGEIN]);
else
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_CHRE_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route reset fail %d", __func__, err);
ALOGV("-%s-", __func__);
return err;
}
int sensor_event_init_params(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGV("+%s+", __func__);
// Set the events and params
err = iaxxx_odsp_plugin_setevent(odsp_hdl, SENSOR_INSTANCE_ID, 0x1F,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Sensor set event with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("Registering for 3 sensor mode switch events\n");
// Subscribe for events
err = iaxxx_odsp_evt_subscribe(odsp_hdl, OSLO_EVT_SRC_ID,
SENSOR_PRESENCE_MODE, IAXXX_SYSID_SCRIPT_MGR,
0x1201);
if (err != 0) {
ALOGE("%s: ERROR: Sensor subscribe (presence mode) failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Subscribe for events
err = iaxxx_odsp_evt_subscribe(odsp_hdl, OSLO_EVT_SRC_ID,
SENSOR_DETECTED_MODE, IAXXX_SYSID_SCRIPT_MGR,
0x1202);
if (err != 0) {
ALOGE("%s: ERROR: Sensor subscribe (detection mode) failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Subscribe for events
err = iaxxx_odsp_evt_subscribe(odsp_hdl, OSLO_EVT_SRC_ID,
SENSOR_MAX_MODE, IAXXX_SYSID_HOST, 0);
if (err != 0) {
ALOGE("%s: ERROR: Sensor subscribe (max mode) failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_subscribe(odsp_hdl, OSLO_EVT_SRC_ID,
OSLO_DATA_EVENT_ID, IAXXX_SYSID_HOST_1, 0);
if (err != 0) {
ALOGE("%s: ERROR: Sensor subscribe (oslo data event) failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_subscribe(odsp_hdl, OSLO_EVT_SRC_ID,
OSLO_CONFIGURED, IAXXX_SYSID_HOST_1, 0);
if (err != 0) {
ALOGE("%s: ERROR: Sensor subscribe (oslo configured) failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_subscribe(odsp_hdl, OSLO_EVT_SRC_ID,
OSLO_DESTROYED, IAXXX_SYSID_HOST_1, 0);
if (err != 0) {
ALOGE("%s: ERROR: Sensor subscribe (oslo destroyed) %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_subscribe(odsp_hdl, IAXXX_SYSID_HOST_1,
OSLO_EP_DISCONNECT, IAXXX_SYSID_HOST_0, 0);
if (err == -1) {
ALOGE("%s: ERROR: oslo event subscription (oslo ep disconnect) failed with"
" error %d(%s)", __func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_trigger(odsp_hdl, OSLO_EVT_SRC_ID, OSLO_CONFIGURED, 0);
if (err != 0) {
ALOGE("%s: ERROR: olso event trigger (oslo configured) failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGV("-%s-", __func__);
exit:
return err;
}
static int sensor_event_deinit_params(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, OSLO_EVT_SRC_ID, SENSOR_MAX_MODE,
IAXXX_SYSID_HOST);
if (err != 0) {
ALOGE("%s: Failed to unsubscribe sensor event (src id %d event id %d)"
" error %d(%s)", __func__, OSLO_EVT_SRC_ID,
SENSOR_MAX_MODE, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, OSLO_EVT_SRC_ID,
SENSOR_DETECTED_MODE, IAXXX_SYSID_SCRIPT_MGR);
if (err != 0) {
ALOGE("%s: Failed to unsubscribe sensor event (src id %d event id %d)"
" error %d(%s)", __func__, OSLO_EVT_SRC_ID,
SENSOR_DETECTED_MODE, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, OSLO_EVT_SRC_ID,
SENSOR_PRESENCE_MODE, IAXXX_SYSID_SCRIPT_MGR);
if (err != 0) {
ALOGE("%s: Failed to unsubscribe sensor event (src id %d event id %d)"
" error %d(%s)", __func__, OSLO_EVT_SRC_ID,
SENSOR_PRESENCE_MODE, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, OSLO_EVT_SRC_ID,
OSLO_DATA_EVENT_ID, IAXXX_SYSID_HOST_1);
if (err != 0) {
ALOGE("%s: Failed to unsubscribe sensor event (src id %d event id %d)"
" from host %d error %d(%s)", __func__, OSLO_EVT_SRC_ID,
OSLO_DATA_EVENT_ID, IAXXX_SYSID_HOST_1, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, OSLO_EVT_SRC_ID,
OSLO_CONFIGURED, IAXXX_SYSID_HOST_1);
if (err != 0) {
ALOGE("%s: Failed to unsubscribe sensor event (src id %d event id %d)"
" from host %d error %d(%s)", __func__, OSLO_EVT_SRC_ID,
OSLO_CONFIGURED, IAXXX_SYSID_HOST_1, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, OSLO_EVT_SRC_ID,
OSLO_DESTROYED, IAXXX_SYSID_HOST_1);
if (err != 0) {
ALOGE("%s: Failed to unsubscribe sensor event (src id %d event id %d)"
" from host %d error %d(%s)", __func__, OSLO_EVT_SRC_ID,
OSLO_DESTROYED, IAXXX_SYSID_HOST_1, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, IAXXX_SYSID_HOST_1,
OSLO_EP_DISCONNECT, IAXXX_SYSID_HOST_0);
if (err != 0) {
ALOGE("%s: Failed to unsubscribe sensor event (src id %d event id %d)"
" from host %d with the error %d(%s)", __func__, IAXXX_SYSID_HOST_1,
OSLO_EP_DISCONNECT, IAXXX_SYSID_HOST_0, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int flush_model(struct iaxxx_odsp_hw *odsp_hdl, int kw_type)
{
int err = 0;
ALOGV("+%s+", __func__);
switch(kw_type)
{
case 0: //HOTWORD
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
HOTWORD_INSTANCE_ID,
HOTWORD_UNLOAD_PARAM_ID,
HOTWORD_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
break;
case 1: //AMBIENT
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
AMBIENT_INSTANCE_ID,
AMBIENT_UNLOAD_PARAM_ID,
AMBIENT_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
break;
case 2: //ENTITY
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
AMBIENT_INSTANCE_ID,
AMBIENT_UNLOAD_PARAM_ID,
ENTITY_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
break;
case 3: //WAKEUP
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl,
HOTWORD_INSTANCE_ID,
HOTWORD_UNLOAD_PARAM_ID,
WAKEUP_SLOT_ID,
IAXXX_HMD_BLOCK_ID);
break;
default:
ALOGE("%s: Unknown KW_ID\n", __func__);
err = -1;
errno = -EINVAL;
break;
}
if (err < 0) {
ALOGE("%s: ERROR: model unload set param failed with error %d(%s)",
__func__, errno, strerror(errno));
}
ALOGV("-%s-", __func__);
return err;
}
int setup_buffer_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_package_load(odsp_hdl, BUFFER_PACKAGE, BUF_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to load Buffer package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_buffer_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_package_unload(odsp_hdl, BUF_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to unload Buffer package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int setup_hotword_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
// Download packages for ok google
err = iaxxx_odsp_package_load(odsp_hdl, AMBIENT_EC_PACKAGE,
HOTWORD_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to load Hotword package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Create Hotword plugin
err = iaxxx_odsp_plugin_create(odsp_hdl, HOTWORD_INSTANCE_ID, HOTWORD_PRIORITY,
HOTWORD_PKG_ID, HOTWORD_PLUGIN_IDX,
IAXXX_HMD_BLOCK_ID, PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create Hotword plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl, HOTWORD_INSTANCE_ID, 0,
0, IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Hotword init frontend failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_hotword_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_plugin_destroy(odsp_hdl, HOTWORD_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy Hotword plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Unload hotword package
err = iaxxx_odsp_package_unload(odsp_hdl, HOTWORD_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to unload Hotword package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
unsigned int get_hotword_version(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
const uint32_t inst_id = HOTWORD_INSTANCE_ID;
const uint32_t param_id = HOTWORD_GET_VERSION_PARAM_ID;
const uint32_t block_id = IAXXX_HMD_BLOCK_ID;
unsigned int param_val = HOTWORD_DEFAULT_VER;
err = setup_hotword_package(odsp_hdl);
if (err != 0) {
if (errno == EEXIST) {
ALOGW("%s: WARN: Hotword package existed already", __func__);
err = iaxxx_odsp_plugin_get_parameter(odsp_hdl, inst_id, param_id,
block_id, &param_val);
if (err != 0) {
ALOGE("%s: Failed to get parameter for id %u with error %d: %s",
__func__, param_id, err, strerror(errno));
} else {
ALOGD("%s: Value of parameter id %u is %u", __func__, param_id,
param_val);
}
} else {
ALOGE("%s: ERROR: setup hotword package failed", __func__);
}
} else {
err = iaxxx_odsp_plugin_get_parameter(odsp_hdl, inst_id, param_id,
block_id, &param_val);
if (err != 0) {
ALOGE("%s: Failed to get parameter for id %u with error %d: %s",
__func__, param_id, err, strerror(errno));
} else {
ALOGD("%s: Value of parameter id %u is %u", __func__, param_id,
param_val);
}
err = destroy_hotword_package(odsp_hdl);
if (err != 0)
ALOGE("%s: ERROR: destroy hotword package failed", __func__);
}
return param_val;
}
int setup_ambient_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
// Download packages for ambient
err = iaxxx_odsp_package_load(odsp_hdl, AMBIENT_DA_PACKAGE,
AMBIENT_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to load Ambient package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Create Ambient plugin
err = iaxxx_odsp_plugin_create(odsp_hdl, AMBIENT_INSTANCE_ID,
AMBIENT_PRIORITY, AMBIENT_PKG_ID,
AMBIENT_PLUGIN_IDX, IAXXX_HMD_BLOCK_ID,
PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create Ambient plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl, AMBIENT_INSTANCE_ID,
0, 0, IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Ambient init frontend failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_ambient_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_plugin_destroy(odsp_hdl, AMBIENT_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy Ambient plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_package_unload(odsp_hdl, AMBIENT_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to unload Ambient package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
unsigned int get_ambient_version(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
const uint32_t inst_id = AMBIENT_INSTANCE_ID;
const uint32_t param_id = AMBIENT_GET_VERSION_PARAM_ID;
const uint32_t block_id = IAXXX_HMD_BLOCK_ID;
unsigned int param_val = AMBIENT_DEFAULT_VER;
err = setup_ambient_package(odsp_hdl);
if (err != 0) {
if (errno == EEXIST) {
ALOGW("%s: WARN: Ambient package existed already", __func__);
err = iaxxx_odsp_plugin_get_parameter(odsp_hdl, inst_id, param_id,
block_id, &param_val);
if (err != 0) {
ALOGE("%s: Failed to get parameter for id %u with error %d: %s",
__func__, param_id, err, strerror(errno));
} else {
ALOGD("%s: Value of parameter id %u is %u", __func__, param_id,
param_val);
}
} else {
ALOGE("%s: ERROR: setup Ambient package failed", __func__);
}
} else {
err = iaxxx_odsp_plugin_get_parameter(odsp_hdl, inst_id, param_id,
block_id, &param_val);
if (err != 0) {
ALOGE("%s: Failed to get parameter for id %u with error %d: %s",
__func__, param_id, err, strerror(errno));
} else {
ALOGD("%s: Value of parameter id %u is %u", __func__, param_id,
param_val);
}
err = destroy_ambient_package(odsp_hdl);
if (err != 0)
ALOGE("%s: ERROR: destroy Ambient package failed", __func__);
}
return param_val;
}
int setup_aec_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_package_load(odsp_hdl, ECHOCANCELLER_PACKAGE,
AEC_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to load AEC passthrough package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// AEC PT Plugin Create
err = iaxxx_odsp_plugin_create(odsp_hdl, AEC_INSTANCE_ID, AEC_PRIORITY,
AEC_PKG_ID, AEC_PLUGIN_IDX, IAXXX_HMD_BLOCK_ID,
PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create AEC plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_aec_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_plugin_destroy(odsp_hdl, AEC_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy AEC plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_package_unload(odsp_hdl, AEC_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to unload AEC package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int setup_chre_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
struct iaxxx_create_config_data cdata;
ALOGD("+%s+", __func__);
/* Create CHRE plugins */
cdata.type = CONFIG_FILE;
cdata.data.fdata.filename = BUFFER_CONFIG_VAL_CHRE;
err = iaxxx_odsp_plugin_set_creation_config(odsp_hdl,
CHRE_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID,
cdata);
if (err != 0) {
ALOGE("%s: ERROR: CHRE Buffer configuration failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Create CHRE Buffer plugin
err = iaxxx_odsp_plugin_create(odsp_hdl, CHRE_INSTANCE_ID, BUF_PRIORITY,
BUF_PKG_ID, CHRE_PLUGIN_IDX,
IAXXX_HMD_BLOCK_ID, PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create CHRE buffer %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_set_parameter(odsp_hdl, CHRE_INSTANCE_ID,
CHRE_EVT_PARAM_ID, CHRE_BUF_SIZE,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: CHRE buffer set param failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_setevent(odsp_hdl, CHRE_INSTANCE_ID,
CHRE_EVT_MASK, IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: CHRE set event failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Subscribe for events
err = iaxxx_odsp_evt_subscribe(odsp_hdl, CHRE_EVT_SRC_ID,
CHRE_EVT_ID, IAXXX_SYSID_HOST_1, 0);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, CHRE_EVT_ID, CHRE_EVT_SRC_ID,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_subscribe(odsp_hdl, CHRE_EVT_SRC_ID,
CHRE_CONFIGURED, IAXXX_SYSID_HOST_1, 0);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, CHRE_CONFIGURED, CHRE_EVT_SRC_ID,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_subscribe(odsp_hdl, CHRE_EVT_SRC_ID,
CHRE_DESTROYED, IAXXX_SYSID_HOST_1, 0);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, CHRE_DESTROYED, CHRE_EVT_SRC_ID,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_subscribe(odsp_hdl, IAXXX_SYSID_HOST_1,
CHRE_EP_DISCONNECT, IAXXX_SYSID_HOST_0, 0);
if (err == -1) {
ALOGE("%s: ERROR: CHRE event subscription (CHRE EP disconnect) failed "
" with error %d(%s)", __func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_trigger(odsp_hdl, CHRE_EVT_SRC_ID, CHRE_CONFIGURED, 0);
if (err != 0) {
ALOGE("%s: ERROR: CHRE event trigger (chre configured) failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_chre_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, CHRE_EVT_SRC_ID, CHRE_EVT_ID,
IAXXX_SYSID_HOST_1);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, CHRE_EVT_ID, CHRE_EVT_SRC_ID,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, CHRE_EVT_SRC_ID, CHRE_CONFIGURED,
IAXXX_SYSID_HOST_1);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, CHRE_CONFIGURED, CHRE_EVT_SRC_ID,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, CHRE_EVT_SRC_ID, CHRE_DESTROYED,
IAXXX_SYSID_HOST_1);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, CHRE_DESTROYED, CHRE_EVT_SRC_ID,
errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, IAXXX_SYSID_HOST_1,
CHRE_EP_DISCONNECT, IAXXX_SYSID_HOST_0);
if (err == -1) {
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed with error %d(%s)", __func__, CHRE_EP_DISCONNECT,
IAXXX_SYSID_HOST_1, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_destroy(odsp_hdl, CHRE_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy buffer plugin for CHRE %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int trigger_chre_destroy_event(struct iaxxx_odsp_hw *odsp_hdl) {
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_evt_trigger(odsp_hdl, CHRE_EVT_SRC_ID, CHRE_DESTROYED, 0);
if (err == -1) {
ALOGE("%s: ERROR: CHRE event trigger (chre destroyed) failed with "
"error %d(%s)", __func__, errno, strerror(errno));
goto exit;
}
exit:
ALOGD("-%s-", __func__);
return err;
}
int setup_sensor_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
struct iaxxx_create_config_data cdata;
ALOGD("+%s+", __func__);
// Download sensor packages
err = iaxxx_odsp_package_load(odsp_hdl, SENSOR_PACKAGE, SENSOR_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to load Sensor package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
/* Create plugins */
cdata.type = CONFIG_FILE;
cdata.data.fdata.filename = BUFFER_CONFIG_OSLO_VAL;
err = iaxxx_odsp_plugin_set_creation_config(odsp_hdl,
OSLO_BUF_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID,
cdata);
if (err != 0) {
ALOGE("%s: ERROR: Sensor buffer configuration failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Create Buffer plugin
err = iaxxx_odsp_plugin_create(odsp_hdl, OSLO_BUF_INSTANCE_ID,
OSLO_BUF_PRIORITY, BUF_PKG_ID,
BUF_PLUGIN_IDX, IAXXX_HMD_BLOCK_ID,
PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create Sensor Buffer %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
cdata.type = CONFIG_FILE;
cdata.data.fdata.filename = SENSOR_CONFIG_VAL;
err = iaxxx_odsp_plugin_set_creation_config(odsp_hdl,
SENSOR_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID,
cdata);
if (err == -1) {
ALOGE("%s: ERROR: Sensor configuration %d(%s)",
__func__, errno, strerror(errno));
return err;
}
// Create Dummy sensor plugin
err = iaxxx_odsp_plugin_create(odsp_hdl, SENSOR_INSTANCE_ID,
SENSOR_PRIORITY, SENSOR_PKG_ID,
SENSOR_PLUGIN_IDX, IAXXX_HMD_BLOCK_ID,
PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create Sensor plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = sensor_event_init_params(odsp_hdl);
if (err) {
ALOGE("%s: ERROR: Sensor event init failed %d", __func__, err);
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_sensor_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = sensor_event_deinit_params(odsp_hdl);
if (err != 0) {
ALOGE("%s: ERROR: Sensor event uninit failed %d", __func__, err);
goto exit;
}
err = iaxxx_odsp_plugin_destroy(odsp_hdl, SENSOR_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy sensor plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_destroy(odsp_hdl, OSLO_BUF_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy sensor buffer plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_package_unload(odsp_hdl, SENSOR_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to unload sensor package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int trigger_sensor_destroy_event(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_evt_trigger(odsp_hdl, OSLO_EVT_SRC_ID, OSLO_DESTROYED, 0);
if (err == -1)
ALOGE("%s: ERROR: oslo event trigger (oslo destroyed) failed with "
"error %d(%s)", __func__, errno, strerror(errno));
ALOGD("-%s-", __func__);
return err;
}
int setup_mixer_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
// Load package for Mixer
err = iaxxx_odsp_package_load(odsp_hdl, MIXER_PACKAGE, MIXER_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to load Mixer package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Create Mixer Plugin
err = iaxxx_odsp_plugin_create(odsp_hdl, MIXER_INSTANCE_ID,
MIXER_PRIORITY, MIXER_PKG_ID,
MIXER_PLUGIN_IDX, IAXXX_HMD_BLOCK_ID,
PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create Mixer plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_mixer_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
// Destroy Mixer Plugin
err = iaxxx_odsp_plugin_destroy(odsp_hdl, MIXER_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy Mixer buffer plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Unload package for Mixer
err = iaxxx_odsp_package_unload(odsp_hdl, MIXER_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to unload sensor package error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int setup_src_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_package_load(odsp_hdl, SRC_PACKAGE, SRC_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to load SRC package %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_src_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_package_unload(odsp_hdl, SRC_PKG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to unload SRC package error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int setup_music_buffer(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
struct iaxxx_create_config_data cdata;
ALOGD("+%s+", __func__);
// Create the 8 seconds Buffer plugin for Downlink Audio
cdata.type = CONFIG_FILE;
cdata.data.fdata.filename = BUFFER_CONFIG_VAL_MULTI_SEC;
err = iaxxx_odsp_plugin_set_creation_config(odsp_hdl,
DA_BUF_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID,
cdata);
if (err != 0) {
ALOGE("%s: ERROR: DA buffer configuration failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Create Buffer plugin
err = iaxxx_odsp_plugin_create(odsp_hdl,
DA_BUF_INSTANCE_ID,
BUF_PRIORITY, BUF_PKG_ID,
BUF_PLUGIN_IDX,
IAXXX_HMD_BLOCK_ID,
PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create DA Buffer error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_music_buffer(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_plugin_destroy(odsp_hdl,
DA_BUF_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err == -1) {
ALOGE("%s: ERROR: Failed to destroy DA buffer plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int setup_howord_buffer(struct iaxxx_odsp_hw *odsp_hdl)
{
struct iaxxx_create_config_data cdata;
int err = 0;
ALOGD("+%s+", __func__);
cdata.type = CONFIG_FILE;
cdata.data.fdata.filename = BUFFER_CONFIG_VAL_2_SEC;
err = iaxxx_odsp_plugin_set_creation_config(odsp_hdl,
BUF_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID,
cdata);
if (err != 0) {
ALOGE("%s: ERROR: 8 sec buffer configuration failed %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
// Create Buffer plugin
err = iaxxx_odsp_plugin_create(odsp_hdl, BUF_INSTANCE_ID,
BUF_PRIORITY, BUF_PKG_ID, BUF_PLUGIN_IDX,
IAXXX_HMD_BLOCK_ID, PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create Buffer Plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_howord_buffer(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
// Destroy Buffer plugin
err = iaxxx_odsp_plugin_destroy(odsp_hdl, BUF_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy 8 sec buffer %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int setup_src_plugin(struct iaxxx_odsp_hw *odsp_hdl, enum src_type st)
{
int err = 0;
int plugin_instant_id = 0;
struct iaxxx_create_config_data cdata;
if (st == SRC_MIC) {
plugin_instant_id = SRC_MIC_INSTANCE_ID;
} else if (st == SRC_AMP_REF) {
plugin_instant_id = SRC_AMP_INSTANCE_ID;
} else {
ALOGE("%s: Invalid src type %d", __func__, st);
err = -EINVAL;
goto exit;
}
ALOGD("+%s+ src type %d", __func__, st);
// set src config
cdata.type = CONFIG_FILE;
cdata.data.fdata.filename = SRC_CONFIG;
err = iaxxx_odsp_plugin_set_creation_config(odsp_hdl,
plugin_instant_id,
IAXXX_HMD_BLOCK_ID,
cdata);
if (err != 0) {
ALOGE("%s: ERROR: SRC-%d configuration failed %d(%s)",
__func__, st, errno, strerror(errno));
goto exit;
}
err = iaxxx_odsp_plugin_create(odsp_hdl, plugin_instant_id,
SRC_PRIORITY, SRC_PKG_ID,
SRC_PLUGIN_IDX, IAXXX_HMD_BLOCK_ID,
PLUGIN_DEF_CONFIG_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to create SRC-%d plugin %d(%s)",
__func__, st, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int destroy_src_plugin(struct iaxxx_odsp_hw *odsp_hdl, enum src_type st)
{
int err = 0;
int plugin_instant_id = 0;
if (st == SRC_MIC) {
plugin_instant_id = SRC_MIC_INSTANCE_ID;
} else if (st == SRC_AMP_REF) {
plugin_instant_id = SRC_AMP_INSTANCE_ID;
} else {
ALOGE("%s: Invalid src type %d", __func__, st);
err = -EINVAL;
goto exit;
}
ALOGD("+%s+ src type %d", __func__, st);
err = iaxxx_odsp_plugin_destroy(odsp_hdl, plugin_instant_id,
IAXXX_HMD_BLOCK_ID);
if (err != 0) {
ALOGE("%s: ERROR: Failed to destroy SRC plugin %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGD("-%s-", __func__);
exit:
return err;
}
int set_hotword_buffer_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGD("+%s %d+", __func__, bargein);
if (bargein == true)
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_HOTWORD_BUFFER_WITH_BARGEIN]);
else
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_HOTWORD_BUFFER_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int tear_hotword_buffer_route(struct audio_route *route_hdl, bool bargein)
{
int err = 0;
ALOGD("+%s %d+", __func__, bargein);
if (bargein == true)
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_HOTWORD_BUFFER_WITH_BARGEIN]);
else
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_HOTWORD_BUFFER_WITHOUT_BARGEIN]);
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int enable_bargein_route(struct audio_route *route_hdl, bool enable)
{
int err = 0;
ALOGV("+%s+ %d", __func__, enable);
if (enable)
err = audio_route_apply_and_update_path(route_hdl, route_table[ST_BARGEIN_ROUTE]);
else
err = audio_route_reset_and_update_path(route_hdl, route_table[ST_BARGEIN_ROUTE]);
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int enable_amp_ref_route(struct audio_route *route_hdl, bool enable,
enum strm_type strmt)
{
int err = 0;
ALOGV("+%s+ %d strm type %d", __func__, enable, strmt);
if (strmt == STRM_16K) {
if (enable)
err = audio_route_apply_and_update_path(route_hdl, route_table[ST_BARGEIN_AMP_REF]);
else
err = audio_route_reset_and_update_path(route_hdl, route_table[ST_BARGEIN_AMP_REF]);
} else if (strmt == STRM_48K) {
if (enable)
err = audio_route_apply_and_update_path(route_hdl, route_table[ST_BARGEIN_AMP_REF_48K]);
else
err = audio_route_reset_and_update_path(route_hdl, route_table[ST_BARGEIN_AMP_REF_48K]);
} else {
ALOGE("%s: ERROR: Invalid strm type", __func__);
err = -EINVAL;
}
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int set_music_buffer_route(struct audio_route *route_hdl, bool downlink)
{
int err = 0;
ALOGD("+%s+ %d", __func__, downlink);
if (downlink)
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_AMBIENT_BUFFER_WITHOUT_BARGEIN]);
else
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_AMBIENT_BUFFER_WITH_BARGEIN]);
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int tear_music_buffer_route(struct audio_route *route_hdl, bool downlink)
{
int err = 0;
ALOGD("+%s+ %d", __func__, downlink);
if (downlink)
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_AMBIENT_BUFFER_WITHOUT_BARGEIN]);
else
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_AMBIENT_BUFFER_WITH_BARGEIN]);
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int enable_src_route(struct audio_route *route_hdl, bool enable, enum src_type st)
{
int err = 0;
ALOGV("+%s+ %d src type %d", __func__, enable, st);
if (st == SRC_MIC) {
if (enable)
err = audio_route_apply_and_update_path(route_hdl, route_table[ST_SRC_ROUTE_MIC]);
else
err = audio_route_reset_and_update_path(route_hdl, route_table[ST_SRC_ROUTE_MIC]);
} else if (st == SRC_AMP_REF) {
if (enable)
err = audio_route_apply_and_update_path(route_hdl, route_table[ST_SRC_ROUTE_AMP_REF]);
else
err = audio_route_reset_and_update_path(route_hdl, route_table[ST_SRC_ROUTE_AMP_REF]);
} else {
ALOGE("%s: ERROR: Invalid src type", __func__);
err = -EINVAL;
}
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int enable_mic_route(struct audio_route *route_hdl, bool enable,
enum clock_type ct)
{
int err = 0;
ALOGD("+%s+ %d clock type %d", __func__, enable, ct);
if (ct == EXTERNAL_OSCILLATOR) {
if (enable) {
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_MIC_ROUTE_EXT_CLK]);
} else {
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_MIC_ROUTE_EXT_CLK]);
}
} else if (ct == INTERNAL_OSCILLATOR) {
if (enable) {
err = audio_route_apply_and_update_path(route_hdl,
route_table[ST_MIC_ROUTE_INT_CLK]);
} else {
err = audio_route_reset_and_update_path(route_hdl,
route_table[ST_MIC_ROUTE_INT_CLK]);
}
} else {
ALOGE("%s: ERROR: Invalid clock type", __func__);
err = -EINVAL;
}
if (err)
ALOGE("%s: route fail %d", __func__, err);
ALOGD("-%s-", __func__);
return err;
}
int get_entity_param_blk(struct iaxxx_odsp_hw *odsp_hdl, void *payload,
unsigned int payload_size)
{
int err = 0;
err = iaxxx_odsp_plugin_get_parameter_blk(odsp_hdl,
AMBIENT_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID,
100, payload,
payload_size);
if (err < 0) {
ALOGE("%s: Failed to get param blk error %s\n",
__func__, strerror(errno));
}
return err;
}
int get_wakeup_param_blk(struct iaxxx_odsp_hw *odsp_hdl, void *payload,
unsigned int payload_size)
{
int err = 0;
err = iaxxx_odsp_plugin_get_parameter_blk(odsp_hdl,
HOTWORD_INSTANCE_ID,
IAXXX_HMD_BLOCK_ID,
100, payload,
payload_size);
if (err < 0) {
ALOGE("%s: Failed to get param blk error %s\n",
__func__, strerror(errno));
}
return err;
}
int set_default_apll_clk(struct mixer *mixer) {
int ret = 0;
struct mixer_ctl* ctl;
ALOGD("+Entering %s+", __func__);
if (!mixer) {
ALOGE("%s mixer is NULL", __func__);
return -EINVAL;
}
ctl = mixer_get_ctl_by_name(mixer, "Port ApllCLK");
if (ctl) {
ret = mixer_ctl_set_enum_by_string(ctl, "IAXXX_ACLK_FREQ_24576");
if (ret)
ALOGE("%s: update ApllCLK fail! ret = %d", __func__, ret);
} else {
ALOGE("%s: get Port ApllCL control fail", __func__);
ret = -ENODEV;
}
ALOGD("-Exiting %s-", __func__);
return ret;
}
int get_fw_status(struct iaxxx_odsp_hw *odsp_hdl, unsigned int *status)
{
int err;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_get_fw_status(odsp_hdl,
status);
if (err == -1) {
ALOGE("%s: ERROR: Failed to get fw status with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
ALOGE("Firmware status is %d", *status);
exit:
ALOGD("-%s-", __func__);
return err;
}
int reset_fw(struct iaxxx_odsp_hw *odsp_hdl)
{
int err;
ALOGD("+%s+", __func__);
err = iaxxx_odsp_reset_fw(odsp_hdl);
if (err == -1) {
ALOGE("%s: ERROR: Failed to reset fw with error %d(%s)",
__func__, errno, strerror(errno));
goto exit;
}
exit:
ALOGD("-%s-", __func__);
return err;
}
int reset_all_route(struct audio_route *route_hdl)
{
int err = 0;
ALOGD("+%s+", __func__);
for (int i = ST_ROUTE_MIN; i < ST_ROUTE_MAX; i++) {
audio_route_force_reset_and_update_path(route_hdl, route_table[i]);
}
ALOGD("-%s-", __func__);
return err;
}
int setup_slpi_wakeup_event(struct iaxxx_odsp_hw *odsp_hdl, bool enabled)
{
int err;
ALOGD("+%s+", __func__);
if (enabled) {
err = iaxxx_odsp_evt_subscribe(odsp_hdl, IAXXX_SYSID_CTRL_MGR_CM4,
IAXXX_HOST1_WAKEUP_EVENT_ID,
IAXXX_SYSID_HOST_1, 0);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, IAXXX_HOST1_WAKEUP_EVENT_ID,
IAXXX_SYSID_CTRL_MGR_CM4, errno, strerror(errno));
goto exit;
}
} else {
err = iaxxx_odsp_evt_unsubscribe(odsp_hdl, IAXXX_SYSID_CTRL_MGR_CM4,
IAXXX_HOST1_WAKEUP_EVENT_ID,
IAXXX_SYSID_HOST_1);
if (err != 0) {
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d)"
" IOCTL failed %d(%s)", __func__, IAXXX_HOST1_WAKEUP_EVENT_ID,
IAXXX_SYSID_CTRL_MGR_CM4, errno, strerror(errno));
goto exit;
}
}
exit:
ALOGD("-%s-", __func__);
return err;
}