1 /*
2 * Copyright (C) 2014 Satoshi Noguchi
3 * Copyright (C) 2014 Synaptics Inc
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 #include <alloca.h>
19 #include <time.h>
20 #include <stdint.h>
21 #include <stdio.h>
22 #include <unistd.h>
23 #include <string.h>
24 #include <stdlib.h>
25 #include <errno.h>
26 #include <math.h>
27
28 #include "testutil.h"
29 #include "f54test.h"
30 #include "rmidevice.h"
31 #include "display.h"
32
33 /* Most recent device status event */
34 #define RMI_F01_STATUS_CODE(status) ((status) & 0x0f)
35 /* Indicates that flash programming is enabled (bootloader mode). */
36 #define RMI_F01_STATUS_BOOTLOADER(status) (!!((status) & 0x40))
37 #define NO_SLEEP_OFF (0 << 2)
38 #define NO_SLEEP_ON (1 << 2)
39
40 /*
41 * Sleep mode controls power management on the device and affects all
42 * functions of the device.
43 */
44 #define RMI_F01_CTRL0_SLEEP_MODE_MASK 0x03
45
46 #define RMI_SLEEP_MODE_NORMAL 0x00
47 #define RMI_SLEEP_MODE_SENSOR_SLEEP 0x01
48 #define RMI_SLEEP_MODE_RESERVED0 0x02
49 #define RMI_SLEEP_MODE_RESERVED1 0x03
50
51 /*
52 * This bit disables whatever sleep mode may be selected by the sleep_mode
53 * field and forces the device to run at full power without sleeping.
54 */
55 #define RMI_F01_CRTL0_NOSLEEP_BIT (1 << 2)
56
~F54Test()57 F54Test::~F54Test()
58 {
59 if (m_txAssignment != NULL) delete [] m_txAssignment;
60 if (m_rxAssignment != NULL) delete [] m_rxAssignment;
61 }
62
Prepare(f54_report_types reportType)63 int F54Test::Prepare(f54_report_types reportType)
64 {
65 int retval;
66 unsigned char data;
67
68 retval = FindTestFunctions();
69 if (retval != TEST_SUCCESS)
70 return retval;
71
72 retval = m_device.QueryBasicProperties();
73 if (retval < 0)
74 return TEST_FAIL_QUERY_BASIC_PROPERTIES;
75
76 retval = ReadF54Queries();
77 if (retval != TEST_SUCCESS)
78 return retval;
79
80 retval = SetupF54Controls();
81 if (retval != TEST_SUCCESS)
82 return retval;
83
84 retval = ReadF55Queries();
85 if (retval != TEST_SUCCESS)
86 return retval;
87
88 retval = SetF54ReportType(reportType);
89 if (retval != TEST_SUCCESS)
90 return retval;
91
92 retval = SetF54Interrupt();
93 if (retval != TEST_SUCCESS)
94 return retval;
95
96 retval = DoPreparation();
97 if (retval != TEST_SUCCESS)
98 return retval;
99
100 data = (unsigned char)m_reportType;
101 retval = m_device.Write(m_f54.GetDataBase(), &data, 1);
102 if (retval < 0)
103 return retval;
104
105 return TEST_SUCCESS;
106 }
107
Run()108 int F54Test::Run()
109 {
110 int retval;
111 unsigned char command;
112
113 command = (unsigned char)COMMAND_GET_REPORT;
114 retval = DoF54Command(command);
115 if (retval != TEST_SUCCESS)
116 return retval;
117
118 retval = ReadF54Report();
119 if (retval != TEST_SUCCESS)
120 return retval;
121
122 retval = ShowF54Report();
123 if (retval != TEST_SUCCESS)
124 return retval;
125
126 return TEST_SUCCESS;
127 }
128
SetF54ReportType(f54_report_types report_type)129 int F54Test::SetF54ReportType(f54_report_types report_type)
130 {
131 switch (report_type) {
132 case F54_8BIT_IMAGE:
133 case F54_16BIT_IMAGE:
134 case F54_RAW_16BIT_IMAGE:
135 case F54_HIGH_RESISTANCE:
136 case F54_TX_TO_TX_SHORTS:
137 case F54_RX_TO_RX_SHORTS_1:
138 case F54_TRUE_BASELINE:
139 case F54_FULL_RAW_CAP_MIN_MAX:
140 case F54_RX_OPENS_1:
141 case F54_TX_OPENS:
142 case F54_TX_TO_GND_SHORTS:
143 case F54_RX_TO_RX_SHORTS_2:
144 case F54_RX_OPENS_2:
145 case F54_FULL_RAW_CAP:
146 case F54_FULL_RAW_CAP_NO_RX_COUPLING:
147 case F54_SENSOR_SPEED:
148 case F54_ADC_RANGE:
149 case F54_TRX_OPENS:
150 case F54_TRX_TO_GND_SHORTS:
151 case F54_TRX_SHORTS:
152 case F54_ABS_RAW_CAP:
153 case F54_ABS_DELTA_CAP:
154 case F54_GUARD_PIN_SHORT:
155 m_reportType = report_type;
156 return SetF54ReportSize(report_type);
157 default:
158 m_reportType = INVALID_REPORT_TYPE;
159 m_reportSize = 0;
160 return TEST_FAIL_INVALID_PARAMETER;
161 }
162 }
163
SetF54ReportSize(f54_report_types report_type)164 int F54Test::SetF54ReportSize(f54_report_types report_type)
165 {
166 int retval;
167 unsigned char tx = m_txAssigned;
168 unsigned char rx = m_rxAssigned;
169 char buf[256];
170
171 switch (report_type) {
172 case F54_8BIT_IMAGE:
173 m_reportSize = tx * rx;
174 break;
175 case F54_16BIT_IMAGE:
176 case F54_RAW_16BIT_IMAGE:
177 case F54_TRUE_BASELINE:
178 case F54_FULL_RAW_CAP:
179 case F54_FULL_RAW_CAP_NO_RX_COUPLING:
180 case F54_SENSOR_SPEED:
181 m_reportSize = 2 * tx * rx;
182 break;
183 case F54_HIGH_RESISTANCE:
184 m_reportSize = HIGH_RESISTANCE_DATA_SIZE;
185 break;
186 case F54_TX_TO_TX_SHORTS:
187 case F54_TX_OPENS:
188 case F54_TX_TO_GND_SHORTS:
189 m_reportSize = (tx + 7) / 8;
190 break;
191 case F54_RX_TO_RX_SHORTS_1:
192 case F54_RX_OPENS_1:
193 if (rx < tx)
194 m_reportSize = 2 * rx * rx;
195 else
196 m_reportSize = 2 * tx * rx;
197 break;
198 case F54_FULL_RAW_CAP_MIN_MAX:
199 m_reportSize = FULL_RAW_CAP_MIN_MAX_DATA_SIZE;
200 break;
201 case F54_RX_TO_RX_SHORTS_2:
202 case F54_RX_OPENS_2:
203 if (rx <= tx)
204 m_reportSize = 0;
205 else
206 m_reportSize = 2 * rx * (rx - tx);
207 break;
208 case F54_ADC_RANGE:
209 if (m_f54Query.has_signal_clarity) {
210
211 retval = m_device.Read(m_f54Control.reg_41.address,
212 m_f54Control.reg_41.data,
213 sizeof(m_f54Control.reg_41.data));
214 if (retval < 0) {
215 m_reportSize = 0;
216 break;
217 }
218 if (m_f54Control.reg_41.no_signal_clarity) {
219 if (tx % 4)
220 tx += 4 - (tx % 4);
221 }
222 }
223 m_reportSize = 2 * tx * rx;
224 break;
225 case F54_TRX_OPENS:
226 case F54_TRX_TO_GND_SHORTS:
227 case F54_TRX_SHORTS:
228 m_reportSize = TRX_OPEN_SHORT_DATA_SIZE;
229 break;
230 case F54_ABS_RAW_CAP:
231 case F54_ABS_DELTA_CAP:
232 m_reportSize = 4 * (tx + rx);
233 break;
234 case F54_GUARD_PIN_SHORT:
235 sprintf(buf, "F54_GUARD_PIN_SHORT\n");
236 m_display.Output(buf);
237 m_reportSize = GUARD_PIN_SHORT_DATA_SIZE;
238 break;
239 default:
240 sprintf(buf, "invalid report type\n");
241 m_display.Output(buf);
242 m_reportSize = 0;
243 return TEST_FAIL_INVALID_PARAMETER;
244 }
245
246 return TEST_SUCCESS;
247 }
248
FindTestFunctions()249 int F54Test::FindTestFunctions()
250 {
251 if (0 > m_device.ScanPDT(0x00, 10))
252 return TEST_FAIL_SCAN_PDT;
253
254 if (!m_device.GetFunction(m_f01, 0x01))
255 return TEST_FAIL_NO_FUNCTION_01;
256
257 if (!m_device.GetFunction(m_f54, 0x54))
258 return TEST_FAIL_NO_FUNCTION_54;
259
260 if (!m_device.GetFunction(m_f55, 0x55))
261 return TEST_FAIL_NO_FUNCTION_55;
262
263 return TEST_SUCCESS;
264 }
265
ReadF54Queries()266 int F54Test::ReadF54Queries()
267 {
268 int retval;
269 unsigned short query_addr = m_f54.GetQueryBase();
270 unsigned char offset;
271
272 retval = m_device.Read(query_addr,
273 m_f54Query.data,
274 sizeof(m_f54Query.data));
275 if (retval < 0)
276 return retval;
277
278 offset = sizeof(m_f54Query.data);
279
280 /* query 12 */
281 if (m_f54Query.has_sense_frequency_control == 0)
282 offset -= 1;
283
284 /* query 13 */
285 if (m_f54Query.has_query13) {
286 retval = m_device.Read(query_addr + offset,
287 m_f54Query_13.data,
288 sizeof(m_f54Query_13.data));
289 if (retval < 0)
290 return retval;
291 offset += 1;
292 }
293
294 /* query 14 */
295 if ((m_f54Query.has_query13) && (m_f54Query_13.has_ctrl87))
296 offset += 1;
297
298 /* query 15 */
299 if (m_f54Query.has_query15) {
300 retval = m_device.Read(query_addr + offset,
301 m_f54Query_15.data,
302 sizeof(m_f54Query_15.data));
303 if (retval < 0)
304 return retval;
305 offset += 1;
306 }
307
308 /* query 16 */
309 if ((m_f54Query.has_query15) && (m_f54Query_15.has_query16)) {
310 retval = m_device.Read(query_addr + offset,
311 m_f54Query_16.data,
312 sizeof(m_f54Query_16.data));
313 if (retval < 0)
314 return retval;
315 offset += 1;
316 }
317
318 /* query 17 */
319 if ((m_f54Query.has_query15) &&
320 (m_f54Query_15.has_query16) &&
321 (m_f54Query_16.has_query17))
322 offset += 1;
323
324 /* query 18 */
325 if ((m_f54Query.has_query15) &&
326 (m_f54Query_15.has_query16) &&
327 (m_f54Query_16.has_ctrl94_query18))
328 offset += 1;
329
330 /* query 19 */
331 if ((m_f54Query.has_query15) &&
332 (m_f54Query_15.has_query16) &&
333 (m_f54Query_16.has_ctrl95_query19))
334 offset += 1;
335
336 /* query 20 */
337 if ((m_f54Query.has_query15) && (m_f54Query_15.has_query20))
338 offset += 1;
339
340 /* query 21 */
341 if ((m_f54Query.has_query15) && (m_f54Query_15.has_query21)) {
342 retval = m_device.Read(query_addr + offset,
343 m_f54Query_21.data,
344 sizeof(m_f54Query_21.data));
345 if (retval < 0)
346 return retval;
347 offset += 1;
348 }
349
350 /* query 22 */
351 if ((m_f54Query.has_query15) && (m_f54Query_15.has_query22)) {
352 retval = m_device.Read(query_addr + offset,
353 m_f54Query_22.data,
354 sizeof(m_f54Query_22.data));
355 if (retval < 0)
356 return retval;
357 offset += 1;
358 }
359
360 /* query 23 */
361 if ((m_f54Query.has_query15) &&
362 (m_f54Query_15.has_query22) &&
363 (m_f54Query_22.has_query23)) {
364 retval = m_device.Read(query_addr + offset,
365 m_f54Query_23.data,
366 sizeof(m_f54Query_23.data));
367 if (retval < 0)
368 return retval;
369 offset += 1;
370 }
371
372 /* query 24 */
373 if ((m_f54Query.has_query15) &&
374 (m_f54Query_15.has_query21) &&
375 (m_f54Query_21.has_query24_data18))
376 offset += 1;
377
378 /* query 25 */
379 if ((m_f54Query.has_query15) && (m_f54Query_15.has_query25)) {
380 retval = m_device.Read(query_addr + offset,
381 m_f54Query_25.data,
382 sizeof(m_f54Query_25.data));
383 if (retval < 0)
384 return retval;
385 offset += 1;
386 }
387
388 /* query 26 */
389 if ((m_f54Query.has_query15) &&
390 (m_f54Query_15.has_query22) &&
391 (m_f54Query_22.has_ctrl103_query26))
392 offset += 1;
393
394 /* query 27 */
395 if ((m_f54Query.has_query15) &&
396 (m_f54Query_15.has_query25) &&
397 (m_f54Query_25.has_query27)) {
398 retval = m_device.Read(query_addr + offset,
399 m_f54Query_27.data,
400 sizeof(m_f54Query_27.data));
401 if (retval < 0)
402 return retval;
403 offset += 1;
404 }
405
406 /* query 28 */
407 if ((m_f54Query.has_query15) &&
408 (m_f54Query_15.has_query22) &&
409 (m_f54Query_22.has_query28))
410 offset += 1;
411
412 /* query 29 */
413 if ((m_f54Query.has_query15) &&
414 (m_f54Query_15.has_query25) &&
415 (m_f54Query_25.has_query27) &&
416 (m_f54Query_27.has_query29)) {
417 retval = m_device.Read(query_addr + offset,
418 m_f54Query_29.data,
419 sizeof(m_f54Query_29.data));
420 if (retval < 0)
421 return retval;
422 offset += 1;
423 }
424
425 /* query 30 */
426 if ((m_f54Query.has_query15) &&
427 (m_f54Query_15.has_query25) &&
428 (m_f54Query_25.has_query27) &&
429 (m_f54Query_27.has_query29) &&
430 (m_f54Query_29.has_query30)) {
431 retval = m_device.Read(query_addr + offset,
432 m_f54Query_30.data,
433 sizeof(m_f54Query_30.data));
434 if (retval < 0)
435 return retval;
436 offset += 1;
437 }
438
439 /* query 31 */
440 if ((m_f54Query.has_query15) &&
441 (m_f54Query_15.has_query25) &&
442 (m_f54Query_25.has_query27) &&
443 (m_f54Query_27.has_query29) &&
444 (m_f54Query_29.has_query30) &&
445 (m_f54Query_30.has_ctrl122_query31))
446 offset += 1;
447
448 /* query 32 */
449 if ((m_f54Query.has_query15) &&
450 (m_f54Query_15.has_query25) &&
451 (m_f54Query_25.has_query27) &&
452 (m_f54Query_27.has_query29) &&
453 (m_f54Query_29.has_query30) &&
454 (m_f54Query_30.has_query32)) {
455 retval = m_device.Read(query_addr + offset,
456 m_f54Query_32.data,
457 sizeof(m_f54Query_32.data));
458 if (retval < 0)
459 return retval;
460 offset += 1;
461 }
462
463 /* query 33 */
464 if ((m_f54Query.has_query15) &&
465 (m_f54Query_15.has_query25) &&
466 (m_f54Query_25.has_query27) &&
467 (m_f54Query_27.has_query29) &&
468 (m_f54Query_29.has_query30) &&
469 (m_f54Query_30.has_query32) &&
470 (m_f54Query_32.has_query33)) {
471 retval = m_device.Read(query_addr + offset,
472 m_f54Query_33.data,
473 sizeof(m_f54Query_33.data));
474 if (retval < 0)
475 return retval;
476 offset += 1;
477 }
478
479 /* query 34 */
480 if ((m_f54Query.has_query15) &&
481 (m_f54Query_15.has_query25) &&
482 (m_f54Query_25.has_query27) &&
483 (m_f54Query_27.has_query29) &&
484 (m_f54Query_29.has_query30) &&
485 (m_f54Query_30.has_query32) &&
486 (m_f54Query_32.has_query34))
487 offset += 1;
488
489 /* query 35 */
490 if ((m_f54Query.has_query15) &&
491 (m_f54Query_15.has_query25) &&
492 (m_f54Query_25.has_query27) &&
493 (m_f54Query_27.has_query29) &&
494 (m_f54Query_29.has_query30) &&
495 (m_f54Query_30.has_query32) &&
496 (m_f54Query_32.has_query35)) {
497 retval = m_device.Read(query_addr + offset,
498 m_f54Query_35.data,
499 sizeof(m_f54Query_35.data));
500 if (retval < 0)
501 return retval;
502 offset += 1;
503 }
504
505 /* query 36 */
506 if ((m_f54Query.has_query15) &&
507 (m_f54Query_15.has_query25) &&
508 (m_f54Query_25.has_query27) &&
509 (m_f54Query_27.has_query29) &&
510 (m_f54Query_29.has_query30) &&
511 (m_f54Query_30.has_query32) &&
512 (m_f54Query_32.has_query33) &&
513 (m_f54Query_33.has_query36)) {
514 retval = m_device.Read(query_addr + offset,
515 m_f54Query_36.data,
516 sizeof(m_f54Query_36.data));
517 if (retval < 0)
518 return retval;
519 offset += 1;
520 }
521
522 /* query 37 */
523 if ((m_f54Query.has_query15) &&
524 (m_f54Query_15.has_query25) &&
525 (m_f54Query_25.has_query27) &&
526 (m_f54Query_27.has_query29) &&
527 (m_f54Query_29.has_query30) &&
528 (m_f54Query_30.has_query32) &&
529 (m_f54Query_32.has_query33) &&
530 (m_f54Query_33.has_query36) &&
531 (m_f54Query_36.has_query37))
532 offset += 1;
533
534 /* query 38 */
535 if ((m_f54Query.has_query15) &&
536 (m_f54Query_15.has_query25) &&
537 (m_f54Query_25.has_query27) &&
538 (m_f54Query_27.has_query29) &&
539 (m_f54Query_29.has_query30) &&
540 (m_f54Query_30.has_query32) &&
541 (m_f54Query_32.has_query33) &&
542 (m_f54Query_33.has_query36) &&
543 (m_f54Query_36.has_query38)) {
544 retval = m_device.Read(query_addr + offset,
545 m_f54Query_38.data,
546 sizeof(m_f54Query_38.data));
547 if (retval < 0)
548 return retval;
549 offset += 1;
550 }
551
552 /* query 39 */
553 if (m_f54Query_38.has_query39) {
554 retval = m_device.Read(query_addr + offset,
555 m_f54Query_39.data,
556 sizeof(m_f54Query_39.data));
557 if (retval < 0)
558 return retval;
559 offset += 1;
560 }
561
562 /* query 40 */
563 if (m_f54Query_39.has_query40) {
564 retval = m_device.Read(query_addr + offset,
565 m_f54Query_40.data,
566 sizeof(m_f54Query_40.data));
567 if (retval < 0)
568 return retval;
569 offset += 1;
570 }
571
572 /* query 41 */
573 if (m_f54Query_40.has_ctrl163_query41)
574 offset += 1;
575
576 /* query 42 */
577 if (m_f54Query_40.has_ctrl165_query42)
578 offset += 1;
579
580 /* query 43 */
581 if (m_f54Query_40.has_query43) {
582 m_device.Read(query_addr + offset,
583 m_f54Query_43.data,
584 sizeof(m_f54Query_43.data));
585 if (retval < 0)
586 return retval;
587 offset += 1;
588 }
589
590 if (m_f54Query_43.has_ctrl172_query44_query45)
591 offset += 2;
592
593 /* query 46 */
594 if (m_f54Query_43.has_query46) {
595 m_device.Read(query_addr + offset,
596 m_f54Query_46.data,
597 sizeof(m_f54Query_46.data));
598 if (retval < 0)
599 return retval;
600 offset += 1;
601 }
602
603 /* query 47 */
604 if (m_f54Query_46.has_query47) {
605 m_device.Read(query_addr + offset,
606 m_f54Query_47.data,
607 sizeof(m_f54Query_47.data));
608 if (retval < 0)
609 return retval;
610 offset += 1;
611 }
612
613 /* query 48 reserved */
614
615 /* query 49 */
616 if (m_f54Query_47.has_query49) {
617 m_device.Read(query_addr + offset,
618 m_f54Query_49.data,
619 sizeof(m_f54Query_49.data));
620 if (retval < 0)
621 return retval;
622 offset += 1;
623 }
624
625 /* query 50 */
626 if (m_f54Query_49.has_query50) {
627 m_device.Read(query_addr + offset,
628 m_f54Query_50.data,
629 sizeof(m_f54Query_50.data));
630 if (retval < 0)
631 return retval;
632 offset += 1;
633 }
634
635 /* query 51 */
636 if (m_f54Query_50.has_query51) {
637 m_device.Read(query_addr + offset,
638 m_f54Query_51.data,
639 sizeof(m_f54Query_51.data));
640 if (retval < 0)
641 return retval;
642 offset += 1;
643 }
644
645 /* query 53 54 */
646 if (m_f54Query_51.has_query53_query54_ctrl198)
647 offset += 2;
648
649 /* query 55 */
650 if (m_f54Query_51.has_query55) {
651 m_device.Read(query_addr + offset,
652 m_f54Query_55.data,
653 sizeof(m_f54Query_55.data));
654 if (retval < 0)
655 return retval;
656 offset += 1;
657 }
658
659 /* query 56 */
660 if (m_f54Query_55.has_query56)
661 offset += 1;
662
663 /* query 57 */
664 if (m_f54Query_55.has_query57) {
665 m_device.Read(query_addr + offset,
666 m_f54Query_57.data,
667 sizeof(m_f54Query_57.data));
668 if (retval < 0)
669 return retval;
670 offset += 1;
671 }
672
673 /* query 58 */
674 if (m_f54Query_57.has_query58) {
675 m_device.Read(query_addr + offset,
676 m_f54Query_58.data,
677 sizeof(m_f54Query_58.data));
678 if (retval < 0)
679 return retval;
680 offset += 1;
681 }
682
683 /* query 59 */
684 if (m_f54Query_58.has_query59)
685 offset += 1;
686
687 /* query 60 */
688 if (m_f54Query_58.has_query60)
689 offset += 1;
690
691 /* query 61 */
692 if (m_f54Query_58.has_query61) {
693 m_device.Read(query_addr + offset,
694 m_f54Query_61.data,
695 sizeof(m_f54Query_61.data));
696 if (retval < 0)
697 return retval;
698 offset += 1;
699 }
700
701 /* query 62 63 */
702 if (m_f54Query_61.has_ctrl215_query62_query63)
703 offset += 2;
704
705 /* query 64 */
706 if (m_f54Query_61.has_query64) {
707 m_device.Read(query_addr + offset,
708 m_f54Query_64.data,
709 sizeof(m_f54Query_64.data));
710 if (retval < 0)
711 return retval;
712 offset += 1;
713 }
714
715 /* query 65 */
716 if (m_f54Query_64.has_query65) {
717 m_device.Read(query_addr + offset,
718 m_f54Query_65.data,
719 sizeof(m_f54Query_65.data));
720 if (retval < 0)
721 return retval;
722 offset += 1;
723 }
724
725 /* query 66 */
726 if (m_f54Query_65.has_query66_ctrl231)
727 offset += 1;
728
729 /* query 67 */
730 if (m_f54Query_65.has_query67) {
731 m_device.Read(query_addr + offset,
732 m_f54Query_67.data,
733 sizeof(m_f54Query_67.data));
734 if (retval < 0)
735 return retval;
736 offset += 1;
737 }
738
739 /* query 68 */
740 if (m_f54Query_67.has_query68) {
741 m_device.Read(query_addr + offset,
742 m_f54Query_68.data,
743 sizeof(m_f54Query_68.data));
744 if (retval < 0)
745 return retval;
746 offset += 1;
747 }
748
749 /* query 69 */
750 if (m_f54Query_68.has_query69) {
751 m_device.Read(query_addr + offset,
752 m_f54Query_69.data,
753 sizeof(m_f54Query_69.data));
754 if (retval < 0)
755 return retval;
756 offset += 1;
757 }
758
759 return TEST_SUCCESS;;
760 }
761
SetupF54Controls()762 int F54Test::SetupF54Controls()
763 {
764 unsigned char length;
765 unsigned char num_of_sensing_freqs;
766 unsigned short reg_addr = m_f54.GetControlBase();
767
768 num_of_sensing_freqs = m_f54Query.number_of_sensing_frequencies;
769
770 /* control 0 */
771 reg_addr += CONTROL_0_SIZE;
772
773 /* control 1 */
774 if ((m_f54Query.touch_controller_family == 0) ||
775 (m_f54Query.touch_controller_family == 1))
776 reg_addr += CONTROL_1_SIZE;
777
778 /* control 2 */
779 reg_addr += CONTROL_2_SIZE;
780
781 /* control 3 */
782 if (m_f54Query.has_pixel_touch_threshold_adjustment == 1)
783 reg_addr += CONTROL_3_SIZE;
784
785 /* controls 4 5 6 */
786 if ((m_f54Query.touch_controller_family == 0) ||
787 (m_f54Query.touch_controller_family == 1))
788 reg_addr += CONTROL_4_6_SIZE;
789
790 /* control 7 */
791 if (m_f54Query.touch_controller_family == 1) {
792 m_f54Control.reg_7.address = reg_addr;
793 reg_addr += CONTROL_7_SIZE;
794 }
795
796 /* controls 8 9 */
797 if ((m_f54Query.touch_controller_family == 0) ||
798 (m_f54Query.touch_controller_family == 1))
799 reg_addr += CONTROL_8_9_SIZE;
800
801 /* control 10 */
802 if (m_f54Query.has_interference_metric == 1)
803 reg_addr += CONTROL_10_SIZE;
804
805 /* control 11 */
806 if (m_f54Query.has_ctrl11 == 1)
807 reg_addr += CONTROL_11_SIZE;
808
809 /* controls 12 13 */
810 if (m_f54Query.has_relaxation_control == 1)
811 reg_addr += CONTROL_12_13_SIZE;
812
813 /* controls 14 15 16 */
814 if (m_f54Query.has_sensor_assignment == 1) {
815 reg_addr += CONTROL_14_SIZE;
816 reg_addr += CONTROL_15_SIZE * m_f54Query.num_of_rx_electrodes;
817 reg_addr += CONTROL_16_SIZE * m_f54Query.num_of_tx_electrodes;
818 }
819
820 /* controls 17 18 19 */
821 if (m_f54Query.has_sense_frequency_control == 1) {
822 reg_addr += CONTROL_17_SIZE * num_of_sensing_freqs;
823 reg_addr += CONTROL_18_SIZE * num_of_sensing_freqs;
824 reg_addr += CONTROL_19_SIZE * num_of_sensing_freqs;
825 }
826
827 /* control 20 */
828 reg_addr += CONTROL_20_SIZE;
829
830 /* control 21 */
831 if (m_f54Query.has_sense_frequency_control == 1)
832 reg_addr += CONTROL_21_SIZE;
833
834 /* controls 22 23 24 25 26 */
835 if (m_f54Query.has_firmware_noise_mitigation == 1)
836 reg_addr += CONTROL_22_26_SIZE;
837
838 /* control 27 */
839 if (m_f54Query.has_iir_filter == 1)
840 reg_addr += CONTROL_27_SIZE;
841
842 /* control 28 */
843 if (m_f54Query.has_firmware_noise_mitigation == 1)
844 reg_addr += CONTROL_28_SIZE;
845
846 /* control 29 */
847 if (m_f54Query.has_cmn_removal == 1)
848 reg_addr += CONTROL_29_SIZE;
849
850 /* control 30 */
851 if (m_f54Query.has_cmn_maximum == 1)
852 reg_addr += CONTROL_30_SIZE;
853
854 /* control 31 */
855 if (m_f54Query.has_touch_hysteresis == 1)
856 reg_addr += CONTROL_31_SIZE;
857
858 /* controls 32 33 34 35 */
859 if (m_f54Query.has_edge_compensation == 1)
860 reg_addr += CONTROL_32_35_SIZE;
861
862 /* control 36 */
863 if ((m_f54Query.curve_compensation_mode == 1) ||
864 (m_f54Query.curve_compensation_mode == 2)) {
865 if (m_f54Query.curve_compensation_mode == 1) {
866 length = std::max(m_f54Query.num_of_rx_electrodes,
867 m_f54Query.num_of_tx_electrodes);
868 } else if (m_f54Query.curve_compensation_mode == 2) {
869 length = m_f54Query.num_of_rx_electrodes;
870 }
871 reg_addr += CONTROL_36_SIZE * length;
872 }
873
874 /* control 37 */
875 if (m_f54Query.curve_compensation_mode == 2)
876 reg_addr += CONTROL_37_SIZE * m_f54Query.num_of_tx_electrodes;
877
878 /* controls 38 39 40 */
879 if (m_f54Query.has_per_frequency_noise_control == 1) {
880 reg_addr += CONTROL_38_SIZE * num_of_sensing_freqs;
881 reg_addr += CONTROL_39_SIZE * num_of_sensing_freqs;
882 reg_addr += CONTROL_40_SIZE * num_of_sensing_freqs;
883 }
884
885 /* control 41 */
886 if (m_f54Query.has_signal_clarity == 1) {
887 m_f54Control.reg_41.address = reg_addr;
888 reg_addr += CONTROL_41_SIZE;
889 }
890
891 /* control 42 */
892 if (m_f54Query.has_variance_metric == 1)
893 reg_addr += CONTROL_42_SIZE;
894
895 /* controls 43 44 45 46 47 48 49 50 51 52 53 54 */
896 if (m_f54Query.has_multi_metric_state_machine == 1)
897 reg_addr += CONTROL_43_54_SIZE;
898
899 /* controls 55 56 */
900 if (m_f54Query.has_0d_relaxation_control == 1)
901 reg_addr += CONTROL_55_56_SIZE;
902
903 /* control 57 */
904 if (m_f54Query.has_0d_acquisition_control == 1) {
905 m_f54Control.reg_57.address = reg_addr;
906 reg_addr += CONTROL_57_SIZE;
907 }
908
909 /* control 58 */
910 if (m_f54Query.has_0d_acquisition_control == 1)
911 reg_addr += CONTROL_58_SIZE;
912
913 /* control 59 */
914 if (m_f54Query.has_h_blank == 1)
915 reg_addr += CONTROL_59_SIZE;
916
917 /* controls 60 61 62 */
918 if ((m_f54Query.has_h_blank == 1) ||
919 (m_f54Query.has_v_blank == 1) ||
920 (m_f54Query.has_long_h_blank == 1))
921 reg_addr += CONTROL_60_62_SIZE;
922
923 /* control 63 */
924 if ((m_f54Query.has_h_blank == 1) ||
925 (m_f54Query.has_v_blank == 1) ||
926 (m_f54Query.has_long_h_blank == 1) ||
927 (m_f54Query.has_slew_metric == 1) ||
928 (m_f54Query.has_slew_option == 1) ||
929 (m_f54Query.has_noise_mitigation2 == 1))
930 reg_addr += CONTROL_63_SIZE;
931
932 /* controls 64 65 66 67 */
933 if (m_f54Query.has_h_blank == 1)
934 reg_addr += CONTROL_64_67_SIZE * 7;
935 else if ((m_f54Query.has_v_blank == 1) ||
936 (m_f54Query.has_long_h_blank == 1))
937 reg_addr += CONTROL_64_67_SIZE;
938
939 /* controls 68 69 70 71 72 73 */
940 if ((m_f54Query.has_h_blank == 1) ||
941 (m_f54Query.has_v_blank == 1) ||
942 (m_f54Query.has_long_h_blank == 1))
943 reg_addr += CONTROL_68_73_SIZE;
944
945 /* control 74 */
946 if (m_f54Query.has_slew_metric == 1)
947 reg_addr += CONTROL_74_SIZE;
948
949 /* control 75 */
950 if (m_f54Query.has_enhanced_stretch == 1)
951 reg_addr += CONTROL_75_SIZE * num_of_sensing_freqs;
952
953 /* control 76 */
954 if (m_f54Query.has_startup_fast_relaxation == 1)
955 reg_addr += CONTROL_76_SIZE;
956
957 /* controls 77 78 */
958 if (m_f54Query.has_esd_control == 1)
959 reg_addr += CONTROL_77_78_SIZE;
960
961 /* controls 79 80 81 82 83 */
962 if (m_f54Query.has_noise_mitigation2 == 1)
963 reg_addr += CONTROL_79_83_SIZE;
964
965 /* controls 84 85 */
966 if (m_f54Query.has_energy_ratio_relaxation == 1)
967 reg_addr += CONTROL_84_85_SIZE;
968
969 /* control 86 */
970 if ((m_f54Query.has_query13 == 1) && (m_f54Query_13.has_ctrl86 == 1))
971 reg_addr += CONTROL_86_SIZE;
972
973 /* control 87 */
974 if ((m_f54Query.has_query13 == 1) && (m_f54Query_13.has_ctrl87 == 1))
975 reg_addr += CONTROL_87_SIZE;
976
977 /* control 88 */
978 if (m_f54Query.has_ctrl88 == 1) {
979 m_f54Control.reg_88.address = reg_addr;
980 reg_addr += CONTROL_88_SIZE;
981 }
982
983 /* control 89 */
984 if ((m_f54Query.has_query13 == 1) &&
985 (m_f54Query_13.has_cidim == 1 ||
986 m_f54Query_13.has_noise_mitigation_enhancement ||
987 m_f54Query_13.has_rail_im))
988 reg_addr += CONTROL_89_SIZE;
989
990 /* control 90 */
991 if ((m_f54Query.has_query15) && (m_f54Query_15.has_ctrl90))
992 reg_addr += CONTROL_90_SIZE;
993
994 /* control 91 */
995 if ((m_f54Query.has_query15) &&
996 (m_f54Query_15.has_query21) &&
997 (m_f54Query_21.has_ctrl91))
998 reg_addr += CONTROL_91_SIZE;
999
1000 /* control 92 */
1001 if ((m_f54Query.has_query15) &&
1002 (m_f54Query_15.has_query16) &&
1003 (m_f54Query_16.has_ctrl92))
1004 reg_addr += CONTROL_92_SIZE;
1005
1006 /* control 93 */
1007 if ((m_f54Query.has_query15) &&
1008 (m_f54Query_15.has_query16) &&
1009 (m_f54Query_16.has_ctrl93))
1010 reg_addr += CONTROL_93_SIZE;
1011
1012 /* control 94 */
1013 if ((m_f54Query.has_query15) &&
1014 (m_f54Query_15.has_query16) &&
1015 (m_f54Query_16.has_ctrl94_query18))
1016 reg_addr += CONTROL_94_SIZE;
1017
1018 /* control 95 */
1019 if ((m_f54Query.has_query15) &&
1020 (m_f54Query_15.has_query16) &&
1021 (m_f54Query_16.has_ctrl95_query19))
1022 reg_addr += CONTROL_95_SIZE;
1023
1024 /* control 96 */
1025 if ((m_f54Query.has_query15) &&
1026 (m_f54Query_15.has_query21) &&
1027 (m_f54Query_21.has_ctrl96))
1028 reg_addr += CONTROL_96_SIZE;
1029
1030 /* control 97 */
1031 if ((m_f54Query.has_query15) &&
1032 (m_f54Query_15.has_query21) &&
1033 (m_f54Query_21.has_ctrl97))
1034 reg_addr += CONTROL_97_SIZE;
1035
1036 /* control 98 */
1037 if ((m_f54Query.has_query15) &&
1038 (m_f54Query_15.has_query21) &&
1039 (m_f54Query_21.has_ctrl98))
1040 reg_addr += CONTROL_98_SIZE;
1041
1042 /* control 99 */
1043 if (m_f54Query.touch_controller_family == 2)
1044 reg_addr += CONTROL_99_SIZE;
1045
1046 /* control 100 */
1047 if ((m_f54Query.has_query15) &&
1048 (m_f54Query_15.has_query16) &&
1049 (m_f54Query_16.has_ctrl100))
1050 reg_addr += CONTROL_100_SIZE;
1051
1052 /* control 101 */
1053 if ((m_f54Query.has_query15) &&
1054 (m_f54Query_15.has_query22) &&
1055 (m_f54Query_22.has_ctrl101))
1056 reg_addr += CONTROL_101_SIZE;
1057
1058
1059 /* control 102 */
1060 if ((m_f54Query.has_query15) &&
1061 (m_f54Query_15.has_query22) &&
1062 (m_f54Query_22.has_query23) &&
1063 (m_f54Query_23.has_ctrl102))
1064 reg_addr += CONTROL_102_SIZE;
1065
1066 /* control 103 */
1067 if ((m_f54Query.has_query15) &&
1068 (m_f54Query_15.has_query22) &&
1069 (m_f54Query_22.has_ctrl103_query26))
1070 reg_addr += CONTROL_103_SIZE;
1071
1072 /* control 104 */
1073 if ((m_f54Query.has_query15) &&
1074 (m_f54Query_15.has_query22) &&
1075 (m_f54Query_22.has_ctrl104))
1076 reg_addr += CONTROL_104_SIZE;
1077
1078 /* control 105 */
1079 if ((m_f54Query.has_query15) &&
1080 (m_f54Query_15.has_query22) &&
1081 (m_f54Query_22.has_ctrl105))
1082 reg_addr += CONTROL_105_SIZE;
1083
1084 /* control 106 */
1085 if ((m_f54Query.has_query15) &&
1086 (m_f54Query_15.has_query25) &&
1087 (m_f54Query_25.has_ctrl106))
1088 reg_addr += CONTROL_106_SIZE;
1089
1090 /* control 107 */
1091 if ((m_f54Query.has_query15) &&
1092 (m_f54Query_15.has_query25) &&
1093 (m_f54Query_25.has_ctrl107))
1094 reg_addr += CONTROL_107_SIZE;
1095
1096 /* control 108 */
1097 if ((m_f54Query.has_query15) &&
1098 (m_f54Query_15.has_query25) &&
1099 (m_f54Query_25.has_ctrl108))
1100 reg_addr += CONTROL_108_SIZE;
1101
1102 /* control 109 */
1103 if ((m_f54Query.has_query15) &&
1104 (m_f54Query_15.has_query25) &&
1105 (m_f54Query_25.has_ctrl109))
1106 reg_addr += CONTROL_109_SIZE;
1107
1108 /* control 110 */
1109 if ((m_f54Query.has_query15) &&
1110 (m_f54Query_15.has_query25) &&
1111 (m_f54Query_25.has_query27) &&
1112 (m_f54Query_27.has_ctrl110)) {
1113 m_f54Control.reg_110.address = reg_addr;
1114 reg_addr += CONTROL_110_SIZE;
1115 }
1116
1117 /* control 111 */
1118 if ((m_f54Query.has_query15) &&
1119 (m_f54Query_15.has_query25) &&
1120 (m_f54Query_25.has_query27) &&
1121 (m_f54Query_27.has_ctrl111))
1122 reg_addr += CONTROL_111_SIZE;
1123
1124 /* control 112 */
1125 if ((m_f54Query.has_query15) &&
1126 (m_f54Query_15.has_query25) &&
1127 (m_f54Query_25.has_query27) &&
1128 (m_f54Query_27.has_ctrl112))
1129 reg_addr += CONTROL_112_SIZE;
1130
1131 /* control 113 */
1132 if ((m_f54Query.has_query15) &&
1133 (m_f54Query_15.has_query25) &&
1134 (m_f54Query_25.has_query27) &&
1135 (m_f54Query_27.has_ctrl113))
1136 reg_addr += CONTROL_113_SIZE;
1137
1138 /* control 114 */
1139 if ((m_f54Query.has_query15) &&
1140 (m_f54Query_15.has_query25) &&
1141 (m_f54Query_25.has_query27) &&
1142 (m_f54Query_27.has_ctrl114))
1143 reg_addr += CONTROL_114_SIZE;
1144
1145 /* control 115 */
1146 if ((m_f54Query.has_query15) &&
1147 (m_f54Query_15.has_query25) &&
1148 (m_f54Query_25.has_query27) &&
1149 (m_f54Query_27.has_query29) &&
1150 (m_f54Query_29.has_ctrl115))
1151 reg_addr += CONTROL_115_SIZE;
1152
1153 /* control 116 */
1154 if ((m_f54Query.has_query15) &&
1155 (m_f54Query_15.has_query25) &&
1156 (m_f54Query_25.has_query27) &&
1157 (m_f54Query_27.has_query29) &&
1158 (m_f54Query_29.has_ctrl116))
1159 reg_addr += CONTROL_116_SIZE;
1160
1161 /* control 117 */
1162 if ((m_f54Query.has_query15) &&
1163 (m_f54Query_15.has_query25) &&
1164 (m_f54Query_25.has_query27) &&
1165 (m_f54Query_27.has_query29) &&
1166 (m_f54Query_29.has_ctrl117))
1167 reg_addr += CONTROL_117_SIZE;
1168
1169 /* control 118 */
1170 if ((m_f54Query.has_query15) &&
1171 (m_f54Query_15.has_query25) &&
1172 (m_f54Query_25.has_query27) &&
1173 (m_f54Query_27.has_query29) &&
1174 (m_f54Query_29.has_query30) &&
1175 (m_f54Query_30.has_ctrl118))
1176 reg_addr += CONTROL_118_SIZE;
1177
1178 /* control 119 */
1179 if ((m_f54Query.has_query15) &&
1180 (m_f54Query_15.has_query25) &&
1181 (m_f54Query_25.has_query27) &&
1182 (m_f54Query_27.has_query29) &&
1183 (m_f54Query_29.has_query30) &&
1184 (m_f54Query_30.has_ctrl119))
1185 reg_addr += CONTROL_119_SIZE;
1186
1187 /* control 120 */
1188 if ((m_f54Query.has_query15) &&
1189 (m_f54Query_15.has_query25) &&
1190 (m_f54Query_25.has_query27) &&
1191 (m_f54Query_27.has_query29) &&
1192 (m_f54Query_29.has_query30) &&
1193 (m_f54Query_30.has_ctrl120))
1194 reg_addr += CONTROL_120_SIZE;
1195
1196 /* control 121 */
1197 if ((m_f54Query.has_query15) &&
1198 (m_f54Query_15.has_query25) &&
1199 (m_f54Query_25.has_query27) &&
1200 (m_f54Query_27.has_query29) &&
1201 (m_f54Query_29.has_query30) &&
1202 (m_f54Query_30.has_ctrl121))
1203 reg_addr += CONTROL_121_SIZE;
1204
1205 /* control 122 */
1206 if ((m_f54Query.has_query15) &&
1207 (m_f54Query_15.has_query25) &&
1208 (m_f54Query_25.has_query27) &&
1209 (m_f54Query_27.has_query29) &&
1210 (m_f54Query_29.has_query30) &&
1211 (m_f54Query_30.has_ctrl122_query31))
1212 reg_addr += CONTROL_122_SIZE;
1213
1214 /* control 123 */
1215 if ((m_f54Query.has_query15) &&
1216 (m_f54Query_15.has_query25) &&
1217 (m_f54Query_25.has_query27) &&
1218 (m_f54Query_27.has_query29) &&
1219 (m_f54Query_29.has_query30) &&
1220 (m_f54Query_30.has_ctrl123))
1221 reg_addr += CONTROL_123_SIZE;
1222
1223 /* control 124 reserved */
1224
1225 /* control 125 */
1226 if ((m_f54Query.has_query15) &&
1227 (m_f54Query_15.has_query25) &&
1228 (m_f54Query_25.has_query27) &&
1229 (m_f54Query_27.has_query29) &&
1230 (m_f54Query_29.has_query30) &&
1231 (m_f54Query_30.has_query32) &&
1232 (m_f54Query_32.has_ctrl125))
1233 reg_addr += CONTROL_125_SIZE;
1234
1235 /* control 126 */
1236 if ((m_f54Query.has_query15) &&
1237 (m_f54Query_15.has_query25) &&
1238 (m_f54Query_25.has_query27) &&
1239 (m_f54Query_27.has_query29) &&
1240 (m_f54Query_29.has_query30) &&
1241 (m_f54Query_30.has_query32) &&
1242 (m_f54Query_32.has_ctrl126))
1243 reg_addr += CONTROL_126_SIZE;
1244
1245 /* control 127 */
1246 if ((m_f54Query.has_query15) &&
1247 (m_f54Query_15.has_query25) &&
1248 (m_f54Query_25.has_query27) &&
1249 (m_f54Query_27.has_query29) &&
1250 (m_f54Query_29.has_query30) &&
1251 (m_f54Query_30.has_query32) &&
1252 (m_f54Query_32.has_ctrl127))
1253 reg_addr += CONTROL_127_SIZE;
1254
1255 /* controls 128 129 130 131 reserved */
1256
1257 /* control 132 */
1258 if ((m_f54Query.has_query15) &&
1259 (m_f54Query_15.has_query25) &&
1260 (m_f54Query_25.has_query27) &&
1261 (m_f54Query_27.has_query29) &&
1262 (m_f54Query_29.has_query30) &&
1263 (m_f54Query_30.has_query32) &&
1264 (m_f54Query_32.has_query33) &&
1265 (m_f54Query_33.has_ctrl132))
1266 reg_addr += CONTROL_132_SIZE;
1267
1268 /* control 133 */
1269 if ((m_f54Query.has_query15) &&
1270 (m_f54Query_15.has_query25) &&
1271 (m_f54Query_25.has_query27) &&
1272 (m_f54Query_27.has_query29) &&
1273 (m_f54Query_29.has_query30) &&
1274 (m_f54Query_30.has_query32) &&
1275 (m_f54Query_32.has_query33) &&
1276 (m_f54Query_33.has_ctrl133))
1277 reg_addr += CONTROL_133_SIZE;
1278
1279 /* control 134 */
1280 if ((m_f54Query.has_query15) &&
1281 (m_f54Query_15.has_query25) &&
1282 (m_f54Query_25.has_query27) &&
1283 (m_f54Query_27.has_query29) &&
1284 (m_f54Query_29.has_query30) &&
1285 (m_f54Query_30.has_query32) &&
1286 (m_f54Query_32.has_query33) &&
1287 (m_f54Query_33.has_ctrl134))
1288 reg_addr += CONTROL_134_SIZE;
1289
1290 /* controls 135 136 reserved */
1291
1292 /* control 137 */
1293 if ((m_f54Query.has_query15) &&
1294 (m_f54Query_15.has_query25) &&
1295 (m_f54Query_25.has_query27) &&
1296 (m_f54Query_27.has_query29) &&
1297 (m_f54Query_29.has_query30) &&
1298 (m_f54Query_30.has_query32) &&
1299 (m_f54Query_32.has_query35) &&
1300 (m_f54Query_35.has_ctrl137))
1301 reg_addr += CONTROL_137_SIZE;
1302
1303 /* control 138 */
1304 if ((m_f54Query.has_query15) &&
1305 (m_f54Query_15.has_query25) &&
1306 (m_f54Query_25.has_query27) &&
1307 (m_f54Query_27.has_query29) &&
1308 (m_f54Query_29.has_query30) &&
1309 (m_f54Query_30.has_query32) &&
1310 (m_f54Query_32.has_query35) &&
1311 (m_f54Query_35.has_ctrl138))
1312 reg_addr += CONTROL_138_SIZE;
1313
1314 /* control 139 */
1315 if ((m_f54Query.has_query15) &&
1316 (m_f54Query_15.has_query25) &&
1317 (m_f54Query_25.has_query27) &&
1318 (m_f54Query_27.has_query29) &&
1319 (m_f54Query_29.has_query30) &&
1320 (m_f54Query_30.has_query32) &&
1321 (m_f54Query_32.has_query35) &&
1322 (m_f54Query_35.has_ctrl139))
1323 reg_addr += CONTROL_139_SIZE;
1324
1325 /* control 140 */
1326 if ((m_f54Query.has_query15) &&
1327 (m_f54Query_15.has_query25) &&
1328 (m_f54Query_25.has_query27) &&
1329 (m_f54Query_27.has_query29) &&
1330 (m_f54Query_29.has_query30) &&
1331 (m_f54Query_30.has_query32) &&
1332 (m_f54Query_32.has_query35) &&
1333 (m_f54Query_35.has_ctrl140))
1334 reg_addr += CONTROL_140_SIZE;
1335
1336 /* control 141 reserved */
1337
1338 /* control 142 */
1339 if ((m_f54Query.has_query15) &&
1340 (m_f54Query_15.has_query25) &&
1341 (m_f54Query_25.has_query27) &&
1342 (m_f54Query_27.has_query29) &&
1343 (m_f54Query_29.has_query30) &&
1344 (m_f54Query_30.has_query32) &&
1345 (m_f54Query_32.has_query33) &&
1346 (m_f54Query_33.has_query36) &&
1347 (m_f54Query_36.has_ctrl142))
1348 reg_addr += CONTROL_142_SIZE;
1349
1350 /* control 143 */
1351 if ((m_f54Query.has_query15) &&
1352 (m_f54Query_15.has_query25) &&
1353 (m_f54Query_25.has_query27) &&
1354 (m_f54Query_27.has_query29) &&
1355 (m_f54Query_29.has_query30) &&
1356 (m_f54Query_30.has_query32) &&
1357 (m_f54Query_32.has_query33) &&
1358 (m_f54Query_33.has_query36) &&
1359 (m_f54Query_36.has_ctrl143))
1360 reg_addr += CONTROL_143_SIZE;
1361
1362 /* control 144 */
1363 if ((m_f54Query.has_query15) &&
1364 (m_f54Query_15.has_query25) &&
1365 (m_f54Query_25.has_query27) &&
1366 (m_f54Query_27.has_query29) &&
1367 (m_f54Query_29.has_query30) &&
1368 (m_f54Query_30.has_query32) &&
1369 (m_f54Query_32.has_query33) &&
1370 (m_f54Query_33.has_query36) &&
1371 (m_f54Query_36.has_ctrl144))
1372 reg_addr += CONTROL_144_SIZE;
1373
1374 /* control 145 */
1375 if ((m_f54Query.has_query15) &&
1376 (m_f54Query_15.has_query25) &&
1377 (m_f54Query_25.has_query27) &&
1378 (m_f54Query_27.has_query29) &&
1379 (m_f54Query_29.has_query30) &&
1380 (m_f54Query_30.has_query32) &&
1381 (m_f54Query_32.has_query33) &&
1382 (m_f54Query_33.has_query36) &&
1383 (m_f54Query_36.has_ctrl145))
1384 reg_addr += CONTROL_145_SIZE;
1385
1386 /* control 146 */
1387 if ((m_f54Query.has_query15) &&
1388 (m_f54Query_15.has_query25) &&
1389 (m_f54Query_25.has_query27) &&
1390 (m_f54Query_27.has_query29) &&
1391 (m_f54Query_29.has_query30) &&
1392 (m_f54Query_30.has_query32) &&
1393 (m_f54Query_32.has_query33) &&
1394 (m_f54Query_33.has_query36) &&
1395 (m_f54Query_36.has_ctrl146))
1396 reg_addr += CONTROL_146_SIZE;
1397
1398 /* control 147 */
1399 if ((m_f54Query.has_query15) &&
1400 (m_f54Query_15.has_query25) &&
1401 (m_f54Query_25.has_query27) &&
1402 (m_f54Query_27.has_query29) &&
1403 (m_f54Query_29.has_query30) &&
1404 (m_f54Query_30.has_query32) &&
1405 (m_f54Query_32.has_query33) &&
1406 (m_f54Query_33.has_query36) &&
1407 (m_f54Query_36.has_query38) &&
1408 (m_f54Query_38.has_ctrl147))
1409 reg_addr += CONTROL_147_SIZE;
1410
1411 /* control 148 */
1412 if ((m_f54Query.has_query15) &&
1413 (m_f54Query_15.has_query25) &&
1414 (m_f54Query_25.has_query27) &&
1415 (m_f54Query_27.has_query29) &&
1416 (m_f54Query_29.has_query30) &&
1417 (m_f54Query_30.has_query32) &&
1418 (m_f54Query_32.has_query33) &&
1419 (m_f54Query_33.has_query36) &&
1420 (m_f54Query_36.has_query38) &&
1421 (m_f54Query_38.has_ctrl148))
1422 reg_addr += CONTROL_148_SIZE;
1423
1424 /* control 149 */
1425 if ((m_f54Query.has_query15) &&
1426 (m_f54Query_15.has_query25) &&
1427 (m_f54Query_25.has_query27) &&
1428 (m_f54Query_27.has_query29) &&
1429 (m_f54Query_29.has_query30) &&
1430 (m_f54Query_30.has_query32) &&
1431 (m_f54Query_32.has_query33) &&
1432 (m_f54Query_33.has_query36) &&
1433 (m_f54Query_36.has_query38) &&
1434 (m_f54Query_38.has_ctrl149)) {
1435 m_f54Control.reg_149.address = reg_addr;
1436 reg_addr += CONTROL_149_SIZE;
1437 }
1438 /* control 150 */
1439 if (m_f54Query_38.has_ctrl150)
1440 reg_addr += CONTROL_150_SIZE;
1441
1442 /* control 151 */
1443 if (m_f54Query_38.has_ctrl151)
1444 reg_addr += CONTROL_151_SIZE;
1445
1446 /* control 152 */
1447 if (m_f54Query_38.has_ctrl152)
1448 reg_addr += CONTROL_152_SIZE;
1449
1450 /* control 153 */
1451 if (m_f54Query_38.has_ctrl153)
1452 reg_addr += CONTROL_153_SIZE;
1453
1454 /* control 154 */
1455 if (m_f54Query_39.has_ctrl154)
1456 reg_addr += CONTROL_154_SIZE;
1457
1458 /* control 155 */
1459 if (m_f54Query_39.has_ctrl155)
1460 reg_addr += CONTROL_155_SIZE;
1461
1462 /* control 156 */
1463 if (m_f54Query_39.has_ctrl156)
1464 reg_addr += CONTROL_156_SIZE;
1465
1466 /* controls 157 158 */
1467 if (m_f54Query_39.has_ctrl157_ctrl158)
1468 reg_addr += CONTROL_157_158_SIZE;
1469
1470 /* controls 159 to 162 reserved */
1471
1472 /* control 163 */
1473 if (m_f54Query_40.has_ctrl163_query41)
1474 reg_addr += CONTROL_163_SIZE;
1475
1476 /* control 164 reserved */
1477
1478 /* control 165 */
1479 if (m_f54Query_40.has_ctrl165_query42)
1480 reg_addr += CONTROL_165_SIZE;
1481
1482 /* control 166 */
1483 if (m_f54Query_40.has_ctrl166)
1484 reg_addr += CONTROL_166_SIZE;
1485
1486 /* control 167 */
1487 if (m_f54Query_40.has_ctrl167)
1488 reg_addr += CONTROL_167_SIZE;
1489
1490 /* control 168 */
1491 if (m_f54Query_40.has_ctrl168)
1492 reg_addr += CONTROL_168_SIZE;
1493
1494 /* control 169 */
1495 if (m_f54Query_40.has_ctrl169)
1496 reg_addr += CONTROL_169_SIZE;
1497
1498 /* control 170 reserved */
1499
1500 /* control 171 */
1501 if (m_f54Query_43.has_ctrl171)
1502 reg_addr += CONTROL_171_SIZE;
1503
1504 /* control 172 */
1505 if (m_f54Query_43.has_ctrl172_query44_query45)
1506 reg_addr += CONTROL_172_SIZE;
1507
1508 /* control 173 */
1509 if (m_f54Query_43.has_ctrl173)
1510 reg_addr += CONTROL_173_SIZE;
1511
1512 /* control 174 */
1513 if (m_f54Query_43.has_ctrl174)
1514 reg_addr += CONTROL_174_SIZE;
1515
1516 /* control 175 */
1517 if (m_f54Query_43.has_ctrl175)
1518 reg_addr += CONTROL_175_SIZE;
1519
1520 /* control 176 */
1521 if (m_f54Query_46.has_ctrl176)
1522 reg_addr += CONTROL_176_SIZE;
1523
1524 /* controls 177 178 */
1525 if (m_f54Query_46.has_ctrl177_ctrl178)
1526 reg_addr += CONTROL_177_178_SIZE;
1527
1528 /* control 179 */
1529 if (m_f54Query_46.has_ctrl179)
1530 reg_addr += CONTROL_179_SIZE;
1531
1532 /* controls 180 to 181 reserved */
1533
1534 /* control 182 */
1535 if (m_f54Query_47.has_ctrl182)
1536 reg_addr += CONTROL_182_SIZE;
1537
1538 /* control 183 */
1539 if (m_f54Query_47.has_ctrl183)
1540 reg_addr += CONTROL_183_SIZE;
1541
1542 /* control 184 reserved */
1543
1544 /* control 185 */
1545 if (m_f54Query_47.has_ctrl185)
1546 reg_addr += CONTROL_185_SIZE;
1547
1548 /* control 186 */
1549 if (m_f54Query_47.has_ctrl186)
1550 reg_addr += CONTROL_186_SIZE;
1551
1552 /* control 187 */
1553 if (m_f54Query_47.has_ctrl187)
1554 reg_addr += CONTROL_187_SIZE;
1555
1556 /* control 188 */
1557 if (m_f54Query_49.has_ctrl188) {
1558 m_f54Control.reg_188.address = reg_addr;
1559 reg_addr += CONTROL_188_SIZE;
1560 }
1561
1562 return TEST_SUCCESS;
1563 }
1564
ReadF55Queries()1565 int F54Test::ReadF55Queries()
1566 {
1567 int retval;
1568 unsigned char ii;
1569 unsigned char rx_electrodes = m_f54Query.num_of_rx_electrodes;
1570 unsigned char tx_electrodes = m_f54Query.num_of_tx_electrodes;
1571
1572 retval = m_device.Read(m_f55.GetQueryBase(),
1573 m_f55Query.data,
1574 sizeof(m_f55Query.data));
1575 if (retval < 0) {
1576 return retval;
1577 }
1578
1579 if (!m_f55Query.has_sensor_assignment)
1580 {
1581 m_txAssigned = tx_electrodes;
1582 m_rxAssigned = rx_electrodes;
1583 m_txAssignment = NULL;
1584 m_rxAssignment = NULL;
1585 return TEST_SUCCESS;
1586 }
1587
1588 if (m_txAssignment != NULL) delete [] m_txAssignment;
1589 if (m_rxAssignment != NULL) delete [] m_rxAssignment;
1590 m_txAssignment = new unsigned char[tx_electrodes];
1591 m_rxAssignment = new unsigned char[rx_electrodes];
1592
1593 retval = m_device.Read(m_f55.GetControlBase() + SENSOR_TX_MAPPING_OFFSET,
1594 m_txAssignment,
1595 tx_electrodes);
1596 if (retval < 0) {
1597 goto exit;
1598 }
1599
1600 retval = m_device.Read(m_f55.GetControlBase() + SENSOR_RX_MAPPING_OFFSET,
1601 m_rxAssignment,
1602 rx_electrodes);
1603 if (retval < 0) {
1604 goto exit;
1605 }
1606
1607 m_txAssigned = 0;
1608 for (ii = 0; ii < tx_electrodes; ii++) {
1609 if (m_txAssignment[ii] != 0xff)
1610 m_txAssigned++;
1611 }
1612
1613 m_rxAssigned = 0;
1614 for (ii = 0; ii < rx_electrodes; ii++) {
1615 if (m_rxAssignment[ii] != 0xff)
1616 m_rxAssigned++;
1617 }
1618
1619 return TEST_SUCCESS;
1620
1621 exit:
1622 if (m_txAssignment != NULL)
1623 {
1624 delete [] m_txAssignment;
1625 m_txAssignment = NULL;
1626 }
1627 if (m_rxAssignment != NULL)
1628 {
1629 delete [] m_rxAssignment;
1630 m_rxAssignment = NULL;
1631 }
1632
1633 return retval;
1634 }
1635
SetF54Interrupt()1636 int F54Test::SetF54Interrupt()
1637 {
1638 int retval;
1639 unsigned char mask = m_f54.GetInterruptMask();
1640 unsigned char zero = 0;
1641 unsigned int i;
1642
1643 for (i = 0; i < m_device.GetNumInterruptRegs(); i++)
1644 {
1645 if (i == m_f54.GetInterruptRegNum())
1646 {
1647 retval = m_device.Write(m_f54.GetControlBase() + 1 + i, &mask, 1);
1648 }
1649 else
1650 {
1651 retval = m_device.Write(m_f54.GetControlBase() + 1 + i, &zero, 1);
1652 }
1653
1654 if (retval < 0)
1655 return retval;
1656 }
1657 return TEST_SUCCESS;
1658 }
1659
DoF54Command(unsigned char command)1660 int F54Test::DoF54Command(unsigned char command)
1661 {
1662 int retval;
1663
1664 retval = m_device.Write(m_f54.GetCommandBase(), &command, 1);
1665 if (retval < 0)
1666 return retval;
1667
1668 retval = WaitForF54CommandCompletion();
1669 if (retval != TEST_SUCCESS)
1670 return retval;
1671
1672 return TEST_SUCCESS;
1673 }
1674
WaitForF54CommandCompletion()1675 int F54Test::WaitForF54CommandCompletion()
1676 {
1677 int retval;
1678 unsigned char value;
1679 unsigned char timeout_count;
1680
1681 timeout_count = 0;
1682 do {
1683 retval = m_device.Read(m_f54.GetCommandBase(),
1684 &value,
1685 sizeof(value));
1686 if (retval < 0)
1687 return retval;
1688
1689 if (value == 0x00)
1690 break;
1691
1692 Sleep(100);
1693 timeout_count++;
1694 } while (timeout_count < COMMAND_TIMEOUT_100MS);
1695
1696 if (timeout_count == COMMAND_TIMEOUT_100MS) {
1697 return -ETIMEDOUT;
1698 }
1699
1700 return TEST_SUCCESS;
1701 }
1702
ReadF54Report()1703 int F54Test::ReadF54Report()
1704 {
1705 int retval;
1706 unsigned char report_index[2];
1707
1708 if (m_reportBufferSize < m_reportSize) {
1709 if (m_reportData != NULL)
1710 delete [] m_reportData;
1711 m_reportData = new unsigned char[m_reportSize];
1712 if (!m_reportData) {
1713 m_reportBufferSize = 0;
1714 retval = TEST_FAIL_MEMORY_ALLOCATION;
1715 goto exit;
1716 }
1717 m_reportBufferSize = m_reportSize;
1718 }
1719
1720 report_index[0] = 0;
1721 report_index[1] = 0;
1722
1723 retval = m_device.Write(m_f54.GetDataBase() + REPORT_INDEX_OFFSET,
1724 report_index,
1725 sizeof(report_index));
1726
1727 if (retval < 0)
1728 goto exit;
1729
1730 retval = m_device.Read(m_f54.GetDataBase() + REPORT_DATA_OFFSET,
1731 m_reportData,
1732 m_reportSize);
1733 if (retval < 0)
1734 goto exit;
1735
1736 return TEST_SUCCESS;
1737
1738 exit:
1739 if (m_reportData != NULL)
1740 {
1741 delete [] m_reportData;
1742 m_reportData = NULL;
1743 }
1744
1745 return retval;
1746 }
1747
1748 #define disable_cbc(ctrl_num)\
1749 do {\
1750 retval = m_device.Read(\
1751 m_f54Control.ctrl_num.address,\
1752 m_f54Control.ctrl_num.data,\
1753 sizeof(m_f54Control.ctrl_num.data));\
1754 if (retval < 0) {\
1755 return retval;\
1756 } \
1757 m_f54Control.ctrl_num.cbc_tx_carrier_selection = 0;\
1758 retval = m_device.Write(\
1759 m_f54Control.ctrl_num.address,\
1760 m_f54Control.ctrl_num.data,\
1761 sizeof(m_f54Control.ctrl_num.data));\
1762 if (retval < 0) {\
1763 return retval;\
1764 } \
1765 } while (0)
1766
DoPreparation()1767 int F54Test::DoPreparation()
1768 {
1769 int retval;
1770 unsigned char value;
1771 unsigned char zero = 0x00;
1772 unsigned char device_ctrl;
1773
1774 retval = m_device.Read(m_f54.GetControlBase(),
1775 &device_ctrl,
1776 sizeof(device_ctrl));
1777 if (retval < 0) {
1778 return retval;
1779 }
1780
1781 device_ctrl |= NO_SLEEP_ON;
1782
1783 retval = m_device.Write(m_f54.GetControlBase(),
1784 &device_ctrl,
1785 sizeof(device_ctrl));
1786 if (retval < 0) {
1787 return retval;
1788 }
1789
1790 switch (m_reportType) {
1791 case F54_16BIT_IMAGE:
1792 case F54_RAW_16BIT_IMAGE:
1793 case F54_SENSOR_SPEED:
1794 case F54_ADC_RANGE:
1795 case F54_ABS_RAW_CAP:
1796 case F54_ABS_DELTA_CAP:
1797 break;
1798 default:
1799 if (m_f54Query.touch_controller_family == 1)
1800 disable_cbc(reg_7);
1801 else if (m_f54Query.has_ctrl88)
1802 disable_cbc(reg_88);
1803
1804 if (m_f54Query.has_0d_acquisition_control)
1805 disable_cbc(reg_57);
1806
1807 if ((m_f54Query.has_query15) &&
1808 (m_f54Query_15.has_query25) &&
1809 (m_f54Query_25.has_query27) &&
1810 (m_f54Query_27.has_query29) &&
1811 (m_f54Query_29.has_query30) &&
1812 (m_f54Query_30.has_query32) &&
1813 (m_f54Query_32.has_query33) &&
1814 (m_f54Query_33.has_query36) &&
1815 (m_f54Query_36.has_query38) &&
1816 (m_f54Query_38.has_ctrl149)) {
1817 retval = m_device.Write(m_f54Control.reg_149.address,
1818 &zero,
1819 sizeof(m_f54Control.reg_149.data));
1820 if (retval < 0) {
1821 return retval;
1822 }
1823 }
1824
1825 if (m_f54Query.has_signal_clarity) {
1826 retval = m_device.Read(m_f54Control.reg_41.address,
1827 &value,
1828 sizeof(m_f54Control.reg_41.data));
1829 if (retval < 0) {
1830 return retval;
1831 }
1832 value |= 0x01;
1833 retval = m_device.Write(m_f54Control.reg_41.address,
1834 &value,
1835 sizeof(m_f54Control.reg_41.data));
1836 if (retval < 0) {
1837 return retval;
1838 }
1839 }
1840
1841 retval = DoF54Command(COMMAND_FORCE_UPDATE);
1842 if (retval < 0) {
1843 return retval;
1844 }
1845
1846 retval = DoF54Command(COMMAND_FORCE_CAL);
1847 if (retval < 0) {
1848 return retval;
1849 }
1850 }
1851 return TEST_SUCCESS;
1852 }
1853
ShowF54Report()1854 int F54Test::ShowF54Report()
1855 {
1856 unsigned int ii;
1857 unsigned int jj;
1858 unsigned int kk;
1859 unsigned int tx_num = m_txAssigned;
1860 unsigned int rx_num = m_rxAssigned;
1861 char *report_data_8;
1862 short *report_data_16;
1863 int *report_data_32;
1864 unsigned int *report_data_u32;
1865 unsigned char *report_data_u8;
1866 char buf[256];
1867 bool rt26_result = true;
1868 unsigned char rt26_ng_num;
1869
1870 switch (m_reportType) {
1871 case F54_8BIT_IMAGE:
1872 report_data_8 = (char *)m_reportData;
1873 for (ii = 0; ii < m_reportSize; ii++) {
1874 sprintf(buf, "%03d: %d\n",
1875 ii, *report_data_8);
1876 m_display.Output(buf);
1877 report_data_8++;
1878 }
1879 break;
1880 case F54_16BIT_IMAGE:
1881 case F54_RAW_16BIT_IMAGE:
1882 case F54_TRUE_BASELINE:
1883 case F54_FULL_RAW_CAP:
1884 case F54_FULL_RAW_CAP_NO_RX_COUPLING:
1885 case F54_SENSOR_SPEED:
1886 report_data_16 = (short *)m_reportData;
1887 sprintf(buf, "tx = %d\nrx = %d\n",
1888 tx_num, rx_num);
1889 m_display.Output(buf);
1890
1891 for (ii = 0; ii < tx_num; ii++) {
1892 for (jj = 0; jj < (rx_num - 1); jj++) {
1893 sprintf(buf, "%-4d ",
1894 *report_data_16);
1895 report_data_16++;
1896 m_display.Output(buf);
1897 }
1898 sprintf(buf, "%-4d\n",
1899 *report_data_16);
1900 m_display.Output(buf);
1901 report_data_16++;
1902 }
1903 break;
1904 case F54_HIGH_RESISTANCE:
1905 case F54_FULL_RAW_CAP_MIN_MAX:
1906 report_data_16 = (short *)m_reportData;
1907 for (ii = 0; ii < m_reportSize; ii += 2) {
1908 sprintf(buf, "%03d: %d\n",
1909 ii / 2, *report_data_16);
1910 m_display.Output(buf);
1911 report_data_16++;
1912 }
1913 break;
1914 case F54_ABS_RAW_CAP:
1915 report_data_u32 = (unsigned int *)m_reportData;
1916 sprintf(buf, "rx ");
1917 m_display.Output(buf);
1918
1919 for (ii = 0; ii < rx_num; ii++) {
1920 sprintf(buf, " %2d", ii);
1921 m_display.Output(buf);
1922 }
1923 sprintf(buf, "\n");
1924 m_display.Output(buf);
1925
1926 sprintf(buf, " ");
1927 m_display.Output(buf);
1928
1929 for (ii = 0; ii < rx_num; ii++) {
1930 sprintf(buf, " %5u",
1931 *report_data_u32);
1932 report_data_u32++;
1933 m_display.Output(buf);
1934 }
1935 sprintf(buf, "\n");
1936 m_display.Output(buf);
1937
1938 sprintf(buf, "tx ");
1939 m_display.Output(buf);
1940
1941 for (ii = 0; ii < tx_num; ii++) {
1942 sprintf(buf, " %2d", ii);
1943 m_display.Output(buf);
1944 }
1945 sprintf(buf, "\n");
1946 m_display.Output(buf);
1947
1948 sprintf(buf, " ");
1949 m_display.Output(buf);
1950
1951 for (ii = 0; ii < tx_num; ii++) {
1952 sprintf(buf, " %5u",
1953 *report_data_u32);
1954 report_data_u32++;
1955 m_display.Output(buf);
1956 }
1957 sprintf(buf, "\n");
1958 m_display.Output(buf);
1959
1960 break;
1961 case F54_ABS_DELTA_CAP:
1962 report_data_32 = (int *)m_reportData;
1963 sprintf(buf, "rx ");
1964 m_display.Output(buf);
1965
1966 for (ii = 0; ii < rx_num; ii++) {
1967 sprintf(buf, " %2d", ii);
1968 m_display.Output(buf);
1969 }
1970 sprintf(buf, "\n");
1971 m_display.Output(buf);
1972
1973 sprintf(buf, " ");
1974 m_display.Output(buf);
1975
1976 for (ii = 0; ii < rx_num; ii++) {
1977 sprintf(buf, " %5d",
1978 *report_data_32);
1979 report_data_32++;
1980 m_display.Output(buf);
1981 }
1982 sprintf(buf, "\n");
1983 m_display.Output(buf);
1984
1985 sprintf(buf, "tx ");
1986 m_display.Output(buf);
1987
1988 for (ii = 0; ii < tx_num; ii++) {
1989 sprintf(buf, " %2d", ii);
1990 m_display.Output(buf);
1991 }
1992 sprintf(buf, "\n");
1993 m_display.Output(buf);
1994
1995 sprintf(buf, " ");
1996 m_display.Output(buf);
1997
1998 for (ii = 0; ii < tx_num; ii++) {
1999 sprintf(buf, " %5d",
2000 *report_data_32);
2001 report_data_32++;
2002 m_display.Output(buf);
2003 }
2004 sprintf(buf, "\n");
2005 m_display.Output(buf);
2006
2007 break;
2008 case F54_GUARD_PIN_SHORT:
2009 report_data_u8 = (unsigned char *)m_reportData;
2010 sprintf(buf, "Guard Pin Short Test:\n");
2011 m_display.Output(buf);
2012 for (ii = 0; ii < GUARD_PIN_SHORT_DATA_SIZE; ii++) {
2013 sprintf(buf, "%03d: 0x%02x\n", ii, *(report_data_u8 + ii));
2014 m_display.Output(buf);
2015 }
2016 sprintf(buf, "\n");
2017 m_display.Output(buf);
2018
2019 if (report_data_u8[GUARD_PIN_SHORT_DATA_SIZE - 1] & 0xC0)
2020 sprintf(buf, "Failed: pin %d\n",
2021 (report_data_u8[GUARD_PIN_SHORT_DATA_SIZE - 1] & 0xC0) >> 7);
2022 else
2023 sprintf(buf, "Pass\n");
2024 m_display.Output(buf);
2025
2026 break;
2027 case F54_TRX_SHORTS:
2028 report_data_u8 = (unsigned char *)m_reportData;
2029 sprintf(buf, "Trx Short Test:\n");
2030 m_display.Output(buf);
2031
2032 for (ii = 0; ii < m_reportSize; ii++) {
2033 sprintf(buf, "%03d: 0x%02x\n", ii, *(report_data_u8 + ii));
2034 m_display.Output(buf);
2035 }
2036 sprintf(buf, "\n");
2037 m_display.Output(buf);
2038
2039 for (ii = 0; ii < m_reportSize; ii++) {
2040 if (report_data_u8[ii] != 0) {
2041 for (jj = 0; jj < sizeof(char); jj++) {
2042 if (report_data_u8[ii] & (1 << jj)) {
2043 rt26_ng_num = ii * 8 + jj;
2044 for (kk = 0; kk < m_txAssigned; kk++) {
2045 if (rt26_ng_num == m_txAssignment[kk]) {
2046 rt26_result = false;
2047 sprintf(buf, "Failed on %d\n", rt26_ng_num);
2048 m_display.Output(buf);
2049 }
2050 }
2051 for (kk = 0; kk < m_rxAssigned; kk++) {
2052 if (rt26_ng_num == m_rxAssignment[kk]) {
2053 rt26_result = false;
2054 sprintf(buf, "Failed on %d\n", rt26_ng_num);
2055 m_display.Output(buf);
2056 }
2057 }
2058 }
2059 }
2060 }
2061 }
2062
2063 if (rt26_result) {
2064 sprintf(buf, "Pass\n");
2065 m_display.Output(buf);
2066 }
2067
2068 break;
2069
2070 default:
2071 for (ii = 0; ii < m_reportSize; ii++) {
2072 sprintf(buf, "%03d: 0x%02x\n",
2073 ii, m_reportData[ii]);
2074 m_display.Output(buf);
2075 }
2076 break;
2077 }
2078
2079 sprintf(buf, "\n");
2080 m_display.Output(buf);
2081
2082 m_display.Reflesh();
2083
2084 return TEST_SUCCESS;
2085 }
2086