aboutsummaryrefslogtreecommitdiff
path: root/f54test/f54test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'f54test/f54test.cpp')
-rw-r--r--f54test/f54test.cpp517
1 files changed, 517 insertions, 0 deletions
diff --git a/f54test/f54test.cpp b/f54test/f54test.cpp
index 7c43574..4b4f6b1 100644
--- a/f54test/f54test.cpp
+++ b/f54test/f54test.cpp
@@ -34,6 +34,8 @@
#define RMI_F01_STATUS_CODE(status) ((status) & 0x0f)
/* Indicates that flash programming is enabled (bootloader mode). */
#define RMI_F01_STATUS_BOOTLOADER(status) (!!((status) & 0x40))
+#define NO_SLEEP_OFF (0 << 2)
+#define NO_SLEEP_ON (1 << 2)
/*
* Sleep mode controls power management on the device and affects all
@@ -91,6 +93,10 @@ int F54Test::Prepare(f54_report_types reportType)
if (retval != TEST_SUCCESS)
return retval;
+ retval = DoPreparation();
+ if (retval != TEST_SUCCESS)
+ return retval;
+
data = (unsigned char)m_reportType;
retval = m_device.Write(m_f54.GetDataBase(), &data, 1);
if (retval < 0)
@@ -145,6 +151,7 @@ int F54Test::SetF54ReportType(f54_report_types report_type)
case F54_TRX_SHORTS:
case F54_ABS_RAW_CAP:
case F54_ABS_DELTA_CAP:
+ case F54_GUARD_PIN_SHORT:
m_reportType = report_type;
return SetF54ReportSize(report_type);
default:
@@ -159,6 +166,7 @@ int F54Test::SetF54ReportSize(f54_report_types report_type)
int retval;
unsigned char tx = m_txAssigned;
unsigned char rx = m_rxAssigned;
+ char buf[256];
switch (report_type) {
case F54_8BIT_IMAGE:
@@ -223,7 +231,14 @@ int F54Test::SetF54ReportSize(f54_report_types report_type)
case F54_ABS_DELTA_CAP:
m_reportSize = 4 * (tx + rx);
break;
+ case F54_GUARD_PIN_SHORT:
+ sprintf(buf, "F54_GUARD_PIN_SHORT\n");
+ m_display.Output(buf);
+ m_reportSize = GUARD_PIN_SHORT_DATA_SIZE;
+ break;
default:
+ sprintf(buf, "invalid report type\n");
+ m_display.Output(buf);
m_reportSize = 0;
return TEST_FAIL_INVALID_PARAMETER;
}
@@ -534,6 +549,213 @@ int F54Test::ReadF54Queries()
offset += 1;
}
+ /* query 39 */
+ if (m_f54Query_38.has_query39) {
+ retval = m_device.Read(query_addr + offset,
+ m_f54Query_39.data,
+ sizeof(m_f54Query_39.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 40 */
+ if (m_f54Query_39.has_query40) {
+ retval = m_device.Read(query_addr + offset,
+ m_f54Query_40.data,
+ sizeof(m_f54Query_40.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 41 */
+ if (m_f54Query_40.has_ctrl163_query41)
+ offset += 1;
+
+ /* query 42 */
+ if (m_f54Query_40.has_ctrl165_query42)
+ offset += 1;
+
+ /* query 43 */
+ if (m_f54Query_40.has_query43) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_43.data,
+ sizeof(m_f54Query_43.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ if (m_f54Query_43.has_ctrl172_query44_query45)
+ offset += 2;
+
+ /* query 46 */
+ if (m_f54Query_43.has_query46) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_46.data,
+ sizeof(m_f54Query_46.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 47 */
+ if (m_f54Query_46.has_query47) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_47.data,
+ sizeof(m_f54Query_47.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 48 reserved */
+
+ /* query 49 */
+ if (m_f54Query_47.has_query49) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_49.data,
+ sizeof(m_f54Query_49.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 50 */
+ if (m_f54Query_49.has_query50) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_50.data,
+ sizeof(m_f54Query_50.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 51 */
+ if (m_f54Query_50.has_query51) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_51.data,
+ sizeof(m_f54Query_51.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 53 54 */
+ if (m_f54Query_51.has_query53_query54_ctrl198)
+ offset += 2;
+
+ /* query 55 */
+ if (m_f54Query_51.has_query55) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_55.data,
+ sizeof(m_f54Query_55.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 56 */
+ if (m_f54Query_55.has_query56)
+ offset += 1;
+
+ /* query 57 */
+ if (m_f54Query_55.has_query57) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_57.data,
+ sizeof(m_f54Query_57.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 58 */
+ if (m_f54Query_57.has_query58) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_58.data,
+ sizeof(m_f54Query_58.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 59 */
+ if (m_f54Query_58.has_query59)
+ offset += 1;
+
+ /* query 60 */
+ if (m_f54Query_58.has_query60)
+ offset += 1;
+
+ /* query 61 */
+ if (m_f54Query_58.has_query61) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_61.data,
+ sizeof(m_f54Query_61.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 62 63 */
+ if (m_f54Query_61.has_ctrl215_query62_query63)
+ offset += 2;
+
+ /* query 64 */
+ if (m_f54Query_61.has_query64) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_64.data,
+ sizeof(m_f54Query_64.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 65 */
+ if (m_f54Query_64.has_query65) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_65.data,
+ sizeof(m_f54Query_65.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 66 */
+ if (m_f54Query_65.has_query66_ctrl231)
+ offset += 1;
+
+ /* query 67 */
+ if (m_f54Query_65.has_query67) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_67.data,
+ sizeof(m_f54Query_67.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 68 */
+ if (m_f54Query_67.has_query68) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_68.data,
+ sizeof(m_f54Query_68.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 69 */
+ if (m_f54Query_68.has_query69) {
+ m_device.Read(query_addr + offset,
+ m_f54Query_69.data,
+ sizeof(m_f54Query_69.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
return TEST_SUCCESS;;
}
@@ -1213,6 +1435,129 @@ int F54Test::SetupF54Controls()
m_f54Control.reg_149.address = reg_addr;
reg_addr += CONTROL_149_SIZE;
}
+ /* control 150 */
+ if (m_f54Query_38.has_ctrl150)
+ reg_addr += CONTROL_150_SIZE;
+
+ /* control 151 */
+ if (m_f54Query_38.has_ctrl151)
+ reg_addr += CONTROL_151_SIZE;
+
+ /* control 152 */
+ if (m_f54Query_38.has_ctrl152)
+ reg_addr += CONTROL_152_SIZE;
+
+ /* control 153 */
+ if (m_f54Query_38.has_ctrl153)
+ reg_addr += CONTROL_153_SIZE;
+
+ /* control 154 */
+ if (m_f54Query_39.has_ctrl154)
+ reg_addr += CONTROL_154_SIZE;
+
+ /* control 155 */
+ if (m_f54Query_39.has_ctrl155)
+ reg_addr += CONTROL_155_SIZE;
+
+ /* control 156 */
+ if (m_f54Query_39.has_ctrl156)
+ reg_addr += CONTROL_156_SIZE;
+
+ /* controls 157 158 */
+ if (m_f54Query_39.has_ctrl157_ctrl158)
+ reg_addr += CONTROL_157_158_SIZE;
+
+ /* controls 159 to 162 reserved */
+
+ /* control 163 */
+ if (m_f54Query_40.has_ctrl163_query41)
+ reg_addr += CONTROL_163_SIZE;
+
+ /* control 164 reserved */
+
+ /* control 165 */
+ if (m_f54Query_40.has_ctrl165_query42)
+ reg_addr += CONTROL_165_SIZE;
+
+ /* control 166 */
+ if (m_f54Query_40.has_ctrl166)
+ reg_addr += CONTROL_166_SIZE;
+
+ /* control 167 */
+ if (m_f54Query_40.has_ctrl167)
+ reg_addr += CONTROL_167_SIZE;
+
+ /* control 168 */
+ if (m_f54Query_40.has_ctrl168)
+ reg_addr += CONTROL_168_SIZE;
+
+ /* control 169 */
+ if (m_f54Query_40.has_ctrl169)
+ reg_addr += CONTROL_169_SIZE;
+
+ /* control 170 reserved */
+
+ /* control 171 */
+ if (m_f54Query_43.has_ctrl171)
+ reg_addr += CONTROL_171_SIZE;
+
+ /* control 172 */
+ if (m_f54Query_43.has_ctrl172_query44_query45)
+ reg_addr += CONTROL_172_SIZE;
+
+ /* control 173 */
+ if (m_f54Query_43.has_ctrl173)
+ reg_addr += CONTROL_173_SIZE;
+
+ /* control 174 */
+ if (m_f54Query_43.has_ctrl174)
+ reg_addr += CONTROL_174_SIZE;
+
+ /* control 175 */
+ if (m_f54Query_43.has_ctrl175)
+ reg_addr += CONTROL_175_SIZE;
+
+ /* control 176 */
+ if (m_f54Query_46.has_ctrl176)
+ reg_addr += CONTROL_176_SIZE;
+
+ /* controls 177 178 */
+ if (m_f54Query_46.has_ctrl177_ctrl178)
+ reg_addr += CONTROL_177_178_SIZE;
+
+ /* control 179 */
+ if (m_f54Query_46.has_ctrl179)
+ reg_addr += CONTROL_179_SIZE;
+
+ /* controls 180 to 181 reserved */
+
+ /* control 182 */
+ if (m_f54Query_47.has_ctrl182)
+ reg_addr += CONTROL_182_SIZE;
+
+ /* control 183 */
+ if (m_f54Query_47.has_ctrl183)
+ reg_addr += CONTROL_183_SIZE;
+
+ /* control 184 reserved */
+
+ /* control 185 */
+ if (m_f54Query_47.has_ctrl185)
+ reg_addr += CONTROL_185_SIZE;
+
+ /* control 186 */
+ if (m_f54Query_47.has_ctrl186)
+ reg_addr += CONTROL_186_SIZE;
+
+ /* control 187 */
+ if (m_f54Query_47.has_ctrl187)
+ reg_addr += CONTROL_187_SIZE;
+
+ /* control 188 */
+ if (m_f54Query_49.has_ctrl188) {
+ m_f54Control.reg_188.address = reg_addr;
+ reg_addr += CONTROL_188_SIZE;
+ }
return TEST_SUCCESS;
}
@@ -1400,17 +1745,127 @@ exit:
return retval;
}
+#define disable_cbc(ctrl_num)\
+do {\
+ retval = m_device.Read(\
+ m_f54Control.ctrl_num.address,\
+ m_f54Control.ctrl_num.data,\
+ sizeof(m_f54Control.ctrl_num.data));\
+ if (retval < 0) {\
+ return retval;\
+ } \
+ m_f54Control.ctrl_num.cbc_tx_carrier_selection = 0;\
+ retval = m_device.Write(\
+ m_f54Control.ctrl_num.address,\
+ m_f54Control.ctrl_num.data,\
+ sizeof(m_f54Control.ctrl_num.data));\
+ if (retval < 0) {\
+ return retval;\
+ } \
+} while (0)
+
+int F54Test::DoPreparation()
+{
+ int retval;
+ unsigned char value;
+ unsigned char zero = 0x00;
+ unsigned char device_ctrl;
+
+ retval = m_device.Read(m_f54.GetControlBase(),
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ return retval;
+ }
+
+ device_ctrl |= NO_SLEEP_ON;
+
+ retval = m_device.Write(m_f54.GetControlBase(),
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ return retval;
+ }
+
+ switch (m_reportType) {
+ case F54_16BIT_IMAGE:
+ case F54_RAW_16BIT_IMAGE:
+ case F54_SENSOR_SPEED:
+ case F54_ADC_RANGE:
+ case F54_ABS_RAW_CAP:
+ case F54_ABS_DELTA_CAP:
+ break;
+ default:
+ if (m_f54Query.touch_controller_family == 1)
+ disable_cbc(reg_7);
+ else if (m_f54Query.has_ctrl88)
+ disable_cbc(reg_88);
+
+ if (m_f54Query.has_0d_acquisition_control)
+ disable_cbc(reg_57);
+
+ if ((m_f54Query.has_query15) &&
+ (m_f54Query_15.has_query25) &&
+ (m_f54Query_25.has_query27) &&
+ (m_f54Query_27.has_query29) &&
+ (m_f54Query_29.has_query30) &&
+ (m_f54Query_30.has_query32) &&
+ (m_f54Query_32.has_query33) &&
+ (m_f54Query_33.has_query36) &&
+ (m_f54Query_36.has_query38) &&
+ (m_f54Query_38.has_ctrl149)) {
+ retval = m_device.Write(m_f54Control.reg_149.address,
+ &zero,
+ sizeof(m_f54Control.reg_149.data));
+ if (retval < 0) {
+ return retval;
+ }
+ }
+
+ if (m_f54Query.has_signal_clarity) {
+ retval = m_device.Read(m_f54Control.reg_41.address,
+ &value,
+ sizeof(m_f54Control.reg_41.data));
+ if (retval < 0) {
+ return retval;
+ }
+ value |= 0x01;
+ retval = m_device.Write(m_f54Control.reg_41.address,
+ &value,
+ sizeof(m_f54Control.reg_41.data));
+ if (retval < 0) {
+ return retval;
+ }
+ }
+
+ retval = DoF54Command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ return retval;
+ }
+
+ retval = DoF54Command(COMMAND_FORCE_CAL);
+ if (retval < 0) {
+ return retval;
+ }
+ }
+ return TEST_SUCCESS;
+}
+
int F54Test::ShowF54Report()
{
unsigned int ii;
unsigned int jj;
+ unsigned int kk;
unsigned int tx_num = m_txAssigned;
unsigned int rx_num = m_rxAssigned;
char *report_data_8;
short *report_data_16;
int *report_data_32;
unsigned int *report_data_u32;
+ unsigned char *report_data_u8;
char buf[256];
+ bool rt26_result = true;
+ unsigned char rt26_ng_num;
switch (m_reportType) {
case F54_8BIT_IMAGE:
@@ -1550,6 +2005,68 @@ int F54Test::ShowF54Report()
m_display.Output(buf);
break;
+ case F54_GUARD_PIN_SHORT:
+ report_data_u8 = (unsigned char *)m_reportData;
+ sprintf(buf, "Guard Pin Short Test:\n");
+ m_display.Output(buf);
+ for (ii = 0; ii < GUARD_PIN_SHORT_DATA_SIZE; ii++) {
+ sprintf(buf, "%03d: 0x%02x\n", ii, *(report_data_u8 + ii));
+ m_display.Output(buf);
+ }
+ sprintf(buf, "\n");
+ m_display.Output(buf);
+
+ if (report_data_u8[GUARD_PIN_SHORT_DATA_SIZE - 1] & 0xC0)
+ sprintf(buf, "Failed: pin %d\n",
+ (report_data_u8[GUARD_PIN_SHORT_DATA_SIZE - 1] & 0xC0) >> 7);
+ else
+ sprintf(buf, "Pass\n");
+ m_display.Output(buf);
+
+ break;
+ case F54_TRX_SHORTS:
+ report_data_u8 = (unsigned char *)m_reportData;
+ sprintf(buf, "Trx Short Test:\n");
+ m_display.Output(buf);
+
+ for (ii = 0; ii < m_reportSize; ii++) {
+ sprintf(buf, "%03d: 0x%02x\n", ii, *(report_data_u8 + ii));
+ m_display.Output(buf);
+ }
+ sprintf(buf, "\n");
+ m_display.Output(buf);
+
+ for (ii = 0; ii < m_reportSize; ii++) {
+ if (report_data_u8[ii] != 0) {
+ for (jj = 0; jj < sizeof(char); jj++) {
+ if (report_data_u8[ii] & (1 << jj)) {
+ rt26_ng_num = ii * 8 + jj;
+ for (kk = 0; kk < m_txAssigned; kk++) {
+ if (rt26_ng_num == m_txAssignment[kk]) {
+ rt26_result = false;
+ sprintf(buf, "Failed on %d\n", rt26_ng_num);
+ m_display.Output(buf);
+ }
+ }
+ for (kk = 0; kk < m_rxAssigned; kk++) {
+ if (rt26_ng_num == m_rxAssignment[kk]) {
+ rt26_result = false;
+ sprintf(buf, "Failed on %d\n", rt26_ng_num);
+ m_display.Output(buf);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (rt26_result) {
+ sprintf(buf, "Pass\n");
+ m_display.Output(buf);
+ }
+
+ break;
+
default:
for (ii = 0; ii < m_reportSize; ii++) {
sprintf(buf, "%03d: 0x%02x\n",