xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/FecParamStream.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 
19*4882a593Smuzhiyun #include "FecParamStream.h"
20*4882a593Smuzhiyun #include "rkispp-config.h"
21*4882a593Smuzhiyun #include "CamHwIsp20.h"
22*4882a593Smuzhiyun namespace RkCam {
23*4882a593Smuzhiyun 
FecParamStream(SmartPtr<V4l2Device> dev,int type)24*4882a593Smuzhiyun FecParamStream::FecParamStream (SmartPtr<V4l2Device> dev, int type)
25*4882a593Smuzhiyun     : RKStream(dev, type)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun     _dev->open();
28*4882a593Smuzhiyun     mParamsAssembler = new IspParamsAssembler("FEC_PARAMS_ASSEMBLER");
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun 
FecParamStream(const rk_sensor_full_info_t * s_info)31*4882a593Smuzhiyun FecParamStream::FecParamStream (const rk_sensor_full_info_t *s_info)
32*4882a593Smuzhiyun     : RKStream(s_info->ispp_info->pp_fec_params_path, ISPP_POLL_FEC_PARAMS)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun     _dev->open();
35*4882a593Smuzhiyun     mParamsAssembler = new IspParamsAssembler("FEC_PARAMS_ASSEMBLER");
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 
~FecParamStream()39*4882a593Smuzhiyun FecParamStream::~FecParamStream()
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun void
start()44*4882a593Smuzhiyun FecParamStream::start()
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun     if (!_dev->is_activated()) {
49*4882a593Smuzhiyun         RKStream::start();
50*4882a593Smuzhiyun     }
51*4882a593Smuzhiyun     // set inital params
52*4882a593Smuzhiyun     ret = mParamsAssembler->start();
53*4882a593Smuzhiyun     if (ret < 0) {
54*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
55*4882a593Smuzhiyun         return;
56*4882a593Smuzhiyun     }
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun     if (mParamsAssembler->ready())
59*4882a593Smuzhiyun         configToDrv(0);
60*4882a593Smuzhiyun     else
61*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no inital fec params ready");
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun void
stop()65*4882a593Smuzhiyun FecParamStream::stop()
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun     RKStream::stop();
68*4882a593Smuzhiyun     if (mParamsAssembler.ptr())
69*4882a593Smuzhiyun         mParamsAssembler->stop();
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
set_devices(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> isppdev)72*4882a593Smuzhiyun void FecParamStream::set_devices(CamHwIsp20* camHw, SmartPtr<V4l2SubDevice> isppdev)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun     mIsppSubDev = isppdev;
75*4882a593Smuzhiyun     mCamHw = camHw;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
configToDrv(uint32_t frameId)78*4882a593Smuzhiyun XCamReturn FecParamStream::configToDrv(uint32_t frameId)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
81*4882a593Smuzhiyun     XCAM_ASSERT (mParamsAssembler.ptr());
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun     SmartPtr<V4l2Buffer> v4l2buf_fec;
84*4882a593Smuzhiyun     struct rkispp_params_feccfg *ispp_fec_params = NULL;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun     if (!mParamsAssembler->ready()) {
87*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "have no fec new parameter\n");
88*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
89*4882a593Smuzhiyun     }
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun     ret = _dev->get_buffer(v4l2buf_fec);
92*4882a593Smuzhiyun     if (ret) {
93*4882a593Smuzhiyun         LOGW_CAMHW_SUBM(ISP20HW_SUBM, "Can not get ispp fec params buffer\n");
94*4882a593Smuzhiyun         return XCAM_RETURN_ERROR_PARAM;
95*4882a593Smuzhiyun     }
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun     cam3aResultList ready_results;
98*4882a593Smuzhiyun     ret = mParamsAssembler->deQueOne(ready_results, frameId);
99*4882a593Smuzhiyun     if (ret != XCAM_RETURN_NO_ERROR) {
100*4882a593Smuzhiyun         LOGI_CAMHW_SUBM(ISP20HW_SUBM, "deque parameter failed\n");
101*4882a593Smuzhiyun         ret = XCAM_RETURN_ERROR_PARAM;
102*4882a593Smuzhiyun         goto ret_fec_buf;
103*4882a593Smuzhiyun     }
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun     ispp_fec_params = (struct rkispp_params_feccfg*)v4l2buf_fec->get_buf().m.userptr;
106*4882a593Smuzhiyun     if (mCamHw->get_fec_cfg_params(ready_results, *ispp_fec_params) != XCAM_RETURN_NO_ERROR)
107*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "fec parameter translation error\n");
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun     LOGD_CAMHW_SUBM(ISP20HW_SUBM, "fec: en update 0x%x, ens 0x%x, cfg update 0x%x",
110*4882a593Smuzhiyun                     ispp_fec_params->head.module_en_update, ispp_fec_params->head.module_ens,
111*4882a593Smuzhiyun                     ispp_fec_params->head.module_cfg_update);
112*4882a593Smuzhiyun     if (memcmp(&last_ispp_fec_params, ispp_fec_params, sizeof(last_ispp_fec_params)) == 0) {
113*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "fec: no need update !");
114*4882a593Smuzhiyun         ret = XCAM_RETURN_NO_ERROR;
115*4882a593Smuzhiyun         goto ret_fec_buf;
116*4882a593Smuzhiyun     }
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun     last_ispp_fec_params = *ispp_fec_params;
119*4882a593Smuzhiyun     if ((ispp_fec_params->head.module_cfg_update) || (ispp_fec_params->head.module_en_update)) {
120*4882a593Smuzhiyun         ispp_fec_params->head.frame_id = frameId;
121*4882a593Smuzhiyun         //ispp_fec_params->image.index = ispp_params->fec_output_buf_index;
122*4882a593Smuzhiyun         //ispp_fec_params->image.size = ispp_params->fec_output_buf_size;
123*4882a593Smuzhiyun         //TODO set update bits
124*4882a593Smuzhiyun         if (_dev->queue_buffer (v4l2buf_fec) != 0) {
125*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISP1: fec: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n",
126*4882a593Smuzhiyun                             v4l2buf_fec->get_buf().index, errno, strerror(errno));
127*4882a593Smuzhiyun             goto ret_fec_buf;
128*4882a593Smuzhiyun         }
129*4882a593Smuzhiyun     } else
130*4882a593Smuzhiyun         goto ret_fec_buf;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun ret_fec_buf:
135*4882a593Smuzhiyun     if (v4l2buf_fec.ptr())
136*4882a593Smuzhiyun         _dev->return_buffer_to_pool (v4l2buf_fec);
137*4882a593Smuzhiyun     return ret;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
config_params(uint32_t frameId,SmartPtr<cam3aResult> & result)140*4882a593Smuzhiyun XCamReturn FecParamStream::config_params(uint32_t frameId, SmartPtr<cam3aResult>& result)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
143*4882a593Smuzhiyun     XCAM_ASSERT (mParamsAssembler.ptr());
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun     // params device should started befor any params queued
146*4882a593Smuzhiyun     if (!_dev->is_activated()) {
147*4882a593Smuzhiyun         mParamsAssembler->addReadyCondition(result->getType());
148*4882a593Smuzhiyun         mParamsAssembler->queue(result);
149*4882a593Smuzhiyun     } else {
150*4882a593Smuzhiyun         mParamsAssembler->queue(result);
151*4882a593Smuzhiyun         // set all ready params to drv
152*4882a593Smuzhiyun         while (mParamsAssembler->ready()) {
153*4882a593Smuzhiyun             if (configToDrv(frameId) != XCAM_RETURN_NO_ERROR)
154*4882a593Smuzhiyun                 break;
155*4882a593Smuzhiyun         }
156*4882a593Smuzhiyun     }
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun     return ret;
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun } //namspace RkCam
161