Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
e2c9500d
Commit
e2c9500d
authored
Sep 19, 2007
by
Mauro Carvalho Chehab
Committed by
Mauro Carvalho Chehab
May 18, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
V4L/DVB (12798): tm6000: Split header processing from header find
Signed-off-by:
Mauro Carvalho Chehab
<
mchehab@redhat.com
>
parent
c13dd704
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
87 additions
and
76 deletions
+87
-76
drivers/staging/tm6000/tm6000-video.c
drivers/staging/tm6000/tm6000-video.c
+87
-76
No files found.
drivers/staging/tm6000/tm6000-video.c
View file @
e2c9500d
...
...
@@ -185,16 +185,14 @@ static void inline buffer_filled (struct tm6000_core *dev,
/*
* Identify the tm5600/6000 buffer header type and properly handles
*/
static
int
copy_streams
(
u8
*
data
,
u8
*
out_p
,
unsigned
long
len
,
struct
urb
*
urb
,
struct
tm6000_buffer
**
buf
)
static
u8
*
copy_packet
(
struct
urb
*
urb
,
u32
header
,
u8
*
data
,
u8
*
endp
,
u8
*
out_p
,
struct
tm6000_buffer
**
buf
)
{
struct
tm6000_dmaqueue
*
dma_q
=
urb
->
context
;
struct
tm6000_core
*
dev
=
container_of
(
dma_q
,
struct
tm6000_core
,
vidq
);
u8
*
ptr
=
data
,
*
endp
=
data
+
len
;
u8
*
ptr
=
data
;
u8
c
;
unsigned
int
cmd
,
cpysize
,
pktsize
,
size
,
field
,
block
,
line
,
pos
=
0
;
unsigned
long
header
;
int
rc
=
0
;
/* FIXME: this is the hardcoded window size
*/
...
...
@@ -202,6 +200,87 @@ static int copy_streams(u8 *data, u8 *out_p, unsigned long len,
//static int last_line=-2;
if
(
!
dev
->
isoc_ctl
.
cmd
)
{
c
=
(
header
>>
24
)
&
0xff
;
/* split the header fields */
size
=
(((
header
&
0x7e
)
<<
1
)
-
1
)
*
4
;
block
=
(
header
>>
7
)
&
0xf
;
field
=
(
header
>>
11
)
&
0x1
;
line
=
(
header
>>
12
)
&
0x1ff
;
cmd
=
(
header
>>
21
)
&
0x7
;
/* Validates header fields */
if
(
size
>
TM6000_URB_MSG_LEN
)
size
=
TM6000_URB_MSG_LEN
;
if
(
block
>=
8
)
cmd
=
TM6000_URB_MSG_ERR
;
/* FIXME: Mounts the image as field0+field1
* It should, instead, check if the user selected
* entrelaced or non-entrelaced mode
*/
pos
=
((
line
<<
1
)
+
field
)
*
linesize
+
block
*
TM6000_URB_MSG_LEN
;
/* Don't allow to write out of the buffer */
if
(
pos
+
TM6000_URB_MSG_LEN
>
(
*
buf
)
->
vb
.
size
)
cmd
=
TM6000_URB_MSG_ERR
;
/* Prints debug info */
dprintk
(
dev
,
V4L2_DEBUG_ISOC
,
"size=%d, num=%d, "
" line=%d, field=%d
\n
"
,
size
,
block
,
line
,
field
);
pktsize
=
TM6000_URB_MSG_LEN
;
/////////////////////////////
/// nao seria size???
}
else
{
/* Continue the last copy */
cmd
=
dev
->
isoc_ctl
.
cmd
;
size
=
dev
->
isoc_ctl
.
size
;
pos
=
dev
->
isoc_ctl
.
pos
;
pktsize
=
dev
->
isoc_ctl
.
pktsize
;
}
cpysize
=
(
endp
-
ptr
>
size
)
?
size
:
endp
-
ptr
;
if
(
cpysize
)
{
/* handles each different URB message */
switch
(
cmd
)
{
case
TM6000_URB_MSG_VIDEO
:
/* Fills video buffer */
bufcpy
(
*
buf
,
&
out_p
[
pos
],
ptr
,
cpysize
);
break
;
}
}
if
(
cpysize
<
size
)
{
/* End of URB packet, but cmd processing is not
* complete. Preserve the state for a next packet
*/
dev
->
isoc_ctl
.
pos
=
pos
+
cpysize
;
dev
->
isoc_ctl
.
size
=
size
-
cpysize
;
dev
->
isoc_ctl
.
cmd
=
cmd
;
dev
->
isoc_ctl
.
pktsize
=
pktsize
-
cpysize
;
ptr
+=
cpysize
;
}
else
{
dev
->
isoc_ctl
.
cmd
=
0
;
ptr
+=
pktsize
;
}
return
ptr
;
}
static
int
copy_streams
(
u8
*
data
,
u8
*
out_p
,
unsigned
long
len
,
struct
urb
*
urb
,
struct
tm6000_buffer
**
buf
)
{
struct
tm6000_dmaqueue
*
dma_q
=
urb
->
context
;
struct
tm6000_core
*
dev
=
container_of
(
dma_q
,
struct
tm6000_core
,
vidq
);
u8
*
ptr
=
data
,
*
endp
=
data
+
len
;
u32
header
=
0
;
int
rc
=
0
;
for
(
ptr
=
data
;
ptr
<
endp
;)
{
if
(
!
dev
->
isoc_ctl
.
cmd
)
{
/* Seek for sync */
...
...
@@ -217,77 +296,10 @@ static int copy_streams(u8 *data, u8 *out_p, unsigned long len,
/* Get message header */
header
=*
(
unsigned
long
*
)
ptr
;
ptr
+=
4
;
c
=
(
header
>>
24
)
&
0xff
;
/* split the header fields */
size
=
(((
header
&
0x7e
)
<<
1
)
-
1
)
*
4
;
block
=
(
header
>>
7
)
&
0xf
;
field
=
(
header
>>
11
)
&
0x1
;
line
=
(
header
>>
12
)
&
0x1ff
;
cmd
=
(
header
>>
21
)
&
0x7
;
/* FIXME: Maximum possible line is 511.
* This doesn't seem to be enough for PAL standards
*/
/* Validates header fields */
if
(
size
>
TM6000_URB_MSG_LEN
)
size
=
TM6000_URB_MSG_LEN
;
if
(
block
>=
8
)
cmd
=
TM6000_URB_MSG_ERR
;
/* FIXME: Mounts the image as field0+field1
* It should, instead, check if the user selected
* entrelaced or non-entrelaced mode
*/
pos
=
((
line
<<
1
)
+
field
)
*
linesize
+
block
*
TM6000_URB_MSG_LEN
;
/* Don't allow to write out of the buffer */
if
(
pos
+
TM6000_URB_MSG_LEN
>
(
*
buf
)
->
vb
.
size
)
cmd
=
TM6000_URB_MSG_ERR
;
/* Prints debug info */
dprintk
(
dev
,
V4L2_DEBUG_ISOC
,
"size=%d, num=%d, "
" line=%d, field=%d
\n
"
,
size
,
block
,
line
,
field
);
dev
->
isoc_ctl
.
cmd
=
cmd
;
dev
->
isoc_ctl
.
size
=
size
;
dev
->
isoc_ctl
.
pos
=
pos
;
dev
->
isoc_ctl
.
pktsize
=
pktsize
=
TM6000_URB_MSG_LEN
;
}
else
{
cmd
=
dev
->
isoc_ctl
.
cmd
;
size
=
dev
->
isoc_ctl
.
size
;
pos
=
dev
->
isoc_ctl
.
pos
;
pktsize
=
dev
->
isoc_ctl
.
pktsize
;
}
cpysize
=
(
endp
-
ptr
>
size
)
?
size
:
endp
-
ptr
;
if
(
cpysize
)
{
/* handles each different URB message */
switch
(
cmd
)
{
case
TM6000_URB_MSG_VIDEO
:
/* Fills video buffer */
bufcpy
(
*
buf
,
&
out_p
[
pos
],
ptr
,
cpysize
);
break
;
}
}
if
(
cpysize
<
size
)
{
/* End of URB packet, but cmd processing is not
* complete. Preserve the state for a next packet
*/
dev
->
isoc_ctl
.
pos
=
pos
+
cpysize
;
dev
->
isoc_ctl
.
size
=
size
-
cpysize
;
dev
->
isoc_ctl
.
cmd
=
cmd
;
dev
->
isoc_ctl
.
pktsize
=
pktsize
-
cpysize
;
ptr
+=
cpysize
;
}
else
{
dev
->
isoc_ctl
.
cmd
=
0
;
ptr
+=
pktsize
;
}
/* Copy or continue last copy */
ptr
=
copy_packet
(
urb
,
header
,
ptr
,
endp
,
out_p
,
buf
);
}
return
rc
;
...
...
@@ -810,7 +822,6 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
/* Round to an enough number of URBs */
urbsize
=
(
urbsize
+
dev
->
max_isoc_in
-
1
)
/
dev
->
max_isoc_in
;
printk
(
"Allocating %d packets to handle %lu size
\n
"
,
urbsize
,
buf
->
vb
.
size
);
dprintk
(
dev
,
V4L2_DEBUG_QUEUE
,
"Allocating %d packets to handle "
...
...
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