Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92e232ac authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB: gspca_ov519: Add support for the button on ov518 based cams



Due to hardware limitations this only works while the camera is
streaming.

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 417a4d26
Loading
Loading
Loading
Loading
+29 −25
Original line number Original line Diff line number Diff line
@@ -2702,6 +2702,11 @@ static void sd_reset_snapshot(struct gspca_dev *gspca_dev)
	sd->snapshot_needs_reset = 0;
	sd->snapshot_needs_reset = 0;


	switch (sd->bridge) {
	switch (sd->bridge) {
	case BRIDGE_OV518:
	case BRIDGE_OV518PLUS:
		reg_w(sd, R51x_SYS_SNAP, 0x02); /* Reset */
		reg_w(sd, R51x_SYS_SNAP, 0x01); /* Enable */
		break;
	case BRIDGE_OV519:
	case BRIDGE_OV519:
		reg_w(sd, R51x_SYS_RESET, 0x40);
		reg_w(sd, R51x_SYS_RESET, 0x40);
		reg_w(sd, R51x_SYS_RESET, 0x00);
		reg_w(sd, R51x_SYS_RESET, 0x00);
@@ -3977,6 +3982,28 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
		w9968cf_stop0(sd);
		w9968cf_stop0(sd);
}
}


static void ov51x_handle_button(struct gspca_dev *gspca_dev, u8 state)
{
	struct sd *sd = (struct sd *) gspca_dev;

	if (sd->snapshot_pressed != state) {
#ifdef CONFIG_INPUT
		input_report_key(gspca_dev->input_dev, KEY_CAMERA, state);
		input_sync(gspca_dev->input_dev);
#endif
		if (state)
			sd->snapshot_needs_reset = 1;

		sd->snapshot_pressed = state;
	} else {
		/* On the ov519 we need to reset the button state multiple
		   times, as resetting does not work as long as the button
		   stays pressed */
		if (sd->bridge == BRIDGE_OV519 && state)
			sd->snapshot_needs_reset = 1;
	}
}

static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
			u8 *in,			/* isoc packet */
			u8 *in,			/* isoc packet */
			int len)		/* iso packet length */
			int len)		/* iso packet length */
@@ -4035,6 +4062,7 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev,
	/* A false positive here is likely, until OVT gives me
	/* A false positive here is likely, until OVT gives me
	 * the definitive SOF/EOF format */
	 * the definitive SOF/EOF format */
	if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) {
	if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) {
		ov51x_handle_button(gspca_dev, (data[6] >> 1) & 1);
		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
		gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
		gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
		sd->packet_nr = 0;
		sd->packet_nr = 0;
@@ -4063,30 +4091,6 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev,
	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
}
}


static void ov519_handle_button(struct gspca_dev *gspca_dev, u8 state)
{
	struct sd *sd = (struct sd *) gspca_dev;

	/* This should never happen, but better to check */
	if (state != 0 && state != 1)
		return;

	/* We may need to reset the button state multiple times, as resetting
	   does not work as long as the button stays pressed, so always set
	   snapshot_needs_reset (instead of only on a state change to 1). */
	if (state)
		sd->snapshot_needs_reset = 1;

	if (sd->snapshot_pressed != state) {
#ifdef CONFIG_INPUT
		input_report_key(gspca_dev->input_dev, KEY_CAMERA, state);
		input_sync(gspca_dev->input_dev);
#endif

		sd->snapshot_pressed = state;
	}
}

static void ov519_pkt_scan(struct gspca_dev *gspca_dev,
static void ov519_pkt_scan(struct gspca_dev *gspca_dev,
			u8 *data,			/* isoc packet */
			u8 *data,			/* isoc packet */
			int len)			/* iso packet length */
			int len)			/* iso packet length */
@@ -4120,7 +4124,7 @@ static void ov519_pkt_scan(struct gspca_dev *gspca_dev,
				gspca_dev->last_packet_type = DISCARD_PACKET;
				gspca_dev->last_packet_type = DISCARD_PACKET;
			return;
			return;
		case 0x51:		/* end of frame */
		case 0x51:		/* end of frame */
			ov519_handle_button(gspca_dev, data[11]);
			ov51x_handle_button(gspca_dev, data[11] & 1);
			if (data[9] != 0)
			if (data[9] != 0)
				gspca_dev->last_packet_type = DISCARD_PACKET;
				gspca_dev->last_packet_type = DISCARD_PACKET;
			gspca_frame_add(gspca_dev, LAST_PACKET,
			gspca_frame_add(gspca_dev, LAST_PACKET,