omap3530/beagle_drivers/byd_touch/common/controller.h
branchBeagle_BSP_dev
changeset 85 d93b485c1325
child 95 450a8cf0c020
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omap3530/beagle_drivers/byd_touch/common/controller.h	Thu Oct 07 00:37:22 2010 +0100
@@ -0,0 +1,227 @@
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// lukasz.forynski@gmail.com
+//
+// Contributors:
+//
+// Description:
+// omap3530/beagle_drivers/byd_touch/common/controller.h
+//
+
+#ifndef TOUCH_KEY_CONTROLLER_H_
+#define TOUCH_KEY_CONTROLLER_H_
+
+#include <drivers/iic.h>
+#include <e32def.h>
+
+
+// controller specific constants..
+const TUint KMaxNumPoints = 3;
+typedef void (*TVoidCallback) (TAny*);
+
+
+// spi specific constants..
+const TUint KSpiPacketLength = 4;
+const TUint KStartByte = 0x56 << 1;
+const TUint KWrite     = 0;
+const TUint KRead      = 1;
+const TUint KReadCommand  = KStartByte | KRead;
+const TUint KWriteCommand = KStartByte;
+const TUint KBufGranulatity = 8;
+
+// digitizer specific settings..
+const TUint KResetPin = 93; // This setting does not change (it goes through J4/J5 connectors)
+const TUint KDataReadyPin = 133; // DAV connected to the GPIO133 (Expansion header pin 15)
+
+const TUint KSpiModule = 2; // McSPI3
+const TUint KSpiSlaveAddr0 = 2; // for data18-data23 pin functions slave address 2=>CS0..
+const TUint KSpiSlaveAddr1 = 3; // ..slave address 3=>CS1 (pref!)
+const TUint KSpiSlaveAddr = KSpiSlaveAddr1;
+
+
+const TConfigSpiV01 KHeader =
+	{
+	ESpiWordWidth_8, //iWordWidth
+	375000,//,93750, //iClkSpeed
+	ESpiPolarityHighFallingEdge, //iClkMode
+	500, // iTimeoutPeriod
+	EBigEndian, // iEndianness
+	EMsbFirst, //iBitOrder
+	2, //iTransactionWaitCycles
+	ESpiCSPinActiveLow //iCsPinActiveMode
+	};
+
+// spi interface to the controller
+class TTouchControllerInterface
+	{
+public:
+	inline TTouchControllerInterface();
+	inline TInt Read(TUint8 aRegAddress, TUint8& aValue);
+	inline TInt Write(TUint8 aRegAddress, TUint8 aValue);
+	inline TInt Write(TUint8 aRegAddress, TUint8* aValues, TInt aNumOfItems);
+
+
+private:
+	// SPI duplex transaction with two transfers for each direction
+	TPckgBuf<TConfigSpiV01> iSpiTransactionHeader;
+	TBuf8<KSpiPacketLength> iSpiWriteBuffer;
+	TBuf8<KSpiPacketLength> iSpiReadBuffer;
+	TIicBusTransfer         iSpiTxTransfer;
+	TIicBusTransfer         iSpiRxTransfer;
+	TIicBusTransaction      iSpiTransaction;
+	TInt                    iSpiBusId;
+	};
+
+class TouchController
+	{
+public:
+	enum TTouchMode
+		{
+		ESingle = 0,
+		EMulti,
+		EGesture
+		};
+
+	enum TResolution
+		{
+		ERes10Bits = 0,
+		ERes12Bits
+		};
+
+	enum TGestureType
+		{
+		EClockwiseCircumvolve = 3,
+		EDragLeft             = 4,
+		EDragRight            = 5,
+		EDragUp               = 6,
+		EDragDown             = 7,
+		EZoomOut              = 8,
+		EZoomIn               = 9
+		};
+
+	TouchController();
+	TouchController(TVoidCallback aCallback);
+
+
+	TInt HardReset();
+	TInt SoftReset();
+	TInt SetTouchMode(TTouchMode aMode);
+	TInt SetResolution(TResolution aResolution);
+	TInt SetLongerSamplingRate(TUint aRate);
+	TInt SetIrqActiveTime(TUint aIrqActiveTime);
+	TInt SetPanelVoltageStabTime(TUint aVoltageStabilizationTime);
+	TInt SetNumberOfColumns(TUint aNumberOfColumns);
+	TInt SetNumberOfRows(TUint aNumberOfRows);
+	TInt EnableWindowMode(TPoint aXpoint, TPoint aYPoint);
+	TInt DisableWindowMode();
+	TInt GetMeasurements(TPoint* aPoints, TInt& aNumPoints);
+	TInt NumOfTouches();
+
+private:
+	TInt iCtrlRegsCache[4];
+	TTouchControllerInterface iInterface;
+	TVoidCallback iCallback;
+	};
+
+
+// BF6917 Register definitions
+const TUint8 KControl_0  = 0x0; // R/W
+const TUint8 KControl_0_SWRST        = 1 << 7;  // SW reset
+const TUint8 KControl_0_RM_12        = 1 << 6; // Resolution mode 12 bits if set, 10bits otherwise
+const TUint8 KControl_0_MODE_SINGLE  = 1 << 3; // single touch mode
+const TUint8 KControl_0_MODE_MULTI   = 5 << 3; // multi-touch mode
+const TUint8 KControl_0_MODE_GESTURE = 6 << 3; // gesture mode
+const TUint8 KControl_0_MODE_MASK    = 7 << 3; // gesture mode
+
+const TUint8 KControl_0_LST_MASK     = 0x7; // Longer sampling rate: from 5 to 120 ADC clocks sampling time
+const TUint8 KControl_0_LST_5        = 0 << 0; // 5   ADC clocks sampling time
+const TUint8 KControl_0_LST_10       = 1 << 0; // 10  ADC clocks sampling time
+const TUint8 KControl_0_LST_20       = 2 << 0; // 20  ADC clocks sampling time
+const TUint8 KControl_0_LST_40       = 3 << 0; // 40  ADC clocks sampling time
+const TUint8 KControl_0_LST_60       = 4 << 0; // 60  ADC clocks sampling time
+const TUint8 KControl_0_LST_80       = 5 << 0; // 80  ADC clocks sampling time
+const TUint8 KControl_0_LST_100      = 6 << 0; // 100 ADC clocks sampling time
+const TUint8 KControl_0_LST_120      = 7 << 0; // 120 ADC clocks sampling time
+
+
+// Pen Irq Active time (sensiveness)
+const TUint8 KControl_1  = 0x1; // R/W
+const TUint8 KControl_1_PAT_SHIFT = 5;
+const TUint8 KControl_1_PAT_MASK  = 7 << 5;
+const TUint8 KControl_1_PAT_100   = 0 << 5;
+const TUint8 KControl_1_PAT_87_5  = 1 << 5;
+const TUint8 KControl_1_PAT_75    = 2 << 5;
+const TUint8 KControl_1_PAT_62_5  = 3 << 5;
+const TUint8 KControl_1_PAT_50    = 4 << 5;
+const TUint8 KControl_1_PAT_37_5  = 5 << 5;
+const TUint8 KControl_1_PAT_25    = 6 << 5;
+const TUint8 KControl_1_PAT_12_5  = 7 << 5;
+
+//  Panel Voltage stabilization Time(sensiveness)
+const TUint8 KControl_1_PVT_SHIFT = 2;
+const TUint8 KControl_1_PVT_MASK = 7 << 2;
+const TUint8 KControl_1_PVT_200  = 0 << 2;
+const TUint8 KControl_1_PVT_175  = 1 << 2;
+const TUint8 KControl_1_PVT_150  = 2 << 2;
+const TUint8 KControl_1_PVT_125  = 3 << 2;
+const TUint8 KControl_1_PVT_100  = 4 << 2;
+const TUint8 KControl_1_PVT_75   = 5 << 2;
+const TUint8 KControl_1_PVT_50   = 6 << 2;
+const TUint8 KControl_1_PVT_25   = 7 << 2;
+const TUint8 KControl_1_WS       = 1 << 0; // Window mode enables
+
+
+const TUint8 KControl_2  = 0x2; // R/W
+const TUint8 KControl_2_C_SHIFT  = 3; // number of columns
+const TUint8 KControl_2_C_MASK = 0xf8;
+const TUint8 KControl_2_PR_SHIFT = 0; // pull-up resistance
+
+
+const TUint8 KControl_3  = 0x3; // R/W
+const TUint8 KControl_3_R_SHIFT  = 4; // number of rows
+const TUint8 KControl_3_R_MASK   = 0xF0; // number of rows
+
+const TUint8 KControl_2_R_TEST   = 1 << 3; // test mode select
+const TUint8 KControl_2_PS_SHIFT = 0; // processing scale (0-7)
+
+const TUint8 KWindowXStart_Msb = 0x4; // R/W
+const TUint8 KWindowXStart_Lsb = 0x5; // R/W
+const TUint8 KWindowXStop_Msb  = 0x6; // R/W
+const TUint8 KWindowXStop_Lsb  = 0x7; // R/W
+const TUint8 KWindowYStart_Msb = 0x8; // R/W
+const TUint8 KWindowYStart_Lsb = 0x9; // R/W
+const TUint8 KWindowYStop_Msb  = 0xa; // R/W
+const TUint8 KWindowYStop_Lsb  = 0xb; // R/W
+const TUint8 KMasterReadStartAddr = 0xc; // R/W
+
+
+//  data registers
+const TUint8 KTouchNumberAndType  = 0xd; //  R, Touch number and touch type
+const TUint8 KTouchNumberAndType_SINGLE = 0 << 3;
+const TUint8 KTouchNumberAndType_MULTI  = 1 << 3;
+const TUint8 KTouchNumberAndType_TouchNMask = 7; // touch number (0 - 3)
+
+
+const TUint8 X1_H   = 0xe; //  R, High byte of x1 measurement
+const TUint8 X1_L   = 0xf; //  R, Low  byte of x1 measurement
+const TUint8 Y1_H   = 0x10; // R, High byte of y1 measurement
+const TUint8 Y1_L   = 0x11; // R, Low  byte of y1 measurement
+const TUint8 X2_H   = 0x12; // R, High byte of x2 measurement
+const TUint8 X2_L   = 0x13; // R, Low  byte of x2 measurement
+const TUint8 Y2_H   = 0x14; // R, High byte of y2 measurement
+const TUint8 Y2_L   = 0x15; // R, Low  byte of y2 measurement
+const TUint8 X3_H   = 0x16; // R, High byte of x3 measurement
+const TUint8 X3_L   = 0x17; // R, Low  byte of x3 measurement
+const TUint8 Y3_H   = 0x18; // R, High byte of y3 measurement
+const TUint8 Y3_L   = 0x19; // R, Low  byte of y3 measurement
+const TUint8 Ges_H  = 0x1a; // R, High byte of gesture information
+const TUint8 Ges_L  = 0x1b; // R, Low  byte of gesture information
+const TUint8 TEST_H = 0x1c; // R, Low byte of the test result
+const TUint8 TEST_L = 0x1d; // R, Low byte of the test result
+
+
+#endif /* TOUCH_KEY_CONTROLLER_H_ */