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