diff options
author | Leon Tu <Leon.Tu@tw.synaptics.com> | 2018-03-02 12:36:11 -0800 |
---|---|---|
committer | Andrew Duggan <andrew@duggan.us> | 2018-03-02 17:58:26 -0800 |
commit | 90045d6ce7920028b2af27013bd648affacdda19 (patch) | |
tree | 5b7b54d5cbf04001c49b0c6f3bdeac321136d455 | |
parent | 82213a2d7bea83cc6d191347383dacdc35ca04fe (diff) | |
download | rmi4utils-90045d6ce7920028b2af27013bd648affacdda19.tar.gz |
Update f54test test tool
- Add F54_GUARD_PIN_SHORT test.
- Extend the parsing logics and definitions of f54 query registers and f54 control registers.
- Add support of test preparation (Disable CBC + No Signal Clarity) for specific test items.
- Show test results of RT50 & RT26.
-rw-r--r-- | f54test/f54test.cpp | 517 | ||||
-rw-r--r-- | f54test/f54test.h | 346 |
2 files changed, 856 insertions, 7 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", diff --git a/f54test/f54test.h b/f54test/f54test.h index 6842cba..bc0b496 100644 --- a/f54test/f54test.h +++ b/f54test/f54test.h @@ -143,10 +143,39 @@ #define CONTROL_147_SIZE 1 #define CONTROL_148_SIZE 1 #define CONTROL_149_SIZE 1 +#define CONTROL_150_SIZE 1 +#define CONTROL_151_SIZE 1 +#define CONTROL_152_SIZE 1 +#define CONTROL_153_SIZE 1 +#define CONTROL_154_SIZE 1 +#define CONTROL_155_SIZE 1 +#define CONTROL_156_SIZE 1 +#define CONTROL_157_158_SIZE 2 +#define CONTROL_163_SIZE 1 +#define CONTROL_165_SIZE 1 +#define CONTROL_166_SIZE 1 +#define CONTROL_167_SIZE 1 +#define CONTROL_168_SIZE 1 +#define CONTROL_169_SIZE 1 +#define CONTROL_171_SIZE 1 +#define CONTROL_172_SIZE 1 +#define CONTROL_173_SIZE 1 +#define CONTROL_174_SIZE 1 +#define CONTROL_175_SIZE 1 +#define CONTROL_176_SIZE 1 +#define CONTROL_177_178_SIZE 2 +#define CONTROL_179_SIZE 1 +#define CONTROL_182_SIZE 1 +#define CONTROL_183_SIZE 1 +#define CONTROL_185_SIZE 1 +#define CONTROL_186_SIZE 1 +#define CONTROL_187_SIZE 1 +#define CONTROL_188_SIZE 1 #define HIGH_RESISTANCE_DATA_SIZE 6 #define FULL_RAW_CAP_MIN_MAX_DATA_SIZE 4 -#define TRX_OPEN_SHORT_DATA_SIZE 7 +#define TRX_OPEN_SHORT_DATA_SIZE 15 +#define GUARD_PIN_SHORT_DATA_SIZE 15 enum f54_report_types { F54_8BIT_IMAGE = 1, @@ -171,6 +200,7 @@ enum f54_report_types { F54_TRX_SHORTS = 26, F54_ABS_RAW_CAP = 38, F54_ABS_DELTA_CAP = 40, + F54_GUARD_PIN_SHORT = 50, INVALID_REPORT_TYPE = -1, }; @@ -493,16 +523,281 @@ struct f54_query_38 { unsigned char has_ctrl147:1; unsigned char has_ctrl148:1; unsigned char has_ctrl149:1; - unsigned char f54_query38_b3:1; - unsigned char f54_query38_b4:1; - unsigned char f54_query38_b5:1; - unsigned char f54_query38_b6:1; - unsigned char f54_query38_b7:1; + unsigned char has_ctrl150:1; + unsigned char has_ctrl151:1; + unsigned char has_ctrl152:1; + unsigned char has_ctrl153:1; + unsigned char has_query39:1; } __attribute__((packed)); unsigned char data[1]; }; }; +struct f54_query_39 { + union { + struct { + unsigned char has_ctrl154:1; + unsigned char has_ctrl155:1; + unsigned char has_ctrl156:1; + unsigned char has_ctrl160:1; + unsigned char has_ctrl157_ctrl158:1; + unsigned char f54_query39_b5__6:2; + unsigned char has_query40:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_40 { + union { + struct { + unsigned char has_ctrl169:1; + unsigned char has_ctrl163_query41:1; + unsigned char f54_query40_b2:1; + unsigned char has_ctrl165_query42:1; + unsigned char has_ctrl166:1; + unsigned char has_ctrl167:1; + unsigned char has_ctrl168:1; + unsigned char has_query43:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_43 { + union { + struct { + unsigned char f54_query43_b0__1:2; + unsigned char has_ctrl171:1; + unsigned char has_ctrl172_query44_query45:1; + unsigned char has_ctrl173:1; + unsigned char has_ctrl174:1; + unsigned char has_ctrl175:1; + unsigned char has_query46:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_46 { + union { + struct { + unsigned char has_ctrl176:1; + unsigned char has_ctrl177_ctrl178:1; + unsigned char has_ctrl179:1; + unsigned char f54_query46_b3:1; + unsigned char has_data27:1; + unsigned char has_data28:1; + unsigned char f54_query46_b6:1; + unsigned char has_query47:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_47 { + union { + struct { + unsigned char f54_query47_b0:1; + unsigned char has_ctrl182:1; + unsigned char has_ctrl183:1; + unsigned char f54_query47_b3:1; + unsigned char has_ctrl185:1; + unsigned char has_ctrl186:1; + unsigned char has_ctrl187:1; + unsigned char has_query49:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_49 { + union { + struct { + unsigned char f54_query49_b0__1:2; + unsigned char has_ctrl188:1; + unsigned char has_data31:1; + unsigned char f54_query49_b4__6:3; + unsigned char has_query50:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_50 { + union { + struct { + unsigned char f54_query50_b0__6:7; + unsigned char has_query51:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_51 { + union { + struct { + unsigned char f54_query51_b0__4:5; + unsigned char has_query53_query54_ctrl198:1; + unsigned char has_ctrl199:1; + unsigned char has_query55:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_55 { + union { + struct { + unsigned char has_query56:1; + unsigned char has_data33_data34:1; + unsigned char has_alt_report_rate:1; + unsigned char has_ctrl200:1; + unsigned char has_ctrl201_ctrl202:1; + unsigned char has_ctrl203:1; + unsigned char has_ctrl204:1; + unsigned char has_query57:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_57 { + union { + struct { + unsigned char has_ctrl205:1; + unsigned char has_ctrl206:1; + unsigned char has_usb_bulk_read:1; + unsigned char has_ctrl207:1; + unsigned char has_ctrl208:1; + unsigned char has_ctrl209:1; + unsigned char has_ctrl210:1; + unsigned char has_query58:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_58 { + union { + struct { + unsigned char has_query59:1; + unsigned char has_query60:1; + unsigned char has_ctrl211:1; + unsigned char has_ctrl212:1; + unsigned char has_hybrid_abs_tx_axis_filtering:1; + unsigned char has_hybrid_abs_tx_interpolation:1; + unsigned char has_ctrl213:1; + unsigned char has_query61:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_61 { + union { + struct { + unsigned char has_ctrl214:1; + unsigned char has_ctrl215_query62_query63:1; + unsigned char f54_query_61_b2:1; + unsigned char has_ctrl216:1; + unsigned char has_ctrl217:1; + unsigned char has_misc_host_ctrl:1; + unsigned char hybrid_abs_buttons:1; + unsigned char has_query64:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_64 { + union { + struct { + unsigned char has_ctrl101_sub1:1; + unsigned char has_ctrl220:1; + unsigned char has_ctrl221:1; + unsigned char has_ctrl222:1; + unsigned char has_ctrl219_sub1:1; + unsigned char has_ctrl103_sub3:1; + unsigned char has_ctrl224_ctrl226_ctrl227:1; + unsigned char has_query65:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_65 { + union { + struct { + unsigned char f54_query_65_b0__1:2; + unsigned char has_ctrl101_sub2:1; + unsigned char f54_query_65_b3__4:2; + unsigned char has_query66_ctrl231:1; + unsigned char has_ctrl232:1; + unsigned char has_query67:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_67 { + union { + struct { + unsigned char has_abs_doze_spatial_filter_en:1; + unsigned char has_abs_doze_avg_filter_enhancement_en:1; + unsigned char has_single_display_pulse:1; + unsigned char f54_query_67_b3__4:2; + unsigned char has_ctrl235_ctrl236:1; + unsigned char f54_query_67_b6:1; + unsigned char has_query68:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_68 { + union { + struct { + unsigned char f54_query_68_b0:1; + unsigned char has_ctrl238:1; + unsigned char has_ctrl238_sub1:1; + unsigned char has_ctrl238_sub2:1; + unsigned char has_ctrl239:1; + unsigned char has_freq_filter_bw_ext:1; + unsigned char is_tddi_hic:1; + unsigned char has_query69:1; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_query_69 { + union { + struct { + unsigned char has_ctrl240_sub0:1; + unsigned char has_ctrl240_sub1_sub2:1; + unsigned char has_ctrl240_sub3:1; + unsigned char has_ctrl240_sub4:1; + unsigned char f54_query_69_b4__7:4; + } __attribute__((packed)); + unsigned char data[1]; + }; +}; + +struct f54_data_31 { + union { + struct { + unsigned char is_calibration_crc:1; + unsigned char calibration_crc:1; + unsigned char short_test_row_number:5; + } __attribute__((packed)); + struct { + unsigned char data[1]; + unsigned short address; + } __attribute__((packed)); + }; +}; + struct f54_control_7 { union { struct { @@ -602,6 +897,23 @@ struct f54_control_149 { }; }; +struct f54_control_188 { + union { + struct { + unsigned char start_calibration:1; + unsigned char start_is_calibration:1; + unsigned char frequency:2; + unsigned char start_production_test:1; + unsigned char short_test_calibration:1; + unsigned char f54_ctrl188_b7:1; + } __attribute__((packed)); + struct { + unsigned char data[1]; + unsigned short address; + } __attribute__((packed)); + }; +}; + struct f54_control { struct f54_control_7 reg_7; struct f54_control_41 reg_41; @@ -609,8 +921,10 @@ struct f54_control { struct f54_control_88 reg_88; struct f54_control_110 reg_110; struct f54_control_149 reg_149; + struct f54_control_188 reg_188; }; + struct f55_query { union { struct { @@ -663,6 +977,7 @@ private: int WaitForF54CommandCompletion(); int ReadF54Report(); int ShowF54Report(); + int DoPreparation(); private: RMIDevice & m_device; @@ -687,9 +1002,26 @@ private: f54_query_35 m_f54Query_35; f54_query_36 m_f54Query_36; f54_query_38 m_f54Query_38; + f54_query_39 m_f54Query_39; + f54_query_40 m_f54Query_40; + f54_query_43 m_f54Query_43; + f54_query_46 m_f54Query_46; + f54_query_47 m_f54Query_47; + f54_query_49 m_f54Query_49; + f54_query_50 m_f54Query_50; + f54_query_51 m_f54Query_51; + f54_query_55 m_f54Query_55; + f54_query_57 m_f54Query_57; + f54_query_58 m_f54Query_58; + f54_query_61 m_f54Query_61; + f54_query_64 m_f54Query_64; + f54_query_65 m_f54Query_65; + f54_query_67 m_f54Query_67; + f54_query_68 m_f54Query_68; + f54_query_69 m_f54Query_69; f54_control m_f54Control; - + f54_data_31 m_f54Data_31; f55_query m_f55Query; f54_report_types m_reportType; |