Re: implement ov3640 driver using subdev-api with omap3-isp

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Laurent Pinchart <laurent.pinchart <at> ideasonboard.com> writes:

> 
> Hi Tom,
> 
> On Monday 15 July 2013 09:23:19 Tom wrote:
> > Hello,
> > 
> > I am working with a gumstix overo board connected with a e-con-systems
> > camera module using a ov3640 camera sensor.
> > 
> > Along with the board I got a camera driver
> > (https://github.com/scottellis/econ-cam-driver)
> > which can be used with linux
> > kernel 2.6.34, but I want to use the camera
> > along with the linux kernel 3.5.
> > 
> > So I tried to implement the driver into the kernel sources by referring to a
> > existing drivers like /driver/media/video/ov9640.c and
> > /driver/media/video/mt9v032.c.
> > 
> > The old driver has an isp implementation integrated and it registers itself
> > once as a video device. So the application which is going to use the camera
> > sensor just needs to open the right video device and by calling ioctl the
> > corresponding functions will be called.
> > 
> > By going through the linux 3.5 kernel sources I found out that the omap3-isp
> > registers itself as an video-device and should support sensors using the
> > v4l2-subdev interface.
> > 
> > So am I right when I think that I just need to add the ov3640 subdev to the
> > isp_v4l2_subdevs_group in the board-overo.c file and then just open the
> > video device of the isp to use it via application (ioctl)?
> > 
> > I read an article which told me that I need to use the v4l2_subdev_pad_ops
> > to interact from isp with the ov3640 subdev, but it does not work. I don't
> > know what I am doing wrong.
> > 
> > Is there already an implemenation of the ov3640 using subdev-api which I
> > couldn't find or can someone give me a hint what I need to do to get the
> > sensor with the isp working?
> 
> As a matter of fact there's one. You can't be blamed for not finding it,
as it 
> was stored on my computer.
> 
> I've rebased the patches on top of the latest linuxtv master branch and
pushed 
> the patches to
> 
> 	git://linuxtv.org/pinchartl/media.git sensors/ov3640
> 
> Two caveats:
> 
> - The rebased patches have been compile-tested only, I haven't had time to 
> test them on the hardware. One particular point that might break is the
use of 
> the clock API as a replacement for the OMAP3 ISP .set_xclk() callback. Any 
> problem that may arise from this shouldn't be too difficult to fix.
> 
> - The driver doesn't work in all resolutions and formats. This is really work 
> in progress that I haven't had time to finish. The code should be relatively 
> clean, but the lack of support from Omnivision killed the schedule (which
I've 
> planned too optimistically I have to confess).
> 
> Fixes would be very welcome. I'd like to push this driver to mainline at some 
> point, I'd hate to waste the time I've spent on this.
> 

Hello Laurent,

many thanks for the quick reply.

I'm still a beginner, so please excuse that I have to ask you once again
just to understand the subdev-api and the isp exactly. 

Is the implementation within the board-overo.c file correct to use the isp
along with your camera driver? 

And would it be enough to just open the isp video device within my
application or do I need to open the subdev-device, too when calling ioctl?

Best Regards, Tom 


My Code Snippet board-overo.c:

#define LM3553_SLAVE_ADDRESS	0x53
#define OV3640_I2C_ADDR		(0x78 >> 1)
int omap3evm_ov3640_platform_data;
int lm3553_platform_data;

static struct i2c_board_info omap3_i2c_boardinfo_ov3640 = {
		I2C_BOARD_INFO("ov3640", OV3640_I2C_ADDR),
		.platform_data = &omap3evm_ov3640_platform_data,
};

static struct i2c_board_info omap3_i2c_boardinfo_lm3553 = {
		I2C_BOARD_INFO("lm3553",LM3553_SLAVE_ADDRESS),
		.platform_data = &lm3553_platform_data,
};

static struct i2c_board_info mt9v032_i2c_device = {
	I2C_BOARD_INFO("mt9v032", MT9V032_I2C_ADDR),
	.platform_data = &mt9v032_platform_data,
};

/*static struct isp_subdev_i2c_board_info mt9v032_subdevs[] = {
	{
		.board_info = &mt9v032_i2c_device,
		.i2c_adapter_id = MT9V032_I2C_BUS_NUM,
	},
	{ NULL, 0, },
};*/

static struct isp_subdev_i2c_board_info overo_subdevs[] = {
	/*{
		.board_info = &mt9v032_i2c_device,
		.i2c_adapter_id = MT9V032_I2C_BUS_NUM,
	},*/
	{
		.board_info = &omap3_i2c_boardinfo_ov3640,
		.i2c_adapter_id = MT9V032_I2C_BUS_NUM,
	},
	{ NULL, 0, },
};

static struct isp_v4l2_subdevs_group overo_camera_subdevs[] = {
	{
		//.subdevs = mt9v032_subdevs,
		.subdevs = overo_subdevs,
		.interface = ISP_INTERFACE_PARALLEL,
		.bus = {
				.parallel = {
					.data_lane_shift = 0,
					.clk_pol = 0,
					.bridge = ISPCTRL_PAR_BRIDGE_DISABLE,
				}
		},
	},
	{ NULL, 0, },
};

static struct isp_platform_data overo_isp_platform_data = {
	.subdevs = overo_camera_subdevs,
};

static int __init overo_camera_init(void)
{
       return omap3_init_camera(&overo_isp_platform_data);
}



--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux