blob: f3ddb04714b439b6f586c37b18ff07f4f9bb8403 [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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <getopt.h>
#include <string.h>
#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 <file_name> -i <plugin-instance-id> -p <param-blk-id> -b <proc-block-id> \n\
2) setparamblk_test -k -f <file_name> -i <plugin-instance-id> -p <param-blk-id> -b <proc-block-id> -m <max-retries> -r <response-size-in-words> \n\
3) setparamblk_test -c -f <file_name> -i <plugin-instance-id> -p <param-blk-id> -b <proc-block-id> \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;
}