1*4882a593Smuzhiyun #include "rk_aiq_comm.h"
2*4882a593Smuzhiyun #include "RawStreamProcUnit.h"
3*4882a593Smuzhiyun #include "CaptureRawData.h"
4*4882a593Smuzhiyun #include "CamHwIsp20.h"
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun namespace RkCam {
RawStreamProcUnit()7*4882a593Smuzhiyun RawStreamProcUnit::RawStreamProcUnit ()
8*4882a593Smuzhiyun : _is_multi_cam_conc(false)
9*4882a593Smuzhiyun , _first_trigger(true)
10*4882a593Smuzhiyun , _is_1608_sensor(false)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun _raw_proc_thread = new RawProcThread(this);
13*4882a593Smuzhiyun _PollCallback = NULL;
14*4882a593Smuzhiyun mCamPhyId = -1;
15*4882a593Smuzhiyun _rawCap = NULL;
16*4882a593Smuzhiyun }
17*4882a593Smuzhiyun
RawStreamProcUnit(const rk_sensor_full_info_t * s_info,bool linked_to_isp,int tx_buf_cnt)18*4882a593Smuzhiyun RawStreamProcUnit::RawStreamProcUnit (const rk_sensor_full_info_t *s_info, bool linked_to_isp, int tx_buf_cnt)
19*4882a593Smuzhiyun : _is_multi_cam_conc(false)
20*4882a593Smuzhiyun , _first_trigger(true)
21*4882a593Smuzhiyun , _is_1608_sensor(false)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun _raw_proc_thread = new RawProcThread(this);
24*4882a593Smuzhiyun _PollCallback = NULL;
25*4882a593Smuzhiyun _rawCap = NULL;
26*4882a593Smuzhiyun //short frame
27*4882a593Smuzhiyun if (strlen(s_info->isp_info->rawrd2_s_path)) {
28*4882a593Smuzhiyun _dev[0] = new V4l2Device (s_info->isp_info->rawrd2_s_path);//rkisp_rawrd2_s
29*4882a593Smuzhiyun _dev[0]->open();
30*4882a593Smuzhiyun _dev[0]->set_mem_type(V4L2_MEMORY_DMABUF);
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun //mid frame
33*4882a593Smuzhiyun if (strlen(s_info->isp_info->rawrd0_m_path)) {
34*4882a593Smuzhiyun _dev[1] = new V4l2Device (s_info->isp_info->rawrd0_m_path);//rkisp_rawrd0_m
35*4882a593Smuzhiyun _dev[1]->open();
36*4882a593Smuzhiyun _dev[1]->set_mem_type(V4L2_MEMORY_DMABUF);
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun //long frame
39*4882a593Smuzhiyun if (strlen(s_info->isp_info->rawrd1_l_path)) {
40*4882a593Smuzhiyun _dev[2] = new V4l2Device (s_info->isp_info->rawrd1_l_path);//rkisp_rawrd1_l
41*4882a593Smuzhiyun _dev[2]->open();
42*4882a593Smuzhiyun _dev[2]->set_mem_type(V4L2_MEMORY_DMABUF);
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun int buf_cnt = 0;
45*4882a593Smuzhiyun if (tx_buf_cnt > 0) {
46*4882a593Smuzhiyun buf_cnt = tx_buf_cnt;
47*4882a593Smuzhiyun } else if (linked_to_isp) {
48*4882a593Smuzhiyun buf_cnt = ISP_TX_BUF_NUM;
49*4882a593Smuzhiyun } else if (s_info->linked_to_1608) {
50*4882a593Smuzhiyun buf_cnt = VIPCAP_TX_BUF_NUM_1608;
51*4882a593Smuzhiyun } else {
52*4882a593Smuzhiyun buf_cnt = VIPCAP_TX_BUF_NUM;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun for (int i = 0; i < 3; i++) {
55*4882a593Smuzhiyun if (_dev[i].ptr()) {
56*4882a593Smuzhiyun _dev[i]->set_buffer_count(buf_cnt);
57*4882a593Smuzhiyun _dev[i]->set_buf_sync (true);
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun _dev_index[i] = i;
61*4882a593Smuzhiyun _stream[i] = new RKRawStream(_dev[i], i, ISP_POLL_RX);
62*4882a593Smuzhiyun _stream[i]->setPollCallback(this);
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
~RawStreamProcUnit()66*4882a593Smuzhiyun RawStreamProcUnit::~RawStreamProcUnit ()
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
start(int mode)70*4882a593Smuzhiyun XCamReturn RawStreamProcUnit::start(int mode)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun _rawCap = new CaptureRawData(mCamPhyId);
73*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
74*4882a593Smuzhiyun _stream[i]->setCamPhyId(mCamPhyId);
75*4882a593Smuzhiyun _stream[i]->start();
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun _msg_queue.clear();
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun // TODO: [baron] for rk1608, vi will capture data before start
80*4882a593Smuzhiyun _buf_mutex.lock();
81*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
82*4882a593Smuzhiyun buf_list[i].clear ();
83*4882a593Smuzhiyun cache_list[i].clear ();
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun _isp_hdr_fid2ready_map.clear();
86*4882a593Smuzhiyun _buf_mutex.unlock();
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun _raw_proc_thread->set_policy(SCHED_RR);
89*4882a593Smuzhiyun _raw_proc_thread->set_priority(20);
90*4882a593Smuzhiyun _raw_proc_thread->start();
91*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
stop()94*4882a593Smuzhiyun XCamReturn RawStreamProcUnit::stop ()
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun _msg_queue.push(0);
97*4882a593Smuzhiyun _raw_proc_thread->stop();
98*4882a593Smuzhiyun _msg_queue.clear();
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
101*4882a593Smuzhiyun _stream[i]->stopThreadOnly();
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun _buf_mutex.lock();
105*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
106*4882a593Smuzhiyun buf_list[i].clear ();
107*4882a593Smuzhiyun cache_list[i].clear ();
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun _isp_hdr_fid2ready_map.clear();
110*4882a593Smuzhiyun _buf_mutex.unlock();
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun _mipi_trigger_mutex.lock();
113*4882a593Smuzhiyun _isp_hdr_fid2times_map.clear();
114*4882a593Smuzhiyun _sof_timestamp_map.clear();
115*4882a593Smuzhiyun _mipi_trigger_mutex.unlock();
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun if (_rawCap) {
118*4882a593Smuzhiyun delete _rawCap;
119*4882a593Smuzhiyun _rawCap = NULL;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
123*4882a593Smuzhiyun _stream[i]->stopDeviceOnly();
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun XCamReturn
prepare(int idx)130*4882a593Smuzhiyun RawStreamProcUnit::prepare(int idx)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
133*4882a593Smuzhiyun // mipi rx/tx format should match to sensor.
134*4882a593Smuzhiyun for (int i = 0; i < 3; i++) {
135*4882a593Smuzhiyun if (!(idx & (1 << i)))
136*4882a593Smuzhiyun continue;
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun ret = _dev[i]->prepare();
139*4882a593Smuzhiyun if (ret < 0)
140*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM,"mipi tx:%d prepare err: %d\n", ret);
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun _stream[i]->set_device_prepared(true);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun return ret;
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun void
set_working_mode(int mode)148*4882a593Smuzhiyun RawStreamProcUnit::set_working_mode(int mode)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun _working_mode = mode;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun switch (_working_mode) {
153*4882a593Smuzhiyun case RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR:
154*4882a593Smuzhiyun case RK_AIQ_ISP_HDR_MODE_3_LINE_HDR:
155*4882a593Smuzhiyun _mipi_dev_max = 3;
156*4882a593Smuzhiyun break;
157*4882a593Smuzhiyun case RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR:
158*4882a593Smuzhiyun case RK_AIQ_ISP_HDR_MODE_2_LINE_HDR:
159*4882a593Smuzhiyun _mipi_dev_max = 2;
160*4882a593Smuzhiyun break;
161*4882a593Smuzhiyun default:
162*4882a593Smuzhiyun _mipi_dev_max = 1;
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM,"working_mode:0x%x, _mipi_dev_max=%d\n", _working_mode, _mipi_dev_max);
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun void
set_rx_devices(SmartPtr<V4l2Device> mipi_rx_devs[3])169*4882a593Smuzhiyun RawStreamProcUnit::set_rx_devices(SmartPtr<V4l2Device> mipi_rx_devs[3])
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun for (int i = 0; i < 3; i++) {
172*4882a593Smuzhiyun _dev[i] = mipi_rx_devs[i];
173*4882a593Smuzhiyun _stream[i].release();
174*4882a593Smuzhiyun _stream[i] = new RKRawStream(_dev[i], i, ISP_POLL_RX);
175*4882a593Smuzhiyun _stream[i]->setPollCallback(this);
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun SmartPtr<V4l2Device>
get_rx_device(int index)180*4882a593Smuzhiyun RawStreamProcUnit::get_rx_device(int index)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun if (index > _mipi_dev_max)
183*4882a593Smuzhiyun return nullptr;
184*4882a593Smuzhiyun else
185*4882a593Smuzhiyun return _dev[index];
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun XCamReturn
set_rx_format(const struct v4l2_subdev_format & sns_sd_fmt,uint32_t sns_v4l_pix_fmt)189*4882a593Smuzhiyun RawStreamProcUnit::set_rx_format(const struct v4l2_subdev_format& sns_sd_fmt,
190*4882a593Smuzhiyun uint32_t sns_v4l_pix_fmt)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun for (int i = 0; i < 3; i++) {
195*4882a593Smuzhiyun if (!_dev[i].ptr()) {
196*4882a593Smuzhiyun ret = XCAM_RETURN_ERROR_PARAM;
197*4882a593Smuzhiyun break;
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun ret = _dev[i]->set_format(sns_sd_fmt.format.width,
201*4882a593Smuzhiyun sns_sd_fmt.format.height,
202*4882a593Smuzhiyun sns_v4l_pix_fmt,
203*4882a593Smuzhiyun V4L2_FIELD_NONE,
204*4882a593Smuzhiyun 0);
205*4882a593Smuzhiyun if (ret < 0) {
206*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) set format failed", _dev[i]->get_device_name());
207*4882a593Smuzhiyun } else {
208*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) set fmt info: fmt 0x%x, %dx%d !",
209*4882a593Smuzhiyun _dev[i]->get_device_name(), sns_v4l_pix_fmt,
210*4882a593Smuzhiyun sns_sd_fmt.format.width, sns_sd_fmt.format.height);
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun return ret;
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun XCamReturn
set_rx_format(const struct v4l2_subdev_selection & sns_sd_sel,uint32_t sns_v4l_pix_fmt)218*4882a593Smuzhiyun RawStreamProcUnit::set_rx_format(const struct v4l2_subdev_selection& sns_sd_sel,
219*4882a593Smuzhiyun uint32_t sns_v4l_pix_fmt)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun for (int i = 0; i < 3; i++) {
224*4882a593Smuzhiyun if (!_dev[i].ptr()) {
225*4882a593Smuzhiyun ret = XCAM_RETURN_ERROR_PARAM;
226*4882a593Smuzhiyun break;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun ret = _dev[i]->set_format(sns_sd_sel.r.width,
230*4882a593Smuzhiyun sns_sd_sel.r.height,
231*4882a593Smuzhiyun sns_v4l_pix_fmt,
232*4882a593Smuzhiyun V4L2_FIELD_NONE,
233*4882a593Smuzhiyun 0);
234*4882a593Smuzhiyun if (ret < 0) {
235*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) set format failed", _dev[i]->get_device_name());
236*4882a593Smuzhiyun } else {
237*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) set rx fmt info: fmt 0x%x, %dx%d !",
238*4882a593Smuzhiyun _dev[i]->get_device_name(), sns_v4l_pix_fmt,
239*4882a593Smuzhiyun sns_sd_sel.r.width, sns_sd_sel.r.height);
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun return ret;
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun void
set_devices(SmartPtr<V4l2SubDevice> ispdev,CamHwIsp20 * handle)247*4882a593Smuzhiyun RawStreamProcUnit::set_devices(SmartPtr<V4l2SubDevice> ispdev, CamHwIsp20* handle)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun _isp_core_dev = ispdev;
250*4882a593Smuzhiyun _camHw = handle;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun XCamReturn
poll_buffer_ready(SmartPtr<V4l2BufferProxy> & buf,int dev_index)254*4882a593Smuzhiyun RawStreamProcUnit::poll_buffer_ready (SmartPtr<V4l2BufferProxy> &buf, int dev_index)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun SmartLock locker (_buf_mutex);
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun if (!buf_list[dev_index].is_empty()) {
259*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> rx_buf = buf_list[dev_index].pop(-1);
260*4882a593Smuzhiyun LOG1_CAMHW_SUBM(ISP20HW_SUBM,"%s dev_index:%d index:%d fd:%d\n",
261*4882a593Smuzhiyun __func__, dev_index, rx_buf->get_v4l2_buf_index(), rx_buf->get_expbuf_fd());
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun if (_PollCallback)
264*4882a593Smuzhiyun _PollCallback->poll_buffer_ready (buf, dev_index);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun void
set_hdr_frame_readback_infos(uint32_t frame_id,int times)270*4882a593Smuzhiyun RawStreamProcUnit::set_hdr_frame_readback_infos(uint32_t frame_id, int times)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun if (_working_mode == RK_AIQ_WORKING_MODE_NORMAL)
273*4882a593Smuzhiyun return;
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun _mipi_trigger_mutex.lock();
276*4882a593Smuzhiyun _isp_hdr_fid2times_map[frame_id] = times;
277*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "rdtimes seq %d \n", frame_id);
278*4882a593Smuzhiyun // trigger_isp_readback();
279*4882a593Smuzhiyun _mipi_trigger_mutex.unlock();
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun void
match_lumadetect_map(uint32_t sequence,sint32_t & additional_times)283*4882a593Smuzhiyun RawStreamProcUnit::match_lumadetect_map(uint32_t sequence, sint32_t &additional_times)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun std::map<uint32_t, int>::iterator it_times_del;
286*4882a593Smuzhiyun _mipi_trigger_mutex.lock();
287*4882a593Smuzhiyun for (std::map<uint32_t, int>::iterator iter = _isp_hdr_fid2times_map.begin();
288*4882a593Smuzhiyun iter != _isp_hdr_fid2times_map.end();) {
289*4882a593Smuzhiyun if (iter->first < sequence) {
290*4882a593Smuzhiyun it_times_del = iter++;
291*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "del seq %d", it_times_del->first);
292*4882a593Smuzhiyun iter = _isp_hdr_fid2times_map.erase(it_times_del);
293*4882a593Smuzhiyun } else if (iter->first == sequence) {
294*4882a593Smuzhiyun additional_times = iter->second;
295*4882a593Smuzhiyun it_times_del = iter++;
296*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "del seq %d", it_times_del->first);
297*4882a593Smuzhiyun iter = _isp_hdr_fid2times_map.erase(it_times_del);
298*4882a593Smuzhiyun break;
299*4882a593Smuzhiyun } else {
300*4882a593Smuzhiyun LOGW_CAMHW_SUBM(ISP20HW_SUBM, "%s missing rdtimes for buf_seq %d, min rdtimes_seq %d !",
301*4882a593Smuzhiyun __func__, sequence, iter->first);
302*4882a593Smuzhiyun additional_times = 0;
303*4882a593Smuzhiyun break;
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun _mipi_trigger_mutex.unlock();
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun void
match_globaltmostate_map(uint32_t sequence,bool & isHdrGlobalTmo)310*4882a593Smuzhiyun RawStreamProcUnit::match_globaltmostate_map(uint32_t sequence, bool &isHdrGlobalTmo)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun std::map<uint32_t, bool>::iterator it_del;
313*4882a593Smuzhiyun _mipi_trigger_mutex.lock();
314*4882a593Smuzhiyun for (std::map<uint32_t, bool>::iterator iter = _hdr_global_tmo_state_map.begin();
315*4882a593Smuzhiyun iter != _hdr_global_tmo_state_map.end();) {
316*4882a593Smuzhiyun if (iter->first < sequence) {
317*4882a593Smuzhiyun it_del = iter++;
318*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "del seq %d", it_del->first);
319*4882a593Smuzhiyun iter = _hdr_global_tmo_state_map.erase(it_del);
320*4882a593Smuzhiyun } else if (iter->first == sequence) {
321*4882a593Smuzhiyun isHdrGlobalTmo = iter->second;
322*4882a593Smuzhiyun it_del = iter++;
323*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "del seq %d", it_del->first);
324*4882a593Smuzhiyun iter = _hdr_global_tmo_state_map.erase(it_del);
325*4882a593Smuzhiyun break;
326*4882a593Smuzhiyun } else {
327*4882a593Smuzhiyun LOGW_CAMHW_SUBM(ISP20HW_SUBM, "%s missing tmo state for buf_seq %d, min rdtimes_seq %d !",
328*4882a593Smuzhiyun __func__, sequence, iter->first);
329*4882a593Smuzhiyun break;
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun _mipi_trigger_mutex.unlock();
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun XCamReturn
match_sof_timestamp_map(sint32_t sequence,uint64_t & timestamp)336*4882a593Smuzhiyun RawStreamProcUnit::match_sof_timestamp_map(sint32_t sequence, uint64_t ×tamp)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
339*4882a593Smuzhiyun std::map<int, uint64_t>::iterator it;
340*4882a593Smuzhiyun sint32_t search_id = sequence < 0 ? 0 : sequence;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun it = _sof_timestamp_map.find(search_id);
343*4882a593Smuzhiyun if (it != _sof_timestamp_map.end()) {
344*4882a593Smuzhiyun timestamp = it->second;
345*4882a593Smuzhiyun } else {
346*4882a593Smuzhiyun LOGW_CAMHW_SUBM(ISP20HW_SUBM, "can't find frameid(%d), get sof timestamp failed!\n",
347*4882a593Smuzhiyun sequence);
348*4882a593Smuzhiyun ret = XCAM_RETURN_ERROR_FAILED;
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun return ret;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun void
set_hdr_global_tmo_mode(uint32_t frame_id,bool mode)355*4882a593Smuzhiyun RawStreamProcUnit::set_hdr_global_tmo_mode(uint32_t frame_id, bool mode)
356*4882a593Smuzhiyun {
357*4882a593Smuzhiyun _mipi_trigger_mutex.lock();
358*4882a593Smuzhiyun _hdr_global_tmo_state_map[frame_id] = mode;
359*4882a593Smuzhiyun _mipi_trigger_mutex.unlock();
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun void
notify_sof(uint64_t time,uint32_t frameid)363*4882a593Smuzhiyun RawStreamProcUnit::notify_sof(uint64_t time, uint32_t frameid)
364*4882a593Smuzhiyun {
365*4882a593Smuzhiyun _mipi_trigger_mutex.lock();
366*4882a593Smuzhiyun while (_sof_timestamp_map.size() > 8) {
367*4882a593Smuzhiyun _sof_timestamp_map.erase(_sof_timestamp_map.begin());
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun _sof_timestamp_map[frameid] = time;
370*4882a593Smuzhiyun _mipi_trigger_mutex.unlock();
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
raw_buffer_proc()373*4882a593Smuzhiyun bool RawStreamProcUnit::raw_buffer_proc()
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun LOGD("%s enter", __FUNCTION__);
376*4882a593Smuzhiyun int ret = true;
377*4882a593Smuzhiyun auto v = _msg_queue.front();
378*4882a593Smuzhiyun if (v)
379*4882a593Smuzhiyun trigger_isp_readback();
380*4882a593Smuzhiyun else
381*4882a593Smuzhiyun ret = false;
382*4882a593Smuzhiyun _msg_queue.pop();
383*4882a593Smuzhiyun LOGD("%s exit", __FUNCTION__);
384*4882a593Smuzhiyun return ret;
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun void
send_sync_buf(SmartPtr<V4l2BufferProxy> & buf_s,SmartPtr<V4l2BufferProxy> & buf_m,SmartPtr<V4l2BufferProxy> & buf_l)388*4882a593Smuzhiyun RawStreamProcUnit::send_sync_buf
389*4882a593Smuzhiyun (
390*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> &buf_s,
391*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> &buf_m,
392*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> &buf_l
393*4882a593Smuzhiyun )
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun _buf_mutex.lock();
396*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
397*4882a593Smuzhiyun if (i == ISP_MIPI_HDR_S)
398*4882a593Smuzhiyun cache_list[ISP_MIPI_HDR_S].push(buf_s);
399*4882a593Smuzhiyun else if (i == ISP_MIPI_HDR_M)
400*4882a593Smuzhiyun cache_list[ISP_MIPI_HDR_M].push(buf_m);
401*4882a593Smuzhiyun else if (i == ISP_MIPI_HDR_L)
402*4882a593Smuzhiyun cache_list[ISP_MIPI_HDR_L].push(buf_l);
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun _isp_hdr_fid2ready_map[buf_s->get_sequence()] = true;
405*4882a593Smuzhiyun _buf_mutex.unlock();
406*4882a593Smuzhiyun _msg_queue.push(1);
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun void
trigger_isp_readback()410*4882a593Smuzhiyun RawStreamProcUnit::trigger_isp_readback()
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun std::map<uint32_t, bool>::iterator it_ready;
413*4882a593Smuzhiyun SmartPtr<V4l2Buffer> v4l2buf[3];
414*4882a593Smuzhiyun SmartPtr<V4l2BufferProxy> buf_proxy;
415*4882a593Smuzhiyun uint32_t sequence = -1;
416*4882a593Smuzhiyun sint32_t additional_times = -1;
417*4882a593Smuzhiyun bool isHdrGlobalTmo = false;
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun SmartLock locker (_buf_mutex);
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun if (_isp_hdr_fid2ready_map.size() == 0) {
422*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%s buf not ready !", __func__);
423*4882a593Smuzhiyun return;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun it_ready = _isp_hdr_fid2ready_map.begin();
427*4882a593Smuzhiyun sequence = it_ready->first;
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun if ( _working_mode != RK_AIQ_WORKING_MODE_NORMAL) {
430*4882a593Smuzhiyun match_lumadetect_map(sequence, additional_times);
431*4882a593Smuzhiyun if (additional_times == -1) {
432*4882a593Smuzhiyun // LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%s rdtimes not ready for seq %d !", __func__, sequence);
433*4882a593Smuzhiyun // return;
434*4882a593Smuzhiyun additional_times = 0;//add by zyl
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun match_globaltmostate_map(sequence, isHdrGlobalTmo);
438*4882a593Smuzhiyun //if (isHdrGlobalTmo && !_camHw->getDhazState())
439*4882a593Smuzhiyun // additional_times = 0;
440*4882a593Smuzhiyun } else {
441*4882a593Smuzhiyun additional_times = 0;
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun _isp_hdr_fid2ready_map.erase(it_ready);
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun if (_camHw) {
446*4882a593Smuzhiyun {
447*4882a593Smuzhiyun int ret = XCAM_RETURN_NO_ERROR;
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun // whether to start capturing raw files
450*4882a593Smuzhiyun if (_rawCap)
451*4882a593Smuzhiyun _rawCap->detect_capture_raw_status(sequence, _first_trigger);
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun //CaptureRawData::getInstance().detect_capture_raw_status(sequence, _first_trigger);
454*4882a593Smuzhiyun //_camHw->setIsppConfig(sequence);
455*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
456*4882a593Smuzhiyun ret = _dev[i]->get_buffer(v4l2buf[i],
457*4882a593Smuzhiyun cache_list[i].front()->get_v4l2_buf_index());
458*4882a593Smuzhiyun if (ret != XCAM_RETURN_NO_ERROR) {
459*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Rx[%d] can not get buffer\n", i);
460*4882a593Smuzhiyun goto out;
461*4882a593Smuzhiyun } else {
462*4882a593Smuzhiyun buf_proxy = cache_list[i].pop(-1);
463*4882a593Smuzhiyun #if 0
464*4882a593Smuzhiyun if (_first_trigger) {
465*4882a593Smuzhiyun u8 *buf = (u8 *)buf_proxy->get_v4l2_userptr();
466*4882a593Smuzhiyun struct v4l2_format format = v4l2buf[i]->get_format();
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun if (buf) {
469*4882a593Smuzhiyun for (u32 j = 0; j < format.fmt.pix.width / 2; j++)
470*4882a593Smuzhiyun *buf++ += j % 16;
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun #endif
474*4882a593Smuzhiyun buf_list[i].push(buf_proxy);
475*4882a593Smuzhiyun if (_dev[i]->get_mem_type() == V4L2_MEMORY_USERPTR)
476*4882a593Smuzhiyun v4l2buf[i]->set_expbuf_usrptr(buf_proxy->get_v4l2_userptr());
477*4882a593Smuzhiyun else if (_dev[i]->get_mem_type() == V4L2_MEMORY_DMABUF){
478*4882a593Smuzhiyun v4l2buf[i]->set_expbuf_fd(buf_proxy->get_expbuf_fd());
479*4882a593Smuzhiyun }else if (_dev[i]->get_mem_type() == V4L2_MEMORY_MMAP) {
480*4882a593Smuzhiyun if (_dev[i]->get_use_type() == 1)
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun memcpy((void*)v4l2buf[i]->get_expbuf_usrptr(),(void*)buf_proxy->get_v4l2_userptr(),v4l2buf[i]->get_buf().m.planes[0].length);
483*4882a593Smuzhiyun v4l2buf[i]->set_reserved(buf_proxy->get_v4l2_userptr());
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun if (_rawCap) {
488*4882a593Smuzhiyun _rawCap->dynamic_capture_raw(i, sequence, buf_proxy, v4l2buf[i],_mipi_dev_max,_working_mode,_dev[0]);
489*4882a593Smuzhiyun }
490*4882a593Smuzhiyun //CaptureRawData::getInstance().dynamic_capture_raw(i, sequence, buf_proxy, v4l2buf[i],_mipi_dev_max,_working_mode,_dev[0]);
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun if (_rawCap) {
495*4882a593Smuzhiyun if (_rawCap->is_need_save_metadata_and_register()) {
496*4882a593Smuzhiyun rkisp_effect_params_v20 ispParams;
497*4882a593Smuzhiyun _camHw->getEffectiveIspParams(ispParams, sequence);
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun SmartPtr<BaseSensorHw> mSensorSubdev = _camHw->mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
500*4882a593Smuzhiyun SmartPtr<RkAiqSensorExpParamsProxy> ExpParams = nullptr;
501*4882a593Smuzhiyun mSensorSubdev->getEffectiveExpParams(ExpParams, sequence);
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun SmartPtr<LensHw> mLensSubdev = _camHw->mLensDev.dynamic_cast_ptr<LensHw>();
504*4882a593Smuzhiyun SmartPtr<RkAiqAfInfoProxy> afParams = nullptr;
505*4882a593Smuzhiyun if (mLensSubdev.ptr())
506*4882a593Smuzhiyun mLensSubdev->getAfInfoParams(afParams, sequence);
507*4882a593Smuzhiyun _rawCap->save_metadata_and_register(sequence, ispParams, ExpParams, afParams, _working_mode);
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun }
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun for (int i = 0; i < _mipi_dev_max; i++) {
512*4882a593Smuzhiyun ret = _dev[i]->queue_buffer(v4l2buf[i]);
513*4882a593Smuzhiyun if (ret != XCAM_RETURN_NO_ERROR) {
514*4882a593Smuzhiyun buf_list[i].pop(-1);
515*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Rx[%d] queue buffer failed\n", i);
516*4882a593Smuzhiyun break;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun struct isp2x_csi_trigger tg = {
521*4882a593Smuzhiyun .sof_timestamp = 0,
522*4882a593Smuzhiyun .frame_timestamp = 0,
523*4882a593Smuzhiyun .frame_id = sequence,
524*4882a593Smuzhiyun .times = 0,
525*4882a593Smuzhiyun .mode = _mipi_dev_max == 1 ? T_START_X1 :
526*4882a593Smuzhiyun _mipi_dev_max == 2 ? T_START_X2 : T_START_X3,
527*4882a593Smuzhiyun /* .mode = T_START_X2, */
528*4882a593Smuzhiyun };
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun if (_first_trigger)
531*4882a593Smuzhiyun tg.times = 1;
532*4882a593Smuzhiyun else
533*4882a593Smuzhiyun tg.times += additional_times;
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun if (tg.times > 2)
536*4882a593Smuzhiyun tg.times = 2;
537*4882a593Smuzhiyun if (_is_multi_cam_conc && (tg.times < 1))
538*4882a593Smuzhiyun tg.times = 1;
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun uint64_t sof_timestamp = 0;
541*4882a593Smuzhiyun match_sof_timestamp_map(tg.frame_id, sof_timestamp);
542*4882a593Smuzhiyun tg.sof_timestamp = sof_timestamp;
543*4882a593Smuzhiyun tg.frame_timestamp = buf_proxy->get_timestamp () * 1000;
544*4882a593Smuzhiyun // tg.times = 1;//fixed to three times readback
545*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM,
546*4882a593Smuzhiyun "camId: %d, frameId: %d: sof_ts %" PRId64 "ms, frame_ts %" PRId64 "ms, trigger readback times: %d\n",
547*4882a593Smuzhiyun mCamPhyId, sequence,
548*4882a593Smuzhiyun tg.sof_timestamp / 1000 / 1000,
549*4882a593Smuzhiyun tg.frame_timestamp / 1000 / 1000,
550*4882a593Smuzhiyun tg.times);
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun if (ret == XCAM_RETURN_NO_ERROR) {
553*4882a593Smuzhiyun _isp_core_dev->io_control(RKISP_CMD_TRIGGER_READ_BACK, &tg);
554*4882a593Smuzhiyun } else {
555*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%s frame[%d] queue failed, don't read back!\n",
556*4882a593Smuzhiyun __func__, sequence);
557*4882a593Smuzhiyun }
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun if (_rawCap)
560*4882a593Smuzhiyun _rawCap->update_capture_raw_status(_first_trigger);
561*4882a593Smuzhiyun //CaptureRawData::getInstance().update_capture_raw_status(_first_trigger);
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun _first_trigger = false;
566*4882a593Smuzhiyun out:
567*4882a593Smuzhiyun return;
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun XCamReturn
set_csi_mem_word_big_align(uint32_t width,uint32_t height,uint32_t sns_v4l_pix_fmt,int8_t sns_bpp)571*4882a593Smuzhiyun RawStreamProcUnit::set_csi_mem_word_big_align(uint32_t width, uint32_t height,
572*4882a593Smuzhiyun uint32_t sns_v4l_pix_fmt, int8_t sns_bpp)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM,"sensor fmt 0x%x, %dx%d, sns_bpp: %d",
577*4882a593Smuzhiyun sns_v4l_pix_fmt, width, height, sns_bpp);
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun for (int i = 0; i < 3; i++) {
580*4882a593Smuzhiyun if (!_dev[i].ptr()) {
581*4882a593Smuzhiyun ret = XCAM_RETURN_BYPASS;
582*4882a593Smuzhiyun break;
583*4882a593Smuzhiyun }
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun if (((width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL) * sns_bpp / 8) & 0xf) {
586*4882a593Smuzhiyun int mem_mode = CSI_MEM_WORD_BIG_ALIGN;
587*4882a593Smuzhiyun int ret1 = _dev[i]->io_control (RKISP_CMD_SET_CSI_MEMORY_MODE, &mem_mode);
588*4882a593Smuzhiyun if (ret1) {
589*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set CSI_MEM_WORD_BIG_ALIGN failed !\n");
590*4882a593Smuzhiyun ret = XCAM_RETURN_ERROR_IOCTL;
591*4882a593Smuzhiyun } else {
592*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM,"set the memory mode of isp rx to big align");
593*4882a593Smuzhiyun }
594*4882a593Smuzhiyun }
595*4882a593Smuzhiyun }
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun return ret;
598*4882a593Smuzhiyun }
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun }
601*4882a593Smuzhiyun
602