xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/fakecamera/FakeCamHwIsp20.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  Copyright (c) 2019 Rockchip Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include "FakeCamHwIsp20.h"
19*4882a593Smuzhiyun #include "Isp20Evts.h"
20*4882a593Smuzhiyun #include "FakeSensorHw.h"
21*4882a593Smuzhiyun #include "rk_isp20_hw.h"
22*4882a593Smuzhiyun #include "Isp20_module_dbg.h"
23*4882a593Smuzhiyun #include "mediactl/mediactl-priv.h"
24*4882a593Smuzhiyun #include <linux/v4l2-subdev.h>
25*4882a593Smuzhiyun #include <sys/mman.h>
26*4882a593Smuzhiyun #include <sys/stat.h>
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun namespace RkCam {
FakeCamHwIsp20()29*4882a593Smuzhiyun FakeCamHwIsp20::FakeCamHwIsp20() : isp_index(0)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
32*4882a593Smuzhiyun     _rx_memory_type = V4L2_MEMORY_DMABUF;
33*4882a593Smuzhiyun     _tx_memory_type = V4L2_MEMORY_DMABUF;
34*4882a593Smuzhiyun     mNoReadBack = false;
35*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun 
~FakeCamHwIsp20()38*4882a593Smuzhiyun FakeCamHwIsp20::~FakeCamHwIsp20()
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
41*4882a593Smuzhiyun     setupOffLineLink(isp_index, false);
42*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun XCamReturn
init(const char * sns_ent_name)46*4882a593Smuzhiyun FakeCamHwIsp20::init(const char* sns_ent_name)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun     ret = CamHwIsp20::init(sns_ent_name);
51*4882a593Smuzhiyun     if (ret)
52*4882a593Smuzhiyun         return ret;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun     // special for fake sensor
55*4882a593Smuzhiyun     SmartPtr<BaseSensorHw> sensorHw;
56*4882a593Smuzhiyun     mSensorDev->close();
57*4882a593Smuzhiyun     sensorHw = new FakeSensorHw();
58*4882a593Smuzhiyun     mSensorDev = sensorHw;
59*4882a593Smuzhiyun     mSensorDev->open();
60*4882a593Smuzhiyun     mIspStatsStream->set_event_handle_dev(sensorHw);
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun XCamReturn
prepare(uint32_t width,uint32_t height,int mode,int t_delay,int g_delay)66*4882a593Smuzhiyun FakeCamHwIsp20::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
69*4882a593Smuzhiyun     SmartPtr<BaseSensorHw> sensorHw;
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun     SmartPtr<FakeSensorHw> fakeSensorHw = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
76*4882a593Smuzhiyun     if ((it = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
77*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
78*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_SENSOR;
79*4882a593Smuzhiyun     }
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun     rk_sensor_full_info_t *s_info = it->second.ptr();
82*4882a593Smuzhiyun     isp_index = s_info->isp_info->logic_id;
83*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
84*4882a593Smuzhiyun     setupOffLineLink(isp_index, true);
85*4882a593Smuzhiyun #endif
86*4882a593Smuzhiyun     init_mipi_devices(s_info);
87*4882a593Smuzhiyun     fakeSensorHw->set_mipi_tx_devs(_mipi_tx_devs);
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #ifndef USE_RAWSTREAM_LIB
90*4882a593Smuzhiyun     mRawCapUnit->set_tx_devices(_mipi_tx_devs);
91*4882a593Smuzhiyun     mRawProcUnit->set_rx_devices(_mipi_rx_devs);
92*4882a593Smuzhiyun     mRawProcUnit->setPollCallback(this);
93*4882a593Smuzhiyun #endif
94*4882a593Smuzhiyun     ret = CamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
95*4882a593Smuzhiyun     if (ret)
96*4882a593Smuzhiyun         return ret;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     if (mIspSofStream.ptr())
99*4882a593Smuzhiyun         mIspSofStream->setPollCallback (NULL);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
102*4882a593Smuzhiyun     return ret;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun XCamReturn
poll_buffer_ready(SmartPtr<V4l2BufferProxy> & buf,int dev_index)106*4882a593Smuzhiyun FakeCamHwIsp20::poll_buffer_ready (SmartPtr<V4l2BufferProxy> &buf, int dev_index)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun     SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
109*4882a593Smuzhiyun     // notify fakesensor one frame has been processed by ISP
110*4882a593Smuzhiyun     return fakeSensor->on_dqueue(dev_index, buf);
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun XCamReturn
init_mipi_devices(rk_sensor_full_info_t * s_info)114*4882a593Smuzhiyun FakeCamHwIsp20::init_mipi_devices(rk_sensor_full_info_t *s_info)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun     /*
117*4882a593Smuzhiyun      * for _mipi_tx_devs, index 0 refer to short frame always, inedex 1 refer
118*4882a593Smuzhiyun      * to middle frame always, index 2 refert to long frame always.
119*4882a593Smuzhiyun      * for CIF usecase, because mipi_id0 refert to long frame always, so we
120*4882a593Smuzhiyun      * should know the HDR mode firstly befor building the relationship between
121*4882a593Smuzhiyun      * _mipi_tx_devs array and mipi_idx. here we just set the mipi_idx to
122*4882a593Smuzhiyun      * _mipi_tx_devs, we will build the real relation in start.
123*4882a593Smuzhiyun      * for CIF usecase, rawwr2_path is always connected to _mipi_tx_devs[0],
124*4882a593Smuzhiyun      * rawwr0_path is always connected to _mipi_tx_devs[1], and rawwr1_path is always
125*4882a593Smuzhiyun      * connected to _mipi_tx_devs[0]
126*4882a593Smuzhiyun      */
127*4882a593Smuzhiyun     //short frame
128*4882a593Smuzhiyun     _mipi_tx_devs[0] = new FakeV4l2Device ();
129*4882a593Smuzhiyun     _mipi_tx_devs[0]->open();
130*4882a593Smuzhiyun     _mipi_tx_devs[0]->set_mem_type(_tx_memory_type);
131*4882a593Smuzhiyun     _mipi_tx_devs[0]->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun     _mipi_rx_devs[0] = new V4l2Device (s_info->isp_info->rawrd2_s_path);//rkisp_rawrd2_s
134*4882a593Smuzhiyun     _mipi_rx_devs[0]->open();
135*4882a593Smuzhiyun     _mipi_rx_devs[0]->set_mem_type(_rx_memory_type);
136*4882a593Smuzhiyun     //mid frame
137*4882a593Smuzhiyun     _mipi_tx_devs[1] = new FakeV4l2Device ();
138*4882a593Smuzhiyun     _mipi_tx_devs[1]->open();
139*4882a593Smuzhiyun     _mipi_tx_devs[1]->set_mem_type(_tx_memory_type);
140*4882a593Smuzhiyun     _mipi_tx_devs[1]->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun     _mipi_rx_devs[1] = new V4l2Device (s_info->isp_info->rawrd0_m_path);//rkisp_rawrd0_m
143*4882a593Smuzhiyun     _mipi_rx_devs[1]->open();
144*4882a593Smuzhiyun     _mipi_rx_devs[1]->set_mem_type(_rx_memory_type);
145*4882a593Smuzhiyun     //long frame
146*4882a593Smuzhiyun     _mipi_tx_devs[2] = new FakeV4l2Device ();
147*4882a593Smuzhiyun     _mipi_tx_devs[2]->open();
148*4882a593Smuzhiyun     _mipi_tx_devs[2]->set_mem_type(_tx_memory_type);
149*4882a593Smuzhiyun     _mipi_tx_devs[2]->set_buf_type(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun     _mipi_rx_devs[2] = new V4l2Device (s_info->isp_info->rawrd1_l_path);//rkisp_rawrd1_l
152*4882a593Smuzhiyun     _mipi_rx_devs[2]->open();
153*4882a593Smuzhiyun     _mipi_rx_devs[2]->set_mem_type(_rx_memory_type);
154*4882a593Smuzhiyun     for (int i = 0; i < 3; i++) {
155*4882a593Smuzhiyun         if (_linked_to_isp) {
156*4882a593Smuzhiyun             if (_rawbuf_type == RK_AIQ_RAW_FILE) {
157*4882a593Smuzhiyun                 _mipi_tx_devs[0]->set_use_type(2);
158*4882a593Smuzhiyun                 _mipi_tx_devs[i]->set_buffer_count(1);
159*4882a593Smuzhiyun                 _mipi_rx_devs[i]->set_buffer_count(1);
160*4882a593Smuzhiyun             } else if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
161*4882a593Smuzhiyun                  _mipi_tx_devs[0]->set_use_type(1);
162*4882a593Smuzhiyun                 _mipi_tx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
163*4882a593Smuzhiyun                 _mipi_rx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
164*4882a593Smuzhiyun             } else {
165*4882a593Smuzhiyun                 _mipi_tx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
166*4882a593Smuzhiyun                 _mipi_rx_devs[i]->set_buffer_count(ISP_TX_BUF_NUM);
167*4882a593Smuzhiyun             }
168*4882a593Smuzhiyun         } else {
169*4882a593Smuzhiyun             _mipi_tx_devs[i]->set_buffer_count(VIPCAP_TX_BUF_NUM);
170*4882a593Smuzhiyun             _mipi_rx_devs[i]->set_buffer_count(VIPCAP_TX_BUF_NUM);
171*4882a593Smuzhiyun         }
172*4882a593Smuzhiyun         SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
173*4882a593Smuzhiyun         rk_aiq_exposure_sensor_descriptor sns_des;
174*4882a593Smuzhiyun         fakeSensor->get_sensor_desc(&sns_des);
175*4882a593Smuzhiyun         _mipi_tx_devs[i]->set_format(sns_des.sensor_output_width,
176*4882a593Smuzhiyun                                      sns_des.sensor_output_height,
177*4882a593Smuzhiyun                                      sns_des.sensor_pixelformat);
178*4882a593Smuzhiyun         _mipi_rx_devs[i]->set_format(sns_des.sensor_output_width,
179*4882a593Smuzhiyun                                      sns_des.sensor_output_height,
180*4882a593Smuzhiyun                                      sns_des.sensor_pixelformat);
181*4882a593Smuzhiyun     }
182*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun XCamReturn
poll_event_ready(uint32_t sequence,int type)186*4882a593Smuzhiyun FakeCamHwIsp20::poll_event_ready (uint32_t sequence, int type)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun     struct v4l2_event event;
189*4882a593Smuzhiyun     event.u.frame_sync.frame_sequence = sequence;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun     mIspSofStream->stop();
192*4882a593Smuzhiyun     SmartPtr<VideoBuffer> buf =
193*4882a593Smuzhiyun         mIspSofStream->new_video_buffer(event, NULL);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun     CamHwBase::poll_buffer_ready(buf);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun XCamReturn
enqueueRawBuffer(void * rawdata,bool sync)201*4882a593Smuzhiyun FakeCamHwIsp20::enqueueRawBuffer(void *rawdata, bool sync)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun     ENTER_XCORE_FUNCTION();
204*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
205*4882a593Smuzhiyun     struct rk_aiq_vbuf vbuf;
206*4882a593Smuzhiyun     memset(&vbuf, 0, sizeof(vbuf));
207*4882a593Smuzhiyun     parse_rk_rawdata(rawdata, &vbuf);
208*4882a593Smuzhiyun     SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
209*4882a593Smuzhiyun     fakeSensor->enqueue_rawbuffer(&vbuf, sync);
210*4882a593Smuzhiyun     poll_event_ready(vbuf.buf_info[0].frame_id, V4L2_EVENT_FRAME_SYNC);
211*4882a593Smuzhiyun     EXIT_XCORE_FUNCTION();
212*4882a593Smuzhiyun     return ret;
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun XCamReturn
enqueueRawFile(const char * path)216*4882a593Smuzhiyun FakeCamHwIsp20::enqueueRawFile(const char *path)
217*4882a593Smuzhiyun {
218*4882a593Smuzhiyun     ENTER_XCORE_FUNCTION();
219*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
220*4882a593Smuzhiyun     struct rk_aiq_vbuf vbuf;
221*4882a593Smuzhiyun     memset(&vbuf, 0, sizeof(vbuf));
222*4882a593Smuzhiyun     if (0 != access(path, F_OK)) {
223*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(FAKECAM_SUBM, "file: %s is not exist!", path);
224*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
225*4882a593Smuzhiyun     }
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun     FILE *fp = fopen(path, "rb");
228*4882a593Smuzhiyun     if (!fp) {
229*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(FAKECAM_SUBM, "open file: %s failed", path);
230*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
231*4882a593Smuzhiyun     }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun     ret = parse_rk_rawfile(fp, &vbuf);
234*4882a593Smuzhiyun     if (ret != XCAM_RETURN_NO_ERROR) {
235*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(FAKECAM_SUBM, "Failed to parse rk rawfile!");
236*4882a593Smuzhiyun         fclose(fp);
237*4882a593Smuzhiyun         return ret;
238*4882a593Smuzhiyun     }
239*4882a593Smuzhiyun     fclose(fp);
240*4882a593Smuzhiyun     SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
241*4882a593Smuzhiyun     fakeSensor->enqueue_rawbuffer(&vbuf, true);
242*4882a593Smuzhiyun     poll_event_ready(vbuf.buf_info[0].frame_id, V4L2_EVENT_FRAME_SYNC);
243*4882a593Smuzhiyun     EXIT_XCORE_FUNCTION();
244*4882a593Smuzhiyun     return ret;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun void
parse_rk_rawdata(void * rawdata,struct rk_aiq_vbuf * vbuf)248*4882a593Smuzhiyun FakeCamHwIsp20::parse_rk_rawdata(void *rawdata, struct rk_aiq_vbuf *vbuf)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun     unsigned short tag = 0;
251*4882a593Smuzhiyun     struct _block_header header;
252*4882a593Smuzhiyun     uint8_t *p = (uint8_t *)rawdata;
253*4882a593Smuzhiyun     uint8_t *actual_raw[3] = {NULL, NULL, NULL};
254*4882a593Smuzhiyun     int actual_raw_len[3] = {0, 0, 0};
255*4882a593Smuzhiyun     bool is_actual_rawdata = false;
256*4882a593Smuzhiyun     bool bExit = false;
257*4882a593Smuzhiyun     while(!bExit){
258*4882a593Smuzhiyun         tag = *((unsigned short*)p);
259*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(FAKECAM_SUBM, "tag=0x%04x\n",tag);
260*4882a593Smuzhiyun         switch (tag)
261*4882a593Smuzhiyun         {
262*4882a593Smuzhiyun         	case START_TAG:
263*4882a593Smuzhiyun             	p = p+TAG_BYTE_LEN;
264*4882a593Smuzhiyun             	memset(_st_addr, 0, sizeof(_st_addr));
265*4882a593Smuzhiyun             	memset(&_rawfmt, 0, sizeof(_rawfmt));
266*4882a593Smuzhiyun             	memset(&_finfo, 0, sizeof(_finfo));
267*4882a593Smuzhiyun             	break;
268*4882a593Smuzhiyun         	case NORMAL_RAW_TAG:
269*4882a593Smuzhiyun         	{
270*4882a593Smuzhiyun                 header = *((struct _block_header *)p);
271*4882a593Smuzhiyun                 p = p + sizeof(struct _block_header);
272*4882a593Smuzhiyun                 if (header.block_length == sizeof(struct _st_addrinfo)) {
273*4882a593Smuzhiyun                     _st_addr[0] = *((struct _st_addrinfo*)p);
274*4882a593Smuzhiyun                 }else{
275*4882a593Smuzhiyun                     //actual raw data
276*4882a593Smuzhiyun                     is_actual_rawdata = true;
277*4882a593Smuzhiyun                     actual_raw[0] = p;
278*4882a593Smuzhiyun                     actual_raw_len[0] = header.block_length;
279*4882a593Smuzhiyun                 }
280*4882a593Smuzhiyun                 p = p + header.block_length;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun             	break;
283*4882a593Smuzhiyun         	}
284*4882a593Smuzhiyun         	case HDR_S_RAW_TAG:
285*4882a593Smuzhiyun         	{
286*4882a593Smuzhiyun                 header = *((struct _block_header *)p);
287*4882a593Smuzhiyun                 p = p + sizeof(struct _block_header);
288*4882a593Smuzhiyun                 if (header.block_length == sizeof(struct _st_addrinfo)) {
289*4882a593Smuzhiyun                     _st_addr[0] = *((struct _st_addrinfo*)p);
290*4882a593Smuzhiyun                 }else{
291*4882a593Smuzhiyun                     //actual raw data
292*4882a593Smuzhiyun                     is_actual_rawdata = true;
293*4882a593Smuzhiyun                     actual_raw[0] = p;
294*4882a593Smuzhiyun                     actual_raw_len[0] = header.block_length;
295*4882a593Smuzhiyun                 }
296*4882a593Smuzhiyun                 p = p + header.block_length;
297*4882a593Smuzhiyun         	    break;
298*4882a593Smuzhiyun         	}
299*4882a593Smuzhiyun         	case HDR_M_RAW_TAG:
300*4882a593Smuzhiyun         	{
301*4882a593Smuzhiyun                 header = *((struct _block_header *)p);
302*4882a593Smuzhiyun                 p = p + sizeof(struct _block_header);
303*4882a593Smuzhiyun                 if (header.block_length == sizeof(struct _st_addrinfo)) {
304*4882a593Smuzhiyun                     _st_addr[1] = *((struct _st_addrinfo*)p);
305*4882a593Smuzhiyun                 }else{
306*4882a593Smuzhiyun                     //actual raw data
307*4882a593Smuzhiyun                     is_actual_rawdata = true;
308*4882a593Smuzhiyun                     actual_raw[1] = p;
309*4882a593Smuzhiyun                     actual_raw_len[1] = header.block_length;
310*4882a593Smuzhiyun                 }
311*4882a593Smuzhiyun                 p = p + header.block_length;
312*4882a593Smuzhiyun             	break;
313*4882a593Smuzhiyun         	}
314*4882a593Smuzhiyun         	case HDR_L_RAW_TAG:
315*4882a593Smuzhiyun         	{
316*4882a593Smuzhiyun                 header = *((struct _block_header *)p);
317*4882a593Smuzhiyun                 p = p + sizeof(struct _block_header);
318*4882a593Smuzhiyun                 if (header.block_length == sizeof(struct _st_addrinfo)) {
319*4882a593Smuzhiyun                     _st_addr[2] = *((struct _st_addrinfo*)p);
320*4882a593Smuzhiyun                 }else{
321*4882a593Smuzhiyun                     //actual raw data
322*4882a593Smuzhiyun                     is_actual_rawdata = true;
323*4882a593Smuzhiyun                     actual_raw[2] = p;
324*4882a593Smuzhiyun                     actual_raw_len[2] = header.block_length;
325*4882a593Smuzhiyun                 }
326*4882a593Smuzhiyun                 p = p + header.block_length;
327*4882a593Smuzhiyun             	break;
328*4882a593Smuzhiyun         	}
329*4882a593Smuzhiyun         	case FORMAT_TAG:
330*4882a593Smuzhiyun         	{
331*4882a593Smuzhiyun             	_rawfmt = *((struct _raw_format *)p);
332*4882a593Smuzhiyun             	LOGD_CAMHW_SUBM(FAKECAM_SUBM, "hdr_mode=%d,bayer_fmt=%d\n",_rawfmt.hdr_mode,_rawfmt.bayer_fmt);
333*4882a593Smuzhiyun             	p = p + sizeof(struct _block_header) + _rawfmt.size;
334*4882a593Smuzhiyun             	break;
335*4882a593Smuzhiyun         	}
336*4882a593Smuzhiyun         	case STATS_TAG:
337*4882a593Smuzhiyun         	{
338*4882a593Smuzhiyun             	_finfo = *((rk_aiq_frame_info_t *)p);
339*4882a593Smuzhiyun             	p = p + sizeof(struct _block_header) + _finfo.size;
340*4882a593Smuzhiyun             	break;
341*4882a593Smuzhiyun         	}
342*4882a593Smuzhiyun         	case ISP_REG_FMT_TAG:
343*4882a593Smuzhiyun         	{
344*4882a593Smuzhiyun         	    header = *((struct _block_header *)p);
345*4882a593Smuzhiyun         	    p += sizeof(struct _block_header);
346*4882a593Smuzhiyun         	    p = p + header.block_length;
347*4882a593Smuzhiyun         	    break;
348*4882a593Smuzhiyun         	}
349*4882a593Smuzhiyun         	case ISP_REG_TAG:
350*4882a593Smuzhiyun         	{
351*4882a593Smuzhiyun         	    header = *((struct _block_header *)p);
352*4882a593Smuzhiyun         	    p += sizeof(struct _block_header);
353*4882a593Smuzhiyun         	    p = p + header.block_length;
354*4882a593Smuzhiyun         	    break;
355*4882a593Smuzhiyun         	}
356*4882a593Smuzhiyun         	case ISPP_REG_FMT_TAG:
357*4882a593Smuzhiyun         	{
358*4882a593Smuzhiyun         	    header = *((struct _block_header *)p);
359*4882a593Smuzhiyun         	    p += sizeof(struct _block_header);
360*4882a593Smuzhiyun         	    p = p + header.block_length;
361*4882a593Smuzhiyun         	    break;
362*4882a593Smuzhiyun         	}
363*4882a593Smuzhiyun         	case ISPP_REG_TAG:
364*4882a593Smuzhiyun         	{
365*4882a593Smuzhiyun         	    header = *((struct _block_header *)p);
366*4882a593Smuzhiyun         	    p += sizeof(struct _block_header);
367*4882a593Smuzhiyun         	    p = p + header.block_length;
368*4882a593Smuzhiyun         	    break;
369*4882a593Smuzhiyun         	}
370*4882a593Smuzhiyun         	case PLATFORM_TAG:
371*4882a593Smuzhiyun         	{
372*4882a593Smuzhiyun             	header = *((struct _block_header *)p);
373*4882a593Smuzhiyun         	    p += sizeof(struct _block_header);
374*4882a593Smuzhiyun         	    p = p + header.block_length;
375*4882a593Smuzhiyun         	    break;
376*4882a593Smuzhiyun         	}
377*4882a593Smuzhiyun         	case END_TAG:
378*4882a593Smuzhiyun         	{
379*4882a593Smuzhiyun                 bExit = true;
380*4882a593Smuzhiyun             	break;
381*4882a593Smuzhiyun             }
382*4882a593Smuzhiyun             default:
383*4882a593Smuzhiyun             {
384*4882a593Smuzhiyun             	LOGE_CAMHW_SUBM(FAKECAM_SUBM, "Not support TAG(0x%04x)\n", tag);
385*4882a593Smuzhiyun             	bExit = true;
386*4882a593Smuzhiyun             	break;
387*4882a593Smuzhiyun         	}
388*4882a593Smuzhiyun         }
389*4882a593Smuzhiyun     }
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun      vbuf->frame_width = _rawfmt.width;
392*4882a593Smuzhiyun      vbuf->frame_height = _rawfmt.height;
393*4882a593Smuzhiyun      vbuf->base_addr = rawdata;
394*4882a593Smuzhiyun      if (_rawfmt.hdr_mode == 1) {
395*4882a593Smuzhiyun          if (is_actual_rawdata) {
396*4882a593Smuzhiyun             vbuf->buf_info[0].data_addr = actual_raw[0];
397*4882a593Smuzhiyun             vbuf->buf_info[0].data_fd = 0;
398*4882a593Smuzhiyun             vbuf->buf_info[0].data_length = actual_raw_len[0];
399*4882a593Smuzhiyun          } else {
400*4882a593Smuzhiyun              if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
401*4882a593Smuzhiyun                  if (sizeof(uint8_t*) == 4) {
402*4882a593Smuzhiyun                      vbuf->buf_info[0].data_addr = (uint8_t*)(long)(_st_addr[0].laddr);
403*4882a593Smuzhiyun                  } else if (sizeof(uint8_t*) == 8) {
404*4882a593Smuzhiyun                      vbuf->buf_info[0].data_addr =
405*4882a593Smuzhiyun                          (uint8_t*)(((uint64_t)_st_addr[0].haddr << 32) + _st_addr[0].laddr);
406*4882a593Smuzhiyun                  }
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun                  vbuf->buf_info[0].data_fd = 0;
409*4882a593Smuzhiyun              } else if (_rawbuf_type == RK_AIQ_RAW_FD) {
410*4882a593Smuzhiyun                  vbuf->buf_info[0].data_fd   = _st_addr[0].fd;
411*4882a593Smuzhiyun                  vbuf->buf_info[0].data_addr = NULL;
412*4882a593Smuzhiyun              }
413*4882a593Smuzhiyun              vbuf->buf_info[0].data_length = _st_addr[0].size;
414*4882a593Smuzhiyun          }
415*4882a593Smuzhiyun           LOGD_CAMHW_SUBM(FAKECAM_SUBM,"data_addr=%p,fd=%d,length=%d\n",
416*4882a593Smuzhiyun                                        vbuf->buf_info[0].data_addr,
417*4882a593Smuzhiyun                                        vbuf->buf_info[0].data_fd,
418*4882a593Smuzhiyun                                        vbuf->buf_info[0].data_length);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun          vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
421*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
422*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
423*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
424*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
425*4882a593Smuzhiyun          vbuf->buf_info[0].valid = true;
426*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
427*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain,
428*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time,
429*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain_reg,
430*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time_reg);
431*4882a593Smuzhiyun     } else if (_rawfmt.hdr_mode == 2) {
432*4882a593Smuzhiyun          if (is_actual_rawdata) {
433*4882a593Smuzhiyun             vbuf->buf_info[0].data_addr = actual_raw[0];
434*4882a593Smuzhiyun             vbuf->buf_info[0].data_fd = 0;
435*4882a593Smuzhiyun             vbuf->buf_info[0].data_length = actual_raw_len[0];
436*4882a593Smuzhiyun          } else {
437*4882a593Smuzhiyun              if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
438*4882a593Smuzhiyun                  if (sizeof(uint8_t*) == 4) {
439*4882a593Smuzhiyun                      vbuf->buf_info[0].data_addr = (uint8_t*)(long)(_st_addr[0].laddr);
440*4882a593Smuzhiyun                  } else if (sizeof(uint8_t*) == 8) {
441*4882a593Smuzhiyun                      vbuf->buf_info[0].data_addr =
442*4882a593Smuzhiyun                          (uint8_t*)(((uint64_t)_st_addr[0].haddr << 32) + _st_addr[0].laddr);
443*4882a593Smuzhiyun                  }
444*4882a593Smuzhiyun                  vbuf->buf_info[0].data_fd = 0;
445*4882a593Smuzhiyun              } else if (_rawbuf_type == RK_AIQ_RAW_FD) {
446*4882a593Smuzhiyun                  vbuf->buf_info[0].data_addr = NULL;
447*4882a593Smuzhiyun                  vbuf->buf_info[0].data_fd   = _st_addr[0].fd;
448*4882a593Smuzhiyun              }
449*4882a593Smuzhiyun              vbuf->buf_info[0].data_length = _st_addr[0].size;
450*4882a593Smuzhiyun          }
451*4882a593Smuzhiyun          vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
452*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain = (float)_finfo.hdr_gain_s;
453*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time = (float)_finfo.hdr_exp_s;
454*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.hdr_gain_s_reg;
455*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.hdr_exp_s_reg;
456*4882a593Smuzhiyun          vbuf->buf_info[0].valid = true;
457*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
458*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_addr,
459*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_fd,
460*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_length);
461*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
462*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain,
463*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time,
464*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain_reg,
465*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time_reg);
466*4882a593Smuzhiyun          if (is_actual_rawdata) {
467*4882a593Smuzhiyun             vbuf->buf_info[1].data_addr = actual_raw[1];//actual_raw[1]
468*4882a593Smuzhiyun             vbuf->buf_info[1].data_fd = 0;
469*4882a593Smuzhiyun             vbuf->buf_info[1].data_length = actual_raw_len[1];//actual_raw_len[1]
470*4882a593Smuzhiyun          } else {
471*4882a593Smuzhiyun              if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
472*4882a593Smuzhiyun                  if (sizeof(uint8_t*) == 4) {
473*4882a593Smuzhiyun                      vbuf->buf_info[1].data_addr = (uint8_t*)(long)(_st_addr[1].laddr);
474*4882a593Smuzhiyun                  } else if (sizeof(uint8_t*) == 8) {
475*4882a593Smuzhiyun                      vbuf->buf_info[1].data_addr =
476*4882a593Smuzhiyun                          (uint8_t*)(((uint64_t)_st_addr[1].haddr << 32) + _st_addr[1].laddr);
477*4882a593Smuzhiyun                  }
478*4882a593Smuzhiyun                  vbuf->buf_info[1].data_fd = 0;
479*4882a593Smuzhiyun              } else if (_rawbuf_type == RK_AIQ_RAW_FD) {
480*4882a593Smuzhiyun                  vbuf->buf_info[1].data_addr = NULL;
481*4882a593Smuzhiyun                  vbuf->buf_info[1].data_fd   = _st_addr[1].fd;
482*4882a593Smuzhiyun              }
483*4882a593Smuzhiyun              vbuf->buf_info[1].data_length = _st_addr[1].size;
484*4882a593Smuzhiyun          }
485*4882a593Smuzhiyun          vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
486*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
487*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
488*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
489*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
490*4882a593Smuzhiyun          vbuf->buf_info[1].valid = true;
491*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
492*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_addr,
493*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_fd,
494*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_length);
495*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
496*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain,
497*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time,
498*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain_reg,
499*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time_reg);
500*4882a593Smuzhiyun     } else if (_rawfmt.hdr_mode == 3) {
501*4882a593Smuzhiyun          if (is_actual_rawdata) {
502*4882a593Smuzhiyun             vbuf->buf_info[0].data_addr = actual_raw[0];
503*4882a593Smuzhiyun             vbuf->buf_info[0].data_fd = 0;
504*4882a593Smuzhiyun             vbuf->buf_info[0].data_length = actual_raw_len[0];
505*4882a593Smuzhiyun          } else {
506*4882a593Smuzhiyun              if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
507*4882a593Smuzhiyun                  if (sizeof(uint8_t*) == 4) {
508*4882a593Smuzhiyun                      vbuf->buf_info[0].data_addr = (uint8_t*)(long)(_st_addr[0].laddr);
509*4882a593Smuzhiyun                  } else if (sizeof(uint8_t*) == 8) {
510*4882a593Smuzhiyun                      vbuf->buf_info[0].data_addr =
511*4882a593Smuzhiyun                          (uint8_t*)(((uint64_t)_st_addr[0].haddr << 32) + _st_addr[0].laddr);
512*4882a593Smuzhiyun                  }
513*4882a593Smuzhiyun                  vbuf->buf_info[0].data_fd = 0;
514*4882a593Smuzhiyun              } else if (_rawbuf_type == RK_AIQ_RAW_FD) {
515*4882a593Smuzhiyun                  vbuf->buf_info[0].data_addr = NULL;
516*4882a593Smuzhiyun                  vbuf->buf_info[0].data_fd   = _st_addr[0].fd;
517*4882a593Smuzhiyun              }
518*4882a593Smuzhiyun              vbuf->buf_info[0].data_length = _st_addr[0].size;
519*4882a593Smuzhiyun          }
520*4882a593Smuzhiyun          vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
521*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain = (float)_finfo.hdr_gain_s;
522*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time = (float)_finfo.hdr_exp_s;
523*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.hdr_gain_s_reg;
524*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.hdr_exp_s_reg;
525*4882a593Smuzhiyun          vbuf->buf_info[0].valid = true;
526*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
527*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_addr,
528*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_fd,
529*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_length);
530*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
531*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain,
532*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time,
533*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain_reg,
534*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time_reg);
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun          if (is_actual_rawdata) {
537*4882a593Smuzhiyun             vbuf->buf_info[1].data_addr = actual_raw[1];
538*4882a593Smuzhiyun             vbuf->buf_info[1].data_fd = 0;
539*4882a593Smuzhiyun             vbuf->buf_info[1].data_length = actual_raw_len[1];
540*4882a593Smuzhiyun          } else {
541*4882a593Smuzhiyun              if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
542*4882a593Smuzhiyun                  if (sizeof(uint8_t*) == 4) {
543*4882a593Smuzhiyun                      vbuf->buf_info[1].data_addr = (uint8_t*)(long)(_st_addr[1].laddr);
544*4882a593Smuzhiyun                  } else if (sizeof(uint8_t*) == 8) {
545*4882a593Smuzhiyun                      vbuf->buf_info[1].data_addr =
546*4882a593Smuzhiyun                          (uint8_t*)(((uint64_t)_st_addr[1].haddr << 32) + _st_addr[1].laddr);
547*4882a593Smuzhiyun                  }
548*4882a593Smuzhiyun                  vbuf->buf_info[1].data_fd = 0;
549*4882a593Smuzhiyun              } else if (_rawbuf_type == RK_AIQ_RAW_FD) {
550*4882a593Smuzhiyun                  vbuf->buf_info[1].data_addr = NULL;
551*4882a593Smuzhiyun                  vbuf->buf_info[1].data_fd   = _st_addr[1].fd;
552*4882a593Smuzhiyun              }
553*4882a593Smuzhiyun              vbuf->buf_info[1].data_length = _st_addr[1].size;
554*4882a593Smuzhiyun          }
555*4882a593Smuzhiyun          vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
556*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
557*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
558*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
559*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
560*4882a593Smuzhiyun          vbuf->buf_info[1].valid = true;
561*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
562*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_addr,
563*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_fd,
564*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_length);
565*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
566*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain,
567*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time,
568*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain_reg,
569*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time_reg);
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun          if (is_actual_rawdata) {
572*4882a593Smuzhiyun             vbuf->buf_info[2].data_addr = actual_raw[2];
573*4882a593Smuzhiyun             vbuf->buf_info[2].data_fd = 0;
574*4882a593Smuzhiyun             vbuf->buf_info[2].data_length = actual_raw_len[2];
575*4882a593Smuzhiyun          } else {
576*4882a593Smuzhiyun              if (_rawbuf_type == RK_AIQ_RAW_ADDR) {
577*4882a593Smuzhiyun                  if (sizeof(uint8_t*) == 4) {
578*4882a593Smuzhiyun                      vbuf->buf_info[2].data_addr = (uint8_t*)(long)(_st_addr[2].laddr);
579*4882a593Smuzhiyun                  } else if (sizeof(uint8_t*) == 8) {
580*4882a593Smuzhiyun                      vbuf->buf_info[2].data_addr =
581*4882a593Smuzhiyun                          (uint8_t*)(((uint64_t)_st_addr[2].haddr << 32) + _st_addr[2].laddr);
582*4882a593Smuzhiyun                  }
583*4882a593Smuzhiyun                  vbuf->buf_info[2].data_fd = 0;
584*4882a593Smuzhiyun              } else if (_rawbuf_type == RK_AIQ_RAW_FD) {
585*4882a593Smuzhiyun                  vbuf->buf_info[2].data_addr = NULL;
586*4882a593Smuzhiyun                  vbuf->buf_info[2].data_fd   = _st_addr[2].fd;
587*4882a593Smuzhiyun              }
588*4882a593Smuzhiyun              vbuf->buf_info[2].data_length = _st_addr[2].size;
589*4882a593Smuzhiyun          }
590*4882a593Smuzhiyun          vbuf->buf_info[2].frame_id = _rawfmt.frame_id;
591*4882a593Smuzhiyun          vbuf->buf_info[2].exp_gain = (float)_finfo.hdr_gain_l;
592*4882a593Smuzhiyun          vbuf->buf_info[2].exp_time = (float)_finfo.hdr_exp_l;
593*4882a593Smuzhiyun          vbuf->buf_info[2].exp_gain_reg = (uint32_t)_finfo.hdr_gain_l_reg;
594*4882a593Smuzhiyun          vbuf->buf_info[2].exp_time_reg = (uint32_t)_finfo.hdr_exp_l_reg;
595*4882a593Smuzhiyun          vbuf->buf_info[2].valid = true;
596*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: data_addr=%p,fd=%d,,length=%d\n",
597*4882a593Smuzhiyun                                       vbuf->buf_info[2].data_addr,
598*4882a593Smuzhiyun                                       vbuf->buf_info[2].data_fd,
599*4882a593Smuzhiyun                                       vbuf->buf_info[2].data_length);
600*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
601*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_gain,
602*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_time,
603*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_gain_reg,
604*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_time_reg);
605*4882a593Smuzhiyun     }
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun XCamReturn
parse_rk_rawfile(FILE * fp,struct rk_aiq_vbuf * vbuf)610*4882a593Smuzhiyun FakeCamHwIsp20::parse_rk_rawfile(FILE *fp, struct rk_aiq_vbuf *vbuf)
611*4882a593Smuzhiyun {
612*4882a593Smuzhiyun     unsigned short tag = 0;
613*4882a593Smuzhiyun     struct _block_header header;
614*4882a593Smuzhiyun     bool bExit = false;
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun     if (!_mipi_rx_devs[0]->is_activated()) {
617*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(FAKECAM_SUBM, "device(%s) hasn't activated(%d) yet!!!\n",
618*4882a593Smuzhiyun                         XCAM_STR (_mipi_rx_devs[0]->get_device_name()),
619*4882a593Smuzhiyun                         _mipi_rx_devs[0]->is_activated());
620*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_FAILED;
621*4882a593Smuzhiyun     }
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun     while(!bExit){
624*4882a593Smuzhiyun         int ret = fread(&tag, sizeof(tag), 1, fp);
625*4882a593Smuzhiyun         if (ret == 0)
626*4882a593Smuzhiyun             break;
627*4882a593Smuzhiyun         fseek(fp, TAG_BYTE_LEN*(-1), SEEK_CUR);//backforwad to tag start
628*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(FAKECAM_SUBM, "tag=0x%04x\n",tag);
629*4882a593Smuzhiyun         switch (tag)
630*4882a593Smuzhiyun         {
631*4882a593Smuzhiyun         	case START_TAG:
632*4882a593Smuzhiyun             	fseek(fp, TAG_BYTE_LEN, SEEK_CUR);
633*4882a593Smuzhiyun             	memset(_st_addr, 0, sizeof(_st_addr));
634*4882a593Smuzhiyun             	memset(&_rawfmt, 0, sizeof(_rawfmt));
635*4882a593Smuzhiyun             	memset(&_finfo, 0, sizeof(_finfo));
636*4882a593Smuzhiyun             	break;
637*4882a593Smuzhiyun         	case NORMAL_RAW_TAG:
638*4882a593Smuzhiyun         	{
639*4882a593Smuzhiyun                 fread(&header, sizeof(header), 1, fp);
640*4882a593Smuzhiyun                 if (header.block_length > 0) {
641*4882a593Smuzhiyun                     vbuf->buf_info[0].data_addr = (uint8_t*)_mipi_rx_devs[0]->get_buffer_by_index(0)->get_expbuf_usrptr();
642*4882a593Smuzhiyun                     fread(vbuf->buf_info[0].data_addr, header.block_length, 1, fp);
643*4882a593Smuzhiyun                     vbuf->buf_info[0].data_length = header.block_length;
644*4882a593Smuzhiyun                 }
645*4882a593Smuzhiyun             	break;
646*4882a593Smuzhiyun         	}
647*4882a593Smuzhiyun         	case HDR_S_RAW_TAG:
648*4882a593Smuzhiyun         	{
649*4882a593Smuzhiyun                 fread(&header, sizeof(header), 1, fp);
650*4882a593Smuzhiyun                 if (header.block_length > 0) {
651*4882a593Smuzhiyun                     vbuf->buf_info[0].data_addr = (uint8_t*)_mipi_rx_devs[0]->get_buffer_by_index(0)->get_expbuf_usrptr();
652*4882a593Smuzhiyun                     fread(vbuf->buf_info[0].data_addr, header.block_length, 1, fp);
653*4882a593Smuzhiyun                     vbuf->buf_info[0].data_length = header.block_length;
654*4882a593Smuzhiyun                 }
655*4882a593Smuzhiyun         	    break;
656*4882a593Smuzhiyun         	}
657*4882a593Smuzhiyun         	case HDR_M_RAW_TAG:
658*4882a593Smuzhiyun         	{
659*4882a593Smuzhiyun                 fread(&header, sizeof(header), 1, fp);
660*4882a593Smuzhiyun                 if (header.block_length > 0) {
661*4882a593Smuzhiyun                     vbuf->buf_info[1].data_addr = (uint8_t*)_mipi_rx_devs[1]->get_buffer_by_index(0)->get_expbuf_usrptr();
662*4882a593Smuzhiyun                     fread(vbuf->buf_info[1].data_addr, header.block_length, 1, fp);
663*4882a593Smuzhiyun                     vbuf->buf_info[1].data_length = header.block_length;
664*4882a593Smuzhiyun                 }
665*4882a593Smuzhiyun             	break;
666*4882a593Smuzhiyun         	}
667*4882a593Smuzhiyun         	case HDR_L_RAW_TAG:
668*4882a593Smuzhiyun         	{
669*4882a593Smuzhiyun                 fread(&header, sizeof(header), 1, fp);
670*4882a593Smuzhiyun                 if (header.block_length > 0) {
671*4882a593Smuzhiyun                     vbuf->buf_info[2].data_addr = (uint8_t*)_mipi_rx_devs[1]->get_buffer_by_index(0)->get_expbuf_usrptr();
672*4882a593Smuzhiyun                     fread(vbuf->buf_info[2].data_addr, header.block_length, 1, fp);
673*4882a593Smuzhiyun                     vbuf->buf_info[2].data_length = header.block_length;
674*4882a593Smuzhiyun                 }
675*4882a593Smuzhiyun             	break;
676*4882a593Smuzhiyun         	}
677*4882a593Smuzhiyun         	case FORMAT_TAG:
678*4882a593Smuzhiyun         	{
679*4882a593Smuzhiyun             	fread(&_rawfmt, sizeof(_rawfmt), 1, fp);
680*4882a593Smuzhiyun             	LOGD_CAMHW_SUBM(FAKECAM_SUBM, "hdr_mode=%d,bayer_fmt=%d\n",_rawfmt.hdr_mode,_rawfmt.bayer_fmt);
681*4882a593Smuzhiyun             	break;
682*4882a593Smuzhiyun         	}
683*4882a593Smuzhiyun         	case STATS_TAG:
684*4882a593Smuzhiyun         	{
685*4882a593Smuzhiyun             	fread(&_finfo, sizeof(_finfo), 1, fp);
686*4882a593Smuzhiyun             	break;
687*4882a593Smuzhiyun         	}
688*4882a593Smuzhiyun         	case ISP_REG_FMT_TAG:
689*4882a593Smuzhiyun         	{
690*4882a593Smuzhiyun         	    fread(&header, sizeof(header), 1, fp);
691*4882a593Smuzhiyun         	    fseek(fp, header.block_length, SEEK_CUR);
692*4882a593Smuzhiyun         	    break;
693*4882a593Smuzhiyun         	}
694*4882a593Smuzhiyun         	case ISP_REG_TAG:
695*4882a593Smuzhiyun         	{
696*4882a593Smuzhiyun         	    fread(&header, sizeof(header), 1, fp);
697*4882a593Smuzhiyun         	    fseek(fp, header.block_length, SEEK_CUR);
698*4882a593Smuzhiyun         	    break;
699*4882a593Smuzhiyun         	}
700*4882a593Smuzhiyun         	case ISPP_REG_FMT_TAG:
701*4882a593Smuzhiyun         	{
702*4882a593Smuzhiyun         	    fread(&header, sizeof(header), 1, fp);
703*4882a593Smuzhiyun         	    fseek(fp, header.block_length, SEEK_CUR);
704*4882a593Smuzhiyun         	    break;
705*4882a593Smuzhiyun         	}
706*4882a593Smuzhiyun         	case ISPP_REG_TAG:
707*4882a593Smuzhiyun         	{
708*4882a593Smuzhiyun         	    fread(&header, sizeof(header), 1, fp);
709*4882a593Smuzhiyun         	    fseek(fp, header.block_length, SEEK_CUR);
710*4882a593Smuzhiyun         	    break;
711*4882a593Smuzhiyun         	}
712*4882a593Smuzhiyun         	case PLATFORM_TAG:
713*4882a593Smuzhiyun         	{
714*4882a593Smuzhiyun             	fread(&header, sizeof(header), 1, fp);
715*4882a593Smuzhiyun         	    fseek(fp, header.block_length, SEEK_CUR);
716*4882a593Smuzhiyun         	    break;
717*4882a593Smuzhiyun         	}
718*4882a593Smuzhiyun         	case END_TAG:
719*4882a593Smuzhiyun         	{
720*4882a593Smuzhiyun                 bExit = true;
721*4882a593Smuzhiyun             	break;
722*4882a593Smuzhiyun             }
723*4882a593Smuzhiyun             default:
724*4882a593Smuzhiyun             {
725*4882a593Smuzhiyun             	LOGE_CAMHW_SUBM(FAKECAM_SUBM, "Not support TAG(0x%04x)\n", tag);
726*4882a593Smuzhiyun             	bExit = true;
727*4882a593Smuzhiyun             	break;
728*4882a593Smuzhiyun         	}
729*4882a593Smuzhiyun         }
730*4882a593Smuzhiyun     }
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun      vbuf->frame_width = _rawfmt.width;
733*4882a593Smuzhiyun      vbuf->frame_height = _rawfmt.height;
734*4882a593Smuzhiyun      if (_rawfmt.hdr_mode == 1) {
735*4882a593Smuzhiyun           LOGD_CAMHW_SUBM(FAKECAM_SUBM,"data_addr=%p,fd=%d,length=%d\n",
736*4882a593Smuzhiyun                                        vbuf->buf_info[0].data_addr,
737*4882a593Smuzhiyun                                        vbuf->buf_info[0].data_fd,
738*4882a593Smuzhiyun                                        vbuf->buf_info[0].data_length);
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun          vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
741*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
742*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
743*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
744*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
745*4882a593Smuzhiyun          vbuf->buf_info[0].valid = true;
746*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
747*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain,
748*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time,
749*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain_reg,
750*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time_reg);
751*4882a593Smuzhiyun     }else if (_rawfmt.hdr_mode == 2) {
752*4882a593Smuzhiyun          vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
753*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
754*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
755*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
756*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
757*4882a593Smuzhiyun          vbuf->buf_info[0].valid = true;
758*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
759*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_addr,
760*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_fd,
761*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_length);
762*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
763*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain,
764*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time,
765*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain_reg,
766*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time_reg);
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun          vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
769*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
770*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
771*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
772*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
773*4882a593Smuzhiyun          vbuf->buf_info[1].valid = true;
774*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
775*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_addr,
776*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_fd,
777*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_length);
778*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
779*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain,
780*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time,
781*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain_reg,
782*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time_reg);
783*4882a593Smuzhiyun     }else if (_rawfmt.hdr_mode == 3) {
784*4882a593Smuzhiyun          vbuf->buf_info[0].frame_id = _rawfmt.frame_id;
785*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain = (float)_finfo.normal_gain;
786*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time = (float)_finfo.normal_exp;
787*4882a593Smuzhiyun          vbuf->buf_info[0].exp_gain_reg = (uint32_t)_finfo.normal_gain_reg;
788*4882a593Smuzhiyun          vbuf->buf_info[0].exp_time_reg = (uint32_t)_finfo.normal_exp_reg;
789*4882a593Smuzhiyun          vbuf->buf_info[0].valid = true;
790*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: data_addr=%p,fd=%d,,length=%d\n",
791*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_addr,
792*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_fd,
793*4882a593Smuzhiyun                                       vbuf->buf_info[0].data_length);
794*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[0]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
795*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain,
796*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time,
797*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_gain_reg,
798*4882a593Smuzhiyun                                       vbuf->buf_info[0].exp_time_reg);
799*4882a593Smuzhiyun 
800*4882a593Smuzhiyun          vbuf->buf_info[1].frame_id = _rawfmt.frame_id;
801*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain = (float)_finfo.hdr_gain_m;
802*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time = (float)_finfo.hdr_exp_m;
803*4882a593Smuzhiyun          vbuf->buf_info[1].exp_gain_reg = (uint32_t)_finfo.hdr_gain_m_reg;
804*4882a593Smuzhiyun          vbuf->buf_info[1].exp_time_reg = (uint32_t)_finfo.hdr_exp_m_reg;
805*4882a593Smuzhiyun          vbuf->buf_info[1].valid = true;
806*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: data_addr=%p,fd=%d,,length=%d\n",
807*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_addr,
808*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_fd,
809*4882a593Smuzhiyun                                       vbuf->buf_info[1].data_length);
810*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[1]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
811*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain,
812*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time,
813*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_gain_reg,
814*4882a593Smuzhiyun                                       vbuf->buf_info[1].exp_time_reg);
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun          vbuf->buf_info[2].frame_id = _rawfmt.frame_id;
817*4882a593Smuzhiyun          vbuf->buf_info[2].exp_gain = (float)_finfo.hdr_gain_l;
818*4882a593Smuzhiyun          vbuf->buf_info[2].exp_time = (float)_finfo.hdr_exp_l;
819*4882a593Smuzhiyun          vbuf->buf_info[2].exp_gain_reg = (uint32_t)_finfo.hdr_gain_l_reg;
820*4882a593Smuzhiyun          vbuf->buf_info[2].exp_time_reg = (uint32_t)_finfo.hdr_exp_l_reg;
821*4882a593Smuzhiyun          vbuf->buf_info[2].valid = true;
822*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: data_addr=%p,fd=%d,,length=%d\n",
823*4882a593Smuzhiyun                                       vbuf->buf_info[2].data_addr,
824*4882a593Smuzhiyun                                       vbuf->buf_info[2].data_fd,
825*4882a593Smuzhiyun                                       vbuf->buf_info[2].data_length);
826*4882a593Smuzhiyun          LOGD_CAMHW_SUBM(FAKECAM_SUBM,"buf_info[2]: gain:%f,time:%f,gain_reg:0x%x,time_reg:0x%x\n",
827*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_gain,
828*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_time,
829*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_gain_reg,
830*4882a593Smuzhiyun                                       vbuf->buf_info[2].exp_time_reg);
831*4882a593Smuzhiyun     }
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun      return XCAM_RETURN_NO_ERROR;
834*4882a593Smuzhiyun }
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun XCamReturn
registRawdataCb(void (* callback)(void *))837*4882a593Smuzhiyun FakeCamHwIsp20::registRawdataCb(void (*callback)(void *))
838*4882a593Smuzhiyun {
839*4882a593Smuzhiyun     ENTER_XCORE_FUNCTION();
840*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
841*4882a593Smuzhiyun     SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
842*4882a593Smuzhiyun     ret = fakeSensor->register_rawdata_callback(callback);
843*4882a593Smuzhiyun     EXIT_XCORE_FUNCTION();
844*4882a593Smuzhiyun     return ret;
845*4882a593Smuzhiyun }
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun XCamReturn
rawdataPrepare(rk_aiq_raw_prop_t prop)848*4882a593Smuzhiyun FakeCamHwIsp20::rawdataPrepare(rk_aiq_raw_prop_t prop)
849*4882a593Smuzhiyun {
850*4882a593Smuzhiyun     ENTER_XCORE_FUNCTION();
851*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun     _rawbuf_type = prop.rawbuf_type;
855*4882a593Smuzhiyun     if (_rawbuf_type == RK_AIQ_RAW_ADDR)
856*4882a593Smuzhiyun     {
857*4882a593Smuzhiyun         _rx_memory_type = V4L2_MEMORY_USERPTR;
858*4882a593Smuzhiyun         _tx_memory_type = V4L2_MEMORY_USERPTR;
859*4882a593Smuzhiyun     }
860*4882a593Smuzhiyun     else if (_rawbuf_type == RK_AIQ_RAW_FD)
861*4882a593Smuzhiyun     {
862*4882a593Smuzhiyun         _rx_memory_type = V4L2_MEMORY_DMABUF;
863*4882a593Smuzhiyun         _tx_memory_type = V4L2_MEMORY_DMABUF;
864*4882a593Smuzhiyun     }
865*4882a593Smuzhiyun     else if(_rawbuf_type == RK_AIQ_RAW_DATA)
866*4882a593Smuzhiyun     {
867*4882a593Smuzhiyun         _rx_memory_type = V4L2_MEMORY_MMAP;
868*4882a593Smuzhiyun         _tx_memory_type = V4L2_MEMORY_USERPTR;
869*4882a593Smuzhiyun     }
870*4882a593Smuzhiyun     else if(_rawbuf_type == RK_AIQ_RAW_FILE)
871*4882a593Smuzhiyun     {
872*4882a593Smuzhiyun         _rx_memory_type = V4L2_MEMORY_MMAP;
873*4882a593Smuzhiyun         _tx_memory_type = V4L2_MEMORY_USERPTR;
874*4882a593Smuzhiyun     }
875*4882a593Smuzhiyun     else {
876*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(FAKECAM_SUBM,"Not support raw data type:%d", _rawbuf_type);
877*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
878*4882a593Smuzhiyun     }
879*4882a593Smuzhiyun     SmartPtr<FakeSensorHw> fakeSensor = mSensorDev.dynamic_cast_ptr<FakeSensorHw>();
880*4882a593Smuzhiyun     ret = fakeSensor->prepare(prop);
881*4882a593Smuzhiyun     EXIT_XCORE_FUNCTION();
882*4882a593Smuzhiyun     return ret;
883*4882a593Smuzhiyun }
884*4882a593Smuzhiyun 
setupOffLineLink(int isp_index,bool enable)885*4882a593Smuzhiyun XCamReturn FakeCamHwIsp20::setupOffLineLink(int isp_index, bool enable)
886*4882a593Smuzhiyun {
887*4882a593Smuzhiyun     media_device* device  = NULL;
888*4882a593Smuzhiyun     media_entity* entity  = NULL;
889*4882a593Smuzhiyun     media_pad* src_pad    = NULL;
890*4882a593Smuzhiyun     media_pad* sink_pad   = NULL;
891*4882a593Smuzhiyun     int lvds_max_entities = 6;
892*4882a593Smuzhiyun     int lvds_entity       = 0;
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun     device = media_device_new(mIspHwInfos.isp_info[isp_index].media_dev_path);
895*4882a593Smuzhiyun     if (!device) return XCAM_RETURN_ERROR_FAILED;
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun     /* Enumerate entities, pads and links. */
898*4882a593Smuzhiyun     media_device_enumerate(device);
899*4882a593Smuzhiyun     entity = media_get_entity_by_name(device, "rkisp-isp-subdev", strlen("rkisp-isp-subdev"));
900*4882a593Smuzhiyun     if (!entity) {
901*4882a593Smuzhiyun         goto FAIL;
902*4882a593Smuzhiyun     }
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun     sink_pad = (media_pad*)media_entity_get_pad(entity, 0);
905*4882a593Smuzhiyun     if (!sink_pad) {
906*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkisp-isp-subdev sink pad failed!\n");
907*4882a593Smuzhiyun         goto FAIL;
908*4882a593Smuzhiyun     }
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun     for (lvds_entity = 0; lvds_entity < lvds_max_entities; lvds_entity++) {
911*4882a593Smuzhiyun         char entity_name[128] = {0};
912*4882a593Smuzhiyun         src_pad               = NULL;
913*4882a593Smuzhiyun         if (!lvds_entity) {
914*4882a593Smuzhiyun           snprintf(entity_name, 128, "rkcif-mipi-lvds");
915*4882a593Smuzhiyun         } else {
916*4882a593Smuzhiyun           snprintf(entity_name, 128, "rkcif-mipi-lvds%d", lvds_entity);
917*4882a593Smuzhiyun         }
918*4882a593Smuzhiyun         entity = media_get_entity_by_name(device, entity_name, strlen(entity_name));
919*4882a593Smuzhiyun         if (entity) {
920*4882a593Smuzhiyun             src_pad = (media_pad*)media_entity_get_pad(entity, 0);
921*4882a593Smuzhiyun             if (!src_pad) {
922*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-mipi-lvds%d source pad s failed!\n",
923*4882a593Smuzhiyun                                 lvds_entity);
924*4882a593Smuzhiyun                 goto FAIL;
925*4882a593Smuzhiyun             }
926*4882a593Smuzhiyun         }
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun         if (src_pad && sink_pad) {
929*4882a593Smuzhiyun             if (enable) {
930*4882a593Smuzhiyun                 media_setup_link(device, src_pad, sink_pad, 0);
931*4882a593Smuzhiyun             } else
932*4882a593Smuzhiyun                 media_setup_link(device, src_pad, sink_pad, MEDIA_LNK_FL_ENABLED);
933*4882a593Smuzhiyun         }
934*4882a593Smuzhiyun     }
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun     media_device_unref(device);
937*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
938*4882a593Smuzhiyun FAIL:
939*4882a593Smuzhiyun     media_device_unref(device);
940*4882a593Smuzhiyun     return XCAM_RETURN_ERROR_FAILED;
941*4882a593Smuzhiyun }
942*4882a593Smuzhiyun 
FakeCamHwIsp21()943*4882a593Smuzhiyun FakeCamHwIsp21::FakeCamHwIsp21()
944*4882a593Smuzhiyun : FakeCamHwIsp20() {
945*4882a593Smuzhiyun }
946*4882a593Smuzhiyun 
~FakeCamHwIsp21()947*4882a593Smuzhiyun FakeCamHwIsp21::~FakeCamHwIsp21()
948*4882a593Smuzhiyun {
949*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
950*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun XCamReturn
init(const char * sns_ent_name)954*4882a593Smuzhiyun FakeCamHwIsp21::init(const char* sns_ent_name)
955*4882a593Smuzhiyun {
956*4882a593Smuzhiyun     return FakeCamHwIsp20::init(sns_ent_name);
957*4882a593Smuzhiyun }
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun XCamReturn
prepare(uint32_t width,uint32_t height,int mode,int t_delay,int g_delay)960*4882a593Smuzhiyun FakeCamHwIsp21::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
961*4882a593Smuzhiyun {
962*4882a593Smuzhiyun     return FakeCamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
963*4882a593Smuzhiyun }
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun XCamReturn
enqueueRawBuffer(void * rawdata,bool sync)966*4882a593Smuzhiyun FakeCamHwIsp21::enqueueRawBuffer(void *rawdata, bool sync)
967*4882a593Smuzhiyun {
968*4882a593Smuzhiyun    return  FakeCamHwIsp20::enqueueRawBuffer(rawdata, sync);
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun XCamReturn
enqueueRawFile(const char * path)972*4882a593Smuzhiyun FakeCamHwIsp21::enqueueRawFile(const char *path)
973*4882a593Smuzhiyun {
974*4882a593Smuzhiyun    return  FakeCamHwIsp20::enqueueRawFile(path);
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun XCamReturn
registRawdataCb(void (* callback)(void *))978*4882a593Smuzhiyun FakeCamHwIsp21::registRawdataCb(void (*callback)(void *))
979*4882a593Smuzhiyun {
980*4882a593Smuzhiyun    return  FakeCamHwIsp20::registRawdataCb(callback);
981*4882a593Smuzhiyun }
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun XCamReturn
rawdataPrepare(rk_aiq_raw_prop_t prop)984*4882a593Smuzhiyun FakeCamHwIsp21::rawdataPrepare(rk_aiq_raw_prop_t prop)
985*4882a593Smuzhiyun {
986*4882a593Smuzhiyun    return  FakeCamHwIsp20::rawdataPrepare(prop);
987*4882a593Smuzhiyun }
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun XCamReturn
poll_event_ready(uint32_t sequence,int type)990*4882a593Smuzhiyun FakeCamHwIsp21::poll_event_ready (uint32_t sequence, int type)
991*4882a593Smuzhiyun {
992*4882a593Smuzhiyun    return  FakeCamHwIsp20::poll_event_ready (sequence, type);
993*4882a593Smuzhiyun }
994*4882a593Smuzhiyun 
FakeCamHwIsp3x()995*4882a593Smuzhiyun FakeCamHwIsp3x::FakeCamHwIsp3x()
996*4882a593Smuzhiyun : FakeCamHwIsp20() {
997*4882a593Smuzhiyun }
998*4882a593Smuzhiyun 
~FakeCamHwIsp3x()999*4882a593Smuzhiyun FakeCamHwIsp3x::~FakeCamHwIsp3x()
1000*4882a593Smuzhiyun {
1001*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
1002*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
1003*4882a593Smuzhiyun }
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun XCamReturn
init(const char * sns_ent_name)1006*4882a593Smuzhiyun FakeCamHwIsp3x::init(const char* sns_ent_name)
1007*4882a593Smuzhiyun {
1008*4882a593Smuzhiyun     return FakeCamHwIsp20::init(sns_ent_name);
1009*4882a593Smuzhiyun }
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun XCamReturn
prepare(uint32_t width,uint32_t height,int mode,int t_delay,int g_delay)1012*4882a593Smuzhiyun FakeCamHwIsp3x::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
1013*4882a593Smuzhiyun {
1014*4882a593Smuzhiyun     return FakeCamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
1015*4882a593Smuzhiyun }
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun XCamReturn
enqueueRawBuffer(void * rawdata,bool sync)1018*4882a593Smuzhiyun FakeCamHwIsp3x::enqueueRawBuffer(void *rawdata, bool sync)
1019*4882a593Smuzhiyun {
1020*4882a593Smuzhiyun    return  FakeCamHwIsp20::enqueueRawBuffer(rawdata, sync);
1021*4882a593Smuzhiyun }
1022*4882a593Smuzhiyun 
1023*4882a593Smuzhiyun XCamReturn
enqueueRawFile(const char * path)1024*4882a593Smuzhiyun FakeCamHwIsp3x::enqueueRawFile(const char *path)
1025*4882a593Smuzhiyun {
1026*4882a593Smuzhiyun    return  FakeCamHwIsp20::enqueueRawFile(path);
1027*4882a593Smuzhiyun }
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun XCamReturn
registRawdataCb(void (* callback)(void *))1030*4882a593Smuzhiyun FakeCamHwIsp3x::registRawdataCb(void (*callback)(void *))
1031*4882a593Smuzhiyun {
1032*4882a593Smuzhiyun    return  FakeCamHwIsp20::registRawdataCb(callback);
1033*4882a593Smuzhiyun }
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun XCamReturn
rawdataPrepare(rk_aiq_raw_prop_t prop)1036*4882a593Smuzhiyun FakeCamHwIsp3x::rawdataPrepare(rk_aiq_raw_prop_t prop)
1037*4882a593Smuzhiyun {
1038*4882a593Smuzhiyun    return  FakeCamHwIsp20::rawdataPrepare(prop);
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun XCamReturn
poll_event_ready(uint32_t sequence,int type)1042*4882a593Smuzhiyun FakeCamHwIsp3x::poll_event_ready (uint32_t sequence, int type)
1043*4882a593Smuzhiyun {
1044*4882a593Smuzhiyun    return  FakeCamHwIsp20::poll_event_ready (sequence, type);
1045*4882a593Smuzhiyun }
1046*4882a593Smuzhiyun 
FakeCamHwIsp32()1047*4882a593Smuzhiyun FakeCamHwIsp32::FakeCamHwIsp32()
1048*4882a593Smuzhiyun : FakeCamHwIsp20() {
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun 
~FakeCamHwIsp32()1051*4882a593Smuzhiyun FakeCamHwIsp32::~FakeCamHwIsp32()
1052*4882a593Smuzhiyun {
1053*4882a593Smuzhiyun     ENTER_CAMHW_FUNCTION();
1054*4882a593Smuzhiyun     EXIT_CAMHW_FUNCTION();
1055*4882a593Smuzhiyun }
1056*4882a593Smuzhiyun 
1057*4882a593Smuzhiyun XCamReturn
init(const char * sns_ent_name)1058*4882a593Smuzhiyun FakeCamHwIsp32::init(const char* sns_ent_name)
1059*4882a593Smuzhiyun {
1060*4882a593Smuzhiyun     return FakeCamHwIsp20::init(sns_ent_name);
1061*4882a593Smuzhiyun }
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun XCamReturn
prepare(uint32_t width,uint32_t height,int mode,int t_delay,int g_delay)1064*4882a593Smuzhiyun FakeCamHwIsp32::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
1065*4882a593Smuzhiyun {
1066*4882a593Smuzhiyun     return FakeCamHwIsp20::prepare(width, height, mode, t_delay, g_delay);
1067*4882a593Smuzhiyun }
1068*4882a593Smuzhiyun 
1069*4882a593Smuzhiyun XCamReturn
enqueueRawBuffer(void * rawdata,bool sync)1070*4882a593Smuzhiyun FakeCamHwIsp32::enqueueRawBuffer(void *rawdata, bool sync)
1071*4882a593Smuzhiyun {
1072*4882a593Smuzhiyun    return  FakeCamHwIsp20::enqueueRawBuffer(rawdata, sync);
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun XCamReturn
enqueueRawFile(const char * path)1076*4882a593Smuzhiyun FakeCamHwIsp32::enqueueRawFile(const char *path)
1077*4882a593Smuzhiyun {
1078*4882a593Smuzhiyun    return  FakeCamHwIsp20::enqueueRawFile(path);
1079*4882a593Smuzhiyun }
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun XCamReturn
registRawdataCb(void (* callback)(void *))1082*4882a593Smuzhiyun FakeCamHwIsp32::registRawdataCb(void (*callback)(void *))
1083*4882a593Smuzhiyun {
1084*4882a593Smuzhiyun    return  FakeCamHwIsp20::registRawdataCb(callback);
1085*4882a593Smuzhiyun }
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun XCamReturn
rawdataPrepare(rk_aiq_raw_prop_t prop)1088*4882a593Smuzhiyun FakeCamHwIsp32::rawdataPrepare(rk_aiq_raw_prop_t prop)
1089*4882a593Smuzhiyun {
1090*4882a593Smuzhiyun    return  FakeCamHwIsp20::rawdataPrepare(prop);
1091*4882a593Smuzhiyun }
1092*4882a593Smuzhiyun 
1093*4882a593Smuzhiyun XCamReturn
poll_event_ready(uint32_t sequence,int type)1094*4882a593Smuzhiyun FakeCamHwIsp32::poll_event_ready (uint32_t sequence, int type)
1095*4882a593Smuzhiyun {
1096*4882a593Smuzhiyun    return  FakeCamHwIsp20::poll_event_ready (sequence, type);
1097*4882a593Smuzhiyun }
1098*4882a593Smuzhiyun 
1099*4882a593Smuzhiyun } //namspace RkCam
1100