m5602_ov7660.c revision 4763fa84d9942137b011629be2e7547a23cdfbc6
14763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén/*
24763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * Driver for the ov7660 sensor
34763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén *
44763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * Copyright (C) 2009 Erik Andrén
54763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
64763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
74763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén *
84763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * Portions of code to USB interface and ALi driver software,
94763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * Copyright (c) 2006 Willem Duinker
104763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * v4l2 interface modeled after the V4L2 driver
114763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * for SN9C10x PC Camera Controllers
124763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén *
134763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * This program is free software; you can redistribute it and/or
144763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * modify it under the terms of the GNU General Public License as
154763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén * published by the Free Software Foundation, version 2.
164763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén *
174763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén */
184763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
194763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén#include "m5602_ov7660.h"
204763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
214763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénconst static struct ctrl ov7660_ctrls[] = {};
224763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
234763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénstatic struct v4l2_pix_format ov7660_modes[] = {
244763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	{
254763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		640,
264763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		480,
274763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		V4L2_PIX_FMT_SBGGR8,
284763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		V4L2_FIELD_NONE,
294763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		.sizeimage =
304763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén			640 * 480,
314763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		.bytesperline = 640,
324763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		.colorspace = V4L2_COLORSPACE_SRGB,
334763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		.priv = 0
344763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	}
354763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén};
364763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
374763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénstatic void ov7660_dump_registers(struct sd *sd);
384763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
394763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénint ov7660_probe(struct sd *sd)
404763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén{
414763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	return -ENODEV;
424763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén}
434763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
444763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénint ov7660_init(struct sd *sd)
454763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén{
464763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	return 0;
474763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén}
484763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
494763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénint ov7660_start(struct sd *sd)
504763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén{
514763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	return 0;
524763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén}
534763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
544763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénint ov7660_stop(struct sd *sd)
554763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén{
564763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	return 0;
574763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén}
584763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
594763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénvoid ov7660_disconnect(struct sd *sd) {}
604763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
614763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrénstatic void ov7660_dump_registers(struct sd *sd)
624763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén{
634763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	int address;
644763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	info("Dumping the ov7660 register state");
654763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	for (address = 0; address < 0xa9; address++) {
664763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		u8 value;
674763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		m5602_read_sensor(sd, address, &value, 1);
684763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		info("register 0x%x contains 0x%x",
694763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		     address, value);
704763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	}
714763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
724763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	info("ov7660 register state dump complete");
734763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
744763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	info("Probing for which registers that are read/write");
754763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	for (address = 0; address < 0xff; address++) {
764763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		u8 old_value, ctrl_value;
774763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		u8 test_value[2] = {0xff, 0xff};
784763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
794763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		m5602_read_sensor(sd, address, &old_value, 1);
804763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		m5602_write_sensor(sd, address, test_value, 1);
814763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		m5602_read_sensor(sd, address, &ctrl_value, 1);
824763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
834763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		if (ctrl_value == test_value[0])
844763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén			info("register 0x%x is writeable", address);
854763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		else
864763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén			info("register 0x%x is read only", address);
874763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
884763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		/* Restore original value */
894763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén		m5602_write_sensor(sd, address, &old_value, 1);
904763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén	}
914763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén}
924763fa84d9942137b011629be2e7547a23cdfbc6Erik Andrén
93