blob: 3b47bba2764b9af4a5e14bb694f4354f36e8b5dd [file] [log] [blame]
#define LOG_TAG "oslo_packages_test"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <string.h>
#include <math.h>
#include <cutils/log.h>
#include <linux/mfd/adnc/iaxxx-odsp.h>
#include <linux/mfd/adnc/iaxxx-system-identifiers.h>
#include <tinyalsa/asoundlib.h>
#define ODSP_NODE "/dev/iaxxx-odsp-celldrv"
#define BUFFER_PACKAGE "BufferPackage.bin"
#define BUFFER_CONFIG_OSLO_VAL "BufferConfigValOslo.bin"
#define SENSOR_PACKAGE "OsloSensorPackage.bin"
#define PLUGIN3_SRC_ID 0x30FF
static struct mixer* open_mixer_ctl()
{
return mixer_open(0);
}
static void close_mixer_ctl(struct mixer *mixer)
{
if (mixer) {
mixer_close(mixer);
}
}
static int set_mixer_ctl_val(struct mixer *mixer, char *id, int value)
{
struct mixer_ctl *ctl = NULL;
int err = 0;
if ((NULL == mixer) || (NULL == id)) {
ALOGE("%s: ERROR Null argument passed", __func__);
err = -EINVAL;
goto exit;
}
ctl = mixer_get_ctl_by_name(mixer, id);
if (NULL == ctl) {
ALOGE("%s: ERROR Invalid control name: %s", __func__, id);
err = -1;
goto exit;
}
if (mixer_ctl_set_value(ctl, 0, value)) {
ALOGE("%s: ERROR Invalid value for %s", __func__, id);
err = -1;
goto exit;
}
exit:
return err;
}
static int set_mixer_ctl_string(struct mixer *mixer, char *id, const char *string)
{
struct mixer_ctl *ctl = NULL;
int err = 0;
if ((NULL == mixer) || (NULL == id)) {
ALOGE("%s: ERROR Null argument passed", __func__);
err = -EINVAL;
goto exit;
}
ctl = mixer_get_ctl_by_name(mixer, id);
if (NULL == ctl) {
ALOGE("%s: ERROR Invalid control name: %s", __func__, id);
err = -1;
goto exit;
}
if (mixer_ctl_set_enum_by_string(ctl, string)) {
ALOGE("%s: ERROR Invalid string for %s", __func__, id);
err = -1;
goto exit;
}
exit:
return err;
}
void usage()
{
fputs("\
USAGE -\n\
-------\n\
1) Oslo_packages_test 1\n\
2) Oslo_packages_test 0\n\
\n\
1 means load all packages\n\
0 means unload.\n\
", stdout);
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[])
{
FILE *odsp_node = NULL;
struct iaxxx_pkg_mgmt_info pkg_info;
struct iaxxx_plugin_info pi;
struct iaxxx_plugin_create_cfg pcc;
struct iaxxx_set_event se;
struct iaxxx_evt_info ei;
uint32_t buffer_id;
uint32_t sensor_pkg_id;
int param;
int err = 0;
struct mixer *mixer = NULL;
if (argc <= 1 || argc > 2) {
usage();
}
param = strtol(argv[1], NULL, 0);
if (param > 1 || param < 0) {
usage();
}
/* Open Host Driver File node */
if((odsp_node = fopen(ODSP_NODE, "rw")) == NULL) {
printf("file %s open for write error: %s\n", ODSP_NODE,
strerror(errno));
ALOGE("file %s open for write error: %s\n", ODSP_NODE,
strerror(errno));
err = -EIO;
goto exit;
}
mixer = open_mixer_ctl();
if (NULL == mixer) {
ALOGE("%s: ERROR: Failed to open the mixer control", __func__);
err = -EINVAL;
goto exit;
}
if (param == 1) {
/* Load all pacakge */
/* Sensor Plugin */
strcpy(pkg_info.pkg_name, SENSOR_PACKAGE);
pkg_info.pkg_id = 0;
pkg_info.proc_id = 0;
err = ioctl(fileno(odsp_node), ODSP_LOAD_PACKAGE, (unsigned long)&pkg_info);
if (err) {
printf("%s: ERROR: SENSOR ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: SENSOR ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
printf("%s: SENSOR ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
ALOGD("%s: SENSOR ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
sensor_pkg_id = pkg_info.proc_id;
/* Buffer Plugin */
strcpy(pkg_info.pkg_name, BUFFER_PACKAGE);
pkg_info.pkg_id = 4;
pkg_info.proc_id = 0;
err = ioctl(fileno(odsp_node), ODSP_LOAD_PACKAGE, (unsigned long)&pkg_info);
if (err) {
printf("%s: ERROR: Buffer ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: Buffer ODSP_LOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
printf("%s: Buffer ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
ALOGD("%s: Buffer ODSP_LOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
buffer_id = pkg_info.proc_id;
/* if buffer plugin Loaded */
strcpy(pcc.file_name, BUFFER_CONFIG_OSLO_VAL);
pcc.inst_id = 2;
pcc.block_id = 1;
pcc.cfg_size = 12;
pcc.cfg_val = 0;
err = ioctl(fileno(odsp_node), ODSP_PLG_SET_CREATE_CFG, (unsigned long)&pcc);
if (err) {
printf("%s: ERROR: ODSP_PLG_SET_CREATE_CFG IOCTL failed to set create config %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_PLG_SET_CREATE_CFG IOCTL failed to set create config %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
/* Create Buffer plugin */
pi.plg_idx = 0;
pi.pkg_id = buffer_id;
pi.block_id = 1;
pi.inst_id = 2;
pi.priority = 1;
err = ioctl(fileno(odsp_node), ODSP_PLG_CREATE, (unsigned long)&pi);
if (err) {
printf("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
/* Create Dummy sensor plugin */
pi.plg_idx = 0;
pi.pkg_id = sensor_pkg_id;
pi.block_id = 1;
pi.inst_id = 3;
pi.priority = 1;
err = ioctl(fileno(odsp_node), ODSP_PLG_CREATE, (unsigned long)&pi);
if (err) {
printf("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
/* Set the events and params */
se.inst_id = 3;
se.event_enable_mask = 0x7;
se.block_id = 1;
err = ioctl(fileno(odsp_node), ODSP_PLG_SET_EVENT, (unsigned long)&se);
if (err) {
printf("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
printf("Registering for 3 sensor mode switch events\n");
ALOGD("Registering for 3 sensor mode switch events\n");
/* Subscribe for events */
ei.src_id = PLUGIN3_SRC_ID;
ei.event_id = 0; // 0 - Mode switch to presence mode
ei.dst_id = IAXXX_SYSID_SCRIPT_MGR;
ei.dst_opaque = 0x1201;
err = ioctl(fileno(odsp_node), ODSP_EVENT_SUBSCRIBE, (unsigned long)&ei);
if (err) {
printf("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
goto exit;
}
/* Subscribe for events */
ei.src_id = PLUGIN3_SRC_ID;
ei.event_id = 1; // 1 - Mode switch to detected mode.
ei.dst_id = IAXXX_SYSID_SCRIPT_MGR;
ei.dst_opaque = 0x1202;
err = ioctl(fileno(odsp_node), ODSP_EVENT_SUBSCRIBE, (unsigned long)&ei);
if (err) {
printf("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
goto exit;
}
/* Subscribe for events */
ei.src_id = PLUGIN3_SRC_ID;
ei.event_id = 2; // 2 - Mode switch to max mode
ei.dst_id = IAXXX_SYSID_HOST; // update this to HOST_1 for Customer
ei.dst_opaque = 0;
err = ioctl(fileno(odsp_node), ODSP_EVENT_SUBSCRIBE, (unsigned long)&ei);
if (err) {
printf("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_EVENT_SUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
goto exit;
}
/* setup routing */
set_mixer_ctl_val(mixer, "sensor0 En", 1);
set_mixer_ctl_string(mixer, "Plgin2Ip Ep0 Conf", "SensorOut0");
set_mixer_ctl_string(mixer, "Plgin3Ip Ep0 Conf", "plugin2Out0");
set_mixer_ctl_val(mixer, "Plgin2Blk1En", 1);
set_mixer_ctl_val(mixer, "Plgin3Blk1En", 1);
} else {
/* disconnect the route */
set_mixer_ctl_val(mixer, "Plgin3Blk1En", 0);
set_mixer_ctl_val(mixer, "Plgin2Blk1En", 0);
set_mixer_ctl_val(mixer, "sensor0 En", 0);
/* Unload all pacakge */
printf("UnSubscribe 3 sensor mode switch events\n");
ALOGD("UnSubscribe 3 sensor mode switch events\n");
/* UnSubscribe for events */
ei.src_id = PLUGIN3_SRC_ID;
ei.event_id = 2; // 2 - Mode switch to max mode
ei.dst_id = IAXXX_SYSID_HOST; // update this to HOST_1 for Customer
ei.dst_opaque = 0;
err = ioctl(fileno(odsp_node), ODSP_EVENT_UNSUBSCRIBE, (unsigned long)&ei);
if (err) {
printf("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
goto exit;
}
/* UnSubscribe for events */
ei.src_id = PLUGIN3_SRC_ID;
ei.event_id = 1; // 1 - Mode switch to detected mode.
ei.dst_id = IAXXX_SYSID_SCRIPT_MGR;
ei.dst_opaque = 0x1202;
err = ioctl(fileno(odsp_node), ODSP_EVENT_UNSUBSCRIBE, (unsigned long)&ei);
if (err) {
printf("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
goto exit;
}
/* UnSubscribe for events */
ei.src_id = PLUGIN3_SRC_ID;
ei.event_id = 0; // 0 - Mode switch to presence mode
ei.dst_id = IAXXX_SYSID_SCRIPT_MGR;
ei.dst_opaque = 0x1201;
err = ioctl(fileno(odsp_node), ODSP_EVENT_UNSUBSCRIBE, (unsigned long)&ei);
if (-1 == err) {
printf("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_EVENT_UNSUBSCRIBE (for event_id %d, src_id %d) IOCTL failed with error %d(%s)\n",
__func__, ei.event_id, ei.src_id, errno, strerror(errno));
goto exit;
}
/* Set the events and params */
se.inst_id = 3;
se.event_enable_mask = 0x0;
se.block_id = 1;
err = ioctl(fileno(odsp_node), ODSP_PLG_SET_EVENT, (unsigned long)&se);
if (err) {
printf("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_PLG_SET_EVENT IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
/* destroy Dummy sensor plugin */
pi.block_id = 1;
pi.inst_id = 3;
err = ioctl(fileno(odsp_node), ODSP_PLG_DESTROY, (unsigned long)&pi);
if (err) {
printf("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create sensor Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
/* destroy Buffer plugin */
pi.block_id = 1;
pi.inst_id = 2;
err = ioctl(fileno(odsp_node), ODSP_PLG_DESTROY, (unsigned long)&pi);
if (err) {
printf("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: ODSP_PLG_DESTROY IOCTL failed to create Buffer Plugin with error %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
/*Unload Buffer Plugin */
pkg_info.pkg_id = 4;
pkg_info.proc_id = 4;
err = ioctl(fileno(odsp_node), ODSP_UNLOAD_PACKAGE, (unsigned long)&pkg_info);
if (err) {
printf("%s: ERROR: SENSOR ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: SENSOR ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
printf("%s: SENSOR ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
ALOGD("%s: SENSOR ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
/*Unload Sensor Plugin */
pkg_info.pkg_id = 0;
pkg_info.proc_id = 4;
err = ioctl(fileno(odsp_node), ODSP_UNLOAD_PACKAGE, (unsigned long)&pkg_info);
if (err) {
printf("%s: ERROR: Buffer ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
ALOGE("%s: ERROR: Buffer ODSP_UNLOAD_PACKAGE failed %d(%s)\n", __func__, errno, strerror(errno));
goto exit;
}
printf("%s: Buffer ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
ALOGD("%s: Buffer ODSP_UNLOAD_PACKAGE %x\n", __func__, pkg_info.proc_id);
}
exit:
if (odsp_node)
fclose(odsp_node);
if (mixer)
close_mixer_ctl(mixer);
return err;
}