Commit 998aa62e authored by Jorge Machado's avatar Jorge Machado

8 december Maciej review

parent b0105d4f
......@@ -43,7 +43,8 @@ static int enable_fmc_dio_device_hw_irq(fmc_dio_device dev,
static int setup_fmc_dio_device_hw_irq(fmc_dio_device dev,
unsigned long period,
long count);
static int get_state_fmc_dio_device_hw_irq(fmc_dio_device dev,
int ch, int * state);
static int get_hw_ts_from_fmc_dio_device(fmc_dio_device dev, int ch,
struct usr_timestamp **ts, unsigned int *nts, int flags);
static int get_kernel_leaps_info(fmc_dio_device dev);
......
......@@ -216,6 +216,73 @@ static int setup_fmc_dio_device_hw_irq(fmc_dio_device dev,
return 0;
}
int get_fmc_dio_device_all_irq_state(fmc_dio_device dev, int * state)
{
int ret = 0, state_internal = 0, channel_state = 0;
for(int i = 0 ; i <= FMC_DIO_N_CH ; i++) {
ret = get_fmc_dio_device_irq_state(dev, i, &channel_state);
if(ret)
break;
state_internal |= (channel_state & 0x1) << i;
}
*state = state_internal;
return ret;
}
int get_fmc_dio_device_irq_state(fmc_dio_device dev, int ch, int * state)
{
int ret;
if(check_fmc_dio_device(dev)) {
return -EINVAL;
}
ret = get_fmc_dio_device_hw_irq_state(dev, ch, state);
return ret;
}
int get_fmc_dio_device_hw_irq_state(fmc_dio_device dev, int ch, int * state)
{
if(ch < 0 || ch > FMC_DIO_N_CH) {
return -EINVAL;
}
struct wr_dio_cmd *c = &dev->cmd;
c->command = WR_DIO_CMD_MASK_IRQ;
c->flags = WR_DIO_F_MASK;
c->channel = 1 << ch;
c->value = WR_DIO_F_MASK_READ_IRQ;
if(ioctl(dev->fd, PRIV_MEZZANINE_CMD, c) < 0)
return -EFAULT;
if(c->value == WR_DIO_F_MASK_ENABLE_IRQ)
*state = 1;
else if(c->value == WR_DIO_F_MASK_DISABLE_IRQ)
*state = 0;
else
return -EFAULT;
return 0;
}
int set_fmc_dio_device_all_irq_state(fmc_dio_device dev, int state)
{
int ret = 0;
for(int i = 0 ; i <= FMC_DIO_N_CH ; i++) {
ret = enable_fmc_dio_device_hw_irq(dev, i, (state >> i) & 0x1);
if(ret)
break;
}
return ret;
}
int get_tai_ts_from_fmc_dio_device(fmc_dio_device dev, int ch,
struct usr_timestamp **ts, unsigned int *nts)
{
......@@ -266,6 +333,7 @@ static int get_hw_ts_from_fmc_dio_device(fmc_dio_device dev, int ch,
c->flags = flags;
c->channel = ch;
ret = ioctl(dev->fd, PRIV_MEZZANINE_CMD, (unsigned long) c);
if(ret < 0) {
return ret;
......@@ -304,9 +372,9 @@ void flush_fmc_dio_device_channel(fmc_dio_device dev, int ch)
sleep(FMC_DIO_FLUSH_SLEEP);
ret = get_hw_ts_from_fmc_dio_device(dev, ch, &ts, &nts, 0);
if(ret == 0) {
if(ret == 0)
free(ts);
}
LOG(dev, "Ok!\n");
}
......
......@@ -34,6 +34,10 @@ int disable_fmc_dio_device_all_irq(fmc_dio_device dev);
int setup_fmc_dio_device_irq(fmc_dio_device dev,
unsigned long period,
long count);
int get_fmc_dio_device_all_irq_state(fmc_dio_device dev, int * state);
int get_fmc_dio_device_irq_state(fmc_dio_device dev, int ch, int * state);
int get_fmc_dio_device_hw_irq_state(fmc_dio_device dev, int ch, int * state);
int set_fmc_dio_device_all_irq_state(fmc_dio_device dev, int state);
int get_tai_ts_from_fmc_dio_device(fmc_dio_device dev, int ch,
struct usr_timestamp **ts, unsigned int *nts);
......
......@@ -187,6 +187,7 @@ static void log_stats_engine(stats_engine engine, int verbose)
engine->stats.peak_to_peak, METRICS_UNIT,
engine->stats.mean, METRICS_UNIT, engine->stats.std, METRICS_UNIT);
LOG(engine, "\n============================================================\n");
LOG(engine, "Please, press 'q' key + ENTER or CNTRL+C to exit from the demo tool\n");
}
static int check_log_configuration(stats_engine engine)
......
......@@ -36,6 +36,7 @@ static void process_timestamps_to_engine(stats_engine engine, struct usr_timesta
unsigned int nts, int last_only);
static user_args create_user_arguments(void);
static user_args create_user_arguments(log_device log);
static int parse_user_arguments(int argc, char *argv[], user_args parsed_args);
static void destroy_user_arguments(user_args args);
......
......@@ -33,7 +33,8 @@ static fmc_dio_device global_fmc_dev = NULL;
static user_args global_user_arguments = NULL;
/* Global verbose control */
static int verbose_mode = 0;
/* Previous interrupt state */
static int prev_irq_state = 0;
/*
* irq-demo -f /dev/<fmc-device-file> [-p <irq period>]
* To exit: Please press 'q' in the keyboard or send a stop signal (CNTR+C)
......@@ -77,10 +78,9 @@ int main(int argc, char *argv[])
err_log = gen_log;
/* Parse user arguments (FMC DIO dev entry path and optionally irq period) */
user_arguments = create_user_arguments();
user_arguments = create_user_arguments(err_log);
if(parse_user_arguments(argc, argv, user_arguments)) {
/* In case of failure, exit */
send_to_log_device(err_log, "Error parsing user arguments\n");
ret = 1;
goto out_log;
}
......@@ -125,6 +125,7 @@ int main(int argc, char *argv[])
* 3) Flush TEST_FMC_DIO_CH channel
* 4) Setup specific information for interrupt line (period from user arguments or default one)
*/
get_fmc_dio_device_all_irq_state(dev, &prev_irq_state);
disable_fmc_dio_device_all_irq(dev);
enable_fmc_dio_device_irq(dev, TEST_FMC_DIO_CH);
flush_fmc_dio_device_channel(dev, TEST_FMC_DIO_CH);
......@@ -143,7 +144,8 @@ int main(int argc, char *argv[])
setup_fmc_dio_device_irq(dev, user_arguments->irq_period, 0);
sleep(1);
/* Disable all interrupts */
disable_fmc_dio_device_all_irq(dev);
set_fmc_dio_device_all_irq_state(dev, prev_irq_state);
out_fmc_dio_device:
/* Close FMC DIO device */
......@@ -206,12 +208,14 @@ static void process_timestamps_to_engine(stats_engine engine, struct usr_timesta
free(ts);
}
static user_args create_user_arguments(void)
static user_args create_user_arguments(log_device log)
{
user_args arguments;
arguments = calloc(1, sizeof(*arguments));
arguments->err_log = log;
return arguments;
}
......@@ -245,18 +249,22 @@ static int parse_user_arguments(int argc, char *argv[], user_args parsed_args)
parsed_args->clock=REALTIME;
break;
case 'h':
default:
show_help();
return 1;
default:
goto out_err;
}
}
if(check_unknown_user_arguments(optind, argc, argv)) {
show_help();
return 1;
goto out_err;
}
return 0;
out_err:
show_help();
send_to_log_device(parsed_args->err_log, "Error parsing user arguments\n");
return 1;
}
static void destroy_user_arguments(user_args args)
......@@ -310,6 +318,6 @@ static void exit_abruptly(int sig)
{
setup_fmc_dio_device_irq(global_fmc_dev, global_user_arguments->irq_period, 0);
sleep(1);
disable_fmc_dio_device_all_irq(global_fmc_dev);
set_fmc_dio_device_all_irq_state(global_fmc_dev, prev_irq_state);
exit(0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment