Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
x393
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
x393
Commits
bb675fbb
Commit
bb675fbb
authored
May 18, 2015
by
Yuri Nenakhov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Switched offset and size representation to mempages for consistency
parent
1917775d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
39 additions
and
75 deletions
+39
-75
x393_mcntrl_dmatest.py
py393/x393_mcntrl_dmatest.py
+39
-75
No files found.
py393/x393_mcntrl_dmatest.py
View file @
bb675fbb
...
...
@@ -66,8 +66,8 @@ class X393McntrlDmatest(object):
@return None
'''
self
.
buffer_startaddr
=
addr
self
.
buffer_size
=
pages
*
self
.
PAGE_SIZE
self
.
buffer_endaddr
=
self
.
buffer_startaddr
+
self
.
buffer_size
self
.
buffer_size
=
pages
self
.
buffer_endaddr
=
self
.
buffer_startaddr
+
self
.
buffer_size
*
self
.
PAGE_SIZE
def
dmatest_set_buffer_from_sysfs
(
self
):
'''
...
...
@@ -79,8 +79,8 @@ class X393McntrlDmatest(object):
with
open
(
self
.
MEM_PATH
+
self
.
BUFFER_ADDRESS_NAME
)
as
sysfile
:
self
.
buffer_startaddr
=
int
(
sysfile
.
read
(),
0
)
with
open
(
self
.
MEM_PATH
+
self
.
BUFFER_PAGES_NAME
)
as
sysfile
:
self
.
buffer_size
=
self
.
PAGE_SIZE
*
int
(
sysfile
.
read
(),
0
)
self
.
buffer_endaddr
=
self
.
buffer_startaddr
+
self
.
buffer_size
self
.
buffer_size
=
int
(
sysfile
.
read
(),
0
)
self
.
buffer_endaddr
=
self
.
buffer_startaddr
+
self
.
buffer_size
*
self
.
PAGE_SIZE
except
:
print
(
"Failed to get reserved physical memory range"
)
...
...
@@ -89,17 +89,15 @@ class X393McntrlDmatest(object):
Set DMA region to be transfered into
framebuffer memory. Page-aligned. Memory buffer
for DMA operations has to be allocated.
@param offset Position in the allocated memory buffer
@param offset Position in the allocated memory buffer
(in pages)
@param pages Data region size (in pages)
@return None
'''
pagealigned
=
offset
&
(
~
(
self
.
PAGE_SIZE
-
1
))
self
.
source_offset
=
pagealigned
self
.
source_size
=
self
.
PAGE_SIZE
*
pages
self
.
source_pages
=
pages
self
.
source_startaddr
=
self
.
buffer_startaddr
+
self
.
source_offset
self
.
source_endaddr
=
self
.
source_startaddr
+
self
.
source_size
if
(
self
.
source_offset
+
self
.
source_size
>
self
.
buffer_endaddr
or
self
.
source_offset
=
offset
self
.
source_size
=
pages
source_startaddr
=
self
.
buffer_startaddr
+
self
.
source_offset
*
self
.
PAGE_SIZE
source_endaddr
=
source_startaddr
+
self
.
source_size
*
self
.
PAGE_SIZE
if
(
source_endaddr
>
self
.
buffer_endaddr
or
self
.
source_offset
<
0
or
self
.
source_size
<
0
):
raise
MemoryError
(
"Region is outside of the buffer"
)
...
...
@@ -108,17 +106,15 @@ class X393McntrlDmatest(object):
Set DMA region to transfer data from
framebuffer memory. Page-aligned. Memory buffer
for DMA operations has to be allocated.
@param offset Position in the allocated memory buffer
@param offset Position in the allocated memory buffer
(in pages)
@param pages Data region size (in pages)
@return None
'''
pagealigned
=
offset
&
(
~
(
self
.
PAGE_SIZE
-
1
))
self
.
dest_offset
=
pagealigned
self
.
dest_size
=
self
.
PAGE_SIZE
*
pages
self
.
dest_pages
=
pages
self
.
dest_startaddr
=
self
.
buffer_startaddr
+
self
.
dest_offset
self
.
dest_endaddr
=
self
.
dest_startaddr
+
self
.
dest_size
if
(
self
.
dest_offset
+
self
.
dest_size
>
self
.
buffer_endaddr
or
self
.
dest_offset
=
offset
self
.
dest_size
=
pages
dest_startaddr
=
self
.
buffer_startaddr
+
self
.
dest_offset
*
self
.
PAGE_SIZE
dest_endaddr
=
dest_startaddr
+
self
.
dest_size
*
self
.
PAGE_SIZE
if
(
dest_endaddr
>
self
.
buffer_endaddr
or
self
.
dest_offset
<
0
or
self
.
dest_size
<
0
):
raise
MemoryError
(
"Region is outside of the buffer"
)
...
...
@@ -127,11 +123,13 @@ class X393McntrlDmatest(object):
Fill defined DMA test region with random data
@return None
'''
source_startaddr
=
self
.
buffer_startaddr
+
self
.
source_offset
*
self
.
PAGE_SIZE
source_endaddr
=
source_startaddr
+
self
.
source_size
*
self
.
PAGE_SIZE
datactr
=
0
self
.
tag
=
random
.
randint
(
0
,
0xFF
)
<<
24
print
(
"Tag = "
+
hex
(
int
(
self
.
tag
>>
24
)))
with
open
(
"/dev/mem"
,
"r+b"
)
as
f
:
for
addr
in
range
(
s
elf
.
source_startaddr
,
self
.
source_endaddr
,
self
.
BYTEMODE
):
for
addr
in
range
(
s
ource_startaddr
,
source_endaddr
,
self
.
BYTEMODE
):
data
=
datactr
*
0x400
//
self
.
PAGE_SIZE
|
self
.
tag
# random.randint(0,(1<<self.BYTEMODE*8)-1) & (1<<self.BYTEMODE*8)-1
page_addr
=
addr
&
(
~
(
self
.
PAGE_SIZE
-
1
))
page_offs
=
addr
-
page_addr
...
...
@@ -147,10 +145,12 @@ class X393McntrlDmatest(object):
Calculate checksum of destination data
@return None
'''
dest_startaddr
=
self
.
buffer_startaddr
+
self
.
dest_offset
*
self
.
PAGE_SIZE
dest_endaddr
=
dest_startaddr
+
self
.
dest_size
*
self
.
PAGE_SIZE
errors
=
0
dataref
=
0
with
open
(
"/dev/mem"
,
"r+b"
)
as
f
:
for
addr
in
range
(
self
.
dest_startaddr
,
self
.
dest_endaddr
,
self
.
BYTEMODE
):
for
addr
in
range
(
dest_startaddr
,
dest_endaddr
,
self
.
BYTEMODE
):
page_addr
=
addr
&
(
~
(
self
.
PAGE_SIZE
-
1
))
page_offs
=
addr
-
page_addr
if
(
page_addr
>=
0x80000000
):
...
...
@@ -197,10 +197,10 @@ class X393McntrlDmatest(object):
print
(
"Source: start = "
+
hex
(
self
.
source_offset
)
+
", size = "
+
str
(
self
.
source_size
))
self
.
membridge
.
membridge_rw
(
True
,
self
.
fb_startaddr
,
self
.
fb_fullwidth
,
self
.
fb_width
,
self
.
source_size
/
self
.
PAGE_SIZE
*
self
.
fb_linemul
,
self
.
source_size
*
self
.
fb_linemul
,
self
.
fb_left
,
self
.
fb_top
,
self
.
source_offset
>>
3
,
self
.
buffer_startaddr
>>
3
,
self
.
source_size
>>
3
,
False
,
0x3
,
True
,
True
)
self
.
source_offset
*
self
.
PAGE_SIZE
>>
3
,
self
.
buffer_startaddr
>>
3
,
self
.
source_size
*
self
.
PAGE_SIZE
>>
3
,
False
,
0x3
,
True
,
True
)
def
_transfer_fb_to_dest
(
self
):
'''
...
...
@@ -211,10 +211,10 @@ class X393McntrlDmatest(object):
print
(
"Dest: start = "
+
hex
(
self
.
dest_offset
)
+
", size = "
+
str
(
self
.
dest_size
))
self
.
membridge
.
membridge_rw
(
False
,
self
.
fb_startaddr
,
self
.
fb_fullwidth
,
self
.
fb_width
,
self
.
dest_size
/
self
.
PAGE_SIZE
*
self
.
fb_linemul
,
self
.
dest_size
*
self
.
fb_linemul
,
self
.
fb_left
,
self
.
fb_top
,
self
.
dest_offset
>>
3
,
self
.
buffer_startaddr
>>
3
,
self
.
dest_size
>>
3
,
False
,
0x3
,
True
,
True
)
self
.
dest_offset
*
self
.
PAGE_SIZE
>>
3
,
self
.
buffer_startaddr
>>
3
,
self
.
dest_size
*
self
.
PAGE_SIZE
>>
3
,
False
,
0x3
,
True
,
True
)
def
_result
(
self
):
'''
...
...
@@ -228,21 +228,9 @@ class X393McntrlDmatest(object):
Set source memory region
and transfer data to fb
@pages Number of data memory pages
@source Source offset in buffer (pages)
Set framebuffer memory region
to transfer data from system memory
Default values allow to read framebuffer at
0x20, 0x21... lines, 0th column, 0..7 memory banks
with 32x32 region showing 1 recorded line
Example: set_and_read 32 32 0 0x20 0 1 1
@startaddr Starting address of data array in framebuffer
@fullwidth Period of lines in memory
@width Length of line
@leftoffset Data offset from beginning of line
@topoffset Data offset from zeroth line
@linemultiplier set this value to a number of lines
which form 1 memory page (to sync
allocated memory size in sysmem and fb)
@source Source offset in buffer (in pages)
@startaddr,@fullwidth,@width,@leftoffset,@topoffset,@linemultiplier -
see _set_fb_region()
'''
self
.
_set_source_region
(
source
,
pages
)
self
.
_set_fb_region
(
startaddr
,
fullwidth
,
width
,
leftoffset
,
topoffset
,
linemultiplier
)
...
...
@@ -255,7 +243,7 @@ class X393McntrlDmatest(object):
Set destination memory region
and transfer data from fb
@pages Number of data memory pages
@dest Destination offset in buffer (pages)
@dest Destination offset in buffer (
in
pages)
@return True if no data corruption was detected
'''
self
.
_set_dest_region
(
dest
,
pages
)
...
...
@@ -273,30 +261,18 @@ class X393McntrlDmatest(object):
generate randomly
@dest Destination offset (in pages) left 'None' to
generate randomly
Set framebuffer memory region
to transfer data from system memory
Default values allow to read framebuffer at
0x20, 0x21... lines, 0th column, 0..7 memory banks
with 32x32 region showing 1 recorded line
Example: set_and_read 32 32 0 0x20 0 1 1
@startaddr Starting address of data array in framebuffer
@fullwidth Period of lines in memory
@width Length of line
@leftoffset Data offset from beginning of line
@topoffset Data offset from zeroth line
@linemultiplier set this value to a number of lines
which form 1 memory page (to sync
allocated memory size in sysmem and fb)
@startaddr,@fullwidth,@width,@leftoffset,@topoffset,@linemultiplier -
see _set_fb_region()
@return True if successful
'''
self
.
dmatest_set_buffer_from_sysfs
()
if
source
==
None
:
source
=
random
.
randint
(
0
,
self
.
buffer_size
-
pages
*
self
.
PAGE_SIZE
)
source
=
random
.
randint
(
0
,
self
.
buffer_size
-
pages
)
if
dest
==
None
:
dest
=
random
.
randint
(
0
,
self
.
buffer_size
-
pages
*
self
.
PAGE_SIZE
)
dest
=
random
.
randint
(
0
,
self
.
buffer_size
-
pages
)
self
.
dmatest_prepare
(
pages
,
source
,
startaddr
,
fullwidth
,
width
,
leftoffset
,
topoffset
,
linemultiplier
)
transfer_str
=
(
str
(
pages
)
+
" pages starting from page "
+
hex
(
int
(
source
//
self
.
PAGE_SIZE
))
+
" -> page "
+
hex
(
int
(
dest
//
self
.
PAGE_SIZE
)))
hex
(
int
(
source
))
+
" -> page "
+
hex
(
int
(
dest
)))
result
=
self
.
dmatest_run
(
pages
,
dest
)
if
(
result
):
print
(
transfer_str
+
" PASSED"
)
...
...
@@ -312,20 +288,8 @@ class X393McntrlDmatest(object):
generate randomly
@dest Destination offset (in pages) left 'None' to
generate randomly
Set framebuffer memory region
to transfer data from system memory
Default values allow to read framebuffer at
0x20, 0x21... lines, 0th column, 0..7 memory banks
with 32x32 region showing 1 recorded line
Example: set_and_read 32 32 0 0x20 0 1 1
@startaddr Starting address of data array in framebuffer
@fullwidth Period of lines in memory
@width Length of line
@leftoffset Data offset from beginning of line
@topoffset Data offset from zeroth line
@linemultiplier set this value to a number of lines
which form 1 memory page (to sync
allocated memory size in sysmem and fb)
@startaddr,@fullwidth,@width,@leftoffset,@topoffset,@linemultiplier -
see _set_fb_region()
@return None
'''
while
True
:
...
...
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