Ejemplo 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();
}
Ejemplo n.º 2
0
/**
 * hp3a_update_framework- execute tasks between frames.
 *
 * No return value.
 **/
void hp3a_update_stats_readout_done(void)
{
	int i;
	bool allow_exp_update = true;
	bool allow_gain_update = true;
	struct hp3a_internal_buffer *ibuffer;
	struct hp3a_sensor_param_internal sensor_param;

	if (unlikely(g_tc.v4l2_streaming == 0)) {
		hp3a_disable_histogram();
		hp3a_disable_af();
		return;
	}

	/* Reuse stats buffers. */
	if (g_tc.histogram_buffer != NULL) {
		g_tc.hist_done = 0;
		hp3a_enqueue(&g_tc.hist_stat_queue,
			 &g_tc.histogram_buffer);
		g_tc.histogram_buffer = NULL;
	}

	if (g_tc.af_buffer  != NULL) {
		hp3a_enqueue(&g_tc.af_stat_queue,
			&g_tc.af_buffer);
		g_tc.af_buffer = NULL;
	}

	if (g_tc.raw_buffer != NULL) {
		hp3a_enqueue(&g_tc.raw_frame_queue,
				&g_tc.raw_buffer);
		g_tc.raw_buffer = NULL;
	}

	/* Process ready stats. */
	for (i = MAX_STAT_BUFFERS_PER_FRAME; i--;) {
		ibuffer = NULL;
		if (hp3a_dequeue(&g_tc.ready_stats_queue, &ibuffer) == 0) {
			if (ibuffer->type == HISTOGRAM &&
					g_tc.histogram_buffer == NULL)
				g_tc.histogram_buffer = ibuffer;
			else if (ibuffer->type == PAXEL &&
						g_tc.af_buffer == NULL)
				g_tc.af_buffer = ibuffer;
			else if (ibuffer->type == BAYER &&
						g_tc.raw_buffer == NULL)
				g_tc.raw_buffer = ibuffer;
			else {
				printk(KERN_ERR "hp3a: Error unknown "
				"buffer type(%d)\n", ibuffer->type);
			}
		} else {
			break;
		}
	}

	for (i = QUEUE_COUNT(g_tc.sensor_read_queue); i--;) {
		if (hp3a_dequeue(&g_tc.sensor_read_queue, &sensor_param) == 0) {
			if (sensor_param.frame_id == g_tc.frame_count) {
				if (sensor_param.exposure == (u32)-1) {
					g_tc.sensor_stats.exposure = 0;
					allow_exp_update = false;
				} else if (sensor_param.exposure && allow_exp_update) {
					g_tc.sensor_stats.exposure = sensor_param.exposure;
				}
				if (sensor_param.gain == (u16)-1) {
					g_tc.sensor_stats.gain = 0;
					allow_gain_update = false;
				} else if (sensor_param.gain && allow_gain_update) {
					g_tc.sensor_stats.gain = sensor_param.gain;
				}
				if (sensor_param.fps) {
					g_tc.sensor_stats.fps = \
						sensor_param.fps;
				}
			} else if (sensor_param.frame_id > g_tc.frame_count) {
				hp3a_enqueue(&g_tc.sensor_read_queue,
								&sensor_param);
			}
		} else {
			break;
		}
	}

	/* Histogram buffer processing and HW configuration. */
	hp3a_enable_histogram();
	/* AF stat buffer processing and HW configuration. */
	hp3a_enable_af();

	/* Notify threads waiting for stats. */
	complete(&g_tc.frame_done);
}