Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
FMC DIO 5ch TTL a
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
6
Issues
6
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
FMC DIO 5ch TTL a
Commits
998aa62e
Commit
998aa62e
authored
Dec 11, 2020
by
Jorge Machado
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
8 december Maciej review
parent
b0105d4f
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
96 additions
and
13 deletions
+96
-13
fmc-dio-device-private.h
sw/irq-demo/dep/fmc-dio-device-private.h
+2
-1
fmc-dio-device.c
sw/irq-demo/dep/fmc-dio-device.c
+70
-2
fmc-dio-device.h
sw/irq-demo/dep/fmc-dio-device.h
+4
-0
stats-engine.c
sw/irq-demo/dep/stats-engine.c
+1
-0
irq-demo-private.h
sw/irq-demo/irq-demo-private.h
+1
-0
irq-demo.c
sw/irq-demo/irq-demo.c
+18
-10
No files found.
sw/irq-demo/dep/fmc-dio-device-private.h
View file @
998aa62e
...
...
@@ -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
);
...
...
sw/irq-demo/dep/fmc-dio-device.c
View file @
998aa62e
...
...
@@ -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
"
);
}
...
...
sw/irq-demo/dep/fmc-dio-device.h
View file @
998aa62e
...
...
@@ -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
);
...
...
sw/irq-demo/dep/stats-engine.c
View file @
998aa62e
...
...
@@ -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
)
...
...
sw/irq-demo/irq-demo-private.h
View file @
998aa62e
...
...
@@ -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
);
...
...
sw/irq-demo/irq-demo.c
View file @
998aa62e
...
...
@@ -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
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment