Esempio n. 1
0
/**
 * hp3a_stream_on - Perform stream on specific tasks.
 *
 * No return value.
 **/
void hp3a_stream_on(void)
{
	g_tc.frame_count = 0;
	memset(&g_tc.sensor_current, 0, sizeof(struct hp3a_sensor_param));
	memset(&g_tc.sensor_requested, 0, sizeof(struct hp3a_sensor_param));
	memset(&g_tc.sensor_stats, 0, sizeof(struct hp3a_sensor_param));
	hp3a_flush_queue_irqsave(&g_tc.ready_stats_queue);
	hp3a_flush_queue_irqsave(&g_tc.hist_hw_queue);
	g_tc.raw_cap_sched_count = 0;
	g_tc.v4l2_streaming = 1;

	hp3a_enable_histogram();
	hp3a_update_hardpipe();
}
Esempio n. 2
0
/**
 * hp3a_set_sensor_param - Set sensor specific params.
 * @param: Pointer the structure containing sensor parameters.
 * @fh: Pointer to a hp3a_fh stucture.
 *
 * Return 0 on success,  less than 0 otherwise.
 **/
int hp3a_set_sensor_param(struct hp3a_sensor_param *param, struct hp3a_fh *fh)
{
	int ret = -1;
	struct hp3a_sensor_param_internal sensor_param = {
		.exposure = 0,
		.gain = 0,
		.fps = 0};
	unsigned long irqflags = 0;

	if (likely(fh->v4l2_dev > -1)) {
		if (likely(g_tc.v4l2_streaming == 1)) {
			sensor_param.v4l2_dev = fh->v4l2_dev;
			ret = 0;

			spin_lock_irqsave(&g_tc.stats_lock, irqflags);
			if (!(g_tc.sensor_stats.exposure &&
					g_tc.sensor_stats.gain) &&
					!QUEUE_COUNT(g_tc.sensor_write_queue)) {
				memset(&g_tc.sensor_current, 0, \
					sizeof(g_tc.sensor_current));
				memset(&g_tc.sensor_requested, 0, \
					sizeof(g_tc.sensor_requested));
			}
			if (param->fps &&
					g_tc.sensor_requested.fps != \
					param->fps) {
				sensor_param.fps = param->fps;
				sensor_param.exposure = param->exposure;
				sensor_param.gain = param->gain;
				ret = hp3a_enqueue( \
						&g_tc.sensor_write_queue,
						&sensor_param);
				sensor_param.fps = 0;
				sensor_param.exposure = 0;
				sensor_param.gain = 0;
				if (!ret) {
					g_tc.sensor_requested.fps = \
						param->fps;
					g_tc.sensor_requested.exposure =
							param->exposure;
					g_tc.sensor_requested.gain = \
						param->gain;
				}
			}
			if (param->exposure &&
				(g_tc.sensor_requested.exposure != \
				param->exposure)) {
				sensor_param.exposure = param->exposure;
				ret = hp3a_enqueue( \
					&g_tc.sensor_write_queue,
					&sensor_param);
				sensor_param.exposure = 0;
				if (!ret) {
					g_tc.sensor_requested.exposure = \
						param->exposure;
				}
			}
			if (param->gain &&
				(g_tc.sensor_requested.gain != \
					param->gain)) {
				sensor_param.gain = param->gain;
				ret = hp3a_enqueue( \
						&g_tc.sensor_write_queue,
						&sensor_param);
				if (!ret) {
					g_tc.sensor_requested.gain = \
						param->gain;
				}
			}
			spin_unlock_irqrestore(&g_tc.stats_lock, irqflags);
		} else {
			struct cam_sensor_settings sensor_settings = {
			.flags = 0,
			.exposure = 0,
			.gain = 0,
			.fps = 0,
			.regs = 0,
			.reg_data = 0};

			sensor_settings.exposure = param->exposure;
			sensor_settings.gain = param->gain;
			sensor_settings.fps = param->fps;
			sensor_settings.flags = (OMAP34XXCAM_SET_GAIN | \
						OMAP34XXCAM_SET_EXPOSURE);

			/**
			* Write and read sensor settings.
			*/
			ret = omap34xxcam_sensor_settings(fh->v4l2_dev,
							&sensor_settings);
		}
	} else {
		dev_err(fh->device->dev,
			"hp3a: Invalid sensor id(%d)\n",
			fh->v4l2_dev);
	}

	return ret;
}

/**
 * hp3a_set_hardpipe_param - Set hard pipe specific params to be programmed.
 * @param: Pointer the structure containing hard pipe parameters.
 * @fh: Pointer to a hp3a_fh stucture.
 *
 * Return 0 on success,  less than 0 otherwise.
 **/
int hp3a_set_hardpipe_param(struct hp3a_hardpipe_param *param,
				struct hp3a_fh *fh)
{
	unsigned long irqflags = 0;

	spin_lock_irqsave(&g_tc.hardpipe_lock, irqflags);
	memcpy(&g_tc.hpipe_param, param, sizeof(struct hp3a_hardpipe_param));
	g_tc.update_hardpipe = 1;
	spin_unlock_irqrestore(&g_tc.hardpipe_lock, irqflags);

	if (g_tc.v4l2_streaming == 0)
		hp3a_update_hardpipe();

	return 0;
}
Esempio n. 3
0
/**
 * hp3a_update_wb - Update WB related hw settings.
 *
 * No return value.
 **/
void hp3a_update_wb(void)
{
	hp3a_update_hardpipe();
}