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