Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 124391
b: refs/heads/master
c: 11d9f25
h: refs/heads/master
i:
  124389: c0e9ca4
  124387: 8bed422
  124383: 449f0a4
v: v3
  • Loading branch information
Jim Paris authored and Mauro Carvalho Chehab committed Dec 30, 2008
1 parent 5a3c42d commit 5226ca1
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 627a5ef7893fa127925b99e2597c8210202c75aa
refs/heads/master: 11d9f25da89523d19dba3608d51a86af2954fc0d
115 changes: 78 additions & 37 deletions trunk/drivers/media/video/gspca/ov534.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,12 @@ MODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>");
MODULE_DESCRIPTION("GSPCA/OV534 USB Camera Driver");
MODULE_LICENSE("GPL");

/* global parameters */
static int frame_rate;

/* specific webcam descriptor */
struct sd {
struct gspca_dev gspca_dev; /* !! must be the first item */
__u32 last_fid;
__u32 last_pts;
int frame_rate;
};

/* V4L2 controls supported by the driver */
Expand Down Expand Up @@ -296,6 +294,40 @@ static const __u8 ov772x_reg_initdata[][2] = {
{ 0x0c, 0xd0 }
};

/* set framerate */
static void ov534_set_frame_rate(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
int fr = sd->frame_rate;

switch (fr) {
case 50:
sccb_reg_write(gspca_dev->dev, 0x11, 0x01);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x02);
break;
case 40:
sccb_reg_write(gspca_dev->dev, 0x11, 0x02);
sccb_reg_write(gspca_dev->dev, 0x0d, 0xc1);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x04);
break;
/* case 30: */
default:
fr = 30;
sccb_reg_write(gspca_dev->dev, 0x11, 0x04);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x81);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x02);
break;
case 15:
sccb_reg_write(gspca_dev->dev, 0x11, 0x03);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x04);
break;
}

sd->frame_rate = fr;
PDEBUG(D_PROBE, "frame_rate: %d", fr);
}

/* setup method */
static void ov534_setup(struct usb_device *udev)
Expand Down Expand Up @@ -339,38 +371,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
/* this function is called at probe and resume time */
static int sd_init(struct gspca_dev *gspca_dev)
{
int fr;

ov534_setup(gspca_dev->dev);

fr = frame_rate;

switch (fr) {
case 50:
sccb_reg_write(gspca_dev->dev, 0x11, 0x01);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x02);
break;
case 40:
sccb_reg_write(gspca_dev->dev, 0x11, 0x02);
sccb_reg_write(gspca_dev->dev, 0x0d, 0xc1);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x04);
break;
/* case 30: */
default:
fr = 30;
sccb_reg_write(gspca_dev->dev, 0x11, 0x04);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x81);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x02);
break;
case 15:
sccb_reg_write(gspca_dev->dev, 0x11, 0x03);
sccb_reg_write(gspca_dev->dev, 0x0d, 0x41);
ov534_reg_write(gspca_dev->dev, 0xe5, 0x04);
break;
}

PDEBUG(D_PROBE, "frame_rate: %d", fr);
ov534_set_frame_rate(gspca_dev);

return 0;
}
Expand Down Expand Up @@ -477,6 +479,46 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, struct gspca_frame *frame,
goto scan_next;
}

/* get stream parameters (framerate) */
int sd_get_streamparm(struct gspca_dev *gspca_dev,
struct v4l2_streamparm *parm)
{
struct v4l2_captureparm *cp = &parm->parm.capture;
struct v4l2_fract *tpf = &cp->timeperframe;
struct sd *sd = (struct sd *) gspca_dev;

if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;

cp->capability |= V4L2_CAP_TIMEPERFRAME;
tpf->numerator = 1;
tpf->denominator = sd->frame_rate;

return 0;
}

/* set stream parameters (framerate) */
int sd_set_streamparm(struct gspca_dev *gspca_dev,
struct v4l2_streamparm *parm)
{
struct v4l2_captureparm *cp = &parm->parm.capture;
struct v4l2_fract *tpf = &cp->timeperframe;
struct sd *sd = (struct sd *) gspca_dev;

if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;

/* Set requested framerate */
sd->frame_rate = tpf->denominator / tpf->numerator;
ov534_set_frame_rate(gspca_dev);

/* Return the actual framerate */
tpf->numerator = 1;
tpf->denominator = sd->frame_rate;

return 0;
}

/* sub-driver description */
static const struct sd_desc sd_desc = {
.name = MODULE_NAME,
Expand All @@ -487,6 +529,8 @@ static const struct sd_desc sd_desc = {
.start = sd_start,
.stopN = sd_stopN,
.pkt_scan = sd_pkt_scan,
.get_streamparm = sd_get_streamparm,
.set_streamparm = sd_set_streamparm,
};

/* -- module initialisation -- */
Expand Down Expand Up @@ -534,6 +578,3 @@ static void __exit sd_mod_exit(void)

module_init(sd_mod_init);
module_exit(sd_mod_exit);

module_param(frame_rate, int, 0644);
MODULE_PARM_DESC(frame_rate, "Frame rate (15, 30, 40, 50)");

0 comments on commit 5226ca1

Please sign in to comment.