// Construct data with Report Type #24 data void ReadTRexOpenReport(void) { int i, j = 0; //int k = ((int)TxChannelCount) / 8 + 1; int k = 7, mask = 0x01, value;// Hardcode for Waikiki Test and it support up to 54 Tx Read8BitRegisters((F54DataBase+REPORT_DATA_OFFEST), Data, k); for (i = 0; i < k ; i++){ value = Data[i]; Data[i] = 0; for (j = 0; j < 8; j++){ if((value & mask) == 1) { Data[i] = Data[i] + (unsigned char)pow_func(2, (7 - j)); } value >>= 1; } printk("TRex-Open Test Data = %#x,", Data[i]); } printk("\n"); CompareTRexOpenTestReport(k * 8); //Reset Device Reset(); }
// Construct data with Report Type #26 data int ReadTRexShortReport(void) { int ret = 0; int i, j = 0; //int k = ((int)TxChannelCount) / 8 + 1; int k = 7, mask = 0x01, value;// Hardcode for Waikiki Test and it support up to 54 Tx Read8BitRegisters((F54DataBase+REPORT_DATA_OFFEST), Data, k); for (i = 0; i < k; i++) { value = Data[i]; Data[i] = 0; for (j = 0; j < 8; j++){ if((value & mask) == 1) { Data[i] = Data[i] + (unsigned char)pow_func(2, (7 - j)); } value >>= 1; } outbuf += sprintf(f54_wlog_buf+outbuf, "TRex-TRex Short Test Data = %#x\n", Data[i]); } outbuf += sprintf(f54_wlog_buf+outbuf, "\n"); ret = CompareTRexShortTestReport(k * 8); write_log(f54_wlog_buf); //Reset Device Reset(); return ret; }
void ReadAbsRawReport(void) { int i, k = 0; int *p32data; Read8BitRegisters((F54DataBase + REPORT_DATA_OFFEST), &Data[0], 4 * (RxChannelCount + TxChannelCount)); p32data = (int *)&Data[0]; printk("Abs Sensing Raw Capacitance Data:\n"); printk("Rx: "); for (i = 0; i < (int)RxChannelCount; i++) { AbsSigned32Data[k] = (int)*p32data; printk("%d ", AbsSigned32Data[k]); k++; p32data++; } printk("\n"); printk("Tx: "); for (i = 0; i < (int)TxChannelCount; i++) { AbsSigned32Data[k] = (int)*p32data; printk("%d ", AbsSigned32Data[k]); k++; p32data++; } printk("\n"); CompareAbsRawReport(); Reset(); }
// Construct data with Report Type #23 data void ReadADCRangeReport(void) { int temp = TxChannelCount; int i, j, k = 0; if (SignalClarityOn){ if ((TxChannelCount / 4) != 0) { temp = (4 - (TxChannelCount % 4)) + TxChannelCount; } } Read8BitRegisters((F54DataBase+REPORT_DATA_OFFEST), Data, (temp*RxChannelCount*2)); k = 0; printk("ADC Data: \n"); for (i = 0; i < (int)TxChannelCount; i++){ printk("Tx[%d]: ", i); for (j = 0; j < (int)RxChannelCount; j++){ //Image1[i][j] = ((unsigned short)Data[k] | (unsigned short)Data[k+1] << 8); Image1[i][j] = ((unsigned short)Data[k]); //ImagepF[i][j] = Image1[i][j]/1000.0; printk("%u,", Image1[i][j]); k = k + 2; } printk("\n"); } CompareADCReport(); //Reset Device Reset(); }
void ReadAbsADCRangeReport(void) { int i, k = 0; Read8BitRegisters((F54DataBase + REPORT_DATA_OFFEST), &Data[0], 2 * (RxChannelCount + TxChannelCount)); printk("Abs Sensing ADC Range Data:\n"); printk("Rx: "); for (i = 0; i < (int)RxChannelCount; i++) { AbsADCRangeData[k / 2] = (unsigned char)Data[k]; printk("%d ", AbsADCRangeData[k / 2]); k = k + 2; } printk("\n"); printk("Tx: "); for (i = 0; i < (int)TxChannelCount; i++) { AbsADCRangeData[k / 2] = (unsigned char)Data[k]; printk("%d ", AbsADCRangeData[k / 2]); k = k + 2; } printk("\n"); CompareAbsADCRangeReport(); Reset(); }
// Construct data with Report Type #4 data int ReadHighResistanceReport(void) { short maxRx, maxTx, min; int maxRxpF, maxTxpF, minpF; int ret = 0; Read8BitRegisters((F54DataBase+REPORT_DATA_OFFEST), Data, 6); maxRx = ((short)Data[0] | (short)Data[1] << 8); maxTx = ((short)Data[2] | (short)Data[3] << 8); min = ((short)Data[4] | (short)Data[5] << 8); maxRxpF = maxRx; maxTxpF = maxTx; minpF = min; outbuf += sprintf(f54_wlog_buf+outbuf, "\nHigh Resistance Test:\n"); outbuf += sprintf(f54_wlog_buf+outbuf, "Max Rx Offset(pF) = %d\n", maxRxpF); outbuf += sprintf(f54_wlog_buf+outbuf, "Max Tx Offset(pF) = %d\n", maxTxpF); outbuf += sprintf(f54_wlog_buf+outbuf, "Min(pF) = %d\n", minpF); write_log(f54_wlog_buf); ret = CompareHighResistance(maxRxpF, maxTxpF, minpF); //Reset Device Reset(); return ret; }
// Construct data with Report Type #20 data int ReadImageReport(void) { int ret = 0; int i,j,k = 0; Read8BitRegisters((F54DataBase+REPORT_DATA_OFFEST), &Data[0], MaxArrayLength); outbuf += sprintf(f54_wlog_buf+outbuf, "Image Data : \n"); for (i = 0; i < (int)TxChannelCount; i++){ outbuf += sprintf(f54_wlog_buf+outbuf, "Tx[%2d]: ", i); for (j = 0; j < (int)RxChannelCount; j++){ Image1[i][j] = ((short)Data[k] | (short)Data[k+1] << 8); ImagepF[i][j] = Image1[i][j]; outbuf += sprintf(f54_wlog_buf+outbuf, "%4d,", ImagepF[i][j]); k = k + 2; } outbuf += sprintf(f54_wlog_buf+outbuf, "\n"); } ret = CompareImageReport(); write_log(f54_wlog_buf); //Reset Device Reset(); return ret; }
// Construct data with Report Type #22 data void ReadSensorSpeedReport(void) { int i,j,k = 0; Read8BitRegisters((F54DataBase+REPORT_DATA_OFFEST), &Data[0], MaxArrayLength); printk("Sensor speed Test Data : \n"); for (i = 0; i < (int)TxChannelCount; i++) { printk("Tx[%d]: ", i); for (j = 0; j < (int)RxChannelCount; j++) { Image1[i][j] = ((short)Data[k] | (short)Data[k+1] << 8); ImagepF[i][j] = Image1[i][j]; printk("%d,", ImagepF[i][j]); k = k + 2; } printk("\n"); } CompareSensorSpeedReport(); //Reset Device Reset(); }
int GetImageRT78(char *buf) { int i, j, k= 0; int ret = 0; unsigned short temp = 0; Read8BitRegisters((F54DataBase + REPORT_DATA_OFFEST), &Data[0], (F12_2DRxCount * F12_2DTxCount * 2)); *buf = 0; ret += snprintf(buf+ret, PAGE_SIZE-ret, "\n\nInfo: Tx = %d Rx = %d\n\n", (int)F12_2DTxCount, (int)F12_2DRxCount); ret += snprintf(buf+ret, PAGE_SIZE-ret, "=========================================" "=================================================" "=================================================" "============================\n :"); //us10_porting for (i = 0; i < (int)F12_2DRxCount; i++) ret += snprintf(buf+ret, PAGE_SIZE-ret, "%4d ", i); ret += snprintf(buf+ret, PAGE_SIZE-ret, "\n---------------------------------------" "-------------------------------------------------" "-------------------------------------------------" "------------------------------\n"); for (i = 0; i < F12_2DTxCount; i++) { ret += snprintf(buf+ret, PAGE_SIZE-ret, " %2d : ", i); for (j = 0; j < F12_2DRxCount; j++, k += 2) { temp = Data[k] | (Data[k+1] << 8); RT78Data[i][j] = temp; ret += snprintf(buf + ret, PAGE_SIZE-ret, "%4d ", RT78Data[i][j]); } ret += snprintf(buf + ret, PAGE_SIZE-ret, "\n"); } ret += snprintf(buf + ret, PAGE_SIZE-ret, "-----------------------------------------" "-------------------------------------------------" "-------------------------------------------------" "----------------------------\n"); //ret = CompareRT78(buf); return ret; }
/* Function to handle report reads based on user input*/ int ReadReport(unsigned char input, char *buf) { int ret = 0; unsigned char data; /*Set the GetReport bit to run the AutoScan*/ data = 0x01; DO_SAFE(Write8BitRegisters(F54CommandBase, &data, 1), error); count = 0; do { DO_SAFE(Read8BitRegisters(F54CommandBase, &data, 1), error); msleep(1); count++; } while (data != 0x00 && (count < DefaultTimeout)); if (count >= DefaultTimeout) { TOUCH_LOG("Timeout - Not supported Report Type in FW\n"); Reset(); return -EAGAIN; } do_gettimeofday(&t_interval[ENDTIME]); TOUCH_LOG("Takes %lu ticks\n", get_time_interval(t_interval[ENDTIME].tv_sec, t_interval[STARTTIME].tv_sec)); switch (input) { case 'p': ret = ReadRT78(buf); break; case 'q': ret = GetImageRT78(buf); break; case 'r': ret = ReadElectodeShortRT78(buf); break; default: break; } return ret; error: TOUCH_ERR("[%s] ReadReport fail\n", __func__); return -EAGAIN; }
int ReadRT78(char *buf) { int i,j,k= 0; int ret = 0; unsigned short temp = 0; TOUCH_LOG("@@@ %s : F12_TxCount = %d F12_RxCount = %d @@@",__func__, F12_2DTxCount, F12_2DRxCount); Read8BitRegisters((F54DataBase + REPORT_DATA_OFFEST), &Data[0], (F12_2DRxCount * F12_2DTxCount * 2)); //us10_porting outbuf += snprintf(f54_wlog_buf+outbuf, sizeof(f54_wlog_buf)-outbuf,"%s"," "); for (i = 0; i < F12_2DRxCount; i++) { outbuf += snprintf(f54_wlog_buf+outbuf, sizeof(f54_wlog_buf)-outbuf,"%4d ",i); } outbuf += snprintf(f54_wlog_buf+outbuf, sizeof(f54_wlog_buf)-outbuf, "\n-----------------------------------------" "-------------------------------------------------" "-------------------------------------------------" "--------------------------\n"); for (i = 0; i < F12_2DTxCount; i++) { //us10_porting outbuf += snprintf(f54_wlog_buf+outbuf, sizeof(f54_wlog_buf)-outbuf,"%4d: ",i); for (j = 0; j < F12_2DRxCount; j++, k += 2) { temp = Data[k] | (Data[k+1] << 8); RT78Data[i][j] = temp; outbuf += snprintf(f54_wlog_buf+outbuf, sizeof(f54_wlog_buf)-outbuf, "%4d ", RT78Data[i][j]);//us10_porting } outbuf += snprintf(f54_wlog_buf+outbuf, sizeof(f54_wlog_buf)-outbuf, "\n"); //us10_porting } outbuf += snprintf(f54_wlog_buf+outbuf, sizeof(f54_wlog_buf)-outbuf, "-----------------------------------------" "-------------------------------------------------" "-------------------------------------------------" "--------------------------\n"); TOUCH_LOG("\n"); ret = CompareRT78(buf); return ret; }
// Function to switch beteen register pages. bool switchPage(int page) { unsigned char values[1]; unsigned char data; pageNum = values[0] = page; count = 0; do { Write8BitRegisters(0xFF, values, 1); msleep(1); Read8BitRegisters(0xFF, &data, 1); count++; } while ((int)data != page && (count < DefaultTimeout)); if(count >= DefaultTimeout){ printk("Timeout -- Page switch fail ! \n"); return false; } return true; }
int ReadElectodeShortRT78(char *buf) { int i,j,k= 0; int ret = 0; unsigned short temp = 0; TOUCH_LOG("@@@ %s : F12_TxCount = %d F12_RxCount = %d @@@",__func__, F12_2DTxCount, F12_2DRxCount); Read8BitRegisters((F54DataBase + REPORT_DATA_OFFEST), &Data[0], (F12_2DRxCount * F12_2DTxCount * 2)); for (i = 0; i < F12_2DTxCount; i++) { for (j = 0; j < F12_2DRxCount; j++, k += 2) { temp = Data[k] | (Data[k+1] << 8); RT78Data[i][j] = temp; } } ret = CompareElectodeShortRT78(buf); return ret; }
// Construct data with Report Type #13 data void ReadMaxMinReport(void) { short max, min; int maxpF, minpF; Read8BitRegisters((F54DataBase+REPORT_DATA_OFFEST), Data, 4); max = ((short)Data[0] | (short)Data[1] << 8); min = ((short)Data[2] | (short)Data[3] << 8); maxpF = max; minpF = min; printk("\nRaw Capacitance Maximum and Minimum Test:\n"); /*printk("Max = 0x%x\n", max); printk("Min = 0x%x\n", min);*/ printk("Max(pF) = %d\n", maxpF); printk("Min(pF) = %d\n", minpF); //Reset Device Reset(); }
// Function to handle report reads based on user input int ReadReport(unsigned char input) { int ret = 0; unsigned char data; data = 0x01; Write8BitRegisters(F54CommandBase, &data, 1); count = 0; do { Read8BitRegisters(F54CommandBase, &data, 1); msleep(1); count++; } while (data != 0x00 && (count < DefaultTimeout)); if(count >= DefaultTimeout) { outbuf += sprintf(f54_wlog_buf+outbuf, "Timeout -- Not supported Report Type in FW\n"); Reset(); return ret; } do_gettimeofday(&t_interval[ENDTIME]); printk("Takes %lu ticks\n", get_time_interval(t_interval[ENDTIME].tv_sec,t_interval[STARTTIME].tv_sec)); switch (input){ case 'a': ret = ReadImageReport(); break; case 'b': ReadADCRangeReport(); break; case 'c': ReadSensorSpeedReport(); break; case 'd': // fprintk(stderr, "Press any key to continue after you have lowered the bar.\n"); // _getch(); ReadTRexOpenReport(); break; case 'e': ret = ReadTRexGroundReport(); break; case 'f': ret = ReadTRexShortReport(); break; case 'g': ret = ReadHighResistanceReport(); break; case 'h': ReadMaxMinReport(); break; case 'i': ReadAbsADCRangeReport(); break; case 'j': ReadAbsDeltaReport(); break; case 'k': ReadAbsRawReport(); break; default: break; } return ret; }
/* Examples of reading query registers. Real applications often do not need to read query registers at all. */ void RunQueries(void) { unsigned short cAddr = 0xEE; unsigned char cFunc = 0; int rxCount = 0; int txCount = 0; int offset = 0; int query_offset = 0; int i, j = 0; /* Scan Page Description Table (PDT) to find all RMI functions presented by this device. The Table starts at $00EE. This and every sixth register (decrementing) is a function number except when this "function number" is $00, meaning end of PDT. In an actual use case this scan might be done only once on first run or before compile. */ do { Read8BitRegisters(cAddr, &cFunc, 1); if (cFunc == 0) break; switch (cFunc) { case 0x01: if (!bHaveF01) { Read8BitRegisters((cAddr - 3), &F01ControlBase, 1); Read8BitRegisters((cAddr - 4), &F01CommandBase, 1); } break; case 0x12: if (!bHaveF12) { Read8BitRegisters((cAddr - 3), &F12ControlBase, 1); Read8BitRegisters((cAddr - 5), &F12QueryBase, 1); Read8BitRegisters((F12QueryBase), &F12Support, 1); if ((F12Support | 0x00) == 0) { TOUCH_LOG( "Device not support F12.\n"); break; } Read8BitRegisters((F12QueryBase + 5), Data, 2); mask = 0x01; for (j = 0; j < 8; j++) { if ((Data[1] & mask) == 1) offset++; Data[1] >>= 1; } Read8BitRegisters((F12ControlBase + offset), Data, 14); F12_2DRxCount = Data[12]; F12_2DTxCount = Data[13]; if (TRX_max <= F12_2DRxCount) F12_2DRxCount = TRX_max; if (TRX_max <= F12_2DTxCount) F12_2DTxCount = TRX_max; offset = 0; } break; case 0x54: if (!bHaveF54) { Read8BitRegisters((cAddr - 2), &F54DataBase, 1); Read8BitRegisters((cAddr - 3), &F54ControlBase, 1); Read8BitRegisters((cAddr - 4), &F54CommandBase, 1); Read8BitRegisters((cAddr - 5), &F54QueryBase, 1); Read8BitRegisters(F54QueryBase, &RxChannelCount, 1); Read8BitRegisters((F54QueryBase + 1), &TxChannelCount, 1); if (TRX_max <= RxChannelCount) RxChannelCount = TRX_max; if (TRX_max <= TxChannelCount) TxChannelCount = 16; MaxArrayLength = (int)RxChannelCount * (int)TxChannelCount * 2; Read8BitRegisters(F54QueryBase, Data, 24); TouchControllerFamily = Data[5]; offset++; /*Ctrl 00*/ if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset++; /*Ctrl 01*/ offset += 2; /*Ctrl 02*/ bHavePixelTouchThresholdTuning = ((Data[6] & 0x01) == 0x01); if (bHavePixelTouchThresholdTuning) offset++; /*Ctrl 03;*/ if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset += 3; /*Ctrl 04/05/06*/ if (TouchControllerFamily == 0x01) { F54Ctrl07Offset = offset; offset++; /*Ctrl 07;*/ bHaveF54Ctrl07 = true; } /*Ctrl 08*/ if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset += 2; /*Ctrl 09*/ if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset++; bHaveInterferenceMetric = ((Data[7] & 0x02) == 0x02); /* Ctrl 10*/ if (bHaveInterferenceMetric) offset++; bHaveCtrl11 = ((Data[7] & 0x10) == 0x10); /*Ctrl 11*/ if (bHaveCtrl11) offset += 2; bHaveRelaxationControl = ((Data[7] & 0x80) == 0x80); /*Ctrl 12/13*/ if (bHaveRelaxationControl) offset += 2; bHaveSensorAssignment = ((Data[7] & 0x01) == 0x01); /*Ctrl 14*/ if (bHaveSensorAssignment) offset++; /*Ctrl 15*/ if (bHaveSensorAssignment) offset += RxChannelCount; /*Ctrl 16*/ if (bHaveSensorAssignment) offset += TxChannelCount; bHaveSenseFrequencyControl = ((Data[7] & 0x04) == 0x04); NumberOfSensingFrequencies = (Data[13] & 0x0F); /*Ctrl 17/18/19*/ if (bHaveSenseFrequencyControl) offset += (3 * (int)NumberOfSensingFrequencies); offset++; /*Ctrl 20*/ if (bHaveSenseFrequencyControl) offset += 2; /*Ctrl 21*/ bHaveFirmwareNoiseMitigation = ((Data[7] & 0x08) == 0x08); if (bHaveFirmwareNoiseMitigation) offset++; /*Ctrl 22*/ if (bHaveFirmwareNoiseMitigation) offset += 2; /*Ctrl 23*/ if (bHaveFirmwareNoiseMitigation) offset += 2; /*Ctrl 24*/ if (bHaveFirmwareNoiseMitigation) offset++; /*Ctrl 25*/ if (bHaveFirmwareNoiseMitigation) offset++; /*Ctrl 26*/ bHaveIIRFilter = ((Data[9] & 0x02) == 0x02); if (bHaveIIRFilter) offset++; /*Ctrl 27*/ if (bHaveFirmwareNoiseMitigation) offset += 2; /*Ctrl 28*/ bHaveCmnRemoval = ((Data[9] & 0x04) == 0x04); bHaveCmnMaximum = ((Data[9] & 0x08) == 0x08); if (bHaveCmnRemoval) offset++; /*Ctrl 29*/ if (bHaveCmnMaximum) offset++; /*Ctrl 30*/ bHaveTouchHysteresis = ((Data[9] & 0x10) == 0x10); if (bHaveTouchHysteresis) offset++; /*Ctrl 31*/ bHaveEdgeCompensation = ((Data[9] & 0x20) == 0x20); if (bHaveEdgeCompensation) offset += 2; /*Ctrl 32*/ if (bHaveEdgeCompensation) offset += 2; /*Ctrl 33*/ if (bHaveEdgeCompensation) offset += 2; /*Ctrl 34*/ if (bHaveEdgeCompensation) offset += 2; /*Ctrl 35*/ CurveCompensationMode = (Data[8] & 0x03); if (CurveCompensationMode == 0x02) { offset += (int)RxChannelCount; } else if (CurveCompensationMode == 0x01) { offset += ((int)RxChannelCount > (int)TxChannelCount) ? (int)RxChannelCount : (int)TxChannelCount; } /*Ctrl 36*/ if (CurveCompensationMode == 0x02) { /*Ctrl 37*/ offset += (int)TxChannelCount; } bHavePerFrequencyNoiseControl = ((Data[9] & 0x40) == 0x40); /*Ctrl 38/39/40*/ if (bHavePerFrequencyNoiseControl) offset += (3 * (int)NumberOfSensingFrequencies); bHaveSignalClarity = ((Data[10] & 0x04) == 0x04); if (bHaveSignalClarity) { F54Ctrl41Offset = offset; offset++; /*Ctrl 41*/ bHaveF54Ctrl41 = true; } bHaveMultiMetricStateMachine = ((Data[10] & 0x02) == 0x02); bHaveVarianceMetric = ((Data[10] & 0x08) == 0x08); if (bHaveVarianceMetric) offset += 2; /*Ctr 42*/ if (bHaveMultiMetricStateMachine) offset += 2; /*Ctrl 43*/ /*Ctrl 44/45/46/47/48/49/50/51/52/53/54*/ if (bHaveMultiMetricStateMachine) offset += 11; bHave0DRelaxationControl = ((Data[10] & 0x10) == 0x10); bHave0DAcquisitionControl = ((Data[10] & 0x20) == 0x20); if (bHave0DRelaxationControl) offset += 2; /*Ctrl 55/56*/ if (bHave0DAcquisitionControl) { F54Ctrl57Offset = offset; offset++; /*Ctrl 57;*/ bHaveF54Ctrl57 = true; } if (bHave0DAcquisitionControl) offset += 1; /*Ctrl 58*/ bHaveSlewMetric = ((Data[10] & 0x80) == 0x80); bHaveHBlank = ((Data[11] & 0x01) == 0x01); bHaveVBlank = ((Data[11] & 0x02) == 0x02); bHaveLongHBlank = ((Data[11] & 0x04) == 0x04); bHaveNoiseMitigation2 = ((Data[11] & 0x20) == 0x20); bHaveSlewOption = ((Data[12] & 0x02) == 0x02); if (bHaveHBlank) offset += 1; /*Ctrl 59*/ if (bHaveHBlank || bHaveVBlank || bHaveLongHBlank) offset += 3; /*Ctrl 60/61/62*/ if (bHaveSlewMetric || bHaveHBlank || bHaveVBlank || bHaveLongHBlank || bHaveNoiseMitigation2 || bHaveSlewOption) offset += 1; /*Ctrl 63*/ if (bHaveHBlank) offset += 28; /*Ctrl 64/65/66/67*/ else if (bHaveVBlank || bHaveLongHBlank) offset += 4; /*Ctrl 64/65/66/67*/ if (bHaveHBlank || bHaveVBlank || bHaveLongHBlank) offset += 8; /*Ctrl 68/69/70/71/72/73*/ if (bHaveSlewMetric) offset += 2; /*Ctrl 74*/ bHaveEnhancedStretch = ((Data[9] & 0x80) == 0x80); /*Ctrl 75*/ if (bHaveEnhancedStretch) offset += (int)NumberOfSensingFrequencies; bHaveStartupFastRelaxation = ((Data[11] & 0x08) == 0x08); if (bHaveStartupFastRelaxation) offset += 1; /*Ctrl 76*/ bHaveESDControl = ((Data[11] & 0x10) == 0x10); if (bHaveESDControl) offset += 2; /*Ctrl 77/78*/ if (bHaveNoiseMitigation2) offset += 5; /*Ctrl 79/80/81/82/83*/ bHaveEnergyRatioRelaxation = ((Data[11] & 0x80) == 0x80); if (bHaveEnergyRatioRelaxation) offset += 2; /*Ctrl 84/85*/ bHaveF54Query13 = ((Data[12] & 0x08) == 0x08); if (bHaveSenseFrequencyControl) { query_offset = 13; NumberOfSensingFrequencies = (Data[13] & 0x0F); } else query_offset = 12; if (bHaveF54Query13) query_offset++; bHaveCtrl86 = (bHaveF54Query13 && ((Data[13] & 0x01) == 0x01)); bHaveCtrl87 = (bHaveF54Query13 && ((Data[13] & 0x02) == 0x02)); bHaveCtrl88 = ((Data[12] & 0x40) == 0x40); if (bHaveCtrl86) offset += 1; /*Ctrl 86*/ if (bHaveCtrl87) offset += 1; /*Ctrl 87*/ if (bHaveCtrl88) { F54Ctrl88Offset = offset; offset++; /*Ctrl 88;*/ } bHaveCtrl89 = ((Data[query_offset] & 0x20) == 0x20); if (bHaveCtrl89) offset++; bHaveF54Query15 = ((Data[12] & 0x80) == 0x80); if (bHaveF54Query15) query_offset++; /*query_offset = 14*/ bHaveCtrl90 = (bHaveF54Query15 && ((Data[query_offset] & 0x01) == 0x01)); if (bHaveCtrl90) offset++; bHaveF54Query16 = ((Data[query_offset] & 0x8) == 0x8); bHaveF54Query22 = ((Data[query_offset] & 0x40) == 0x40); bHaveF54Query25 = ((Data[query_offset] & 0x80) == 0x80); if (bHaveF54Query16) query_offset++; /*query_offset = 15*/ bHaveF54Query17 = ((Data[query_offset] & 0x1) == 0x1); bHaveCtrl92 = ((Data[query_offset] & 0x4) == 0x4); bHaveCtrl93 = ((Data[query_offset] & 0x8) == 0x8); bHaveCtrl94 = ((Data[query_offset] & 0x10) == 0x10); bHaveF54Query18 = bHaveCtrl94; bHaveCtrl95 = ((Data[query_offset] & 0x20) == 0x20); bHaveF54Query19 = bHaveCtrl95; bHaveCtrl99 = ((Data[query_offset] & 0x40) == 0x40); bHaveCtrl100 = ((Data[query_offset] & 0x80) == 0x80); if (bHaveF54Query17) query_offset++; /*query_offset = 16*/ if (bHaveF54Query18) query_offset++; /*query_offset = 17*/ if (bHaveF54Query19) query_offset++; /*query_offset = 18*/ /*query 20, 21 query_offset = 20*/ query_offset = query_offset + 2; bHaveCtrl91 = ((Data[query_offset] & 0x4) == 0x4); bHaveCtrl96 = ((Data[query_offset] & 0x8) == 0x8); bHaveCtrl97 = ((Data[query_offset] & 0x10) == 0x10); bHaveCtrl98 = ((Data[query_offset] & 0x20) == 0x20); if (bHaveF54Query22) query_offset++; /*query_offset = 21*/ bHaveCtrl101 = ((Data[query_offset] & 0x2) == 0x2); bHaveF54Query23 = ((Data[query_offset] & 0x8) == 0x8); if (bHaveF54Query23) { query_offset++; /*query_offset = 22*/ bHaveCtrl102 = ((Data[query_offset] & 0x01) == 0x01); } else bHaveCtrl102 = false; if (bHaveCtrl91) offset++; if (bHaveCtrl92) offset++; if (bHaveCtrl93) offset++; if (bHaveCtrl94) offset++; if (bHaveCtrl95) offset++; if (bHaveCtrl96) offset++; if (bHaveCtrl97) offset++; if (bHaveCtrl98) { F54Ctrl98Offset = offset; offset++; } if (bHaveCtrl99) offset++; if (bHaveCtrl100) offset++; if (bHaveCtrl101) offset++; } break; case 0x55: if (!bHaveF55) { Read8BitRegisters((cAddr - 3), &F55ControlBase, 1); Read8BitRegisters((cAddr - 5), &F55QueryBase, 1); Read8BitRegisters(F55QueryBase, &RxChannelCount, 1); Read8BitRegisters((F55QueryBase+1), &TxChannelCount, 1); rxCount = 0; txCount = 0; /*Read Sensor Mapping*/ Read8BitRegisters((F55ControlBase + 1), Data, (int)RxChannelCount); for (i = 0; i < (int)RxChannelCount; i++) { if (Data[i] != 0xFF) { rxCount++; TRxPhysical[i] = Data[i]; } else break; } Read8BitRegisters((F55ControlBase + 2), Data, (int)TxChannelCount); for (i = 0; i < (int)TxChannelCount; i++) { if (Data[i] != 0xFF) { TRxPhysical[rxCount + i] = Data[i]; txCount++; } else break; } for (i = (rxCount + txCount); i < (TRX_mapping_max); i++) { TRxPhysical[i] = 0xFF; } RxChannelCount = rxCount; TxChannelCount = txCount; if (TRX_max <= RxChannelCount) RxChannelCount = TRX_max; if (TRX_max <= TxChannelCount) TxChannelCount = 16; MaxArrayLength = (int)RxChannelCount * (int)TxChannelCount * 2; if (((int)TxChannelCount - F12_2DTxCount == 0) && ButtonCount > 0) { ButtonShared = true; } } break; default: /* Any other function*/ break; } cAddr -= 6; } while (true);
// Examples of reading query registers. Real applications often do not need to read query registers at all. void RunQueries(void) { unsigned short cAddr = 0xEE; unsigned char cFunc; int rxCount = 0; int txCount = 0; int offset = 0; int i,j = 0; #if defined(CONFIG_MACH_MSM8974_VU3_KR) int k = 0; int cnt = 0; #endif // Scan Page Description Table (PDT) to find all RMI functions presented by this device. // The Table starts at $00EE. This and every sixth register (decrementing) is a function number // except when this "function number" is $00, meaning end of PDT. // In an actual use case this scan might be done only once on first run or before compile. do{ Read8BitRegisters(cAddr, &cFunc, 1); if (cFunc == 0){ break; } switch (cFunc){ case 0x01: if (!bHaveF01){ Read8BitRegisters((cAddr-3), &F01ControlBase, 1); Read8BitRegisters((cAddr-4), &F01CommandBase, 1); bHaveF01 = true; break; } #if defined(CONFIG_MACH_MSM8974_VU3_KR) case 0x1a: if(!bHaveF1A){ k =0; Read8BitRegisters((cAddr-3), &F1AControlBase, 1); Read8BitRegisters(F1AControlBase+1, &ButtonCount, 1); //ButtonCount = log((double)ButtonCount+1 )/ log(2.0); while(ButtonCount){ cnt++; ButtonCount=(ButtonCount>>1); } ButtonCount=cnt; for (i = 0; i < ButtonCount; i++){ Read8BitRegisters(F1AControlBase + 3 + k, &ButtonTx[i], 1); Read8BitRegisters(F1AControlBase + 3 + k + 1 , &ButtonRx[i], 1); k= k +2; } //printk("Have 1A:%d,%d\n",ButtonTx[1], ButtonRx[1]); bHaveF1A = true; } break; #endif case 0x12: if(!bHaveF12){ Read8BitRegisters((cAddr-3), &F12ControlBase, 1); Read8BitRegisters((cAddr-5), &F12QueryBase, 1); Read8BitRegisters((F12QueryBase), &F12Support, 1); if( (F12Support | 0x00) == 0 ){ printk("Device not support F12.\n"); break; } Read8BitRegisters((F12QueryBase+5), Data, 2); mask = 0x01; for (j = 0; j < 8; j++){ if((Data[1] & mask) == 1) offset++; Data[1] >>= 1; } Read8BitRegisters((F12ControlBase + offset), Data, 14); F12_2DRxCount = Data[12]; F12_2DTxCount = Data[13]; if(TRX_max<=F12_2DRxCount) F12_2DRxCount = TRX_max; if(TRX_max<=F12_2DTxCount) F12_2DTxCount = 16; bHaveF12 = true; offset = 0; break; } case 0x54: if (!bHaveF54){ Read8BitRegisters((cAddr-2), &F54DataBase, 1); Read8BitRegisters((cAddr-3), &F54ControlBase, 1); Read8BitRegisters((cAddr-4), &F54CommandBase, 1); Read8BitRegisters((cAddr-5), &F54QueryBase, 1); Read8BitRegisters(F54QueryBase, &RxChannelCount, 1); Read8BitRegisters((F54QueryBase+1), &TxChannelCount, 1); if(TRX_max<=RxChannelCount) RxChannelCount = TRX_max; if(TRX_max<=TxChannelCount) TxChannelCount = 16; MaxArrayLength = (int)RxChannelCount * (int)TxChannelCount * 2; bHaveF54 = true; Read8BitRegisters(F54QueryBase, Data, 15); TouchControllerFamily = Data[5]; offset++; //Ctrl 00 if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset++; //Ctrl 01 offset+=2; //Ctrl 02 bHavePixelTouchThresholdTuning = ((Data[6] & 0x01) == 0x01); if (bHavePixelTouchThresholdTuning) offset++; //Ctrl 03; if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset+=3; //Ctrl 04/05/06 if (TouchControllerFamily == 0x01){ F54Ctrl07Offset = offset; offset++; //Ctrl 07; bHaveF54Ctrl07 = true; } if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset+=2; //Ctrl 08 if (TouchControllerFamily == 0x0 || TouchControllerFamily == 0x01) offset++; //Ctrl 09 bHaveInterferenceMetric = ((Data[7] & 0x02) == 0x02); if (bHaveInterferenceMetric) offset++; // Ctrl 10 bHaveCtrl11 = ((Data[7] & 0x10) == 0x10); if (bHaveCtrl11) offset+=2; //Ctrl 11 bHaveRelaxationControl = ((Data[7] & 0x80) == 0x80); if (bHaveRelaxationControl) offset+=2; //Ctrl 12/13 bHaveSensorAssignment = ((Data[7] & 0x01) == 0x01); if (bHaveSensorAssignment) offset++; //Ctrl 14 if (bHaveSensorAssignment) offset+=RxChannelCount; //Ctrl 15 if (bHaveSensorAssignment) offset+=TxChannelCount; //Ctrl 16 bHaveSenseFrequencyControl = ((Data[7] & 0x04) == 0x04); NumberOfSensingFrequencies = (Data[13] & 0x0F); if (bHaveSenseFrequencyControl) offset+=(3*(int)NumberOfSensingFrequencies); //Ctrl 17/18/19 offset++; //Ctrl 20 if (bHaveSenseFrequencyControl) offset+=2; //Ctrl 21 bHaveFirmwareNoiseMitigation = ((Data[7] & 0x08) == 0x08); if (bHaveFirmwareNoiseMitigation) offset++; //Ctrl 22 if (bHaveFirmwareNoiseMitigation) offset+=2; //Ctrl 23 if (bHaveFirmwareNoiseMitigation) offset+=2; //Ctrl 24 if (bHaveFirmwareNoiseMitigation) offset++; //Ctrl 25 if (bHaveFirmwareNoiseMitigation) offset++; //Ctrl 26 bHaveIIRFilter = ((Data[9] & 0x02) == 0x02); if (bHaveIIRFilter) offset++; //Ctrl 27 if (bHaveFirmwareNoiseMitigation) offset+=2; //Ctrl 28 bHaveCmnRemoval = ((Data[9] & 0x04) == 0x04); bHaveCmnMaximum = ((Data[9] & 0x08) == 0x08); if (bHaveCmnRemoval) offset++; //Ctrl 29 if (bHaveCmnMaximum) offset++; //Ctrl 30 bHaveTouchHysteresis = ((Data[9] & 0x10) == 0x10); if (bHaveTouchHysteresis) offset++; //Ctrl 31 bHaveEdgeCompensation = ((Data[9] & 0x20) == 0x20); if (bHaveEdgeCompensation) offset+=2; //Ctrl 32 if (bHaveEdgeCompensation) offset+=2; //Ctrl 33 if (bHaveEdgeCompensation) offset+=2; //Ctrl 34 if (bHaveEdgeCompensation) offset+=2; //Ctrl 35 CurveCompensationMode = (Data[8] & 0x03); if (CurveCompensationMode == 0x02) { offset += (int)RxChannelCount; } else if (CurveCompensationMode == 0x01) { offset += ((int)RxChannelCount > (int)TxChannelCount) ? (int)RxChannelCount: (int)TxChannelCount; } //Ctrl 36 if (CurveCompensationMode == 0x02) offset += (int)TxChannelCount; //Ctrl 37 bHavePerFrequencyNoiseControl = ((Data[9] & 0x40) == 0x40); if (bHavePerFrequencyNoiseControl) offset+=(3*(int)NumberOfSensingFrequencies); //Ctrl 38/39/40 bHaveSignalClarity = ((Data[10] & 0x04) == 0x04); if (bHaveSignalClarity){ F54Ctrl41Offset = offset; offset++; //Ctrl 41 bHaveF54Ctrl41 = true; } bHaveMultiMetricStateMachine = ((Data[10] & 0x02) == 0x02); bHaveVarianceMetric = ((Data[10] & 0x08) == 0x08); if (bHaveVarianceMetric) offset+=2; //Ctr 42 if (bHaveMultiMetricStateMachine) offset+=2; //Ctrl 43 if (bHaveMultiMetricStateMachine) offset+=11 ; //Ctrl 44/45/46/47/48/49/50/51/52/53/54 bHave0DRelaxationControl = ((Data[10] & 0x10) == 0x10); bHave0DAcquisitionControl = ((Data[10] & 0x20) == 0x20); if (bHave0DRelaxationControl) offset+=2; //Ctrl 55/56 if (bHave0DAcquisitionControl){ F54Ctrl57Offset = offset; offset++; //Ctrl 57; bHaveF54Ctrl57 = true; } if (bHave0DAcquisitionControl) offset += 1; //Ctrl 58 bHaveSlewMetric = ((Data[10] & 0x80) == 0x80); bHaveHBlank = ((Data[11] & 0x01) == 0x01); bHaveVBlank = ((Data[11] & 0x02) == 0x02); bHaveLongHBlank = ((Data[11] & 0x04) == 0x04); bHaveNoiseMitigation2 = ((Data[11] & 0x20) == 0x20); bHaveSlewOption = ((Data[12] & 0x02) == 0x02); if (bHaveHBlank) offset += 1; //Ctrl 59 if (bHaveHBlank || bHaveVBlank || bHaveLongHBlank) offset +=3; //Ctrl 60/61/62 if (bHaveSlewMetric || bHaveHBlank || bHaveVBlank || bHaveLongHBlank || bHaveNoiseMitigation2 || bHaveSlewOption) offset += 1; //Ctrl 63 if (bHaveHBlank) offset += 28; //Ctrl 64/65/66/67 else if (bHaveVBlank || bHaveLongHBlank) offset += 4; //Ctrl 64/65/66/67 if (bHaveHBlank || bHaveVBlank || bHaveLongHBlank) offset += 8; //Ctrl 68/69/70/71/72/73 if (bHaveSlewMetric) offset += 2; //Ctrl 74 bHaveEnhancedStretch = ((Data[9] & 0x80) == 0x80); if (bHaveEnhancedStretch) offset += (int)NumberOfSensingFrequencies; //Ctrl 75 bHaveStartupFastRelaxation = ((Data[11] & 0x08) == 0x08); if (bHaveStartupFastRelaxation) offset += 1; //Ctrl 76 bHaveESDControl = ((Data[11] & 0x10) == 0x10); if (bHaveESDControl) offset += 2; //Ctrl 77/78 if (bHaveNoiseMitigation2) offset += 5; //Ctrl 79/80/81/82/83 bHaveEnergyRatioRelaxation = ((Data[11] & 0x80) == 0x80); if (bHaveEnergyRatioRelaxation) offset += 2; //Ctrl 84/85 bHaveCtrl86 = (((Data[12] & 0x08) == 0x08) && ((Data[13] & 0x01) == 0x01)); bHaveCtrl87 = (((Data[12] & 0x08) == 0x08) && ((Data[13] & 0x02) == 0x02)); bHaveCtrl88 = ((Data[12] & 0x40) == 0x40); if (bHaveCtrl86) offset += 1; //Ctrl 86 if (bHaveCtrl87) offset += 1; //Ctrl 87 if (bHaveCtrl88){ F54Ctrl88Offset = offset; offset++; //Ctrl 88; } break; } case 0x55: if (!bHaveF55){ Read8BitRegisters((cAddr-3), &F55ControlBase, 1); Read8BitRegisters((cAddr-5), &F55QueryBase, 1); Read8BitRegisters(F55QueryBase, &RxChannelCount, 1); Read8BitRegisters((F55QueryBase+1), &TxChannelCount, 1); rxCount = 0; txCount = 0; //Read Sensor Mapping Read8BitRegisters((F55ControlBase+1), Data, (int)RxChannelCount); for (i = 0; i < (int)RxChannelCount; i++){ if (Data[i] != 0xFF){ rxCount++; TRxPhysical[i] = Data[i]; } else break; } Read8BitRegisters((F55ControlBase+2), Data, (int)TxChannelCount); for (i = 0; i < (int)TxChannelCount; i++){ if (Data[i] != 0xFF ){ TRxPhysical[rxCount + i] = Data[i]; txCount++; } else break; } for (i = (rxCount + txCount); i < (TRX_mapping_max); i++){ TRxPhysical[i] = 0xFF; } RxChannelCount = rxCount; TxChannelCount = txCount; if(TRX_max<=RxChannelCount) RxChannelCount = TRX_max; if(TRX_max<=TxChannelCount) TxChannelCount = 16; MaxArrayLength = (int)RxChannelCount * (int)TxChannelCount * 2; if(((int)TxChannelCount - F12_2DTxCount == 0) && ButtonCount > 0){ ButtonShared = true; } bHaveF55 = true; break; } default: // Any other function break; }