/* * 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 "spi_reliability_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> #define ODSP_NODE "/dev/iaxxx-odsp-celldrv" #define PASS_THROUGH_PACKAGE "PassthruPackageSPITest.bin" #define RANDOM_BYTES_FILE "/data/data/random.bin" #define PTP_PKG_ID (9) #define PTP_PROC_ID (0) #define PTP_PLG_IDX (0) #define PTP_BLOCK_ID (1) #define PTP_INST_ID (12) #define PTP_PRIORITY (1) int main() { FILE *odsp_node = NULL; FILE *fp = NULL; struct iaxxx_pkg_mgmt_info pkg_info; struct iaxxx_plugin_param_blk ppb; struct iaxxx_plugin_info pi; uint32_t ptp_id; int len = 0; void *buf = NULL, *read_buf = NULL; int err = 0; if ((fp = fopen(RANDOM_BYTES_FILE, "rb")) == NULL) { ALOGE("Failed to open random bytes file"); err = -EIO; goto exit; } fseek(fp, 0, SEEK_END); len = ftell(fp); fseek(fp, 0, SEEK_SET); buf = malloc(len); if (NULL == buf) { ALOGE("Failed to alloc memory"); err = -ENOMEM; goto exit; } read_buf = malloc(len); if (NULL == read_buf) { ALOGE("Failed to alloc memory"); err = -ENOMEM; goto exit; } fread(buf, 1, len, fp); fclose(fp); ALOGD("Successfully read random byte file"); if((odsp_node = fopen(ODSP_NODE, "rw")) == NULL) { ALOGE("file %s open for write error: %s\n", ODSP_NODE, strerror(errno)); err = -EIO; goto exit; } strcpy(pkg_info.pkg_name, PASS_THROUGH_PACKAGE); pkg_info.pkg_id = PTP_PKG_ID; pkg_info.proc_id = PTP_PROC_ID; err = ioctl(fileno(odsp_node), ODSP_LOAD_PACKAGE, (unsigned long) &pkg_info); if (-1 == err && EEXIST != errno) { ALOGE("%s: ERROR: ODSP_LOAD_PACKAGE failed %d(%s)", __func__, errno, strerror(errno)); goto exit; } ALOGD("%s: Pass through package loaded 0x%x\n", __func__, pkg_info.proc_id); ptp_id = pkg_info.proc_id; pi.plg_idx = PTP_PLG_IDX; pi.pkg_id = ptp_id; pi.block_id = PTP_BLOCK_ID; pi.inst_id = PTP_INST_ID; pi.priority = PTP_PRIORITY; err = ioctl(fileno(odsp_node), ODSP_PLG_CREATE, (unsigned long) &pi); if (-1 == err && EEXIST != errno) { ALOGE("%s: ERROR: ODSP_PLG_CREATE IOCTL failed to create VQ Plugin with error %d(%s)", __func__, errno, strerror(errno)); goto exit; } ALOGD("%s: Pass through plugin created", __func__); ppb.block_id = PTP_BLOCK_ID; ppb.inst_id = PTP_INST_ID; ppb.id = 0; ppb.param_size = len; ppb.param_blk = (uintptr_t) buf; err = ioctl(fileno(odsp_node), ODSP_PLG_SET_PARAM_BLK, &ppb); if (-1 == err) { ALOGE("%s: ERROR: ODSP_PLG_SET_PARAM_BLK IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno)); goto exit; } ALOGD("%s: Random byte set param block completed", __func__); ppb.block_id = PTP_BLOCK_ID; ppb.inst_id = PTP_INST_ID; ppb.id = 0; ppb.param_size = len; ppb.param_blk = (uintptr_t) read_buf; err = ioctl(fileno(odsp_node), ODSP_PLG_GET_PARAM_BLK, &ppb); if (-1 == err) { ALOGE("%s: ERROR: ODSP_PLG_GET_PARAM_BLK IOCTL failed with error %d(%s)\n", __func__, errno, strerror(errno)); goto exit; } ALOGD("%s: Random byte get param block completed", __func__); err = memcmp(buf, read_buf, len); if (0 != err) { ALOGE("ERROR: Set/Get buffers were different"); err = -EINVAL; goto exit; } fp = fopen("/data/data/getbuf.bin", "wb"); fwrite(read_buf, 1, len, fp); fclose(fp); ALOGD("%s: Set/Get buffers matched", __func__); exit: if (odsp_node) fclose(odsp_node); if (read_buf) free (read_buf); if (buf) free (buf); if (fp) fclose(fp); return err; }