/** * 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(); }
/** * 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); }