static int TestPreparation(struct synaptics_ts_data *ts) { int ret = 0; u8 data = 0; ReadChCount(ts); /*Turn off CBC.*/ ret = Touch_I2C_Read(ts->client, ANALOG_CONTROL_REG, &data, 1); data = data & 0xDF; ret = Touch_I2C_Write(ts->client, ANALOG_CONTROL_REG, &data, 1); /*Apply ForceUpdate.*/ ret = Touch_I2C_Read(ts->client, ANALOG_COMMAND_REG, &data, 1); data = data | 0x04; ret = Touch_I2C_Write(ts->client, ANALOG_COMMAND_REG, &data, 1); msleep(WAIT_TIME); /*Apply ForceCal.*/ ret = Touch_I2C_Read(ts->client, ANALOG_COMMAND_REG, &data, 1); data = data | 0x02; ret = Touch_I2C_Write(ts->client, ANALOG_COMMAND_REG, &data, 1); msleep(WAIT_TIME); return TOUCH_SUCCESS; }
static int ReadChCount(struct synaptics_ts_data *ts) { int ret = 0; u8 data[64] = {0}; u8 rx_max_cnt = 0; u8 tx_max_cnt = 0; int i; RxChNum = TxChNum = 0; /*Read channel count*/ ret = Touch_I2C_Read(ts->client, RX_CH_CNT_REG, &rx_max_cnt, 1); if( ret < 0) { return TOUCH_FAIL; } ret = Touch_I2C_Read(ts->client, TX_CH_CNT_REG, &tx_max_cnt, 1); if( ret < 0) { return TOUCH_FAIL; } ret = Touch_I2C_Write_Byte(ts->client, PAGE_SELECT_REG, ts->sensor_fc.function_page); if( ret < 0) { return TOUCH_FAIL; } ret = Touch_I2C_Read(ts->client, ts->sensor_fc.dsc.data_base+1, data, rx_max_cnt); if( ret < 0) { return TOUCH_FAIL; } for (i = 0; i < (int)rx_max_cnt; i++) { if (data[i] != 0xFF) RxChNum++; } ret = Touch_I2C_Read(ts->client, ts->sensor_fc.dsc.data_base+2, data, tx_max_cnt); if( ret < 0) { return TOUCH_FAIL; } for (i = 0; i < (int)tx_max_cnt; i++) { if (data[i] != 0xFF) TxChNum++; } TOUCH_DBG("rx ch cnt = %d, tx ch cnt = %d\n", RxChNum, TxChNum); ret = Touch_I2C_Write_Byte(ts->client, PAGE_SELECT_REG, ts->analog_fc.function_page); if( ret < 0) { return TOUCH_FAIL; } return TOUCH_SUCCESS; }
static int ReadHighResistance(struct synaptics_ts_data *ts) { int ret = 0; int MaxArrayLength = RxChNum * TxChNum * 2; int HighResistanceLowerLimit[3] = {-1000, -1000, -400}; int HighResistanceUpperLimit[3] = {450, 450, 200}; int maxRxpF, maxTxpF, minpF; int i = 0; int result = TOUCH_SUCCESS; u8 cap_data[MaxArrayLength]; short maxRx, maxTx, min; ret = Touch_I2C_Read(ts->client, REPORT_DATA_REG, cap_data, MaxArrayLength); maxRx = ((short)cap_data[0] | (short)cap_data[1] << 8); maxTx = ((short)cap_data[2] | (short)cap_data[3] << 8); min = ((short)cap_data[4] | (short)cap_data[5] << 8); maxRxpF = maxRx; maxTxpF = maxTx; minpF = min; WRITE_BUFFER(f54_wlog_buf, "High Resistance Test\n"); WRITE_BUFFER(f54_wlog_buf, "Max Rx Offset(pF) = %d\n", maxRxpF); WRITE_BUFFER(f54_wlog_buf, "Max Tx Offset(pF) = %d\n", maxTxpF); WRITE_BUFFER(f54_wlog_buf, "Min(pF) = %d\n", minpF); WRITE_BUFFER(f54_wlog_buf, "\n=====================================================\n"); WRITE_BUFFER(f54_wlog_buf, "\tHigh Resistance Test\n"); WRITE_BUFFER(f54_wlog_buf, "=====================================================\n"); WRITE_BUFFER(f54_wlog_buf, " Parameters: "); WRITE_BUFFER(f54_wlog_buf, "%5d %5d %5d ", maxRxpF, maxTxpF, minpF); WRITE_BUFFER(f54_wlog_buf, "\n\n Limits(+) : "); for(i = 0; i < 3; i++) WRITE_BUFFER(f54_wlog_buf, "%5d ", HighResistanceUpperLimit[i]); WRITE_BUFFER(f54_wlog_buf, "\n Limits(-) : "); for(i = 0; i < 3; i++) WRITE_BUFFER(f54_wlog_buf, "%5d ", HighResistanceLowerLimit[i]); WRITE_BUFFER(f54_wlog_buf, "\n-----------------------------------------------------\n"); if (maxRxpF > HighResistanceUpperLimit[0] || maxRxpF < HighResistanceLowerLimit[0]) result = TOUCH_FAIL; if (maxTxpF > HighResistanceUpperLimit[1] || maxTxpF < HighResistanceLowerLimit[1]) result = TOUCH_FAIL; if (minpF > HighResistanceUpperLimit[2] || minpF < HighResistanceLowerLimit[2]) result = TOUCH_FAIL; if (result == TOUCH_FAIL) WRITE_BUFFER(f54_wlog_buf, "HighResistance Test failed.\n\n"); else WRITE_BUFFER(f54_wlog_buf, "HighResistance Test passed.\n\n"); write_log(NULL, f54_wlog_buf); return result; }
static int ReadTRexShort(struct synaptics_ts_data *ts) { int ret = 0; unsigned char TRX_Short[7] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; int MaxArrayLength = RxChNum * TxChNum * 2; int i, j = 0; int mask = 0x01; int value; // Hardcode for Waikiki Test and it support up to 54 Tx int result = TOUCH_SUCCESS; u8 buf[40] = {0}; u8 cap_data[MaxArrayLength]; ret = Touch_I2C_Read(ts->client, REPORT_DATA_REG, cap_data, MaxArrayLength); WRITE_BUFFER(f54_wlog_buf, "TRex Short Test\n"); for (i = 0; i < 7; i++) { int short_num = 0; value = cap_data[i]; cap_data[i] = 0; for (j = 0; j < 8; j++) { if((value & mask) == 1) { cap_data[i] = cap_data[i] + (unsigned char)pow_func(2, (7 - j)); short_num += sprintf(buf+short_num, "%d ", (i * 8 + (7 - j))); } value >>= 1; } WRITE_BUFFER(f54_wlog_buf, "TRex-TRex Short Test Data = %#x", cap_data[i]); if (short_num) { WRITE_BUFFER(f54_wlog_buf, " (Short TRx Number: "); WRITE_BUFFER(f54_wlog_buf, buf); WRITE_BUFFER(f54_wlog_buf, ")\n"); } WRITE_BUFFER(f54_wlog_buf, "\n"); } for(i = 0; i < 7; i++) { if(cap_data[i] != TRX_Short[i]) { result = TOUCH_FAIL; break; } } if (result == TOUCH_SUCCESS) WRITE_BUFFER(f54_wlog_buf, "\nTRex-TRex Short Test passed.\n\n"); else WRITE_BUFFER(f54_wlog_buf, "\nTRex-TRex Short Test failed.\n\n"); write_log(NULL, f54_wlog_buf); return result; }
// Construct data with Report Type #20 data static int ReadRawData(struct synaptics_ts_data *ts) { int ret = 0; int MaxArrayLength = RxChNum * TxChNum * 2; int i,j,k = 0; int result = TOUCH_SUCCESS; u8 cap_data[MaxArrayLength]; ret = Touch_I2C_Read(ts->client, REPORT_DATA_REG, cap_data, MaxArrayLength); WRITE_BUFFER(f54_wlog_buf, "Full Raw Capacitance Test\n"); WRITE_BUFFER(f54_wlog_buf, "\nInfo: Tx = %d Rx = %d \n", TxChNum, RxChNum); WRITE_BUFFER(f54_wlog_buf, "Image Data : \n"); WRITE_BUFFER(f54_wlog_buf, "==========================================================================================================\n :"); for (i = 0; i < RxChNum; i++) WRITE_BUFFER(f54_wlog_buf, "%5d ", i); WRITE_BUFFER(f54_wlog_buf, "\n----------------------------------------------------------------------------------------------------------\n"); for (i = 0; i < TxChNum; i++) { WRITE_BUFFER(f54_wlog_buf, " %5d : ", i); for (j = 0; j < RxChNum; j++) { full_raw_data[i][j] = ((short)cap_data[k] | (short)cap_data[k+1] << 8); WRITE_BUFFER(f54_wlog_buf, "%5d ", full_raw_data[i][j]); k = k + 2; } WRITE_BUFFER(f54_wlog_buf, "\n"); } WRITE_BUFFER(f54_wlog_buf, "------------------------------------------------------------------------------------------------------------\n"); //Compare 2D area for (j = 0; j < RxChNum; j++) { for (i = 0; i < TxChNum; i++) { if ((full_raw_data[i][j] < LowerImageLimit[i][j]) || (full_raw_data[i][j] > UpperImageLimit[i][j])) { WRITE_BUFFER(f54_wlog_buf, "FAIL, %d,%d,%d\n", LowerImageLimit[i][j], UpperImageLimit[i][j], full_raw_data[i][j]); result = TOUCH_FAIL; break; } } } if (result == TOUCH_SUCCESS) WRITE_BUFFER(f54_wlog_buf, "\nFull Raw Capacitance Image Test passed.\n\n"); else WRITE_BUFFER(f54_wlog_buf, "\nFull Raw Capacitance Image Test failed.\n\n"); write_log(NULL, f54_wlog_buf); return result; }
static int readRMI(struct i2c_client *client, u8 uRmiAddress, u8 *data, unsigned int length) { return Touch_I2C_Read(client, uRmiAddress, data, length); }