示例#1
0
// 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();
}
示例#2
0
// 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;
}
示例#3
0
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();
}
示例#4
0
// 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();
}
示例#5
0
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();
}
示例#6
0
// 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;
}
示例#7
0
// 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;
}
示例#8
0
// 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();
}
示例#9
0
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;

}
示例#10
0
/* 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;
}
示例#11
0
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;
}
示例#12
0
// 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;
}
示例#13
0
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;
}
示例#14
0
// 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();
}
示例#15
0
// 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;
}
示例#16
0
/* 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);
示例#17
0
// 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;
		}