xref: /aosp_15_r20/external/rmi4utils/f54test/f54test.cpp (revision a248dafd7653b99fc45f9d29e5f139b04f2f28bc)
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