Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
9aeb4b05
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
9aeb4b05
编写于
19年前
作者:
M
Mauro Carvalho Chehab
提交者:
Mauro Carvalho Chehab
19年前
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
V4L/DVB (3423): CodingStyle fixes.
- CodingStyle fixes. Signed-off-by:
N
Mauro Carvalho Chehab
<
mchehab@infradead.org
>
上级
2d50f847
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
427 addition
and
442 deletion
+427
-442
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/em28xx/em28xx-video.c
+427
-442
未找到文件。
drivers/media/video/em28xx/em28xx-video.c
浏览文件 @
9aeb4b05
...
...
@@ -1012,19 +1012,15 @@ static int em28xx_set_fmt(struct em28xx *dev, unsigned int cmd, struct v4l2_form
width
/=
2
;
}
if
((
hscale
=
(((
unsigned
long
)
maxw
)
<<
12
)
/
width
-
4096L
)
>=
0x4000
)
if
((
hscale
=
(((
unsigned
long
)
maxw
)
<<
12
)
/
width
-
4096L
)
>=
0x4000
)
hscale
=
0x3fff
;
width
=
(((
unsigned
long
)
maxw
)
<<
12
)
/
(
hscale
+
4096L
);
if
((
vscale
=
(((
unsigned
long
)
maxh
)
<<
12
)
/
height
-
4096L
)
>=
0x4000
)
width
=
(((
unsigned
long
)
maxw
)
<<
12
)
/
(
hscale
+
4096L
);
if
((
vscale
=
(((
unsigned
long
)
maxh
)
<<
12
)
/
height
-
4096L
)
>=
0x4000
)
vscale
=
0x3fff
;
height
=
(((
unsigned
long
)
maxh
)
<<
12
)
/
(
vscale
+
4096L
);
height
=
(((
unsigned
long
)
maxh
)
<<
12
)
/
(
vscale
+
4096L
);
format
->
fmt
.
pix
.
width
=
width
;
format
->
fmt
.
pix
.
height
=
height
;
...
...
@@ -1035,10 +1031,9 @@ static int em28xx_set_fmt(struct em28xx *dev, unsigned int cmd, struct v4l2_form
format
->
fmt
.
pix
.
field
=
V4L2_FIELD_INTERLACED
;
em28xx_videodbg
(
"%s: returned %dx%d (%d, %d)
\n
"
,
cmd
==
VIDIOC_TRY_FMT
?
"VIDIOC_TRY_FMT"
:
"VIDIOC_S_FMT"
,
format
->
fmt
.
pix
.
width
,
format
->
fmt
.
pix
.
height
,
hscale
,
vscale
);
cmd
==
VIDIOC_TRY_FMT
?
"VIDIOC_TRY_FMT"
:
"VIDIOC_S_FMT"
,
format
->
fmt
.
pix
.
width
,
format
->
fmt
.
pix
.
height
,
hscale
,
vscale
);
if
(
cmd
==
VIDIOC_TRY_FMT
)
return
0
;
...
...
@@ -1064,7 +1059,7 @@ static int em28xx_set_fmt(struct em28xx *dev, unsigned int cmd, struct v4l2_form
dev
->
width
=
width
;
dev
->
height
=
height
;
dev
->
frame_size
=
dev
->
width
*
dev
->
height
*
2
;
dev
->
field_size
=
dev
->
frame_size
>>
1
;
/*both_fileds ? dev->frame_size>>1 : dev->frame_size; */
dev
->
field_size
=
dev
->
frame_size
>>
1
;
dev
->
bytesperline
=
dev
->
width
*
2
;
dev
->
hscale
=
hscale
;
dev
->
vscale
=
vscale
;
...
...
@@ -1092,374 +1087,367 @@ static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
switch
(
cmd
)
{
/* ---------- tv norms ---------- */
case
VIDIOC_ENUMSTD
:
{
struct
v4l2_standard
*
e
=
arg
;
unsigned
int
i
;
{
struct
v4l2_standard
*
e
=
arg
;
unsigned
int
i
;
i
=
e
->
index
;
if
(
i
>=
TVNORMS
)
return
-
EINVAL
;
ret
=
v4l2_video_std_construct
(
e
,
tvnorms
[
e
->
index
].
id
,
tvnorms
[
e
->
index
].
name
);
e
->
index
=
i
;
if
(
ret
<
0
)
return
ret
;
return
0
;
}
i
=
e
->
index
;
if
(
i
>=
TVNORMS
)
return
-
EINVAL
;
ret
=
v4l2_video_std_construct
(
e
,
tvnorms
[
e
->
index
].
id
,
tvnorms
[
e
->
index
].
name
);
e
->
index
=
i
;
if
(
ret
<
0
)
return
ret
;
return
0
;
}
case
VIDIOC_G_STD
:
{
v4l2_std_id
*
id
=
arg
;
{
v4l2_std_id
*
id
=
arg
;
*
id
=
dev
->
tvnorm
->
id
;
return
0
;
}
*
id
=
dev
->
tvnorm
->
id
;
return
0
;
}
case
VIDIOC_S_STD
:
{
v4l2_std_id
*
id
=
arg
;
unsigned
int
i
;
{
v4l2_std_id
*
id
=
arg
;
unsigned
int
i
;
for
(
i
=
0
;
i
<
TVNORMS
;
i
++
)
if
(
*
id
==
tvnorms
[
i
].
id
)
break
;
if
(
i
==
TVNORMS
)
for
(
i
=
0
;
i
<
TVNORMS
;
i
++
)
if
(
*
id
==
tvnorms
[
i
].
id
)
if
(
*
id
&
tvnorms
[
i
].
id
)
break
;
if
(
i
==
TVNORMS
)
for
(
i
=
0
;
i
<
TVNORMS
;
i
++
)
if
(
*
id
&
tvnorms
[
i
].
id
)
break
;
if
(
i
==
TVNORMS
)
return
-
EINVAL
;
if
(
i
==
TVNORMS
)
return
-
EINVAL
;
down
(
&
dev
->
lock
);
dev
->
tvnorm
=
&
tvnorms
[
i
];
down
(
&
dev
->
lock
);
dev
->
tvnorm
=
&
tvnorms
[
i
];
em28xx_set_norm
(
dev
,
dev
->
width
,
dev
->
height
);
em28xx_set_norm
(
dev
,
dev
->
width
,
dev
->
height
);
em28xx_i2c_call_clients
(
dev
,
DECODER_SET_NORM
,
&
tvnorms
[
i
].
mode
);
em28xx_i2c_call_clients
(
dev
,
VIDIOC_S_STD
,
&
dev
->
tvnorm
->
id
);
em28xx_i2c_call_clients
(
dev
,
DECODER_SET_NORM
,
&
tvnorms
[
i
].
mode
);
em28xx_i2c_call_clients
(
dev
,
VIDIOC_S_STD
,
&
dev
->
tvnorm
->
id
);
up
(
&
dev
->
lock
);
up
(
&
dev
->
lock
);
return
0
;
}
return
0
;
}
/* ------ input switching ---------- */
/* ------ input switching ---------- */
case
VIDIOC_ENUMINPUT
:
{
struct
v4l2_input
*
i
=
arg
;
unsigned
int
n
;
static
const
char
*
iname
[]
=
{
[
EM28XX_VMUX_COMPOSITE1
]
=
"Composite1"
,
[
EM28XX_VMUX_COMPOSITE2
]
=
"Composite2"
,
[
EM28XX_VMUX_COMPOSITE3
]
=
"Composite3"
,
[
EM28XX_VMUX_COMPOSITE4
]
=
"Composite4"
,
[
EM28XX_VMUX_SVIDEO
]
=
"S-Video"
,
[
EM28XX_VMUX_TELEVISION
]
=
"Television"
,
[
EM28XX_VMUX_CABLE
]
=
"Cable TV"
,
[
EM28XX_VMUX_DVB
]
=
"DVB"
,
[
EM28XX_VMUX_DEBUG
]
=
"for debug only"
,
};
n
=
i
->
index
;
if
(
n
>=
MAX_EM28XX_INPUT
)
return
-
EINVAL
;
if
(
0
==
INPUT
(
n
)
->
type
)
return
-
EINVAL
;
memset
(
i
,
0
,
sizeof
(
*
i
));
i
->
index
=
n
;
i
->
type
=
V4L2_INPUT_TYPE_CAMERA
;
strcpy
(
i
->
name
,
iname
[
INPUT
(
n
)
->
type
]);
if
((
EM28XX_VMUX_TELEVISION
==
INPUT
(
n
)
->
type
)
||
(
EM28XX_VMUX_CABLE
==
INPUT
(
n
)
->
type
))
i
->
type
=
V4L2_INPUT_TYPE_TUNER
;
for
(
n
=
0
;
n
<
ARRAY_SIZE
(
tvnorms
);
n
++
)
i
->
std
|=
tvnorms
[
n
].
id
;
return
0
;
}
{
struct
v4l2_input
*
i
=
arg
;
unsigned
int
n
;
static
const
char
*
iname
[]
=
{
[
EM28XX_VMUX_COMPOSITE1
]
=
"Composite1"
,
[
EM28XX_VMUX_COMPOSITE2
]
=
"Composite2"
,
[
EM28XX_VMUX_COMPOSITE3
]
=
"Composite3"
,
[
EM28XX_VMUX_COMPOSITE4
]
=
"Composite4"
,
[
EM28XX_VMUX_SVIDEO
]
=
"S-Video"
,
[
EM28XX_VMUX_TELEVISION
]
=
"Television"
,
[
EM28XX_VMUX_CABLE
]
=
"Cable TV"
,
[
EM28XX_VMUX_DVB
]
=
"DVB"
,
[
EM28XX_VMUX_DEBUG
]
=
"for debug only"
,
};
n
=
i
->
index
;
if
(
n
>=
MAX_EM28XX_INPUT
)
return
-
EINVAL
;
if
(
0
==
INPUT
(
n
)
->
type
)
return
-
EINVAL
;
memset
(
i
,
0
,
sizeof
(
*
i
));
i
->
index
=
n
;
i
->
type
=
V4L2_INPUT_TYPE_CAMERA
;
strcpy
(
i
->
name
,
iname
[
INPUT
(
n
)
->
type
]);
if
((
EM28XX_VMUX_TELEVISION
==
INPUT
(
n
)
->
type
)
||
(
EM28XX_VMUX_CABLE
==
INPUT
(
n
)
->
type
))
i
->
type
=
V4L2_INPUT_TYPE_TUNER
;
for
(
n
=
0
;
n
<
ARRAY_SIZE
(
tvnorms
);
n
++
)
i
->
std
|=
tvnorms
[
n
].
id
;
return
0
;
}
case
VIDIOC_G_INPUT
:
{
int
*
i
=
arg
;
*
i
=
dev
->
ctl_input
;
return
0
;
}
{
int
*
i
=
arg
;
*
i
=
dev
->
ctl_input
;
return
0
;
}
case
VIDIOC_S_INPUT
:
{
int
*
index
=
arg
;
if
(
*
index
>=
MAX_EM28XX_INPUT
)
return
-
EINVAL
;
if
(
0
==
INPUT
(
*
index
)
->
type
)
return
-
EINVAL
;
{
int
*
index
=
arg
;
down
(
&
dev
->
lock
);
video_mux
(
dev
,
*
index
);
up
(
&
dev
->
lock
);
if
(
*
index
>=
MAX_EM28XX_INPUT
)
return
-
EINVAL
;
if
(
0
==
INPUT
(
*
index
)
->
type
)
return
-
EINVAL
;
return
0
;
}
down
(
&
dev
->
lock
);
video_mux
(
dev
,
*
index
);
up
(
&
dev
->
lock
);
return
0
;
}
case
VIDIOC_G_AUDIO
:
{
struct
v4l2_audio
*
a
=
arg
;
unsigned
int
index
=
a
->
index
;
{
struct
v4l2_audio
*
a
=
arg
;
unsigned
int
index
=
a
->
index
;
if
(
a
->
index
>
1
)
return
-
EINVAL
;
memset
(
a
,
0
,
sizeof
(
*
a
));
index
=
dev
->
ctl_ainput
;
if
(
a
->
index
>
1
)
return
-
EINVAL
;
memset
(
a
,
0
,
sizeof
(
*
a
));
index
=
dev
->
ctl_ainput
;
if
(
index
==
0
)
{
strcpy
(
a
->
name
,
"Television"
);
}
else
{
strcpy
(
a
->
name
,
"Line In"
);
}
a
->
capability
=
V4L2_AUDCAP_STEREO
;
a
->
index
=
index
;
return
0
;
if
(
index
==
0
)
{
strcpy
(
a
->
name
,
"Television"
);
}
else
{
strcpy
(
a
->
name
,
"Line In"
);
}
a
->
capability
=
V4L2_AUDCAP_STEREO
;
a
->
index
=
index
;
return
0
;
}
case
VIDIOC_S_AUDIO
:
{
struct
v4l2_audio
*
a
=
arg
;
if
(
a
->
index
!=
dev
->
ctl_ainput
)
return
-
EINVAL
;
{
struct
v4l2_audio
*
a
=
arg
;
return
0
;
}
if
(
a
->
index
!=
dev
->
ctl_ainput
)
return
-
EINVAL
;
return
0
;
}
/* --- controls ---------------------------------------------- */
/* --- controls ---------------------------------------------- */
case
VIDIOC_QUERYCTRL
:
{
struct
v4l2_queryctrl
*
qc
=
arg
;
int
i
,
id
=
qc
->
id
;
memset
(
qc
,
0
,
sizeof
(
*
qc
));
qc
->
id
=
id
;
if
(
!
dev
->
has_msp34xx
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
em28xx_qctrl
);
i
++
)
{
if
(
qc
->
id
&&
qc
->
id
==
em28xx_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
em28xx_qctrl
[
i
]),
sizeof
(
*
qc
));
return
0
;
}
}
}
if
(
dev
->
decoder
==
EM28XX_TVP5150
)
{
em28xx_i2c_call_clients
(
dev
,
cmd
,
qc
);
if
(
qc
->
type
)
return
0
;
else
return
-
EINVAL
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
saa711x_qctrl
);
i
++
)
{
if
(
qc
->
id
&&
qc
->
id
==
saa711x_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
saa711x_qctrl
[
i
]),
sizeof
(
*
qc
));
{
struct
v4l2_queryctrl
*
qc
=
arg
;
int
i
,
id
=
qc
->
id
;
memset
(
qc
,
0
,
sizeof
(
*
qc
));
qc
->
id
=
id
;
if
(
!
dev
->
has_msp34xx
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
em28xx_qctrl
);
i
++
)
{
if
(
qc
->
id
&&
qc
->
id
==
em28xx_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
em28xx_qctrl
[
i
]),
sizeof
(
*
qc
));
return
0
;
}
}
return
-
EINVAL
;
}
if
(
dev
->
decoder
==
EM28XX_TVP5150
)
{
em28xx_i2c_call_clients
(
dev
,
cmd
,
qc
);
if
(
qc
->
type
)
return
0
;
else
return
-
EINVAL
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
saa711x_qctrl
);
i
++
)
{
if
(
qc
->
id
&&
qc
->
id
==
saa711x_qctrl
[
i
].
id
)
{
memcpy
(
qc
,
&
(
saa711x_qctrl
[
i
]),
sizeof
(
*
qc
));
return
0
;
}
}
return
-
EINVAL
;
}
case
VIDIOC_G_CTRL
:
{
struct
v4l2_control
*
ctrl
=
arg
;
int
retval
=-
EINVAL
;
if
(
!
dev
->
has_msp34xx
)
retval
=
em28xx_get_ctrl
(
dev
,
ctrl
);
if
(
retval
==-
EINVAL
)
{
if
(
dev
->
decoder
==
EM28XX_TVP5150
)
{
em28xx_i2c_call_clients
(
dev
,
cmd
,
arg
);
return
0
;
}
{
struct
v4l2_control
*
ctrl
=
arg
;
int
retval
=-
EINVAL
;
return
saa711x_get_ctrl
(
dev
,
ctrl
);
}
else
return
retval
;
}
if
(
!
dev
->
has_msp34xx
)
retval
=
em28xx_get_ctrl
(
dev
,
ctrl
);
if
(
retval
==-
EINVAL
)
{
if
(
dev
->
decoder
==
EM28XX_TVP5150
)
{
em28xx_i2c_call_clients
(
dev
,
cmd
,
arg
);
return
0
;
}
return
saa711x_get_ctrl
(
dev
,
ctrl
);
}
else
return
retval
;
}
case
VIDIOC_S_CTRL
:
{
struct
v4l2_control
*
ctrl
=
arg
;
u8
i
;
if
(
!
dev
->
has_msp34xx
){
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
em28xx_qctrl
);
i
++
)
{
if
(
ctrl
->
id
==
em28xx_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
em28xx_qctrl
[
i
].
minimum
||
ctrl
->
value
>
em28xx_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
return
em28xx_set_ctrl
(
dev
,
ctrl
);
}
{
struct
v4l2_control
*
ctrl
=
arg
;
u8
i
;
if
(
!
dev
->
has_msp34xx
){
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
em28xx_qctrl
);
i
++
)
{
if
(
ctrl
->
id
==
em28xx_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
em28xx_qctrl
[
i
].
minimum
||
ctrl
->
value
>
em28xx_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
return
em28xx_set_ctrl
(
dev
,
ctrl
);
}
}
}
if
(
dev
->
decoder
==
EM28XX_TVP5150
)
{
em28xx_i2c_call_clients
(
dev
,
cmd
,
arg
);
return
0
;
}
else
if
(
!
dev
->
has_msp34xx
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
em28xx_qctrl
);
i
++
)
{
if
(
ctrl
->
id
==
em28xx_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
em28xx_qctrl
[
i
].
minimum
||
ctrl
->
value
>
em28xx_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
return
em28xx_set_ctrl
(
dev
,
ctrl
);
}
if
(
dev
->
decoder
==
EM28XX_TVP5150
)
{
em28xx_i2c_call_clients
(
dev
,
cmd
,
arg
);
return
0
;
}
else
if
(
!
dev
->
has_msp34xx
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
em28xx_qctrl
);
i
++
)
{
if
(
ctrl
->
id
==
em28xx_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
em28xx_qctrl
[
i
].
minimum
||
ctrl
->
value
>
em28xx_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
return
em28xx_set_ctrl
(
dev
,
ctrl
);
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
saa711x_qctrl
);
i
++
)
{
if
(
ctrl
->
id
==
saa711x_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
saa711x_qctrl
[
i
].
minimum
||
ctrl
->
value
>
saa711x_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
return
saa711x_set_ctrl
(
dev
,
ctrl
)
;
}
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
saa711x_qctrl
);
i
++
)
{
if
(
ctrl
->
id
==
saa711x_qctrl
[
i
].
id
)
{
if
(
ctrl
->
value
<
saa711x_qctrl
[
i
].
minimum
||
ctrl
->
value
>
saa711x_qctrl
[
i
].
maximum
)
return
-
ERANGE
;
return
saa711x_set_ctrl
(
dev
,
ctrl
);
}
}
return
-
EINVAL
;
}
/* --- tuner ioctls ------------------------------------------ */
return
-
EINVAL
;
}
/* --- tuner ioctls ------------------------------------------ */
case
VIDIOC_G_TUNER
:
{
struct
v4l2_tuner
*
t
=
arg
;
int
status
=
0
;
{
struct
v4l2_tuner
*
t
=
arg
;
int
status
=
0
;
if
(
0
!=
t
->
index
)
return
-
EINVAL
;
if
(
0
!=
t
->
index
)
return
-
EINVAL
;
memset
(
t
,
0
,
sizeof
(
*
t
));
strcpy
(
t
->
name
,
"Tuner"
);
t
->
type
=
V4L2_TUNER_ANALOG_TV
;
t
->
capability
=
V4L2_TUNER_CAP_NORM
;
t
->
rangehigh
=
0xffffffffUL
;
/* FIXME: set correct range */
memset
(
t
,
0
,
sizeof
(
*
t
));
strcpy
(
t
->
name
,
"Tuner"
);
t
->
type
=
V4L2_TUNER_ANALOG_TV
;
t
->
capability
=
V4L2_TUNER_CAP_NORM
;
t
->
rangehigh
=
0xffffffffUL
;
/* FIXME: set correct range */
/* t->signal = 0xffff;*/
/* em28xx_i2c_call_clients(dev,VIDIOC_G_TUNER,t);*/
/* No way to get signal strength? */
down
(
&
dev
->
lock
);
em28xx_i2c_call_clients
(
dev
,
DECODER_GET_STATUS
,
&
status
);
up
(
&
dev
->
lock
);
t
->
signal
=
(
status
&
DECODER_STATUS_GOOD
)
!=
0
?
0xffff
:
0
;
em28xx_videodbg
(
"VIDIO_G_TUNER: signal=%x, afc=%x
\n
"
,
t
->
signal
,
t
->
afc
);
return
0
;
}
/* No way to get signal strength? */
down
(
&
dev
->
lock
);
em28xx_i2c_call_clients
(
dev
,
DECODER_GET_STATUS
,
&
status
);
up
(
&
dev
->
lock
);
t
->
signal
=
(
status
&
DECODER_STATUS_GOOD
)
!=
0
?
0xffff
:
0
;
em28xx_videodbg
(
"VIDIO_G_TUNER: signal=%x, afc=%x
\n
"
,
t
->
signal
,
t
->
afc
);
return
0
;
}
case
VIDIOC_S_TUNER
:
{
struct
v4l2_tuner
*
t
=
arg
;
int
status
=
0
;
{
struct
v4l2_tuner
*
t
=
arg
;
int
status
=
0
;
if
(
0
!=
t
->
index
)
return
-
EINVAL
;
memset
(
t
,
0
,
sizeof
(
*
t
));
strcpy
(
t
->
name
,
"Tuner"
);
t
->
type
=
V4L2_TUNER_ANALOG_TV
;
t
->
capability
=
V4L2_TUNER_CAP_NORM
;
t
->
rangehigh
=
0xffffffffUL
;
/* FIXME: set correct range */
if
(
0
!=
t
->
index
)
return
-
EINVAL
;
memset
(
t
,
0
,
sizeof
(
*
t
));
strcpy
(
t
->
name
,
"Tuner"
);
t
->
type
=
V4L2_TUNER_ANALOG_TV
;
t
->
capability
=
V4L2_TUNER_CAP_NORM
;
t
->
rangehigh
=
0xffffffffUL
;
/* FIXME: set correct range */
/* t->signal = 0xffff; */
/* No way to get signal strength? */
down
(
&
dev
->
lock
);
em28xx_i2c_call_clients
(
dev
,
DECODER_GET_STATUS
,
&
status
);
up
(
&
dev
->
lock
);
t
->
signal
=
(
status
&
DECODER_STATUS_GOOD
)
!=
0
?
0xffff
:
0
;
em28xx_videodbg
(
"VIDIO_S_TUNER: signal=%x, afc=%x
\n
"
,
t
->
signal
,
t
->
afc
);
return
0
;
}
/* No way to get signal strength? */
down
(
&
dev
->
lock
);
em28xx_i2c_call_clients
(
dev
,
DECODER_GET_STATUS
,
&
status
);
up
(
&
dev
->
lock
);
t
->
signal
=
(
status
&
DECODER_STATUS_GOOD
)
!=
0
?
0xffff
:
0
;
em28xx_videodbg
(
"VIDIO_S_TUNER: signal=%x, afc=%x
\n
"
,
t
->
signal
,
t
->
afc
);
return
0
;
}
case
VIDIOC_G_FREQUENCY
:
{
struct
v4l2_frequency
*
f
=
arg
;
{
struct
v4l2_frequency
*
f
=
arg
;
memset
(
f
,
0
,
sizeof
(
*
f
));
f
->
type
=
V4L2_TUNER_ANALOG_TV
;
f
->
frequency
=
dev
->
ctl_freq
;
memset
(
f
,
0
,
sizeof
(
*
f
));
f
->
type
=
V4L2_TUNER_ANALOG_TV
;
f
->
frequency
=
dev
->
ctl_freq
;
return
0
;
}
return
0
;
}
case
VIDIOC_S_FREQUENCY
:
{
struct
v4l2_frequency
*
f
=
arg
;
if
(
0
!=
f
->
tuner
)
return
-
EINVAL
;
{
struct
v4l2_frequency
*
f
=
arg
;
if
(
V4L2_TUNER_ANALOG_TV
!=
f
->
type
)
return
-
EINVAL
;
if
(
0
!=
f
->
tuner
)
return
-
EINVAL
;
down
(
&
dev
->
lock
);
dev
->
ctl_freq
=
f
->
frequency
;
em28xx_i2c_call_clients
(
dev
,
VIDIOC_S_FREQUENCY
,
f
);
up
(
&
dev
->
lock
);
return
0
;
}
if
(
V4L2_TUNER_ANALOG_TV
!=
f
->
type
)
return
-
EINVAL
;
down
(
&
dev
->
lock
);
dev
->
ctl_freq
=
f
->
frequency
;
em28xx_i2c_call_clients
(
dev
,
VIDIOC_S_FREQUENCY
,
f
);
up
(
&
dev
->
lock
);
return
0
;
}
case
VIDIOC_CROPCAP
:
{
struct
v4l2_cropcap
*
cc
=
arg
;
{
struct
v4l2_cropcap
*
cc
=
arg
;
if
(
cc
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
)
return
-
EINVAL
;
cc
->
bounds
.
left
=
0
;
cc
->
bounds
.
top
=
0
;
cc
->
bounds
.
width
=
dev
->
width
;
cc
->
bounds
.
height
=
dev
->
height
;
cc
->
defrect
=
cc
->
bounds
;
cc
->
pixelaspect
.
numerator
=
54
;
/* 4:3 FIXME: remove magic numbers */
cc
->
pixelaspect
.
denominator
=
59
;
return
0
;
}
if
(
cc
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
)
return
-
EINVAL
;
cc
->
bounds
.
left
=
0
;
cc
->
bounds
.
top
=
0
;
cc
->
bounds
.
width
=
dev
->
width
;
cc
->
bounds
.
height
=
dev
->
height
;
cc
->
defrect
=
cc
->
bounds
;
cc
->
pixelaspect
.
numerator
=
54
;
/* 4:3 FIXME: remove magic numbers */
cc
->
pixelaspect
.
denominator
=
59
;
return
0
;
}
case
VIDIOC_STREAMON
:
{
int
*
type
=
arg
;
{
int
*
type
=
arg
;
if
(
*
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
if
(
*
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
if
(
list_empty
(
&
dev
->
inqueue
))
return
-
EINVAL
;
if
(
list_empty
(
&
dev
->
inqueue
))
return
-
EINVAL
;
dev
->
stream
=
STREAM_ON
;
/* FIXME: Start video capture here? */
dev
->
stream
=
STREAM_ON
;
/* FIXME: Start video capture here? */
em28xx_videodbg
(
"VIDIOC_STREAMON: starting stream
\n
"
);
em28xx_videodbg
(
"VIDIOC_STREAMON: starting stream
\n
"
);
return
0
;
}
return
0
;
}
case
VIDIOC_STREAMOFF
:
{
int
*
type
=
arg
;
int
ret
;
if
(
*
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
{
int
*
type
=
arg
;
int
ret
;
if
(
dev
->
stream
==
STREAM_ON
)
{
em28xx_videodbg
(
"VIDIOC_STREAMOFF: interrupting stream
\n
"
);
if
((
ret
=
em28xx_stream_interrupt
(
dev
)))
return
ret
;
}
em28xx_empty_framequeues
(
dev
);
if
(
*
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
return
0
;
if
(
dev
->
stream
==
STREAM_ON
)
{
em28xx_videodbg
(
"VIDIOC_STREAMOFF: interrupting stream
\n
"
);
if
((
ret
=
em28xx_stream_interrupt
(
dev
)))
return
ret
;
}
em28xx_empty_framequeues
(
dev
);
return
0
;
}
default:
return
v4l_compat_translate_ioctl
(
inode
,
filp
,
cmd
,
arg
,
driver_ioctl
);
...
...
@@ -1489,40 +1477,38 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
/* --- capabilities ------------------------------------------ */
case
VIDIOC_QUERYCAP
:
{
struct
v4l2_capability
*
cap
=
arg
;
memset
(
cap
,
0
,
sizeof
(
*
cap
));
strlcpy
(
cap
->
driver
,
"em28xx"
,
sizeof
(
cap
->
driver
));
strlcpy
(
cap
->
card
,
em28xx_boards
[
dev
->
model
].
name
,
sizeof
(
cap
->
card
));
strlcpy
(
cap
->
bus_info
,
dev
->
udev
->
dev
.
bus_id
,
sizeof
(
cap
->
bus_info
));
cap
->
version
=
EM28XX_VERSION_CODE
;
cap
->
capabilities
=
V4L2_CAP_SLICED_VBI_CAPTURE
|
V4L2_CAP_VIDEO_CAPTURE
|
V4L2_CAP_AUDIO
|
V4L2_CAP_READWRITE
|
V4L2_CAP_STREAMING
;
if
(
dev
->
has_tuner
)
cap
->
capabilities
|=
V4L2_CAP_TUNER
;
return
0
;
}
/* --- capture ioctls ---------------------------------------- */
struct
v4l2_capability
*
cap
=
arg
;
memset
(
cap
,
0
,
sizeof
(
*
cap
));
strlcpy
(
cap
->
driver
,
"em28xx"
,
sizeof
(
cap
->
driver
));
strlcpy
(
cap
->
card
,
em28xx_boards
[
dev
->
model
].
name
,
sizeof
(
cap
->
card
));
strlcpy
(
cap
->
bus_info
,
dev
->
udev
->
dev
.
bus_id
,
sizeof
(
cap
->
bus_info
));
cap
->
version
=
EM28XX_VERSION_CODE
;
cap
->
capabilities
=
V4L2_CAP_SLICED_VBI_CAPTURE
|
V4L2_CAP_VIDEO_CAPTURE
|
V4L2_CAP_AUDIO
|
V4L2_CAP_READWRITE
|
V4L2_CAP_STREAMING
;
if
(
dev
->
has_tuner
)
cap
->
capabilities
|=
V4L2_CAP_TUNER
;
return
0
;
}
/* --- capture ioctls ---------------------------------------- */
case
VIDIOC_ENUM_FMT
:
{
struct
v4l2_fmtdesc
*
fmtd
=
arg
;
if
(
fmtd
->
index
!=
0
)
return
-
EINVAL
;
memset
(
fmtd
,
0
,
sizeof
(
*
fmtd
));
fmtd
->
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
strcpy
(
fmtd
->
description
,
"Packed YUY2"
);
fmtd
->
pixelformat
=
V4L2_PIX_FMT_YUYV
;
memset
(
fmtd
->
reserved
,
0
,
sizeof
(
fmtd
->
reserved
));
return
0
;
}
{
struct
v4l2_fmtdesc
*
fmtd
=
arg
;
if
(
fmtd
->
index
!=
0
)
return
-
EINVAL
;
memset
(
fmtd
,
0
,
sizeof
(
*
fmtd
));
fmtd
->
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
strcpy
(
fmtd
->
description
,
"Packed YUY2"
);
fmtd
->
pixelformat
=
V4L2_PIX_FMT_YUYV
;
memset
(
fmtd
->
reserved
,
0
,
sizeof
(
fmtd
->
reserved
));
return
0
;
}
case
VIDIOC_G_FMT
:
return
em28xx_get_fmt
(
dev
,
(
struct
v4l2_format
*
)
arg
);
...
...
@@ -1531,131 +1517,130 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
return
em28xx_set_fmt
(
dev
,
cmd
,
(
struct
v4l2_format
*
)
arg
);
case
VIDIOC_REQBUFS
:
{
struct
v4l2_requestbuffers
*
rb
=
arg
;
u32
i
;
int
ret
;
if
(
rb
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
rb
->
memory
!=
V4L2_MEMORY_MMAP
)
return
-
EINVAL
;
{
struct
v4l2_requestbuffers
*
rb
=
arg
;
u32
i
;
int
ret
;
if
(
dev
->
io
==
IO_READ
)
{
em28xx_videodbg
(
"method is set to read;"
" close and open the device again to"
" choose the mmap I/O method
\n
"
);
return
-
EINVAL
;
}
if
(
rb
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
rb
->
memory
!=
V4L2_MEMORY_MMAP
)
return
-
EINVAL
;
for
(
i
=
0
;
i
<
dev
->
num_frames
;
i
++
)
if
(
dev
->
frame
[
i
].
vma_use_count
)
{
em28xx_videodbg
(
"VIDIOC_REQBUFS failed; previous buffers are still mapped
\n
"
);
return
-
EINVAL
;
}
if
(
dev
->
io
==
IO_READ
)
{
em28xx_videodbg
(
"method is set to read;"
" close and open the device again to"
" choose the mmap I/O method
\n
"
);
return
-
EINVAL
;
}
if
(
dev
->
stream
==
STREAM_ON
)
{
em28xx_videodbg
(
"VIDIOC_REQBUFS: interrupting stream
\n
"
);
if
((
ret
=
em28xx_stream_interrupt
(
dev
)))
return
ret
;
for
(
i
=
0
;
i
<
dev
->
num_frames
;
i
++
)
if
(
dev
->
frame
[
i
].
vma_use_count
)
{
em28xx_videodbg
(
"VIDIOC_REQBUFS failed; previous buffers are still mapped
\n
"
);
return
-
EINVAL
;
}
em28xx_empty_framequeues
(
dev
);
if
(
dev
->
stream
==
STREAM_ON
)
{
em28xx_videodbg
(
"VIDIOC_REQBUFS: interrupting stream
\n
"
);
if
((
ret
=
em28xx_stream_interrupt
(
dev
)))
return
ret
;
}
em28xx_release_buffers
(
dev
);
if
(
rb
->
count
)
rb
->
count
=
em28xx_request_buffers
(
dev
,
rb
->
count
);
em28xx_empty_framequeues
(
dev
);
dev
->
frame_current
=
NULL
;
em28xx_release_buffers
(
dev
);
if
(
rb
->
count
)
rb
->
count
=
em28xx_request_buffers
(
dev
,
rb
->
count
);
em28xx_videodbg
(
"VIDIOC_REQBUFS: setting io method to mmap: num bufs %i
\n
"
,
rb
->
count
);
dev
->
io
=
rb
->
count
?
IO_MMAP
:
IO_NONE
;
return
0
;
}
dev
->
frame_current
=
NULL
;
em28xx_videodbg
(
"VIDIOC_REQBUFS: setting io method to mmap: num bufs %i
\n
"
,
rb
->
count
);
dev
->
io
=
rb
->
count
?
IO_MMAP
:
IO_NONE
;
return
0
;
}
case
VIDIOC_QUERYBUF
:
{
struct
v4l2_buffer
*
b
=
arg
;
{
struct
v4l2_buffer
*
b
=
arg
;
if
(
b
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
b
->
index
>=
dev
->
num_frames
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
if
(
b
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
b
->
index
>=
dev
->
num_frames
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
memcpy
(
b
,
&
dev
->
frame
[
b
->
index
].
buf
,
sizeof
(
*
b
));
memcpy
(
b
,
&
dev
->
frame
[
b
->
index
].
buf
,
sizeof
(
*
b
));
if
(
dev
->
frame
[
b
->
index
].
vma_use_count
)
{
b
->
flags
|=
V4L2_BUF_FLAG_MAPPED
;
}
if
(
dev
->
frame
[
b
->
index
].
state
==
F_DONE
)
b
->
flags
|=
V4L2_BUF_FLAG_DONE
;
else
if
(
dev
->
frame
[
b
->
index
].
state
!=
F_UNUSED
)
b
->
flags
|=
V4L2_BUF_FLAG_QUEUED
;
return
0
;
if
(
dev
->
frame
[
b
->
index
].
vma_use_count
)
{
b
->
flags
|=
V4L2_BUF_FLAG_MAPPED
;
}
if
(
dev
->
frame
[
b
->
index
].
state
==
F_DONE
)
b
->
flags
|=
V4L2_BUF_FLAG_DONE
;
else
if
(
dev
->
frame
[
b
->
index
].
state
!=
F_UNUSED
)
b
->
flags
|=
V4L2_BUF_FLAG_QUEUED
;
return
0
;
}
case
VIDIOC_QBUF
:
{
struct
v4l2_buffer
*
b
=
arg
;
unsigned
long
lock_flags
;
{
struct
v4l2_buffer
*
b
=
arg
;
unsigned
long
lock_flags
;
if
(
b
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
b
->
index
>=
dev
->
num_frames
||
dev
->
io
!=
IO_MMAP
)
{
return
-
EINVAL
;
}
if
(
b
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
b
->
index
>=
dev
->
num_frames
||
dev
->
io
!=
IO_MMAP
)
{
return
-
EINVAL
;
}
if
(
dev
->
frame
[
b
->
index
].
state
!=
F_UNUSED
)
{
return
-
EAGAIN
;
}
dev
->
frame
[
b
->
index
].
state
=
F_QUEUED
;
if
(
dev
->
frame
[
b
->
index
].
state
!=
F_UNUSED
)
{
return
-
EAGAIN
;
}
dev
->
frame
[
b
->
index
].
state
=
F_QUEUED
;
/* add frame to fifo */
spin_lock_irqsave
(
&
dev
->
queue_lock
,
lock_flags
);
list_add_tail
(
&
dev
->
frame
[
b
->
index
].
frame
,
&
dev
->
inqueue
);
spin_unlock_irqrestore
(
&
dev
->
queue_lock
,
lock_flags
);
/* add frame to fifo */
spin_lock_irqsave
(
&
dev
->
queue_lock
,
lock_flags
);
list_add_tail
(
&
dev
->
frame
[
b
->
index
].
frame
,
&
dev
->
inqueue
);
spin_unlock_irqrestore
(
&
dev
->
queue_lock
,
lock_flags
);
return
0
;
}
return
0
;
}
case
VIDIOC_DQBUF
:
{
struct
v4l2_buffer
*
b
=
arg
;
struct
em28xx_frame_t
*
f
;
unsigned
long
lock_flags
;
int
ret
=
0
;
{
struct
v4l2_buffer
*
b
=
arg
;
struct
em28xx_frame_t
*
f
;
unsigned
long
lock_flags
;
int
ret
=
0
;
if
(
b
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
if
(
b
->
type
!=
V4L2_BUF_TYPE_VIDEO_CAPTURE
||
dev
->
io
!=
IO_MMAP
)
return
-
EINVAL
;
if
(
list_empty
(
&
dev
->
outqueue
))
{
if
(
dev
->
stream
==
STREAM_OFF
)
return
-
EINVAL
;
if
(
filp
->
f_flags
&
O_NONBLOCK
)
return
-
EAGAIN
;
ret
=
wait_event_interruptible
(
dev
->
wait_frame
,
(
!
list_empty
(
&
dev
->
outqueue
))
||
(
dev
->
state
&
DEV_DISCONNECTED
));
if
(
ret
)
return
ret
;
if
(
dev
->
state
&
DEV_DISCONNECTED
)
return
-
ENODEV
;
}
if
(
list_empty
(
&
dev
->
outqueue
))
{
if
(
dev
->
stream
==
STREAM_OFF
)
return
-
EINVAL
;
if
(
filp
->
f_flags
&
O_NONBLOCK
)
return
-
EAGAIN
;
ret
=
wait_event_interruptible
(
dev
->
wait_frame
,
(
!
list_empty
(
&
dev
->
outqueue
))
||
(
dev
->
state
&
DEV_DISCONNECTED
));
if
(
ret
)
return
ret
;
if
(
dev
->
state
&
DEV_DISCONNECTED
)
return
-
ENODEV
;
}
spin_lock_irqsave
(
&
dev
->
queue_lock
,
lock_flags
);
f
=
list_entry
(
dev
->
outqueue
.
next
,
struct
em28xx_frame_t
,
frame
);
list_del
(
dev
->
outqueue
.
next
);
spin_unlock_irqrestore
(
&
dev
->
queue_lock
,
lock_flags
);
spin_lock_irqsave
(
&
dev
->
queue_lock
,
lock_flags
);
f
=
list_entry
(
dev
->
outqueue
.
next
,
struct
em28xx_frame_t
,
frame
);
list_del
(
dev
->
outqueue
.
next
);
spin_unlock_irqrestore
(
&
dev
->
queue_lock
,
lock_flags
);
f
->
state
=
F_UNUSED
;
memcpy
(
b
,
&
f
->
buf
,
sizeof
(
*
b
));
f
->
state
=
F_UNUSED
;
memcpy
(
b
,
&
f
->
buf
,
sizeof
(
*
b
));
if
(
f
->
vma_use_count
)
b
->
flags
|=
V4L2_BUF_FLAG_MAPPED
;
if
(
f
->
vma_use_count
)
b
->
flags
|=
V4L2_BUF_FLAG_MAPPED
;
return
0
;
}
return
0
;
}
default:
return
em28xx_do_ioctl
(
inode
,
filp
,
dev
,
cmd
,
arg
,
em28xx_video_do_ioctl
);
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
反馈
建议
客服
返回
顶部