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
5d80abac
Commit
5d80abac
authored
Jan 11, 2018
by
Oleg Dzhimiev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simplified lseek
parent
f010236a
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
30 additions
and
29 deletions
+30
-29
x393_videomem.c
src/drivers/elphel/x393_videomem.c
+30
-29
No files found.
src/drivers/elphel/x393_videomem.c
View file @
5d80abac
...
@@ -685,6 +685,11 @@ struct raw_priv_t {
...
@@ -685,6 +685,11 @@ struct raw_priv_t {
dma_addr_t
phys_addr
;
///< physical address of memory region reported by memory driver
dma_addr_t
phys_addr
;
///< physical address of memory region reported by memory driver
};
};
static
inline
int
membridge_is_busy
(){
x393_status_membridge_t
status
=
x393_membridge_status
();
return
status
.
busy
;
}
int
membridge_start
(
struct
file
*
file
){
int
membridge_start
(
struct
file
*
file
){
struct
raw_priv_t
*
privData
=
(
struct
raw_priv_t
*
)
file
->
private_data
;
struct
raw_priv_t
*
privData
=
(
struct
raw_priv_t
*
)
file
->
private_data
;
...
@@ -693,11 +698,7 @@ int membridge_start(struct file * file){
...
@@ -693,11 +698,7 @@ int membridge_start(struct file * file){
int
width_marg
,
height_marg
,
width_bursts
;
int
width_marg
,
height_marg
,
width_bursts
;
int
frame_number
;
int
frame_number
;
x393_status_membridge_t
status
=
x393_membridge_status
();
x393_status_membridge_t
status
;
if
(
status
.
busy
)
{
return
-
EBUSY
;
}
// no need
// no need
frame_number
=
GLOBALPARS
(
privData
->
sensor_num
,
G_THIS_FRAME
)
&
PARS_FRAMES_MASK
;
frame_number
=
GLOBALPARS
(
privData
->
sensor_num
,
G_THIS_FRAME
)
&
PARS_FRAMES_MASK
;
...
@@ -748,11 +749,22 @@ int membridge_start(struct file * file){
...
@@ -748,11 +749,22 @@ int membridge_start(struct file * file){
control_membridge_memory
(
membridge_sensor_port
,
1
,
DIRECT
,
frame_number
);
control_membridge_memory
(
membridge_sensor_port
,
1
,
DIRECT
,
frame_number
);
status
=
x393_membridge_status
();
pr_debug
(
"membridge status is %d
\n
"
,
status
.
busy
);
/*
// timeout exit?
// timeout exit?
while(true){
while(true){
status = x393_membridge_status();
status = x393_membridge_status();
if (!status.busy) break;
if (!status.busy) break;
}
}
*/
wait_event_interruptible
(
videomem_wait_queue
,
membridge_is_busy
()
==
0
);
status
=
x393_membridge_status
();
pr_debug
(
"membridge status is %d
\n
"
,
status
.
busy
);
//NOTES:
//NOTES:
...
@@ -832,6 +844,7 @@ loff_t videomem_lseek(struct file * file, loff_t offset, int orig){
...
@@ -832,6 +844,7 @@ loff_t videomem_lseek(struct file * file, loff_t offset, int orig){
int
sensor_port
=
privData
->
sensor_num
;
int
sensor_port
=
privData
->
sensor_num
;
//sec_usec_t sec_usec;
//sec_usec_t sec_usec;
int
res
;
int
res
;
x393_status_membridge_t
status
;
pr_debug
(
"(videomem_lseek) offset=0x%x, orig=0x%x, sensor_port = %d
\n
"
,
(
int
)
offset
,
(
int
)
orig
,
sensor_port
);
pr_debug
(
"(videomem_lseek) offset=0x%x, orig=0x%x, sensor_port = %d
\n
"
,
(
int
)
offset
,
(
int
)
orig
,
sensor_port
);
...
@@ -851,30 +864,19 @@ loff_t videomem_lseek(struct file * file, loff_t offset, int orig){
...
@@ -851,30 +864,19 @@ loff_t videomem_lseek(struct file * file, loff_t offset, int orig){
break
;
break
;
}
else
{
}
else
{
// wait for a frame here (1 action at a time)
target_frame
=
offset
;
if
(
offset
>=
LSEEK_FRAME_WAIT_REL
)
{
if
(
offset
>=
LSEEK_FRAME_WAIT_ABS
){
target_frame
=
offset
-
LSEEK_FRAME_WAIT_ABS
;
// Wait for absolute frame number
}
else
{
target_frame
=
getThisFrameNumber
(
sensor_port
)
+
offset
-
LSEEK_FRAME_WAIT_REL
;
}
pr_debug
(
"(videomem_lseek) waiting for frame: %d
\n
"
,
target_frame
);
// wait for frame then continue
waitFrame
(
sensor_port
,
target_frame
);
waitFrame
(
sensor_port
,
target_frame
);
return
getThisFrameNumber
(
sensor_port
);
status
=
x393_membridge_status
();
if
(
status
.
busy
)
{
return
-
EBUSY
;
}
}
// setup and run copying through membridge (1 action at a time)
switch
(
offset
)
{
case
LSEEK_VIDEOMEM_START
:
// Check lock here:
LOCK_IBH
(
&
membridge_lock
);
LOCK_IBH
(
&
membridge_lock
);
res
=
membridge_start
(
file
);
res
=
membridge_start
(
file
);
UNLOCK_IBH
(
&
membridge_lock
);
UNLOCK_IBH
(
&
membridge_lock
);
if
(
res
<
0
)
return
res
;
if
(
res
<
0
)
return
res
;
break
;
}
}
}
break
;
break
;
...
@@ -1052,7 +1054,6 @@ static irqreturn_t videomem_irq_handler(int irq, ///< [in] irq interru
...
@@ -1052,7 +1054,6 @@ static irqreturn_t videomem_irq_handler(int irq, ///< [in] irq interru
//TODO: Do what is needed here
//TODO: Do what is needed here
pr_info
(
"Wake up, videomem interrupt received!!!
\n
"
);
pr_info
(
"Wake up, videomem interrupt received!!!
\n
"
);
x393_membridge_ctrl_irq
(
ctrl_interrupts
);
// reset interrupt
x393_membridge_ctrl_irq
(
ctrl_interrupts
);
// reset interrupt
wake_up_interruptible
(
&
videomem_wait_queue
);
wake_up_interruptible
(
&
videomem_wait_queue
);
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
...
...
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