Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
Simple PCIe FMC carrier SPEC - Software
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
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
Simple PCIe FMC carrier SPEC - Software
Commits
a301a69e
Commit
a301a69e
authored
Aug 29, 2019
by
Miguel Jimenez Lopez
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement a command option for the spec-vuart tool.
parent
50a86c94
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
175 additions
and
37 deletions
+175
-37
spec-vuart.c
tools/spec-vuart.c
+84
-29
speclib.c
tools/speclib.c
+74
-0
speclib.h
tools/speclib.h
+17
-8
No files found.
tools/spec-vuart.c
View file @
a301a69e
...
...
@@ -24,38 +24,23 @@ static void print_version(char *pname)
static
void
*
card
;
static
int
transfer_byte
(
int
from
,
int
is_control
)
{
char
c
;
int
ret
;
do
{
ret
=
read
(
from
,
&
c
,
1
);
}
while
(
ret
<
0
&&
errno
==
EINTR
);
if
(
ret
==
1
)
{
if
(
is_control
)
{
if
(
c
==
'\x01'
)
{
// C-a
return
-
1
;
}
}
spec_vuart_tx
(
card
,
&
c
,
1
);
}
else
{
fprintf
(
stderr
,
"nothing to read. Port disconnected?
\n
"
);
return
-
2
;
}
return
0
;
}
void
term_main
(
int
keep_term
)
void
term_main
(
int
keep_term
,
int
cmd_mode
,
char
*
cmd
)
{
struct
termios
oldkey
,
newkey
;
//above is place for old and new port settings for keyboard teletype
int
need_exit
=
0
;
char
c
;
int
prompt_det
=
0
;
char
tmp
[
20
];
int
tmp_idx
;
int
i
;
if
(
cmd_mode
==
0
)
fprintf
(
stderr
,
"[press C-a to exit]
\n
"
);
if
(
!
keep_term
)
{
tcgetattr
(
STDIN_FILENO
,
&
oldkey
);
newkey
.
c_cflag
=
B
96
00
|
CS8
|
CLOCAL
|
CREAD
;
newkey
.
c_cflag
=
B
1152
00
|
CS8
|
CLOCAL
|
CREAD
;
newkey
.
c_iflag
=
IGNPAR
;
newkey
.
c_oflag
=
0
;
newkey
.
c_lflag
=
0
;
...
...
@@ -64,6 +49,19 @@ void term_main(int keep_term)
tcflush
(
STDIN_FILENO
,
TCIFLUSH
);
tcsetattr
(
STDIN_FILENO
,
TCSANOW
,
&
newkey
);
}
if
(
cmd_mode
==
1
)
{
char
endc
;
vuart_flush
(
card
);
spec_vuart_tx
(
card
,
cmd
,
strlen
(
cmd
));
do
{
spec_vuart_rx
(
card
,
&
endc
,
1
);
}
while
(
endc
!=
13
);
}
while
(
!
need_exit
)
{
fd_set
fds
;
int
ret
;
...
...
@@ -78,12 +76,59 @@ void term_main(int keep_term)
perror
(
"select"
);
}
else
if
(
ret
>
0
)
{
if
(
FD_ISSET
(
STDIN_FILENO
,
&
fds
))
{
need_exit
=
transfer_byte
(
STDIN_FILENO
,
1
);
need_exit
=
vuart_check_end
(
STDIN_FILENO
,
1
,
&
c
);
if
(
need_exit
==
0
&&
cmd_mode
==
0
)
{
spec_vuart_tx
(
card
,
&
c
,
1
);
}
else
{
if
(
need_exit
==
0
&&
cmd_mode
==
1
&&
c
==
27
)
{
spec_vuart_tx
(
card
,
&
c
,
1
);
}
}
}
}
prompt_det
=
0
;
tmp_idx
=
0
;
while
((
spec_vuart_rx
(
card
,
&
rx
,
1
))
==
1
)
{
while
((
spec_vuart_rx
(
card
,
&
rx
,
1
))
==
1
)
#if VUART_RX_USLEEP > 0
usleep
(
VUART_RX_USLEEP
);
#endif
if
(
cmd_mode
==
1
)
{
vuart_detect_prompt
(
rx
,
&
prompt_det
,
VUART_PROMPT_DET_MODE_FULL
);
switch
(
prompt_det
)
{
case
VUART_PROMT_DETECTED
:
need_exit
=-
1
;
break
;
case
VUART_W_DETECTED
:
tmp
[
tmp_idx
]
=
rx
;
tmp_idx
++
;
break
;
case
VUART_R_DETECTED
:
tmp
[
tmp_idx
]
=
rx
;
tmp_idx
++
;
break
;
case
VUART_C_DETECTED
:
tmp
[
tmp_idx
]
=
rx
;
tmp_idx
++
;
break
;
default:
for
(
i
=
0
;
i
<
tmp_idx
;
i
++
)
fprintf
(
stderr
,
"%c"
,
tmp
[
tmp_idx
]);
tmp_idx
=
0
;
fprintf
(
stderr
,
"%c"
,
rx
);
break
;
}
}
else
{
fprintf
(
stderr
,
"%c"
,
rx
);
}
}
}
...
...
@@ -96,8 +141,11 @@ int main(int argc, char **argv)
int
bus
=
-
1
,
dev_fn
=
-
1
,
c
;
uint32_t
vuart_base
=
0x20500
;
int
keep_term
=
0
;
int
cmd_len
;
int
cmd_mode
=
0
;
char
cmd
[
VUART_SIZE_CMD
];
while
((
c
=
getopt
(
argc
,
argv
,
"b:d:u:kV"
))
!=
-
1
)
while
((
c
=
getopt
(
argc
,
argv
,
"b:d:u:
c:
kV"
))
!=
-
1
)
{
switch
(
c
)
{
...
...
@@ -113,6 +161,13 @@ int main(int argc, char **argv)
case
'k'
:
keep_term
=
1
;
break
;
case
'c'
:
cmd_mode
=
1
;
strcpy
(
cmd
,
optarg
);
cmd_len
=
strlen
(
cmd
);
cmd
[
cmd_len
]
=
13
;
cmd
[
cmd_len
+
1
]
=
0
;
break
;
case
'V'
:
print_version
(
argv
[
0
]);
exit
(
0
);
...
...
@@ -139,7 +194,7 @@ int main(int argc, char **argv)
}
spec_vuart_init
(
card
,
vuart_base
);
term_main
(
keep_term
);
term_main
(
keep_term
,
cmd_mode
,
cmd
);
spec_close
(
card
);
return
0
;
...
...
tools/speclib.c
View file @
a301a69e
...
...
@@ -225,6 +225,80 @@ static void vuart_tx(void *card, int c)
p
->
vuart_base
+
UART_REG_HOST_TDR
);
}
void
vuart_flush
(
void
*
card
)
{
char
rx
;
while
((
spec_vuart_rx
(
card
,
&
rx
,
1
))
==
1
)
{
}
}
int
vuart_check_end
(
int
from
,
int
is_control
,
char
*
c
)
{
int
ret
;
do
{
ret
=
read
(
from
,
c
,
1
);
}
while
(
ret
<
0
&&
errno
==
EINTR
);
if
(
ret
==
1
)
{
if
(
is_control
)
{
if
(
*
c
==
'\x01'
)
{
// C-a
return
-
1
;
}
}
}
else
{
fprintf
(
stderr
,
"nothing to read. Port disconnected?
\n
"
);
return
-
2
;
}
return
0
;
}
void
vuart_detect_prompt
(
char
c
,
int
*
det
,
int
mode_det
)
{
switch
(
mode_det
)
{
case
VUART_PROMPT_DET_MODE_FULL
:
switch
(
*
det
)
{
case
VUART_INIT_PROMT_DET
:
if
(
c
==
'w'
)
*
det
=
VUART_W_DETECTED
;
break
;
case
VUART_W_DETECTED
:
if
(
c
==
'r'
)
*
det
=
VUART_R_DETECTED
;
else
*
det
=
VUART_INIT_PROMT_DET
;
break
;
case
VUART_R_DETECTED
:
if
(
c
==
'c'
)
*
det
=
VUART_C_DETECTED
;
else
*
det
=
VUART_INIT_PROMT_DET
;
break
;
case
VUART_C_DETECTED
:
if
(
c
==
'#'
)
*
det
=
VUART_PROMT_DETECTED
;
else
*
det
=
VUART_INIT_PROMT_DET
;
break
;
case
VUART_PROMT_DETECTED
:
break
;
default:
*
det
=
VUART_INIT_PROMT_DET
;
break
;
}
break
;
case
VUART_PROMPT_DET_MODE_FAST
:
if
(
c
==
'#'
)
*
det
=
VUART_PROMT_DETECTED
;
break
;
case
VUART_PROMPT_DET_MODE_NONE
:
*
det
=
VUART_INIT_PROMT_DET
;
break
;
}
}
static
char
*
load_binary_file
(
const
char
*
filename
,
size_t
*
size
)
{
int
i
;
...
...
tools/speclib.h
View file @
a301a69e
...
...
@@ -13,17 +13,23 @@
/* For compatibility */
#define PCI_DEVICE_ID_SPEC PCI_DEVICE_ID_SPEC_45T
/* 'Opens' the SPEC card at PCI bus [bus], device/function [dev].
Returns a handle to the card or NULL in case of failure. */
void
*
spec_open
(
int
bus
,
int
dev
);
#define VUART_SIZE_CMD 1024
/* Closes the SPEC handle [card] */
void
spec_close
(
void
*
card
);
#define VUART_PROMPT_DET_MODE_FULL 0
#define VUART_PROMPT_DET_MODE_FAST 1
#define VUART_PROMPT_DET_MODE_NONE 2
/* Loads the FPGA bitstream into card [card] from file [filename].
Returns 0 on success. */
int
spec_load_bitstream
(
void
*
card
,
const
char
*
filename
);
#define VUART_INIT_PROMT_DET 0
#define VUART_W_DETECTED 1
#define VUART_R_DETECTED 2
#define VUART_C_DETECTED 3
#define VUART_PROMT_DETECTED 4
#define VUART_RX_USLEEP 1
void
*
spec_open
();
void
spec_close
(
void
*
card
);
int
spec_load_bitstream
(
void
*
card
,
const
char
*
filename
);
/* Load the FPGA bitstram into car [card] from a given buffer [buf]
of size [size] */
int
spec_load_bitstream_buffer
(
void
*
card
,
void
*
buf
,
size_t
size
);
...
...
@@ -43,6 +49,9 @@ int spec_vuart_init(void *card, uint32_t base_addr);
/* Virtual uart Rx (VUART->Host) and Tx (Host->VUART) functions */
size_t
spec_vuart_rx
(
void
*
card
,
char
*
buffer
,
size_t
size
);
size_t
spec_vuart_tx
(
void
*
card
,
char
*
buffer
,
size_t
size
);
void
vuart_flush
(
void
*
card
);
int
vuart_check_end
(
int
from
,
int
is_control
,
char
*
c
);
void
vuart_detect_prompt
(
char
c
,
int
*
det
,
int
mode_det
);
/* Get the pointer to access SPEC memory directly */
void
*
spec_get_base
(
void
*
card
,
int
basenr
);
...
...
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