Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
Simple VME FMC Carrier SVEC - Software
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
Simple VME FMC Carrier SVEC - Software
Commits
641ff1f1
Commit
641ff1f1
authored
Aug 29, 2013
by
Tomasz Wlostowski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tools: added userspace tool (svec-config) for configuring VME via sysfs
parent
94674ffb
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
187 additions
and
0 deletions
+187
-0
svec-config
tools/svec-config
+187
-0
No files found.
tools/svec-config
0 → 100755
View file @
641ff1f1
#!/usr/bin/python
#
# Copyright (C) 2013 CERN (www.cern.ch)
# Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
#
# Released according to the GNU GPL, version 2 or any later version
#
# svec-config: a userspace utility for configuring VME interface
# of SVEC (Simple VME FMC carrier) boards.
#
import
glob
import
sys
import
getopt
import
os
cards
=
[]
def
write_sysfs
(
lun
,
attr
,
value
):
f
=
open
(
"/sys/bus/vme/devices/svec.
%
d/
%
s"
%
(
lun
,
attr
),
"w"
)
f
.
write
(
str
(
value
)
+
"
\n
"
);
f
.
close
()
def
read_sysfs
(
lun
,
attr
):
f
=
open
(
"/sys/bus/vme/devices/svec.
%
d/
%
s"
%
(
lun
,
attr
),
"r"
)
rv
=
int
(
f
.
read
(),
0
);
f
.
close
()
return
rv
class
SVEC
:
def
__init__
(
self
,
lun
):
self
.
lun
=
lun
self
.
read_config
()
def
read_config
(
self
):
self
.
conf_valid
=
True
self
.
conf_updated
=
False
self
.
slot
=
read_sysfs
(
self
.
lun
,
"slot"
)
self
.
vme_base
=
read_sysfs
(
self
.
lun
,
"vme_base"
)
if
(
self
.
vme_base
==
0xffffffff
):
self
.
conf_valid
=
0
self
.
vme_size
=
read_sysfs
(
self
.
lun
,
"vme_size"
)
self
.
vme_am
=
read_sysfs
(
self
.
lun
,
"vme_am"
)
self
.
interrupt_vector
=
read_sysfs
(
self
.
lun
,
"interrupt_vector"
)
if
(
self
.
interrupt_vector
==
0xffffffff
):
self
.
conf_valid
=
0
self
.
interrupt_level
=
read_sysfs
(
self
.
lun
,
"interrupt_level"
)
self
.
use_fmc
=
read_sysfs
(
self
.
lun
,
"use_fmc"
)
def
set_am
(
self
,
am
):
if
(
am
==
"A24"
):
self
.
vme_am
=
0x39
elif
(
am
==
"A32"
):
self
.
vme_am
=
0x09
else
:
raise
Exception
(
"unsupported address modifier:
%
s"
%
am
)
self
.
conf_updated
=
True
def
set_size
(
self
,
size
):
if
(
size
<=
0x10000
or
size
>
0x1000000
):
raise
Exception
(
"VME window size out of range"
)
self
.
vme_size
=
size
self
.
conf_updated
=
True
def
set_base
(
self
,
base
):
if
(
base
<
0x0
or
base
>
0xfffe0000
):
raise
Exception
(
"VME window base out of range"
)
self
.
vme_base
=
base
self
.
conf_updated
=
True
def
set_vector
(
self
,
v
):
if
(
v
<
0x0
or
v
>
0xff
):
raise
Exception
(
"VME interrupt vector out of range"
)
self
.
interrupt_vector
=
v
self
.
conf_updated
=
True
def
set_level
(
self
,
l
):
if
(
l
<
0x0
or
l
>
0x7
):
raise
Exception
(
"VME interrupt level out of range"
)
self
.
interrupt_level
=
l
self
.
conf_updated
=
True
def
enable_fmcs
(
self
,
e
):
self
.
use_fmc
=
e
self
.
conf_updated
=
True
def
commit
(
self
):
if
not
self
.
conf_updated
:
return
# nothing changed, nothing to commit
write_sysfs
(
self
.
lun
,
"vme_base"
,
"0x
%08
x"
%
self
.
vme_base
)
write_sysfs
(
self
.
lun
,
"vme_size"
,
"0x
%08
x"
%
self
.
vme_size
)
write_sysfs
(
self
.
lun
,
"vme_am"
,
"0x
%02
x"
%
self
.
vme_am
)
write_sysfs
(
self
.
lun
,
"interrupt_vector"
,
"0x
%02
x"
%
self
.
interrupt_vector
)
write_sysfs
(
self
.
lun
,
"interrupt_level"
,
"
%
d"
%
self
.
interrupt_level
)
write_sysfs
(
self
.
lun
,
"use_fmc"
,
"
%
d"
%
self
.
use_fmc
)
write_sysfs
(
self
.
lun
,
"configured"
,
"1"
)
# commit new config!
def
__str__
(
self
):
am_map
=
{
0x9
:
"A32"
,
0x39
:
"A24"
}
s
=
"svec.
%
d: slot
%
d, "
%
(
self
.
lun
,
self
.
slot
)
if
(
not
self
.
conf_valid
):
s
+=
"VME unconfigured"
return
s
s
+=
am_map
[
self
.
vme_am
];
s
+=
", 0x
%08
x-0x
%08
x, vector 0x
%
x, level
%
d"
%
(
self
.
vme_base
,
self
.
vme_base
+
self
.
vme_size
-
1
,
self
.
interrupt_vector
,
self
.
interrupt_level
)
if
(
self
.
use_fmc
==
0
):
s
+=
" (FMC drivers disabled)"
return
s
def
find_svecs
():
for
p
in
glob
.
glob
(
"/sys/bus/vme/devices/svec.*"
):
lun
=
int
(
p
.
split
(
'.'
)[
1
])
cards
.
append
(
SVEC
(
lun
))
def
dump_svecs
():
print
(
"
%
d card(s) found:"
%
len
(
cards
))
for
c
in
cards
:
print
(
str
(
c
))
def
find_card
(
lun
,
slot
):
if
(
lun
==
None
and
slot
==
None
):
raise
Exception
(
"need either LUN or slot number"
)
for
c
in
cards
:
if
(
c
.
lun
==
lun
or
c
.
slot
==
slot
):
return
c
raise
Exception
(
"no card matching LUN/slot found"
)
def
__main__
():
try
:
find_svecs
()
optlist
,
args
=
getopt
.
getopt
(
sys
.
argv
[
1
:],
'hlu:s:a:b:f:w:k:v:'
)
if
len
(
optlist
)
==
0
:
print
(
"usage:
%
s [-h] [-l] [-u lun] [-s slot] [-a am] [-b base] [-w size] [-v vector] [-k level] [-f enable]"
%
sys
.
argv
[
0
])
return
0
for
o
,
a
in
optlist
:
if
(
o
==
"-h"
):
print
(
"svec-config: a tool for configuring VME interface of SVEC cards"
)
print
(
"usage:
%
s [-h] [-l] [-u lun] [-s slot] [-a am] [-b base] [-w size] [-v vector] [-k level] [-f enable]"
%
sys
.
argv
[
0
])
print
(
" -h: prints this message"
)
print
(
" -l: lists all SVECs in the system"
)
print
(
" -u: specifies the LUN of the card to be configured"
)
print
(
" -s: specifies the slot of the card to be configured"
)
print
(
" -a modifier: specifies the address modifier to use (A24 or A32)"
)
print
(
" -b address: specifies the VME base address"
)
print
(
" -w size: specifies the VME window size"
)
print
(
" -v vector: specifies the VME interrupt vector"
)
print
(
" -k level: specifies the VME interrupt level"
)
print
(
" -f enable: enables/disables probing FMC kernel drivers for given carrier
\n
"
)
return
0
elif
(
o
==
"-u"
):
card
=
find_card
(
int
(
a
,
0
),
None
)
elif
(
o
==
"-s"
):
card
=
find_card
(
None
,
int
(
a
,
0
))
elif
(
o
==
"-a"
):
card
.
set_am
(
a
)
elif
(
o
==
"-w"
):
card
.
set_size
(
int
(
a
,
0
))
elif
(
o
==
"-b"
):
card
.
set_base
(
int
(
a
,
0
))
elif
(
o
==
"-v"
):
card
.
set_vector
(
int
(
a
,
0
))
elif
(
o
==
"-k"
):
card
.
set_level
(
int
(
a
,
0
))
elif
(
o
==
"-f"
):
card
.
enable_fmcs
(
int
(
a
,
0
))
elif
(
o
==
"-l"
):
dump_svecs
()
return
0
card
.
commit
()
except
:
print
(
"Error:
%
s"
%
sys
.
exc_info
()[
1
])
__main__
()
\ No newline at end of file
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