xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/atmo/rk_aiq_uapi_atmo_int.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "rk_aiq_uapi_atmo_int.h"
2 #include "rk_aiq_types_atmo_algo_prvt.h"
3 
4 bool
IfTmoDataEqu(int * pInput,int len)5 IfTmoDataEqu
6 (
7     int* pInput,
8     int len
9 )
10 {
11     bool equ = true;
12 
13     for(int i = 0; i < len - 1; i++)
14         if(pInput[i] != pInput[i + 1])
15             equ = false;
16 
17     return equ;
18 }
19 
20 XCamReturn
rk_aiq_uapi_atmo_SetTool(CalibDbV2_tmo_t * pStore,CalibDbV2_tmo_t * pInput)21 rk_aiq_uapi_atmo_SetTool
22 (
23     CalibDbV2_tmo_t* pStore,
24     CalibDbV2_tmo_t* pInput
25 )
26 {
27     XCamReturn ret = XCAM_RETURN_NO_ERROR;
28 
29     //global luma
30     int GlobalLumaLen[3];
31     GlobalLumaLen[0] = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
32     GlobalLumaLen[1] = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO_len;
33     GlobalLumaLen[2] = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength_len;
34     bool GlobalLumaEqu = IfTmoDataEqu(GlobalLumaLen, 3);
35     if(!GlobalLumaEqu) {
36         LOGE_ATMO("%s: Input TMO Global Luma Data length is NOT EQUAL !!!\n", __FUNCTION__ );
37         return XCAM_RETURN_ERROR_FAILED;
38     }
39 
40     if(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len != pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len) {
41         free(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv);
42         free(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO);
43         free(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength);
44         pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv =
45             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
46         pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO =
47             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
48         pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength =
49             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
50     }
51     pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
52     pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO_len = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
53     pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength_len = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
54     memcpy(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv,
55            pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv, sizeof(float)*pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
56     memcpy(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO,
57            pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO, sizeof(float)*pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
58     memcpy(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength,
59            pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength, sizeof(float)*pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
60 
61     //high light
62     int HighLightLen[3];
63     HighLightLen[0] = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
64     HighLightLen[1] = pInput->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv_len;
65     HighLightLen[2] = pInput->TmoTuningPara.DetailsHighLight.HighLightData.Strength_len;
66     bool HighLightLenEqu = IfTmoDataEqu(HighLightLen, 3);
67     if(!HighLightLenEqu) {
68         LOGE_ATMO("%s: Input TMO Hight Light Data length is NOT EQUAL !!!\n", __FUNCTION__ );
69         return XCAM_RETURN_ERROR_FAILED;
70     }
71     if(pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len != pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len) {
72         free(pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf);
73         free(pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv);
74         free(pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength);
75         pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf =
76             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
77         pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv =
78             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
79         pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength =
80             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
81     }
82     pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
83     pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv_len = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
84     pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength_len = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
85     memcpy(pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf,
86            pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf, sizeof(float)*pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
87     memcpy(pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv,
88            pInput->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv, sizeof(float)*pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
89     memcpy(pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength,
90            pInput->TmoTuningPara.DetailsHighLight.HighLightData.Strength, sizeof(float)*pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
91 
92     //low light
93     int LowLightLen[4];
94     LowLightLen[0] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
95     LowLightLen[1] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf_len;
96     LowLightLen[2] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.ISO_len;
97     LowLightLen[3] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.Strength_len;
98     bool LowLightLenEqu = IfTmoDataEqu(LowLightLen, 4);
99     if(!LowLightLenEqu) {
100         LOGE_ATMO("%s: Input TMO Low Light Data length is NOT EQUAL !!!\n", __FUNCTION__ );
101         return XCAM_RETURN_ERROR_FAILED;
102     }
103     if(pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len != pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len) {
104         free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma);
105         free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf);
106         free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO);
107         free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength);
108         pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma =
109             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
110         pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf =
111             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
112         pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO =
113             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
114         pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength =
115             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
116     }
117     pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
118     pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
119     pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
120     pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
121     memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma,
122            pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
123     memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf,
124            pInput->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
125     memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO,
126            pInput->TmoTuningPara.DetailsLowLight.LowLightData.ISO, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
127     memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength,
128            pInput->TmoTuningPara.DetailsLowLight.LowLightData.Strength, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
129 
130     //global tmo
131     int GlobalTMOLen[3];
132     GlobalTMOLen[0] = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
133     GlobalTMOLen[1] = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv_len;
134     GlobalTMOLen[2] = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength_len;
135     bool GlobalTMOLenEqu = IfTmoDataEqu(GlobalTMOLen, 3);
136     if(!GlobalTMOLenEqu) {
137         LOGE_ATMO("%s: Input TMO GlobalTMO Data length is NOT EQUAL !!!\n", __FUNCTION__ );
138         return XCAM_RETURN_ERROR_FAILED;
139     }
140     if(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len != pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len) {
141         free(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange);
142         free(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv);
143         free(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength);
144         pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange =
145             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
146         pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv =
147             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
148         pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength =
149             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
150     }
151     pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
152     pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv_len = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
153     pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength_len = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
154     memcpy(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange,
155            pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange, sizeof(float)*pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
156     memcpy(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv,
157            pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv, sizeof(float)*pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
158     memcpy(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength,
159            pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength, sizeof(float)*pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
160 
161     //local tmo
162     int LocalTMOLen[3];
163     LocalTMOLen[0] = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
164     LocalTMOLen[1] = pInput->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv_len;
165     LocalTMOLen[2] = pInput->TmoTuningPara.LocalTMO.LocalTmoData.Strength_len;
166     bool LocalTMOLenEqu = IfTmoDataEqu(LocalTMOLen, 3);
167     if(!LocalTMOLenEqu) {
168         LOGE_ATMO("%s: Input TMO LocalTMO Data length is NOT EQUAL !!!\n", __FUNCTION__ );
169         return XCAM_RETURN_ERROR_FAILED;
170     }
171     if(pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len != pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len) {
172         //free
173         free(pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange);
174         free(pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv);
175         free(pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength);
176         //malloc
177         pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange =
178             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
179         pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv =
180             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
181         pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength =
182             (float *) malloc(sizeof(float) * pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
183         //store len
184         pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
185         pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv_len = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
186         pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength_len = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
187     }
188     memcpy(pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange,
189            pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange, sizeof(float)*pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
190     memcpy(pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv,
191            pInput->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv, sizeof(float)*pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
192     memcpy(pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength,
193            pInput->TmoTuningPara.LocalTMO.LocalTmoData.Strength, sizeof(float)*pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
194 
195 
196     pStore->TmoTuningPara.Enable = pInput->TmoTuningPara.Enable;
197     pStore->TmoTuningPara.GlobalLuma.Mode = pInput->TmoTuningPara.GlobalLuma.Mode;
198     pStore->TmoTuningPara.GlobalLuma.Tolerance = pInput->TmoTuningPara.GlobalLuma.Tolerance;
199     pStore->TmoTuningPara.DetailsHighLight.Mode = pInput->TmoTuningPara.DetailsHighLight.Mode;
200     pStore->TmoTuningPara.DetailsHighLight.Tolerance = pInput->TmoTuningPara.DetailsHighLight.Tolerance;
201     pStore->TmoTuningPara.DetailsLowLight.Mode = pInput->TmoTuningPara.DetailsLowLight.Mode;
202     pStore->TmoTuningPara.DetailsLowLight.Tolerance = pInput->TmoTuningPara.DetailsLowLight.Tolerance;
203     pStore->TmoTuningPara.LocalTMO.Mode = pInput->TmoTuningPara.LocalTMO.Mode;
204     pStore->TmoTuningPara.LocalTMO.Tolerance = pInput->TmoTuningPara.LocalTMO.Tolerance;
205     pStore->TmoTuningPara.GlobaTMO.Mode = pInput->TmoTuningPara.GlobaTMO.Mode;
206     pStore->TmoTuningPara.GlobaTMO.Tolerance = pInput->TmoTuningPara.GlobaTMO.Tolerance;
207     pStore->TmoTuningPara.GlobaTMO.Enable = pInput->TmoTuningPara.GlobaTMO.Enable;
208     pStore->TmoTuningPara.GlobaTMO.IIR = pInput->TmoTuningPara.GlobaTMO.IIR;
209     pStore->TmoTuningPara.damp = pInput->TmoTuningPara.damp;
210 
211     return ret;
212 }
213 
214 XCamReturn
rk_aiq_uapi_atmo_SetAttrib(RkAiqAlgoContext * ctx,atmo_attrib_t attr,bool need_sync)215 rk_aiq_uapi_atmo_SetAttrib
216 (
217     RkAiqAlgoContext* ctx,
218     atmo_attrib_t attr,
219     bool need_sync
220 )
221 {
222     XCamReturn ret = XCAM_RETURN_NO_ERROR;
223 
224     if(ctx == NULL) {
225         LOGE_ATMO("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
226         return XCAM_RETURN_ERROR_PARAM;
227     }
228 
229     AtmoContext_t* pAtmoCtx = (AtmoContext_t*)(ctx->AtmoInstConfig.hAtmo);
230 
231     //Todo
232     pAtmoCtx->tmoAttr.opMode = attr.opMode;
233     if(attr.opMode == TMO_OPMODE_SET_LEVEL)
234         memcpy(&pAtmoCtx->tmoAttr.stSetLevel, &attr.stSetLevel, sizeof(FastMode_t));
235     if(attr.opMode == TMO_OPMODE_DARKAREA)
236         memcpy(&pAtmoCtx->tmoAttr.stDarkArea, &attr.stDarkArea, sizeof(DarkArea_t));
237     if(attr.opMode == TMO_OPMODE_TOOL)
238         ret = rk_aiq_uapi_atmo_SetTool(&pAtmoCtx->tmoAttr.stTool, &attr.stTool);
239 
240     if (attr.opMode == TMO_OPMODE_AUTO) {
241         pAtmoCtx->tmoAttr.stAuto.bUpdateTmo = attr.stAuto.bUpdateTmo;
242         memcpy(&pAtmoCtx->tmoAttr.stAuto.stTmoAuto, &attr.stAuto.stTmoAuto, sizeof(atmoAttr_t));
243     }
244     else
245         pAtmoCtx->tmoAttr.stAuto.bUpdateTmo = false;
246 
247     if (attr.opMode == TMO_OPMODE_MANU) {
248         pAtmoCtx->tmoAttr.stManual.bUpdateTmo = attr.stManual.bUpdateTmo;
249         memcpy(&pAtmoCtx->tmoAttr.stManual.stTmoManual, &attr.stManual.stTmoManual, sizeof(mtmoAttr_t));
250     }
251     else
252         pAtmoCtx->tmoAttr.stManual.bUpdateTmo = false;
253 
254     return ret;
255 }
256 
257 XCamReturn
rk_aiq_uapi_atmo_GetAttrib(RkAiqAlgoContext * ctx,atmo_attrib_t * attr)258 rk_aiq_uapi_atmo_GetAttrib
259 (
260     RkAiqAlgoContext*  ctx,
261     atmo_attrib_t* attr
262 )
263 {
264     XCamReturn ret = XCAM_RETURN_NO_ERROR;
265 
266     if(ctx == NULL || attr == NULL) {
267         LOGE_ATMO("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
268         return XCAM_RETURN_ERROR_PARAM;
269     }
270 
271     AtmoContext_t* pAtmoCtx = (AtmoContext_t*)ctx->AtmoInstConfig.hAtmo;
272 
273     attr->opMode = pAtmoCtx->tmoAttr.opMode;
274     memcpy(&attr->stAuto.stTmoAuto, &pAtmoCtx->tmoAttr.stAuto.stTmoAuto, sizeof(atmoAttr_t));
275     memcpy(&attr->stManual.stTmoManual, &pAtmoCtx->tmoAttr.stManual.stTmoManual, sizeof(mtmoAttr_t));
276     memcpy(&attr->stSetLevel, &pAtmoCtx->tmoAttr.stSetLevel, sizeof(FastMode_t));
277     memcpy(&attr->stDarkArea, &pAtmoCtx->tmoAttr.stDarkArea, sizeof(DarkArea_t));
278     ret = rk_aiq_uapi_atmo_SetTool(&attr->stTool, &pAtmoCtx->tmoAttr.stTool);
279     memcpy(&attr->stTool, &pAtmoCtx->tmoAttr.stTool, sizeof(CalibDbV2_tmo_t));
280     memcpy(&attr->CtlInfo, &pAtmoCtx->tmoAttr.CtlInfo, sizeof(TmoCurrCtlData_t));
281     memcpy(&attr->RegInfo, &pAtmoCtx->tmoAttr.RegInfo, sizeof(TmoCurrRegData_t));
282 
283     return ret;
284 }
285 
286 
287