1 #include "third_party_af_algo.h"
2 #include "rk_aiq_user_api2_sysctl.h"
3 
set_af_manual_meascfg(const rk_aiq_sys_ctx_t * ctx)4 static void set_af_manual_meascfg(const rk_aiq_sys_ctx_t* ctx)
5 {
6     rk_aiq_af_attrib_t attr;
7     uint16_t gamma_y[RKAIQ_RAWAF_GAMMA_NUM] =
8         {0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023};
9 
10     rk_aiq_user_api2_af_GetAttrib(ctx, &attr);
11     attr.AfMode = RKAIQ_AF_MODE_FIXED;
12     printf("AfHwVer %d\n", attr.AfHwVer);
13     if (attr.AfHwVer == RKAIQ_AF_HW_V20) {
14         // rv1126/rv1109 rk356x
15         memset(&attr.manual_meascfg, 0, sizeof(attr.manual_meascfg));
16         attr.manual_meascfg.contrast_af_en = 1;
17         attr.manual_meascfg.rawaf_sel = 0; // normal = 0; hdr = 1
18 
19         attr.manual_meascfg.window_num = 2;
20         attr.manual_meascfg.wina_h_offs = 2;
21         attr.manual_meascfg.wina_v_offs = 2;
22         attr.manual_meascfg.wina_h_size = 2580;
23         attr.manual_meascfg.wina_v_size = 1935;
24 
25         attr.manual_meascfg.winb_h_offs = 500;
26         attr.manual_meascfg.winb_v_offs = 600;
27         attr.manual_meascfg.winb_h_size = 300;
28         attr.manual_meascfg.winb_v_size = 300;
29 
30         attr.manual_meascfg.gamma_flt_en = 1;
31         memcpy(attr.manual_meascfg.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
32 
33         attr.manual_meascfg.gaus_flt_en = 1;
34         attr.manual_meascfg.gaus_h0 = 0x20;
35         attr.manual_meascfg.gaus_h1 = 0x10;
36         attr.manual_meascfg.gaus_h2 = 0x08;
37 
38         attr.manual_meascfg.afm_thres = 4;
39 
40         attr.manual_meascfg.lum_var_shift[0] = 0;
41         attr.manual_meascfg.afm_var_shift[0] = 0;
42         attr.manual_meascfg.lum_var_shift[1] = 4;
43         attr.manual_meascfg.afm_var_shift[1] = 4;
44 
45         attr.manual_meascfg.sp_meas.enable = true;
46         attr.manual_meascfg.sp_meas.ldg_xl = 10;
47         attr.manual_meascfg.sp_meas.ldg_yl = 28;
48         attr.manual_meascfg.sp_meas.ldg_kl = (255-28)*256/45;
49         attr.manual_meascfg.sp_meas.ldg_xh = 118;
50         attr.manual_meascfg.sp_meas.ldg_yh = 8;
51         attr.manual_meascfg.sp_meas.ldg_kh = (255-8)*256/15;
52         attr.manual_meascfg.sp_meas.highlight_th = 245;
53         attr.manual_meascfg.sp_meas.highlight2_th = 200;
54     } else if (attr.AfHwVer == RKAIQ_AF_HW_V30) {
55         // rk3588
56         memset(&attr.manual_meascfg_v30, 0, sizeof(attr.manual_meascfg_v30));
57         attr.manual_meascfg_v30.af_en = 1;
58         attr.manual_meascfg_v30.rawaf_sel = 0; // normal = 0; hdr = 1
59         attr.manual_meascfg_v30.accu_8bit_mode = 1;
60         attr.manual_meascfg_v30.ae_mode = 1;
61 
62         attr.manual_meascfg_v30.window_num = 2;
63         attr.manual_meascfg_v30.wina_h_offs = 2;
64         attr.manual_meascfg_v30.wina_v_offs = 2;
65         attr.manual_meascfg_v30.wina_h_size = 2580;
66         attr.manual_meascfg_v30.wina_v_size = 1935;
67 
68         attr.manual_meascfg_v30.winb_h_offs = 500;
69         attr.manual_meascfg_v30.winb_v_offs = 600;
70         attr.manual_meascfg_v30.winb_h_size = 300;
71         attr.manual_meascfg_v30.winb_v_size = 300;
72 
73         attr.manual_meascfg_v30.gamma_en = 1;
74         memcpy(attr.manual_meascfg_v30.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
75 
76         // param for winb
77         attr.manual_meascfg_v30.thres = 4;
78         attr.manual_meascfg_v30.shift_sum_a = 0;
79         attr.manual_meascfg_v30.shift_y_a = 0;
80         attr.manual_meascfg_v30.shift_sum_b = 1;
81         attr.manual_meascfg_v30.shift_y_b = 1;
82 
83         // Vertical filter
84         // face [0.025, 0.06], max=0.5
85         int ver_flt_face[6] =
86             { 503, 8, 9, -1997, 0, 1997 };
87 
88         // lowlit [0.025, 0.075], max=0.5
89         int ver_flt_lowlit[6] =
90             { 503, 8, 9, -1997, 0, 1997 };
91 
92         // normal [0.042, 0.14], max=0.5
93         int ver_flt_normal[6] =
94             { 483, 28, 28, -1186, 0, 1186 };
95 
96         // high [0.055, 0.125], max=0.5
97         int ver_flt_high[6] =
98             { 483, 27, 28, -1212, 0, 1212 };
99 
100         // dotlight [0.1 0.175], max=0.5
101         int ver_flt_dotlight[6] =
102             { 445, 63, 64, -531, 0, 531 };
103 
104         // full [0.025, 0.175], max=0.5
105         int ver_flt_full[6] =
106             { 476, 33, 34, -985, 0, 985 };
107 
108         attr.manual_meascfg_v30.gaus_en = 1;
109         attr.manual_meascfg_v30.v1_fir_sel = 1; // 0:old 1:new
110         attr.manual_meascfg_v30.viir_en = 1;
111         attr.manual_meascfg_v30.v1_fv_outmode = 0; // 0 square, 1 absolute
112         attr.manual_meascfg_v30.v2_fv_outmode = 0; // 0 square, 1 absolute
113         attr.manual_meascfg_v30.v1_fv_shift = 1; //only for sel1
114         attr.manual_meascfg_v30.v2_fv_shift = 1;
115         attr.manual_meascfg_v30.v_fv_thresh = 0;
116         attr.manual_meascfg_v30.v1_iir_coe[1] = ver_flt_lowlit[0];
117         attr.manual_meascfg_v30.v1_iir_coe[4] = ver_flt_lowlit[1];
118         attr.manual_meascfg_v30.v1_iir_coe[7] = ver_flt_lowlit[2];
119         for (int i = 0; i < 3; i++) {
120             attr.manual_meascfg_v30.v1_fir_coe[i] = ver_flt_lowlit[i + 3];
121             attr.manual_meascfg_v30.v2_iir_coe[i] = ver_flt_normal[i];
122             attr.manual_meascfg_v30.v2_fir_coe[i] = ver_flt_normal[i + 3];
123         }
124 
125         // Horizontal filter
126         // low [0.0125, 0.03], max=0.5
127         int hor_flt_low[2][6] =
128         {
129             { 31, 960, -462, 546, 0, -546 },
130             { 17, 994, -486, 665, 0, -665 },
131         };
132         // face [0.025, 0.06], max=0.5
133         int hor_flt_face[2][6] =
134         {
135             { 117, 877, -417, 805, 0, -805 },
136             { 23,  957, -460, 334, 0, -334 },
137         };
138         // lowlit [0.025, 0.075], max=0.5
139         int hor_flt_lowlit[2][6] =
140         {
141             { 203, 811, -375, 673, 0, -673 },
142             { 31,  945, -448, 323, 0, -323 },
143         };
144         // normal [0.042, 0.14], max=0.5
145         int hor_flt_normal[2][6] =
146         {
147             { 512, 557, -276, 460, 0, -460 },
148             { 100, 870, -399, 191, 0, -191 },
149         };
150         // high [0.055, 0.125], max=0.5
151         int hor_flt_high[2][6] =
152         {
153             { 415, 648, -344, 403, 0, -403 },
154             { 96,  854, -409, 156, 0, -156 },
155         };
156         // dotlight [0.1 0.175], max=0.5
157         int hor_flt_dotlight[2][6] =
158         {
159             { 512, 447, -349, 319, 0, -319 },
160             { 181, 698, -386, 96, 0, -96 },
161         };
162         // full [0.025, 0.175], max=0.5
163         int hor_flt_full[2][6] =
164         {
165             { 512, 362, -171, 512, 0, -512 },
166             { 114, 915, -417, 302, 0, -302 },
167         };
168         attr.manual_meascfg_v30.hiir_en = 1;
169         attr.manual_meascfg_v30.h1_fv_outmode = 0; // 0 square, 1 absolute
170         attr.manual_meascfg_v30.h2_fv_outmode = 0; // 0 square, 1 absolute
171         attr.manual_meascfg_v30.h1_fv_shift = 1;
172         attr.manual_meascfg_v30.h2_fv_shift = 1;
173         attr.manual_meascfg_v30.h_fv_thresh = 0;
174         for (int i = 0; i < 6; i++) {
175             attr.manual_meascfg_v30.h1_iir1_coe[i] = hor_flt_lowlit[0][i];
176             attr.manual_meascfg_v30.h1_iir2_coe[i] = hor_flt_lowlit[1][i];
177             attr.manual_meascfg_v30.h2_iir1_coe[i] = hor_flt_normal[0][i];
178             attr.manual_meascfg_v30.h2_iir2_coe[i] = hor_flt_normal[1][i];
179         }
180 
181         // level depended gain
182         attr.manual_meascfg_v30.ldg_en = 0;
183         attr.manual_meascfg_v30.h_ldg_lumth[0] = 64;
184         attr.manual_meascfg_v30.h_ldg_gain[0]  = 28;
185         attr.manual_meascfg_v30.h_ldg_gslp[0]  = (255-28)*255/45;
186         attr.manual_meascfg_v30.h_ldg_lumth[1] = 185;
187         attr.manual_meascfg_v30.h_ldg_gain[1]  = 8;
188         attr.manual_meascfg_v30.h_ldg_gslp[1]  = (255-8)*255/45;
189         attr.manual_meascfg_v30.v_ldg_lumth[0] = 64;
190         attr.manual_meascfg_v30.v_ldg_gain[0]  = 28;
191         attr.manual_meascfg_v30.v_ldg_gslp[0]  = (255-28)*255/45;
192         attr.manual_meascfg_v30.v_ldg_lumth[1] = 185;
193         attr.manual_meascfg_v30.v_ldg_gain[1]  = 8;
194         attr.manual_meascfg_v30.v_ldg_gslp[1]  = (255-8)*255/45;
195 
196         // High light
197         attr.manual_meascfg_v30.highlit_thresh = 912;
198     } else if (attr.AfHwVer == RKAIQ_AF_HW_V31) {
199         // rk1106
200         memset(&attr.manual_meascfg_v31, 0, sizeof(attr.manual_meascfg_v31));
201         attr.manual_meascfg_v31.af_en = 1;
202         attr.manual_meascfg_v31.rawaf_sel = 0; // normal = 0; hdr = 1
203         attr.manual_meascfg_v31.accu_8bit_mode = 1;
204         attr.manual_meascfg_v31.ae_mode = 1;
205         attr.manual_meascfg_v31.v_dnscl_mode = 1;
206 
207         attr.manual_meascfg_v31.window_num = 2;
208         attr.manual_meascfg_v31.wina_h_offs = 2;
209         attr.manual_meascfg_v31.wina_v_offs = 2;
210         attr.manual_meascfg_v31.wina_h_size = 2550;
211         attr.manual_meascfg_v31.wina_v_size = 1425;
212 
213         attr.manual_meascfg_v31.winb_h_offs = 500;
214         attr.manual_meascfg_v31.winb_v_offs = 600;
215         attr.manual_meascfg_v31.winb_h_size = 300;
216         attr.manual_meascfg_v31.winb_v_size = 300;
217 
218         attr.manual_meascfg_v31.gamma_en = 1;
219         memcpy(attr.manual_meascfg_v31.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
220 
221         // param for winb
222         attr.manual_meascfg_v31.thres = 4;
223         attr.manual_meascfg_v31.shift_sum_a = 0;
224         attr.manual_meascfg_v31.shift_y_a = 0;
225         attr.manual_meascfg_v31.shift_sum_b = 1;
226         attr.manual_meascfg_v31.shift_y_b = 1;
227 
228         // Vertical filter
229         // face [0.025, 0.06], max=0.5
230         int ver_flt_face[6] =
231             { -410, 895, 330, -79, 0, 79 };
232 
233         // lowlit [0.025, 0.075], max=0.5
234         int ver_flt_lowlit[6] =
235             { -372, 851, 465, -77, 0, 77 };
236 
237         // normal [0.042, 0.14], max=0.5
238         int ver_flt_normal[6] =
239             { -265, 686, 512, -124, 0, 124 };
240 
241         // high [0.055, 0.125], max=0.5
242         int ver_flt_high[6] =
243             { -325, 724, 512, -94, 0, 94 };
244 
245         // dotlight [0.1 0.175], max=0.5
246         int ver_flt_dotlight[6] =
247             { -314, 552, 512, -99, 0, 99 };
248 
249         // full [0.025, 0.175], max=0.5
250         int ver_flt_full[6] =
251             { -166, 616, 512, -173, 0, 173 };
252 
253         attr.manual_meascfg_v31.gaus_en = 1;
254         attr.manual_meascfg_v31.gaus_coe[1] = 64;
255         attr.manual_meascfg_v31.gaus_coe[4] = 64;
256         attr.manual_meascfg_v31.v1_fir_sel = 1; // 0:old 1:new
257         attr.manual_meascfg_v31.viir_en = 1;
258         attr.manual_meascfg_v31.v1_fv_outmode = 0; // 0 square, 1 absolute
259         attr.manual_meascfg_v31.v2_fv_outmode = 0; // 0 square, 1 absolute
260         attr.manual_meascfg_v31.v1_fv_shift = 1; //only for sel1
261         attr.manual_meascfg_v31.v2_fv_shift = 1;
262         attr.manual_meascfg_v31.v_fv_thresh = 0;
263         for (int i = 0; i < 3; i++) {
264             attr.manual_meascfg_v31.v1_iir_coe[i] = ver_flt_lowlit[i];
265             attr.manual_meascfg_v31.v1_fir_coe[i] = ver_flt_lowlit[i + 3];
266             attr.manual_meascfg_v31.v2_iir_coe[i] = ver_flt_normal[i];
267             attr.manual_meascfg_v31.v2_fir_coe[i] = ver_flt_normal[i + 3];
268         }
269 
270         // Horizontal filter
271         // low [0.0125, 0.03], max=0.5
272         int hor_flt_low[2][6] =
273         {
274             { 31, 960, -462, 491, 0, -491 },
275             { 19, 994, -486, 665, 0, -665 },
276         };
277         // face [0.025, 0.06], max=0.5
278         int hor_flt_face[2][6] =
279         {
280             { 117, 877, -417, 805, 0, -805 },
281             { 23,  957, -460, 334, 0, -334 },
282         };
283         // lowlit [0.025, 0.075], max=0.5
284         int hor_flt_lowlit[2][6] =
285         {
286             { 203, 811, -375, 673, 0, -673 },
287             { 31,  945, -448, 323, 0, -323 },
288         };
289         // normal [0.042, 0.14], max=0.5
290         int hor_flt_normal[2][6] =
291         {
292             { 512, 557, -276, 460, 0, -460 },
293             { 100, 870, -399, 191, 0, -191 },
294         };
295         // high [0.055, 0.125], max=0.5
296         int hor_flt_high[2][6] =
297         {
298             { 415, 648, -344, 403, 0, -403 },
299             { 96,  854, -409, 156, 0, -156 },
300         };
301         // dotlight [0.1 0.175], max=0.5
302         int hor_flt_dotlight[2][6] =
303         {
304             { 512, 447, -349, 319, 0, -319 },
305             { 181, 698, -386,  96, 0, -96 },
306         };
307         // full [0.025, 0.175], max=0.5
308         int hor_flt_full[2][6] =
309         {
310             { 512, 362, -171, 512, 0, -512 },
311             { 114, 915, -417, 302, 0, -302 },
312         };
313         attr.manual_meascfg_v31.hiir_en = 1;
314         attr.manual_meascfg_v31.h1_fv_outmode = 0; // 0 square, 1 absolute
315         attr.manual_meascfg_v31.h2_fv_outmode = 0; // 0 square, 1 absolute
316         attr.manual_meascfg_v31.h1_fv_shift = 1;
317         attr.manual_meascfg_v31.h2_fv_shift = 1;
318         attr.manual_meascfg_v31.h_fv_thresh = 0;
319         for (int i = 0; i < 6; i++) {
320             attr.manual_meascfg_v31.h1_iir1_coe[i] = hor_flt_lowlit[0][i];
321             attr.manual_meascfg_v31.h1_iir2_coe[i] = hor_flt_lowlit[1][i];
322             attr.manual_meascfg_v31.h2_iir1_coe[i] = hor_flt_normal[0][i];
323             attr.manual_meascfg_v31.h2_iir2_coe[i] = hor_flt_normal[1][i];
324         }
325 
326         // level depended gain
327         attr.manual_meascfg_v31.ldg_en = 0;
328         attr.manual_meascfg_v31.h_ldg_lumth[0] = 64;
329         attr.manual_meascfg_v31.h_ldg_gain[0]  = 28;
330         attr.manual_meascfg_v31.h_ldg_gslp[0]  = (255-28)*255/45;
331         attr.manual_meascfg_v31.h_ldg_lumth[1] = 185;
332         attr.manual_meascfg_v31.h_ldg_gain[1]  = 8;
333         attr.manual_meascfg_v31.h_ldg_gslp[1]  = (255-8)*255/45;
334         attr.manual_meascfg_v31.v_ldg_lumth[0] = 64;
335         attr.manual_meascfg_v31.v_ldg_gain[0]  = 28;
336         attr.manual_meascfg_v31.v_ldg_gslp[0]  = (255-28)*255/45;
337         attr.manual_meascfg_v31.v_ldg_lumth[1] = 185;
338         attr.manual_meascfg_v31.v_ldg_gain[1]  = 8;
339         attr.manual_meascfg_v31.v_ldg_gslp[1]  = (255-8)*255/45;
340 
341         // High light
342         attr.manual_meascfg_v31.highlit_thresh = 912;
343     } else if (attr.AfHwVer == RKAIQ_AF_HW_V32_LITE) {
344         // rk3562
345         memset(&attr.manual_meascfg_v32, 0, sizeof(attr.manual_meascfg_v32));
346         attr.manual_meascfg_v32.af_en = 1;
347         attr.manual_meascfg_v32.rawaf_sel = 0; // normal = 0; hdr = 1
348         attr.manual_meascfg_v32.accu_8bit_mode = 1;
349         attr.manual_meascfg_v32.ae_mode = 1;
350         attr.manual_meascfg_v32.ae_sel = 1;
351         attr.manual_meascfg_v32.v_dnscl_mode = 1;
352 
353         attr.manual_meascfg_v32.window_num = 2;
354         attr.manual_meascfg_v32.wina_h_offs = 51;
355         attr.manual_meascfg_v32.wina_v_offs = 51;
356         attr.manual_meascfg_v32.wina_h_size = 2550;
357         attr.manual_meascfg_v32.wina_v_size = 1425;
358 
359         attr.manual_meascfg_v32.winb_h_offs = 500;
360         attr.manual_meascfg_v32.winb_v_offs = 600;
361         attr.manual_meascfg_v32.winb_h_size = 300;
362         attr.manual_meascfg_v32.winb_v_size = 300;
363 
364         attr.manual_meascfg_v32.gamma_en = 1;
365         memcpy(attr.manual_meascfg_v32.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
366 
367         // param for winb
368         attr.manual_meascfg_v32.thres = 4;
369         attr.manual_meascfg_v32.shift_sum_a = 0;
370         attr.manual_meascfg_v32.shift_y_a = 0;
371         attr.manual_meascfg_v32.shift_sum_b = 1;
372         attr.manual_meascfg_v32.shift_y_b = 1;
373 
374         // Vertical filter
375         // face [0.025, 0.06], max=0.5
376         int ver_flt_face[6] =
377             { -410, 895, 330, -79, 0, 79 };
378 
379         // lowlit [0.025, 0.075], max=0.5
380         int ver_flt_lowlit[6] =
381             { -372, 851, 465, -77, 0, 77 };
382 
383         // normal [0.042, 0.14], max=0.5
384         int ver_flt_normal[6] =
385             { -265, 686, 512, -124, 0, 124 };
386 
387         // high [0.055, 0.125], max=0.5
388         int ver_flt_high[6] =
389             { -325, 724, 512, -94, 0, 94 };
390 
391         // dotlight [0.1 0.175], max=0.5
392         int ver_flt_dotlight[6] =
393             { -314, 552, 512, -99, 0, 99 };
394 
395         // full [0.025, 0.175], max=0.5
396         int ver_flt_full[6] =
397             { -166, 616, 512, -173, 0, 173 };
398 
399         attr.manual_meascfg_v32.gaus_en = 1;
400         attr.manual_meascfg_v32.gaus_coe[1] = 64;
401         attr.manual_meascfg_v32.gaus_coe[4] = 64;
402         attr.manual_meascfg_v32.v1_fir_sel = 1; // 0:old 1:new
403         attr.manual_meascfg_v32.viir_en = 1;
404         attr.manual_meascfg_v32.v1_fv_outmode = 0; // 0 square, 1 absolute
405         attr.manual_meascfg_v32.v1_fv_shift = 1; //only for sel1
406         attr.manual_meascfg_v32.v_fv_thresh = 0;
407         attr.manual_meascfg_v32.v_fv_limit = 1023;
408         attr.manual_meascfg_v32.v_fv_slope = 256;
409         for (int i = 0; i < 3; i++) {
410             attr.manual_meascfg_v32.v1_iir_coe[i] = ver_flt_normal[i];
411             attr.manual_meascfg_v32.v1_fir_coe[i] = ver_flt_normal[i + 3];
412         }
413 
414         // Horizontal filter
415         // low [0.0125, 0.03], max=0.5
416         int hor_flt_low[2][6] =
417         {
418             { 256,   958,  -460,   202,     0,  -202 },
419             {  45,   994,  -485,    87,     0,   -87 },
420         };
421         // face [0.025, 0.06], max=0.5
422         int hor_flt_face[2][6] =
423         {
424             { 512,   877,  -417,   184,     0,  -184 },
425             { 181,   957,  -460,    42,     0,   -42 },
426         };
427         // lowlit [0.025, 0.075], max=0.5
428         int hor_flt_lowlit[2][6] =
429         {
430             { 512,   811,  -375,   266,     0,  -266 },
431             { 249,   945,  -448,    41,     0,   -41 },
432         };
433         // normal [0.042, 0.14], max=0.5
434         int hor_flt_normal[2][6] =
435         {
436             { 512,   557,  -276,   460,     0,  -460 },
437             { 512,   870,  -399,    37,     0,   -37 },
438         };
439         // high [0.055, 0.125], max=0.5
440         int hor_flt_high[2][6] =
441         {
442             { 512,   648,  -344,   327,     0,  -327 },
443             { 512,   854,  -409,    29,     0,   -29 },
444         };
445         // dotlight [0.1 0.175], max=0.5
446         int hor_flt_dotlight[2][6] =
447         {
448             { 512,   447,  -349,   319,     0,  -319 },
449             { 512,   698,  -386,    34,     0,   -34 },
450         };
451         // full [0.025, 0.175], max=0.5
452         int hor_flt_full[2][6] =
453         {
454             { 512,   362,  -171,   512,     0,  -512 },
455             { 512,   915,  -417,    67,     0,   -67 },
456         };
457         attr.manual_meascfg_v32.hiir_en = 1;
458         attr.manual_meascfg_v32.h1_fv_outmode = 0; // 0 square, 1 absolute
459         attr.manual_meascfg_v32.h1_fv_shift = 1;
460         attr.manual_meascfg_v32.h_fv_thresh = 0;
461         attr.manual_meascfg_v32.h_fv_limit = 1023;
462         attr.manual_meascfg_v32.h_fv_slope = 256;
463         for (int i = 0; i < 6; i++) {
464             attr.manual_meascfg_v32.h1_iir1_coe[i] = hor_flt_normal[0][i];
465             attr.manual_meascfg_v32.h1_iir2_coe[i] = hor_flt_normal[1][i];
466         }
467 
468         // level depended gain
469         attr.manual_meascfg_v32.ldg_en = 0;
470         attr.manual_meascfg_v32.h_ldg_lumth[0] = 64;
471         attr.manual_meascfg_v32.h_ldg_gain[0]  = 28;
472         attr.manual_meascfg_v32.h_ldg_gslp[0]  = (255-28)*255/45;
473         attr.manual_meascfg_v32.h_ldg_lumth[1] = 185;
474         attr.manual_meascfg_v32.h_ldg_gain[1]  = 8;
475         attr.manual_meascfg_v32.h_ldg_gslp[1]  = (255-8)*255/45;
476         attr.manual_meascfg_v32.v_ldg_lumth[0] = 64;
477         attr.manual_meascfg_v32.v_ldg_gain[0]  = 28;
478         attr.manual_meascfg_v32.v_ldg_gslp[0]  = (255-28)*255/45;
479         attr.manual_meascfg_v32.v_ldg_lumth[1] = 185;
480         attr.manual_meascfg_v32.v_ldg_gain[1]  = 8;
481         attr.manual_meascfg_v32.v_ldg_gslp[1]  = (255-8)*255/45;
482         attr.manual_meascfg_v32.hldg_dilate_num = 0;
483 
484         // High light
485         attr.manual_meascfg_v32.highlit_thresh = 912;
486 
487         // bls
488         attr.manual_meascfg_v32.bls_en = 0;
489         attr.manual_meascfg_v32.bls_offset = 0;
490     }
491 
492     attr.sync.sync_mode = RK_AIQ_UAPI_MODE_SYNC;
493     rk_aiq_user_api2_af_SetAttrib(ctx, &attr);
494     printf("setFocusMeasCfg\n");
495 }
496 
print_af_stats(rk_aiq_isp_stats_t * stats_ref)497 static void print_af_stats(rk_aiq_isp_stats_t *stats_ref)
498 {
499     unsigned long sof_time;
500 
501     // show af stats every 30 frames
502     if (stats_ref->frame_id % 30 != 0)
503         return;
504 
505     if (stats_ref->af_hw_ver == RKAIQ_AF_HW_V20) {
506         // rv1126/rv1109 rk356x
507         sof_time = stats_ref->af_stats.sof_tim / 1000000LL;
508         printf("sof_tim %ld, sharpness roia: 0x%llx-0x%08x roib: 0x%x-0x%08x\n",
509                sof_time,
510                stats_ref->af_stats.roia_sharpness,
511                stats_ref->af_stats.roia_luminance,
512                stats_ref->af_stats.roib_sharpness,
513                stats_ref->af_stats.roib_luminance);
514 
515         printf("global_sharpness\n");
516         for (int i = 0; i < 15; i++) {
517             for (int j = 0; j < 15; j++) {
518                 printf("0x%08x, ", stats_ref->af_stats.global_sharpness[15 * i + j]);
519             }
520             printf("\n");
521         }
522         printf("lowpass_fv4_4\n");
523         for (int i = 0; i < 15; i++) {
524             for (int j = 0; j < 15; j++) {
525                 printf("0x%08x, ", stats_ref->af_stats.lowpass_fv4_4[15 * i + j]);
526             }
527             printf("\n");
528         }
529         printf("lowpass_fv8_8\n");
530         for (int i = 0; i < 15; i++) {
531             for (int j = 0; j < 15; j++) {
532                 printf("0x%08x, ", stats_ref->af_stats.lowpass_fv8_8[15 * i + j]);
533             }
534             printf("\n");
535         }
536         printf("lowpass_highlht\n");
537         for (int i = 0; i < 15; i++) {
538             for (int j = 0; j < 15; j++) {
539                 printf("0x%08x, ", stats_ref->af_stats.lowpass_highlht[15 * i + j]);
540             }
541             printf("\n");
542         }
543         printf("lowpass_highlht2\n");
544         for (int i = 0; i < 15; i++) {
545             for (int j = 0; j < 15; j++) {
546                 printf("0x%08x, ", stats_ref->af_stats.lowpass_highlht2[15 * i + j]);
547             }
548             printf("\n");
549         }
550     } else if (stats_ref->af_hw_ver == RKAIQ_AF_HW_V30 || stats_ref->af_hw_ver == RKAIQ_AF_HW_V31) {
551         // rk3588 & rk1106
552         sof_time = stats_ref->af_stats_v3x.sof_tim / 1000000LL;
553         printf("wnda_fv_h1\n");
554         for (int i = 0; i < 15; i++) {
555             for (int j = 0; j < 15; j++) {
556                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_h1[15 * i + j]);
557             }
558             printf("\n");
559         }
560         printf("wnda_fv_h2\n");
561         for (int i = 0; i < 15; i++) {
562             for (int j = 0; j < 15; j++) {
563                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_h2[15 * i + j]);
564             }
565             printf("\n");
566         }
567         printf("wnda_fv_v1\n");
568         for (int i = 0; i < 15; i++) {
569             for (int j = 0; j < 15; j++) {
570                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_v1[15 * i + j]);
571             }
572             printf("\n");
573         }
574         printf("wnda_fv_v2\n");
575         for (int i = 0; i < 15; i++) {
576             for (int j = 0; j < 15; j++) {
577                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_v2[15 * i + j]);
578             }
579             printf("\n");
580         }
581         printf("wnda_luma\n");
582         for (int i = 0; i < 15; i++) {
583             for (int j = 0; j < 15; j++) {
584                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_luma[15 * i + j]);
585             }
586             printf("\n");
587         }
588         printf("wina_highlit_cnt\n");
589         for (int i = 0; i < 15; i++) {
590             for (int j = 0; j < 15; j++) {
591                 printf("0x%08x, ", stats_ref->af_stats_v3x.wina_highlit_cnt[15 * i + j]);
592             }
593             printf("\n");
594         }
595     } else if (stats_ref->af_hw_ver == RKAIQ_AF_HW_V32_LITE) {
596         // rk3562
597         sof_time = stats_ref->af_stats_v3x.sof_tim / 1000000LL;
598         printf("wnda_fv_h1\n");
599         for (int i = 0; i < 5; i++) {
600             for (int j = 0; j < 5; j++) {
601                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_h1[5 * i + j]);
602             }
603             printf("\n");
604         }
605         printf("wnda_fv_v1\n");
606         for (int i = 0; i < 5; i++) {
607             for (int j = 0; j < 5; j++) {
608                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_v1[5 * i + j]);
609             }
610             printf("\n");
611         }
612         printf("wnda_luma\n");
613         for (int i = 0; i < 5; i++) {
614             for (int j = 0; j < 5; j++) {
615                 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_luma[5 * i + j]);
616             }
617             printf("\n");
618         }
619         printf("wina_highlit_cnt\n");
620         for (int i = 0; i < 5; i++) {
621             for (int j = 0; j < 5; j++) {
622                 printf("0x%08x, ", stats_ref->af_stats_v3x.wina_highlit_cnt[5 * i + j]);
623             }
624             printf("\n");
625         }
626     }
627 }
628 
custom_af_algo(rk_aiq_isp_stats_t * stats_ref)629 static void custom_af_algo(rk_aiq_isp_stats_t *stats_ref)
630 {
631     // show af stats
632     print_af_stats(stats_ref);
633 
634     // run af algo
635 
636     // move zoom/focus motor
637 
638 }
639 
af_thread(void * args)640 static void* af_thread(void* args) {
641     rk_aiq_sys_ctx_t* ctx = (rk_aiq_sys_ctx_t*)args;
642     XCamReturn ret;
643     pthread_detach (pthread_self());
644     printf("begin af thread\n");
645 
646     // set af meas config
647     set_af_manual_meascfg(ctx);
648     while(1) {
649         rk_aiq_isp_stats_t *stats_ref = NULL;
650         // get 3a stats
651         ret = rk_aiq_uapi2_sysctl_get3AStatsBlk(ctx, &stats_ref, -1);
652         if (ret == XCAM_RETURN_NO_ERROR && stats_ref != NULL) {
653             printf("get one stats frame id %d \n", stats_ref->frame_id);
654             custom_af_algo(stats_ref);
655             // release 3a stats
656             rk_aiq_uapi2_sysctl_release3AStatsRef(ctx, stats_ref);
657         } else {
658             if (ret == XCAM_RETURN_NO_ERROR) {
659                 printf("aiq has stopped !\n");
660                 break;
661             } else if (ret == XCAM_RETURN_ERROR_TIMEOUT) {
662                 printf("aiq timeout!\n");
663                 continue;
664             } else if (ret == XCAM_RETURN_ERROR_FAILED) {
665                 printf("aiq failed!\n");
666                 break;
667             }
668         }
669     }
670     printf("end stats thread\n");
671     return 0;
672 }
673 
custom_af_run(rk_aiq_sys_ctx_t * ctx)674 int32_t custom_af_run(rk_aiq_sys_ctx_t* ctx)
675 {
676     pthread_t af_tid;
677     pthread_create(&af_tid, NULL, af_thread, ctx);
678 
679     return 0;
680 }
681