Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-elphel
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
linux-elphel
Commits
d528e945
Commit
d528e945
authored
Jan 09, 2018
by
Oleg Dzhimiev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reading membridge status from sysfs
parent
290800bd
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
36 additions
and
28 deletions
+36
-28
x393_videomem.c
src/drivers/elphel/x393_videomem.c
+36
-28
No files found.
src/drivers/elphel/x393_videomem.c
View file @
d528e945
...
...
@@ -32,6 +32,7 @@
#include "x393_macro.h"
#include "pgm_functions.h"
#include "x393_videomem.h"
#include "x393_fpga_functions.h"
#include <uapi/elphel/c313a.h>
#include <uapi/elphel/x393_devices.h>
...
...
@@ -43,6 +44,8 @@
// NC393 debug macros
#include "debug393.h"
#define MEMBRIDGE_CMD_IRQ_EN 0x3
static
const
struct
of_device_id
elphel393_videomem_of_match
[];
static
struct
device
*
g_dev_ptr
;
///< Global pointer to basic device structure. This pointer is used in debugfs output functions
wait_queue_head_t
videomem_wait_queue
;
...
...
@@ -88,6 +91,8 @@ static int membridge_direction = 0; // 0 - from pl to ps, 1 - from ps to pl
// Membridge can be only accessed by a single source - TODO: use this lock
static
bool
membridge_lock
=
false
;
static
int
hardware_initialized
=
0
;
/** Setup memory bridge system memory */
int
setup_membridge_system_memory
(
int
lo_addr64
,
///< start address of the system memory range in QWORDs (4 LSBs==0)
...
...
@@ -244,8 +249,12 @@ int control_membridge_memory (int num_sensor, ///< sensor port number (0..3)
membridge_mode
.
reset_frame
=
1
;
membridge_mode
.
single
=
0
;
membridge_mode
.
repetitive
=
1
;
membridge_mode
.
single
=
1
;
membridge_mode
.
repetitive
=
0
;
//membridge_mode.single = 0;
//membridge_mode.repetitive = 1;
membridge_mode
.
extra_pages
=
0
;
// TODO: direction can be changed to copy data to fpga memory (the one that's not system memory)
membridge_mode
.
write_mem
=
membridge_direction
;
...
...
@@ -288,7 +297,7 @@ int control_membridge_memory (int num_sensor, ///< sensor port number (0..3)
}
/** Setup memory controller for a sensor channel */
int
setup_sensor_memory
(
int
num_sensor
,
///< sensor port number (0..3)
int
setup_sensor_memory
(
int
num_sensor
,
///< sensor port number (0..3)
int
window_width
,
///< 13-bit - in 8*16=128 bit bursts
int
window_height
,
///< 16-bit window height (in scan lines)
int
window_left
,
///< 13-bit window left margin in 8-bursts (16 bytes)
...
...
@@ -739,6 +748,23 @@ static int videomem_open(struct inode *inode, struct file *filp)
int
width_marg
,
height_marg
,
width_bursts
;
int
frame_number
;
// to enable interrupt
x393_membridge_ctrl_irq_t
membridge_irq_en
=
{.
d32
=
0
};
membridge_irq_en
.
interrupt_cmd
=
MEMBRIDGE_CMD_IRQ_EN
;
// check fpga
if
(
!
is_fpga_programmed
()){
pr_err
(
"*** Attempted to access hardware without bitsteram ***
\n
"
);
return
-
ENODEV
;
}
// extra variable
if
(
!
hardware_initialized
){
// enable interrupt
x393_membridge_ctrl_irq
(
membridge_irq_en
);
hardware_initialized
=
1
;
}
pr_debug
(
"VIDEOMEM_OPEN
\n
"
);
privData
=
(
struct
raw_priv_t
*
)
kmalloc
(
sizeof
(
struct
raw_priv_t
),
GFP_KERNEL
);
...
...
@@ -926,7 +952,10 @@ static irqreturn_t videomem_irq_handler(int irq, ///< [in] irq interru
{
x393_membridge_ctrl_irq_t
ctrl_interrupts
=
{.
d32
=
0
};
ctrl_interrupts
.
interrupt_cmd
=
X393_IRQ_RESET
;
//TODO: Do what is needed here
pr_info
(
"Wake up, videomem interrupt received!!!
\n
"
);
x393_membridge_ctrl_irq
(
ctrl_interrupts
);
// reset interrupt
wake_up_interruptible
(
&
videomem_wait_queue
);
return
IRQ_HANDLED
;
...
...
@@ -969,13 +998,7 @@ static ssize_t get_num_sensor(struct device *dev, struct device_attribute *attr,
static
ssize_t
get_membridge_status
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
x393_status_ctrl_t
status
=
get_x393_membridge_status_cntrl
();
return
sprintf
(
buf
,
"0x%08x
\n
"
,
status
);
}
static
ssize_t
get_membridge_loaddr64
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
x393_status_ctrl_t
status
=
get_x393_membridge_status_cntrl
();
x393_status_ctrl_t
status
=
x393_membridge_status
();
return
sprintf
(
buf
,
"0x%08x
\n
"
,
status
);
}
...
...
@@ -1006,7 +1029,7 @@ static ssize_t set_num_sensor(struct device *dev, struct device_attribute *attr,
return
count
;
}
static
ssize_t
set_membridge_status
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
static
ssize_t
set_membridge_status
_reg
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
int
in
;
x393_status_ctrl_t
d
=
{.
d32
=
0
};
...
...
@@ -1019,20 +1042,6 @@ static ssize_t set_membridge_status(struct device *dev, struct device_attribute
return
count
;
}
static
ssize_t
set_membridge_loaddr64
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
int
in
;
u29_t
lo_addr
=
{.
d32
=
0
};
sscanf
(
buf
,
"%x"
,
&
in
);
lo_addr
.
d32
=
in
;
x393_membridge_lo_addr64
(
lo_addr
);
pr_info
(
"Set membridge system memory address to 0x%08x
\n
"
,
lo_addr
);
return
count
;
}
static
DEVICE_ATTR
(
frame_start0
,
SYSFS_PERMISSIONS
,
show_frame_start
,
store_frame_start
);
static
DEVICE_ATTR
(
frame_start1
,
SYSFS_PERMISSIONS
,
show_frame_start
,
store_frame_start
);
...
...
@@ -1050,8 +1059,7 @@ static DEVICE_ATTR(frames_in_buffer0, SYSFS_PERMISSIONS, show_frame
static
DEVICE_ATTR
(
frames_in_buffer1
,
SYSFS_PERMISSIONS
,
show_frames_in_buffer
,
store_frames_in_buffer
);
static
DEVICE_ATTR
(
frames_in_buffer2
,
SYSFS_PERMISSIONS
,
show_frames_in_buffer
,
store_frames_in_buffer
);
static
DEVICE_ATTR
(
frames_in_buffer3
,
SYSFS_PERMISSIONS
,
show_frames_in_buffer
,
store_frames_in_buffer
);
static
DEVICE_ATTR
(
membridge_status
,
SYSFS_PERMISSIONS
,
get_membridge_status
,
set_membridge_status
);
static
DEVICE_ATTR
(
membridge_addr
,
SYSFS_PERMISSIONS
,
get_membridge_loaddr64
,
set_membridge_loaddr64
);
static
DEVICE_ATTR
(
membridge_status
,
SYSFS_PERMISSIONS
,
get_membridge_status
,
set_membridge_status_reg
);
// selected sensor channel == port
// TODO: switch to multiple device files and remove this
...
...
@@ -1076,7 +1084,6 @@ static struct attribute *root_dev_attrs[] = {
&
dev_attr_frames_in_buffer3
.
attr
,
&
dev_attr_channel
.
attr
,
&
dev_attr_membridge_status
.
attr
,
&
dev_attr_membridge_addr
.
attr
,
NULL
};
...
...
@@ -1182,6 +1189,7 @@ static int videomem_probe(struct platform_device *pdev)
}
init_waitqueue_head
(
&
videomem_wait_queue
);
// wait queue for video memory driver
g_dev_ptr
=
dev
;
// for debugfs
return
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