xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/TnrStreamProcUnit.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 "TnrStreamProcUnit.h"
19*4882a593Smuzhiyun #include "CamHwIsp20.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun namespace RkCam {
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define ISPP_TNR_SUBM  (0x03)
24*4882a593Smuzhiyun 
TnrStreamProcUnit(const rk_sensor_full_info_t * s_info)25*4882a593Smuzhiyun TnrStreamProcUnit::TnrStreamProcUnit (const rk_sensor_full_info_t *s_info)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun     mTnrStatsDev = new V4l2Device(s_info->ispp_info->pp_tnr_stats_path);
28*4882a593Smuzhiyun     mTnrStatsDev->open();
29*4882a593Smuzhiyun     mTnrParamsDev = new V4l2Device (s_info->ispp_info->pp_tnr_params_path);
30*4882a593Smuzhiyun     mTnrParamsDev->open();
31*4882a593Smuzhiyun     mTnrStatsStream = new TnrStatsStream(mTnrStatsDev, ISPP_POLL_TNR_STATS);
32*4882a593Smuzhiyun     mTnrParamStream = new RKStream(mTnrParamsDev, ISPP_POLL_TNR_PARAMS);
33*4882a593Smuzhiyun     mParamsAssembler = new IspParamsAssembler("TNR_PARAMS_ASSEMBLER");
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun 
~TnrStreamProcUnit()36*4882a593Smuzhiyun TnrStreamProcUnit::~TnrStreamProcUnit()
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun void
start()41*4882a593Smuzhiyun TnrStreamProcUnit::start()
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun     if (mTnrParamsDev.ptr() && !mTnrParamsDev->is_activated()) {
46*4882a593Smuzhiyun         if (mTnrStatsStream.ptr())
47*4882a593Smuzhiyun             mTnrStatsStream->start();
48*4882a593Smuzhiyun         if (mTnrParamStream.ptr())
49*4882a593Smuzhiyun             //mTnrParamStream->startThreadOnly();
50*4882a593Smuzhiyun             mTnrParamStream->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 tnr params ready");
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun void
stop()66*4882a593Smuzhiyun TnrStreamProcUnit::stop()
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun     if (mTnrParamStream.ptr())
69*4882a593Smuzhiyun         mTnrParamStream->stop();
70*4882a593Smuzhiyun     if (mTnrStatsStream.ptr())
71*4882a593Smuzhiyun         mTnrStatsStream->stop();
72*4882a593Smuzhiyun     if (mParamsAssembler.ptr())
73*4882a593Smuzhiyun         mParamsAssembler->stop();
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun void
pause()77*4882a593Smuzhiyun TnrStreamProcUnit::pause()
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun void
resume()82*4882a593Smuzhiyun TnrStreamProcUnit::resume()
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun void
set_devices(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> isppdev)87*4882a593Smuzhiyun TnrStreamProcUnit::set_devices(CamHwIsp20 *camHw, SmartPtr<V4l2SubDevice> isppdev)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun     mIsppSubDev = isppdev;
90*4882a593Smuzhiyun     mCamHw = camHw;
91*4882a593Smuzhiyun     mTnrStatsStream->set_device(camHw, isppdev);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
configToDrv(uint32_t frameId)94*4882a593Smuzhiyun XCamReturn TnrStreamProcUnit::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_tnr;
100*4882a593Smuzhiyun     if (mTnrParamsDev.ptr()) {
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun         struct rkispp_params_tnrcfg *ispp_tnr_params = NULL;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun         if (!mParamsAssembler->ready()) {
105*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "have no tnr new parameter\n");
106*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
107*4882a593Smuzhiyun         }
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun         ret = mTnrParamsDev->get_buffer(v4l2buf_tnr);
110*4882a593Smuzhiyun         if (ret) {
111*4882a593Smuzhiyun             LOGW_CAMHW_SUBM(ISP20HW_SUBM, "Can not get ispp tnr params buffer\n");
112*4882a593Smuzhiyun             return XCAM_RETURN_ERROR_PARAM;
113*4882a593Smuzhiyun         }
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun         cam3aResultList ready_results;
116*4882a593Smuzhiyun         ret = mParamsAssembler->deQueOne(ready_results, frameId);
117*4882a593Smuzhiyun         if (ret != XCAM_RETURN_NO_ERROR) {
118*4882a593Smuzhiyun             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "deque parameter failed\n");
119*4882a593Smuzhiyun             ret = XCAM_RETURN_ERROR_PARAM;
120*4882a593Smuzhiyun             goto ret_tnr_buf;
121*4882a593Smuzhiyun         }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun         ispp_tnr_params = (struct rkispp_params_tnrcfg*)v4l2buf_tnr->get_buf().m.userptr;
124*4882a593Smuzhiyun         ispp_tnr_params->head.frame_id = frameId;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun         if (mCamHw->get_tnr_cfg_params(ready_results, *ispp_tnr_params) != XCAM_RETURN_NO_ERROR)
127*4882a593Smuzhiyun             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "tnr parameter translation error\n");
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "tnr: en update 0x%x, ens 0x%x, cfg update 0x%x",
130*4882a593Smuzhiyun                         ispp_tnr_params->head.module_en_update, ispp_tnr_params->head.module_ens,
131*4882a593Smuzhiyun                         ispp_tnr_params->head.module_cfg_update);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun         if (memcmp(&last_ispp_tnr_params, ispp_tnr_params, sizeof(last_ispp_tnr_params)) == 0) {
134*4882a593Smuzhiyun             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "tnr: no need update !");
135*4882a593Smuzhiyun             ret = XCAM_RETURN_NO_ERROR;
136*4882a593Smuzhiyun             goto ret_tnr_buf;
137*4882a593Smuzhiyun         }
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun         last_ispp_tnr_params = *ispp_tnr_params;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun         if ((ispp_tnr_params->head.module_cfg_update) || (ispp_tnr_params->head.module_en_update)) {
142*4882a593Smuzhiyun             if (mTnrParamsDev->queue_buffer (v4l2buf_tnr) != 0) {
143*4882a593Smuzhiyun                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISP1: tnr: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n",
144*4882a593Smuzhiyun                                 v4l2buf_tnr->get_buf().index, errno, strerror(errno));
145*4882a593Smuzhiyun                 goto ret_tnr_buf;
146*4882a593Smuzhiyun             }
147*4882a593Smuzhiyun         } else
148*4882a593Smuzhiyun             goto ret_tnr_buf;
149*4882a593Smuzhiyun     } else
150*4882a593Smuzhiyun         return XCAM_RETURN_BYPASS;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun     return XCAM_RETURN_NO_ERROR;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun ret_tnr_buf:
155*4882a593Smuzhiyun     if (v4l2buf_tnr.ptr())
156*4882a593Smuzhiyun         mTnrParamsDev->return_buffer_to_pool (v4l2buf_tnr);
157*4882a593Smuzhiyun     return ret;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun 
config_params(uint32_t frameId,SmartPtr<cam3aResult> & result)160*4882a593Smuzhiyun XCamReturn TnrStreamProcUnit::config_params(uint32_t frameId, SmartPtr<cam3aResult>& result)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun     XCamReturn ret = XCAM_RETURN_NO_ERROR;
163*4882a593Smuzhiyun     XCAM_ASSERT (mParamsAssembler.ptr());
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun     // params device should started befor any params queued
166*4882a593Smuzhiyun     if (mTnrParamsDev.ptr() && !mTnrParamsDev->is_activated()) {
167*4882a593Smuzhiyun         mParamsAssembler->addReadyCondition(result->getType());
168*4882a593Smuzhiyun         mParamsAssembler->queue(result);
169*4882a593Smuzhiyun     } else {
170*4882a593Smuzhiyun         mParamsAssembler->queue(result);
171*4882a593Smuzhiyun         // set all ready params to drv
172*4882a593Smuzhiyun         while (mParamsAssembler->ready()) {
173*4882a593Smuzhiyun             if (configToDrv(frameId) != XCAM_RETURN_NO_ERROR)
174*4882a593Smuzhiyun                 break;
175*4882a593Smuzhiyun         }
176*4882a593Smuzhiyun     }
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun     return ret;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun } //namspace RkCam
182