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