/* * 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. */ #include #include #include #include #include #include #include "iaxxx_odsp_hw.h" #define MAX_FILE_PATH_SIZE (512) enum { SETPARAMBLK_TEST_OPTION_FROMFILE, SETPARAMBLK_TEST_OPTION_CUSTOM, SETPARAMBLK_TEST_OPTION_WITHACK }; static struct option const long_options[] = { {"setparamblkfromfile", no_argument, NULL, 's'}, {"customsetparamblk", no_argument, NULL, 'c'}, {"setparamblkwithack", no_argument, NULL, 'k'}, {"filename", required_argument, NULL, 'f'}, {"plugininstanceid", required_argument, NULL, 'i'}, {"paramblkid", required_argument, NULL, 'p'}, {"procblockid", required_argument, NULL, 'b'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; static int setparamblk_with_ack_test(struct iaxxx_odsp_hw *odsp_hw, const uint32_t inst_id, const uint32_t block_id, const uint32_t param_blk_id, const uint32_t max_retries, uint32_t* response_data, const uint32_t response_data_size_in_words, const char *file) { int ret = -1; uint32_t *data = NULL; FILE *fp = NULL; long file_len, bytes_read; fp = fopen(file, "rb"); if (NULL == fp) { fprintf(stderr,"Failed to find the file at the location %s", file); goto setparamblk_with_ack_test; } fseek(fp, 0, SEEK_END); file_len = ftell(fp); fseek(fp, 0, SEEK_SET); data = malloc(file_len); if (!data) { fprintf(stderr,"Error allocating memory"); goto setparamblk_with_ack_test; } bytes_read = fread(data, 1, file_len, fp); if (bytes_read != file_len) { fprintf(stderr,"Failed to read the complete file"); fclose(fp); goto setparamblk_with_ack_test; } fclose(fp); ret = iaxxx_odsp_plugin_set_parameter_blk_with_ack(odsp_hw, inst_id, param_blk_id, block_id, data, file_len * sizeof(uint32_t), response_data, response_data_size_in_words, max_retries); setparamblk_with_ack_test: if (data) free(data); return ret; } void usage() { fprintf(stdout, "\ USAGE -\n\ -------\n\ 1) setparamblk_test -s -f -i -p -b \n\ 2) setparamblk_test -k -f -i -p -b -m -r \n\ 3) setparamblk_test -c -f -i -p -b \n\ \n\ In the first form, test setparamblk from a file.\n\ In the second form, test setparamblk from a file with retry and acknowledgement\n\ In the second form, test setparamblk from a file for custom configuration of plugin.\n\n"); exit(0); } int main(int argc, char **argv) { struct iaxxx_odsp_hw* odsp_hw = NULL; int err = 0; int plugin_instance_id = -1; int proc_block_id = -1; int param_blk_id = -1; int max_retries = -1; int response_data_size_in_words = -1; uint32_t *response_data = NULL; char file_path[MAX_FILE_PATH_SIZE]; int setparamblk_test_option = -1; int index = 0; /* getopt_long stores the option index here. */ int option_index = 0; int ch; file_path[0] = '\0'; if (argc <= 1) { usage(); } while (1) { ch = getopt_long(argc, argv, "sckhf:p:i:b:m:r:", long_options, &option_index); /* Detect the end of the options. */ if (ch == -1) break; switch (ch) { case 's': setparamblk_test_option = SETPARAMBLK_TEST_OPTION_FROMFILE; break; case 'c': setparamblk_test_option = SETPARAMBLK_TEST_OPTION_CUSTOM; break; case 'k': setparamblk_test_option = SETPARAMBLK_TEST_OPTION_WITHACK; break; case 'f': strcpy(file_path, optarg); break; case 'p': param_blk_id = atoi(optarg); break; case 'i': plugin_instance_id = atoi(optarg); break; case 'b': proc_block_id = atoi(optarg); break; case 'm': max_retries = atoi(optarg); break; case 'r': response_data_size_in_words = atoi(optarg); break; case 'h': default: usage(); } } if (setparamblk_test_option == -1) { fprintf(stderr,"\n No Test Option Parameter! \n"); usage(); } if (file_path[0] == '\0') { fprintf(stderr,"\n No File Name Parameter! \n"); usage(); } if (plugin_instance_id == -1) { fprintf(stderr,"\n No Plugin_instance_id Parameter! \n"); usage(); } if (param_blk_id == -1) { fprintf(stderr,"\n No Param_blk_id Parameter! \n"); usage(); } if (proc_block_id == -1) { fprintf(stderr,"\n No proc_block_id Parameter! \n"); usage(); } if (setparamblk_test_option == SETPARAMBLK_TEST_OPTION_WITHACK) { if (max_retries == -1) { fprintf(stderr,"\n No max retries Parameter! \n"); usage(); } if (response_data_size_in_words <= 0) { fprintf(stderr,"\n No or Invalid Response data size Parameter! \n"); usage(); } response_data = (uint32_t*) malloc(sizeof(uint32_t) * response_data_size_in_words); if (!response_data) { fprintf(stderr,"\n malloc failed! \n", stdout); exit(0); } memset(response_data, 0, sizeof(uint32_t) * response_data_size_in_words); } if ((odsp_hw = iaxxx_odsp_init()) == NULL) { fprintf(stderr,"\n ODSP Init Failed! \n"); return 0; } if (setparamblk_test_option == SETPARAMBLK_TEST_OPTION_FROMFILE) { fprintf(stdout, "\n## Setparamblk_test from file.. ##\n"); err = iaxxx_odsp_plugin_set_parameter_blk_from_file(odsp_hw, plugin_instance_id, param_blk_id, proc_block_id, file_path); } else if (setparamblk_test_option == SETPARAMBLK_TEST_OPTION_CUSTOM) { fprintf(stdout, "\n## Setparamblk_test custom configuration.. ##\n"); err = iaxxx_odsp_plugin_set_custom_cfg(odsp_hw, plugin_instance_id, proc_block_id, param_blk_id, 0, file_path); } else if (setparamblk_test_option == SETPARAMBLK_TEST_OPTION_WITHACK) { fprintf(stdout, "\n## Setparamblk_test with ack and retry.. ##\n"); err = setparamblk_with_ack_test(odsp_hw, plugin_instance_id, proc_block_id, param_blk_id, max_retries, response_data, response_data_size_in_words, file_path); if (!err) { // Print the response data fprintf(stdout,"\nResponse Data::"); for (index = 0; index < response_data_size_in_words; index++) { if (!(index % 8)) fprintf(stdout, "\n0x%04x: ", index); fprintf(stdout, "0x%08x ", response_data[index]); } fprintf(stdout, "\n"); } free(response_data); } iaxxx_odsp_deinit(odsp_hw); if (err) fprintf(stdout, "\n## Setparamblk_test failed!! ##\n\n"); else fprintf(stdout, "\n## Setparamblk_test done. ##\n\n"); return 0; }