Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
DIOT WIC Gateware
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
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
DIOT WIC Gateware
Commits
3100cc17
Commit
3100cc17
authored
Feb 20, 2020
by
Tristan Gingold
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fip_urv: add -t, add slots command.
parent
fc529788
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
155 additions
and
13 deletions
+155
-13
fip_urv.c
sw/diot-sw/fip_urv/fip_urv.c
+128
-13
mbox_regs.h
sw/fip_urv/mbox_regs.h
+27
-0
No files found.
sw/diot-sw/fip_urv/fip_urv.c
View file @
3100cc17
...
...
@@ -34,6 +34,8 @@
#include "fip_urv_cmd.h"
#define IO_ADDR 0x100000
static
const
uint16_t
ftb_var_id
[
2
]
=
{
0x05
,
/* produced var */
0x06
,
/* consumed var */
...
...
@@ -89,6 +91,8 @@ struct ftb_dev {
unsigned
waitrep
;
}
*
ftb
;
static
int
flag_trace
;
static
int
read_vars
(
void
)
{
struct
mstrfip_data
*
pvar
=
ftb
->
ba
.
cons_varlist
[
0
];
...
...
@@ -99,7 +103,7 @@ static int read_vars(void)
switch
(
pvar
->
status
)
{
case
MSTRFIP_DATA_OK
:
if
(
1
)
{
if
(
flag_trace
)
{
printf
(
"Recv:"
);
for
(
unsigned
j
=
0
;
j
<
VAR_LENGTH
;
j
++
)
printf
(
" %02x"
,
pvar
->
buffer
[
j
]);
...
...
@@ -117,6 +121,10 @@ static int read_vars(void)
if
(
cmd
->
cb
!=
NULL
)
{
res
=
cmd
->
cb
(
cmd
,
pvar
->
buffer
);
if
(
res
<
0
)
{
/* Will stop. */
ftb
->
idx_cmd
=
ftb
->
nbr_cmds
;
}
}
else
res
=
0
;
...
...
@@ -172,7 +180,8 @@ static int update_vars(void)
pvar
->
bsz
=
72
;
pvar
->
buffer
[
0
]
=
CMD_ERROR
;
pvar
->
buffer
[
1
]
=
0xff
;
printf
(
"Send padding
\n
"
);
if
(
flag_trace
)
printf
(
"Send padding
\n
"
);
}
else
if
(
ftb
->
idx_cmd
>=
ftb
->
nbr_cmds
)
{
kill
(
getpid
(),
SIGINT
);
...
...
@@ -189,10 +198,12 @@ static int update_vars(void)
pvar
->
buffer
[
1
]
=
cmd
->
id
;
memcpy
(
pvar
->
buffer
+
4
,
cmd
->
args
,
cmd
->
len
);
printf
(
"Send 0x%02x, len=%d:"
,
cmd
->
cmd
,
pvar
->
bsz
);
for
(
unsigned
j
=
0
;
j
<
4
+
cmd
->
len
;
j
++
)
printf
(
" %02x"
,
pvar
->
buffer
[
j
]);
printf
(
"
\n
"
);
if
(
flag_trace
)
{
printf
(
"Send 0x%02x, len=%d:"
,
cmd
->
cmd
,
pvar
->
bsz
);
for
(
unsigned
j
=
0
;
j
<
4
+
cmd
->
len
;
j
++
)
printf
(
" %02x"
,
pvar
->
buffer
[
j
]);
printf
(
"
\n
"
);
}
ftb
->
waitrep
=
1
;
}
...
...
@@ -414,6 +425,39 @@ static int cb_read_word (struct urv_cmd *cmd, unsigned char *rep)
return
0
;
}
static
int
cb_slots
(
struct
urv_cmd
*
cmd
,
unsigned
char
*
rep
)
{
unsigned
addr
=
word_unpack
(
&
cmd
->
args
[
0
]);
unsigned
slot
=
(
addr
-
IO_ADDR
-
0x40
)
>>
2
;
int
i
;
unsigned
val
;
val
=
word_unpack
(
&
rep
[
4
]);
printf
(
"Slot %d: "
,
slot
);
for
(
i
=
31
;
i
>=
0
;
i
--
)
{
putc
((
val
&
(
1
<<
i
))
?
'*'
:
'.'
,
stdout
);
if
(
i
==
16
)
putc
(
' '
,
stdout
);
}
putc
(
'\n'
,
stdout
);
if
(
slot
==
7
)
return
0
;
addr
+=
4
;
word_pack
(
&
cmd
->
args
[
0
],
addr
);
return
1
;
}
static
int
cb_check_off
(
struct
urv_cmd
*
cmd
,
unsigned
char
*
rep
)
{
unsigned
val
=
word_unpack
(
&
rep
[
4
]);
if
(
val
!=
0
)
{
fprintf
(
stderr
,
"PLC cpu is still running (do 'plc off')
\n
"
);
return
-
1
;
}
return
0
;
}
static
Elf32_Half
read_elf_half
(
const
Elf32_Half
*
v
)
{
const
unsigned
char
*
p
=
(
const
unsigned
char
*
)
v
;
...
...
@@ -457,7 +501,7 @@ static int load_cb_prepare(struct urv_cmd *cmd)
cmd
->
cmd
=
CMD_WRITE_BLOCK
;
cmd
->
len
=
4
+
l
;
word_pack
(
&
cmd
->
args
[
0
],
0x100000
+
0x2000
+
dat
->
off
);
word_pack
(
&
cmd
->
args
[
0
],
IO_ADDR
+
0x2000
+
dat
->
off
);
memcpy
(
&
cmd
->
args
[
4
],
dat
->
buf
+
dat
->
off
,
l
);
cmd
->
cb
=
cb_load
;
dat
->
off
+=
l
;
...
...
@@ -572,6 +616,35 @@ static int cmd_load (const char *filename)
return
-
1
;
}
static
int
cmd_reset
(
unsigned
val
)
{
struct
urv_cmd
cmd
;
cmd
.
cmd
=
CMD_WRITE_WORD
;
cmd
.
len
=
8
;
word_pack
(
&
cmd
.
args
[
0
],
IO_ADDR
+
0
);
word_pack
(
&
cmd
.
args
[
4
],
val
==
0
);
cmd
.
cb
=
NULL
;
if
(
append_command
(
ftb
,
&
cmd
)
!=
0
)
return
-
1
;
return
0
;
}
static
int
cmd_check_off
(
void
)
{
struct
urv_cmd
cmd
;
cmd
.
cmd
=
CMD_READ_WORD
;
cmd
.
len
=
4
;
word_pack
(
&
cmd
.
args
[
0
],
IO_ADDR
+
0
);
cmd
.
cb
=
cb_check_off
;
if
(
append_command
(
ftb
,
&
cmd
)
!=
0
)
return
-
1
;
return
0
;
}
/* Return the number of arguments consumed.
0: argument unknown,
< 0: bad argument (error). */
...
...
@@ -674,6 +747,17 @@ static int decode_command (int argc, char *argv[])
return
-
1
;
return
3
;
}
else
if
(
strcmp
(
argv
[
0
],
"plc"
)
==
0
)
{
if
(
argc
>
1
)
{
if
(
strcmp
(
argv
[
1
],
"on"
)
==
0
)
return
cmd_reset
(
0
)
<
0
?
-
1
:
2
;
if
(
strcmp
(
argv
[
1
],
"off"
)
==
0
)
return
cmd_reset
(
1
)
<
0
?
-
1
:
2
;
}
fprintf
(
stderr
,
"plc requires on/off
\n
"
);
return
-
1
;
}
else
if
(
strcmp
(
argv
[
0
],
"load"
)
==
0
)
{
if
(
argc
<
2
)
{
...
...
@@ -681,10 +765,30 @@ static int decode_command (int argc, char *argv[])
return
-
1
;
}
if
(
cmd_check_off
()
<
0
)
return
-
1
;
if
(
cmd_load
(
argv
[
1
])
<
0
)
return
-
1
;
if
(
cmd_reset
(
0
)
!=
0
)
return
-
1
;
return
2
;
}
else
if
(
strcmp
(
argv
[
0
],
"slots"
)
==
0
)
{
struct
urv_cmd
cmd
;
cmd
.
cmd
=
CMD_READ_WORD
;
cmd
.
len
=
4
;
word_pack
(
&
cmd
.
args
[
0
],
IO_ADDR
+
0x40
);
cmd
.
cb
=
cb_slots
;
if
(
append_command
(
ftb
,
&
cmd
)
!=
0
)
return
-
1
;
printf
(
" 1111111 relays 1111111 loops
\n
"
);
printf
(
"slot 6543210987654321 6543210987654321
\n
"
);
return
1
;
}
else
return
0
;
}
...
...
@@ -707,20 +811,31 @@ int main(int argc, char *argv[])
memset
(
ftb
,
0
,
sizeof
(
struct
ftb_dev
));
ftb
->
var_length
=
VAR_LENGTH
;
ftb
->
cycle_uslength
=
5000
00
;
ftb
->
cycle_uslength
=
5000
;
ftb
->
nbr_cmds
=
0
;
ftb
->
idx_cmd
=
0
;
ftb
->
waitrep
=
0
;
if
(
argc
<=
1
)
{
/* Skip progname. */
argc
--
;
argv
++
;
while
(
argc
>
0
&&
argv
[
0
][
0
]
==
'-'
)
{
if
(
strcmp
(
argv
[
0
],
"-t"
)
==
0
)
flag_trace
++
;
else
{
fprintf
(
stderr
,
"unknown option %s
\n
"
,
argv
[
0
]);
return
1
;
}
argc
--
;
argv
++
;
}
if
(
argc
==
0
)
{
fprintf
(
stderr
,
"no commands
\n
"
);
return
1
;
}
/* TODO: handle options. */
argc
--
;
argv
++
;
while
(
argc
>
0
)
{
res
=
decode_command
(
argc
,
argv
);
if
(
res
==
0
)
{
...
...
sw/fip_urv/mbox_regs.h
0 → 100644
View file @
3100cc17
#ifndef __CHEBY__MBOX_REGS__H__
#define __CHEBY__MBOX_REGS__H__
#define MBOX_REGS_SIZE 12
/* Mailbox to the fip urv */
#define MBOX_REGS_MBOXOUT 0x0UL
/* Mailbox from the fip urv */
#define MBOX_REGS_MBOXIN 0x4UL
/* Status for mailboxes */
#define MBOX_REGS_STATUS 0x8UL
#define MBOX_REGS_STATUS_MBIN 0x1UL
#define MBOX_REGS_STATUS_MBOUT 0x2UL
struct
mbox_regs
{
/* [0x0]: REG (wo) Mailbox to the fip urv */
uint32_t
mboxout
;
/* [0x4]: REG (ro) Mailbox from the fip urv */
uint32_t
mboxin
;
/* [0x8]: REG (ro) Status for mailboxes */
uint32_t
status
;
};
#endif
/* __CHEBY__MBOX_REGS__H__ */
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