xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/NrStreamProcUnit.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 "NrStreamProcUnit.h"
19*4882a593Smuzhiyun #include "CamHwIsp20.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun namespace RkCam {
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define ISPP_NR_SUBM  (0x02)
24*4882a593Smuzhiyun 
NrStreamProcUnit(const rk_sensor_full_info_t * s_info)25*4882a593Smuzhiyun NrStreamProcUnit::NrStreamProcUnit (const rk_sensor_full_info_t *s_info)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun     mNrStatsDev = new V4l2Device(s_info->ispp_info->pp_nr_stats_path);
28*4882a593Smuzhiyun     mNrStatsDev->open();
29*4882a593Smuzhiyun     mNrParamsDev = new V4l2Device (s_info->ispp_info->pp_nr_params_path);
30*4882a593Smuzhiyun     mNrParamsDev->open();
31*4882a593Smuzhiyun     mNrStatsStream = new NrStatsStream(mNrStatsDev, ISPP_POLL_NR_STATS);
32*4882a593Smuzhiyun     mNrParamStream = new RKStream(mNrParamsDev, ISPP_POLL_NR_PARAMS);
33*4882a593Smuzhiyun     mParamsAssembler = new IspParamsAssembler("NR_PARAMS_ASSEMBLER");
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun 
~NrStreamProcUnit()36*4882a593Smuzhiyun NrStreamProcUnit::~NrStreamProcUnit()
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun void
start()41*4882a593Smuzhiyun NrStreamProcUnit::start()
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun     if (mNrParamsDev.ptr() && !mNrParamsDev->is_activated()) {
46*4882a593Smuzhiyun         if (mNrStatsStream.ptr())
47*4882a593Smuzhiyun             mNrStatsStream->start();
48*4882a593Smuzhiyun         if (mNrParamStream.ptr())
49*4882a593Smuzhiyun             //mNrParamStream->startThreadOnly();
50*4882a593Smuzhiyun             mNrParamStream->start();
51*4882a593Smuzhiyun     }
52*4882a593Smuzhiyun     // set inital params
53*4882a593Smuzhiyun     ret = mParamsAssembler->start();
54*4882a593Smuzhiyun     if (ret < 0) {
55*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
56*4882a593Smuzhiyun         return;
57*4882a593Smuzhiyun     }
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun     if (mParamsAssembler->ready())
60*4882a593Smuzhiyun         configToDrv(0);
61*4882a593Smuzhiyun     else
62*4882a593Smuzhiyun         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no inital nr params ready");
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun void
stop()66*4882a593Smuzhiyun NrStreamProcUnit::stop()
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun     if (mNrParamStream.ptr())
69*4882a593Smuzhiyun         mNrParamStream->stop();
70*4882a593Smuzhiyun     if (mNrStatsStream.ptr())
71*4882a593Smuzhiyun         mNrStatsStream->stop();
72*4882a593Smuzhiyun     if (mParamsAssembler.ptr())
73*4882a593Smuzhiyun         mParamsAssembler->stop();
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun void
pause()77*4882a593Smuzhiyun NrStreamProcUnit::pause()
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun void
resume()82*4882a593Smuzhiyun NrStreamProcUnit::resume()
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun void
set_devices(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> isppdev)87*4882a593Smuzhiyun NrStreamProcUnit::set_devices(CamHwIsp20 *camHw, SmartPtr<V4l2SubDevice> isppdev)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun     mIsppSubDev = isppdev;
90*4882a593Smuzhiyun     mCamHw = camHw;
91*4882a593Smuzhiyun     mNrStatsStream->set_device(camHw, isppdev);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
configToDrv(uint32_t frameId)94*4882a593Smuzhiyun XCamReturn NrStreamProcUnit::configToDrv(uint32_t frameId)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
97*4882a593Smuzhiyun     XCAM_ASSERT (mParamsAssembler.ptr());
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun     SmartPtr<V4l2Buffer> v4l2buf_nr;
100*4882a593Smuzhiyun     if (mNrParamsDev.ptr()) {
101*4882a593Smuzhiyun         if (!mParamsAssembler->ready()) {
102*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISPP_NR_SUBM, "have no nr new parameter\n");
103*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
104*4882a593Smuzhiyun         }
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun         ret = mNrParamsDev->get_buffer(v4l2buf_nr);
107*4882a593Smuzhiyun         if (ret) {
108*4882a593Smuzhiyun             LOGW_CAMHW_SUBM(ISPP_NR_SUBM, "Can not get ispp nr params buffer\n");
109*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
110*4882a593Smuzhiyun         }
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun         cam3aResultList ready_results;
113*4882a593Smuzhiyun         ret = mParamsAssembler->deQueOne(ready_results, frameId);
114*4882a593Smuzhiyun         if (ret != XCAM_RETURN_NO_ERROR) {
115*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISPP_NR_SUBM, "deque parameter failed\n");
116*4882a593Smuzhiyun             ret = XCAM_RETURN_ERROR_PARAM;
117*4882a593Smuzhiyun             goto ret_nr_buf;
118*4882a593Smuzhiyun         }
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun         struct rkispp_params_nrcfg* ispp_nr_params = (struct rkispp_params_nrcfg*)v4l2buf_nr->get_buf().m.userptr;
121*4882a593Smuzhiyun         if (mCamHw->merge_results(ready_results, *ispp_nr_params) != XCAM_RETURN_NO_ERROR)
122*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISPP_NR_SUBM, "nr parameter translation error\n");
123*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISPP_NR_SUBM, "nr: frameid %u, en update 0x%x, ens 0x%x, cfg update 0x%x",frameId,
124*4882a593Smuzhiyun                         ispp_nr_params->head.module_en_update, ispp_nr_params->head.module_ens,
125*4882a593Smuzhiyun                         ispp_nr_params->head.module_cfg_update);
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun         if (memcmp(&last_ispp_nr_params, ispp_nr_params, sizeof(last_ispp_nr_params)) == 0) {
128*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nr: no need update !");
129*4882a593Smuzhiyun             ret = XCAM_RETURN_NO_ERROR;
130*4882a593Smuzhiyun             goto ret_nr_buf;
131*4882a593Smuzhiyun         }
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun         last_ispp_nr_params = *ispp_nr_params;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun         if ((ispp_nr_params->head.module_cfg_update) || (ispp_nr_params->head.module_en_update))
136*4882a593Smuzhiyun         {
137*4882a593Smuzhiyun             ispp_nr_params->head.frame_id = frameId;
138*4882a593Smuzhiyun             ispp_nr_params->gain.index = -1;
139*4882a593Smuzhiyun             ispp_nr_params->gain.size = 0;
140*4882a593Smuzhiyun             //mNrStatsStream->get_nrgain_fd();
141*4882a593Smuzhiyun             //ispp_nr_params->gain.index = mNrStatsStream->get_nrgain_fd();
142*4882a593Smuzhiyun             //ispp_nr_params->gain = ispp_params->gain;
143*4882a593Smuzhiyun             //TODO set update bits
144*4882a593Smuzhiyun             if (mNrParamsDev->queue_buffer (v4l2buf_nr) != 0) {
145*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISPP_NR_SUBM, "RKISP1: nr: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n",
146*4882a593Smuzhiyun                                 v4l2buf_nr->get_buf().index, errno, strerror(errno));
147*4882a593Smuzhiyun                 goto ret_nr_buf;
148*4882a593Smuzhiyun             }
149*4882a593Smuzhiyun             //setIsppSharpFbcRot(&ispp_nr_params->shp_cfg);
150*4882a593Smuzhiyun         } else
151*4882a593Smuzhiyun             goto ret_nr_buf;
152*4882a593Smuzhiyun      } else
153*4882a593Smuzhiyun         ret = XCAM_RETURN_BYPASS;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun ret_nr_buf:
158*4882a593Smuzhiyun     if (v4l2buf_nr.ptr())
159*4882a593Smuzhiyun         mNrParamsDev->return_buffer_to_pool (v4l2buf_nr);
160*4882a593Smuzhiyun     return ret;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun 
config_params(uint32_t frameId,SmartPtr<cam3aResult> & result)164*4882a593Smuzhiyun XCamReturn NrStreamProcUnit::config_params(uint32_t frameId, SmartPtr<cam3aResult>& result)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
167*4882a593Smuzhiyun     XCAM_ASSERT (mParamsAssembler.ptr());
168*4882a593Smuzhiyun     // params device should started befor any params queued
169*4882a593Smuzhiyun     if (mNrParamsDev.ptr() && !mNrParamsDev->is_activated()) {
170*4882a593Smuzhiyun         mParamsAssembler->addReadyCondition(result->getType());
171*4882a593Smuzhiyun         mParamsAssembler->queue(result);
172*4882a593Smuzhiyun     } else {
173*4882a593Smuzhiyun         mParamsAssembler->queue(result);
174*4882a593Smuzhiyun         // set all ready params to drv
175*4882a593Smuzhiyun         while (mParamsAssembler->ready()) {
176*4882a593Smuzhiyun             if (configToDrv(frameId) != XCAM_RETURN_NO_ERROR)
177*4882a593Smuzhiyun                 break;
178*4882a593Smuzhiyun         }
179*4882a593Smuzhiyun     }
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun     return ret;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun } //namspace RkCam
185