xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/TnrStreamProcUnit.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *  Copyright (c) 2019 Rockchip Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 
18 #include "TnrStreamProcUnit.h"
19 #include "CamHwIsp20.h"
20 
21 namespace RkCam {
22 
23 #define ISPP_TNR_SUBM  (0x03)
24 
TnrStreamProcUnit(const rk_sensor_full_info_t * s_info)25 TnrStreamProcUnit::TnrStreamProcUnit (const rk_sensor_full_info_t *s_info)
26 {
27     mTnrStatsDev = new V4l2Device(s_info->ispp_info->pp_tnr_stats_path);
28     mTnrStatsDev->open();
29     mTnrParamsDev = new V4l2Device (s_info->ispp_info->pp_tnr_params_path);
30     mTnrParamsDev->open();
31     mTnrStatsStream = new TnrStatsStream(mTnrStatsDev, ISPP_POLL_TNR_STATS);
32     mTnrParamStream = new RKStream(mTnrParamsDev, ISPP_POLL_TNR_PARAMS);
33     mParamsAssembler = new IspParamsAssembler("TNR_PARAMS_ASSEMBLER");
34 }
35 
~TnrStreamProcUnit()36 TnrStreamProcUnit::~TnrStreamProcUnit()
37 {
38 }
39 
40 void
start()41 TnrStreamProcUnit::start()
42 {
43     XCamReturn ret = XCAM_RETURN_NO_ERROR;
44 
45     if (mTnrParamsDev.ptr() && !mTnrParamsDev->is_activated()) {
46         if (mTnrStatsStream.ptr())
47             mTnrStatsStream->start();
48         if (mTnrParamStream.ptr())
49             //mTnrParamStream->startThreadOnly();
50             mTnrParamStream->start();
51     }
52     // set inital params
53     ret = mParamsAssembler->start();
54     if (ret < 0) {
55         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
56         return;
57     }
58 
59     if (mParamsAssembler->ready())
60         configToDrv(0);
61     else
62         LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no inital tnr params ready");
63 }
64 
65 void
stop()66 TnrStreamProcUnit::stop()
67 {
68     if (mTnrParamStream.ptr())
69         mTnrParamStream->stop();
70     if (mTnrStatsStream.ptr())
71         mTnrStatsStream->stop();
72     if (mParamsAssembler.ptr())
73         mParamsAssembler->stop();
74 }
75 
76 void
pause()77 TnrStreamProcUnit::pause()
78 {
79 }
80 
81 void
resume()82 TnrStreamProcUnit::resume()
83 {
84 }
85 
86 void
set_devices(CamHwIsp20 * camHw,SmartPtr<V4l2SubDevice> isppdev)87 TnrStreamProcUnit::set_devices(CamHwIsp20 *camHw, SmartPtr<V4l2SubDevice> isppdev)
88 {
89     mIsppSubDev = isppdev;
90     mCamHw = camHw;
91     mTnrStatsStream->set_device(camHw, isppdev);
92 }
93 
configToDrv(uint32_t frameId)94 XCamReturn TnrStreamProcUnit::configToDrv(uint32_t frameId)
95 {
96     XCamReturn ret = XCAM_RETURN_NO_ERROR;
97     XCAM_ASSERT (mParamsAssembler.ptr());
98 
99     SmartPtr<V4l2Buffer> v4l2buf_tnr;
100     if (mTnrParamsDev.ptr()) {
101 
102         struct rkispp_params_tnrcfg *ispp_tnr_params = NULL;
103 
104         if (!mParamsAssembler->ready()) {
105             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "have no tnr new parameter\n");
106             return XCAM_RETURN_ERROR_PARAM;
107         }
108 
109         ret = mTnrParamsDev->get_buffer(v4l2buf_tnr);
110         if (ret) {
111             LOGW_CAMHW_SUBM(ISP20HW_SUBM, "Can not get ispp tnr params buffer\n");
112             return XCAM_RETURN_ERROR_PARAM;
113         }
114 
115         cam3aResultList ready_results;
116         ret = mParamsAssembler->deQueOne(ready_results, frameId);
117         if (ret != XCAM_RETURN_NO_ERROR) {
118             LOGI_CAMHW_SUBM(ISP20HW_SUBM, "deque parameter failed\n");
119             ret = XCAM_RETURN_ERROR_PARAM;
120             goto ret_tnr_buf;
121         }
122 
123         ispp_tnr_params = (struct rkispp_params_tnrcfg*)v4l2buf_tnr->get_buf().m.userptr;
124         ispp_tnr_params->head.frame_id = frameId;
125 
126         if (mCamHw->get_tnr_cfg_params(ready_results, *ispp_tnr_params) != XCAM_RETURN_NO_ERROR)
127             LOGE_CAMHW_SUBM(ISP20HW_SUBM, "tnr parameter translation error\n");
128 
129         LOGD_CAMHW_SUBM(ISP20HW_SUBM, "tnr: en update 0x%x, ens 0x%x, cfg update 0x%x",
130                         ispp_tnr_params->head.module_en_update, ispp_tnr_params->head.module_ens,
131                         ispp_tnr_params->head.module_cfg_update);
132 
133         if (memcmp(&last_ispp_tnr_params, ispp_tnr_params, sizeof(last_ispp_tnr_params)) == 0) {
134             LOGD_CAMHW_SUBM(ISP20HW_SUBM, "tnr: no need update !");
135             ret = XCAM_RETURN_NO_ERROR;
136             goto ret_tnr_buf;
137         }
138 
139         last_ispp_tnr_params = *ispp_tnr_params;
140 
141         if ((ispp_tnr_params->head.module_cfg_update) || (ispp_tnr_params->head.module_en_update)) {
142             if (mTnrParamsDev->queue_buffer (v4l2buf_tnr) != 0) {
143                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISP1: tnr: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n",
144                                 v4l2buf_tnr->get_buf().index, errno, strerror(errno));
145                 goto ret_tnr_buf;
146             }
147         } else
148             goto ret_tnr_buf;
149     } else
150         return XCAM_RETURN_BYPASS;
151 
152     return XCAM_RETURN_NO_ERROR;
153 
154 ret_tnr_buf:
155     if (v4l2buf_tnr.ptr())
156         mTnrParamsDev->return_buffer_to_pool (v4l2buf_tnr);
157     return ret;
158 }
159 
config_params(uint32_t frameId,SmartPtr<cam3aResult> & result)160 XCamReturn TnrStreamProcUnit::config_params(uint32_t frameId, SmartPtr<cam3aResult>& result)
161 {
162     XCamReturn ret = XCAM_RETURN_NO_ERROR;
163     XCAM_ASSERT (mParamsAssembler.ptr());
164 
165     // params device should started befor any params queued
166     if (mTnrParamsDev.ptr() && !mTnrParamsDev->is_activated()) {
167         mParamsAssembler->addReadyCondition(result->getType());
168         mParamsAssembler->queue(result);
169     } else {
170         mParamsAssembler->queue(result);
171         // set all ready params to drv
172         while (mParamsAssembler->ready()) {
173             if (configToDrv(frameId) != XCAM_RETURN_NO_ERROR)
174                 break;
175         }
176     }
177 
178     return ret;
179 }
180 
181 } //namspace RkCam
182