omap3530/beagle_drivers/byd_touch/common/controller.h
author Lukasz Forynski <lukasz.forynski@gmail.com>
Tue, 02 Nov 2010 00:33:23 +0000
branchBeagle_BSP_dev
changeset 95 450a8cf0c020
parent 85 d93b485c1325
child 112 fdfa12d9a47a
permissions -rw-r--r--
updated byd touch controller handling. needs debugging and update.

// 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;


const TInt KNumColumns = 0x4; // TODO update these values..
const TInt KNumRows = 0x4;


typedef void (*TVoidCallback) (TAny*);


// spi specific constants..
const TUint KMaxPacketLength = 16;
const TUint KStartByte = 0x80;
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 ReadMultiple(TUint8 aStartAddress, TInt aNumBytes);
	inline TInt Write(TUint8 aRegAddress, TUint8 aValue);
	inline TInt WriteMultiple(TUint8 aStartAddress, TInt aNumBytes);
	inline TDes& ReadBuff();
	inline TDes& WriteBuff();


private:
	TInt iCurrentReadStart;
	// SPI duplex transaction with two transfers for each direction
	TPckgBuf<TConfigSpiV01> iSpiTransactionHeader;
	TBuf8<KMaxPacketLength> iSpiWriteBuffer;
	TBuf8<KMaxPacketLength> iSpiReadBuffer;
	TIicBusTransfer         iSpiTxTransfer;
	TIicBusTransfer         iSpiRxTransfer;
	TIicBusTransaction      iSpiTransaction;
	TInt                    iSpiBusId;
	};

class TouchController
	{
public:
	enum TTouchMode
		{
		EModeSingle = 0,
		EModeMulti,
		EModeGesture
		};

	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 Configure(TTouchMode aMode);
	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_ */