#define LOG_TAG "oslo_packages_test" #include #include #include #include #include #include #include #include #include #include #include #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 placeholder 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 placeholder 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; }