summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r--arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_bma150.c16
-rwxr-xr-x[-rw-r--r--]arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_kxtf9.c183
-rw-r--r--arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.c14
-rw-r--r--arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.h17
4 files changed, 106 insertions, 124 deletions
diff --git a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_bma150.c b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_bma150.c
index 486d02cf8b3c..f2e6a1c13b84 100644
--- a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_bma150.c
+++ b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_bma150.c
@@ -94,18 +94,8 @@
#define NV_ACCELEROMETER_BUS_SPI_3 1
#define NV_ACCELEROMETER_BUS_SPI_4 2
-#define NVODMACCELEROMETER_ENABLE_PRINTF 0
#define EEPROM_ID_E1206 0x0C06
-#if NVODMACCELEROMETER_ENABLE_PRINTF
- #define NVODMACCELEROMETER_PRINTF(x) \
- do { \
- NvOdmOsPrintf x; \
- } while (0)
-#else
- #define NVODMACCELEROMETER_PRINTF(x)
-#endif
-
#define NV_BMA150_MAX_FORCE_IN_REG 512 // It indicates force register length.
#define NV_DEBOUNCE_TIME_MS 0
@@ -677,9 +667,15 @@ NvBool bma150_init(NvOdmAccelHandle* hDevice)
hAccel->Caption.MaxSampleRate = 100;
hAccel->Caption.MinSampleRate = 3;
hAccel->PowerState = NvOdmAccelPower_Fullrun;
+#if AXES_MAPPING_FOR_PROPER_DISPLAY_ALIGNMENT
hAccel->AxisXMapping = NvOdmAccelAxis_Y;
hAccel->AxisXDirection = -1;
hAccel->AxisYMapping = NvOdmAccelAxis_X;
+#else
+ hAccel->AxisXMapping = NvOdmAccelAxis_X;
+ hAccel->AxisXDirection = 1;
+ hAccel->AxisYMapping = NvOdmAccelAxis_Y;
+#endif
hAccel->AxisYDirection = 1;
hAccel->AxisZMapping = NvOdmAccelAxis_Z;
hAccel->AxisZDirection = -1;
diff --git a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_kxtf9.c b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_kxtf9.c
index cea4e57561d5..917d7345f49c 100644..100755
--- a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_kxtf9.c
+++ b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_accelerometer_kxtf9.c
@@ -96,24 +96,12 @@
// I2C clock speed.
#define I2C_CLK_SPEED 400
-#define kxtf9_GUID NV_ODM_GUID('k','x','t','f','9','-','4','0')
-
#define EEPROM_ID_E1206 0x0C06
-#define NVODMACCELEROMETER_ENABLE_PRINTF 0
-
-#if NVODMACCELEROMETER_ENABLE_PRINTF
- #define NVODMACCELEROMETER_PRINTF(x) \
- do { \
- NvOdmOsPrintf x; \
- } while (0)
-#else
- #define NVODMACCELEROMETER_PRINTF(x)
-#endif
-
#define NV_DEBOUNCE_TIME_MS 0
-
#define ENABLE_XYZ_POLLING 0
+#define kxtf9_GUID NV_ODM_GUID('k','x','t','f','9','-','4','0')
+
static NvU8 s_ReadBuffer[I2C_ACCELRATOR_PACKET_SIZE];
static NvU8 s_WriteBuffer[I2C_ACCELRATOR_PACKET_SIZE];
static NvU8 s_IntSrcReg1;
@@ -339,6 +327,10 @@ CloseGpioHandle:
return NV_FALSE;
}
+// For 12 bit resolution, Max reading possible with msb left for sign bit.
+static NvS32 s_MaxAccelReading = 1 << 11;
+// Considering g variation to be +/-2g, Max g value in milli g's.
+static NvS32 s_MaxGValInMilliGs = 2000;
static NvBool kxtf9_Init(NvOdmAccelHandle hDevice)
{
NvU8 TestVal;
@@ -370,14 +362,14 @@ static NvBool kxtf9_Init(NvOdmAccelHandle hDevice)
NVODMACCELEROMETER_PRINTF(("\n Int Set failed\n"));
}
- // set ODR to 200 Hz
- RegVal = 0x3;
+ // set ODR to 25 Hz
+ RegVal = 0x0;
if (!WriteReg(hDevice, kxtf9_CTRL_REG3, &RegVal, 1))
{
NVODMACCELEROMETER_PRINTF(("\n LPF freq set failed\n"));
}
- // Set WUF_TIMER to 1 ODR clock
- RegVal = 0x1;
+ // Set WUF_TIMER to 2 ODR clock
+ RegVal = 2;
if (!WriteReg(hDevice, kxtf9_WUF_TIMER, &RegVal, 1))
{
NVODMACCELEROMETER_PRINTF(("\n LPF freq set failed\n"));
@@ -397,7 +389,7 @@ static NvBool kxtf9_Init(NvOdmAccelHandle hDevice)
#if MOTION_ONLY_ENABLE
//set PC1, RES & WUFE to 1.
- RegVal |= 0xC2;
+ RegVal |= 0XE2; // 0xC2;
#endif
if(!WRITE_VERIFY(hDevice, kxtf9_CTRL_REG1, RegVal))
goto error;
@@ -423,6 +415,13 @@ kxtf9_ReadXYZ(
*X = ((Data[1] << 4) | (Data[0] >> 4));
*Y = ((Data[3] << 4) | (Data[2] >> 4));
*Z = ((Data[5] << 4) | (Data[4] >> 4));
+
+ if (*X & 0x800)
+ *X |= 0xFFFFF000;
+ if (*Y & 0x800)
+ *Y |= 0xFFFFF000;
+ if (*Z & 0x800)
+ *Z |= 0xFFFFF000;
}
void kxtf9_deInit(NvOdmAccelHandle hDevice)
@@ -481,7 +480,9 @@ kxtf9_SetIntForceThreshold(
NvU32 IntNum,
NvU32 Threshold)
{
- NvU8 RegVal = Threshold;
+ NvU8 RegVal;
+ NvU32 Reading;
+
// If not motion Threshold, return from here
if (IntType != NvOdmAccelInt_MotionThreshold)
return NV_TRUE;
@@ -489,16 +490,18 @@ kxtf9_SetIntForceThreshold(
if(!SetAccelerometerActive(hDevice, NV_FALSE))
return NV_FALSE;
+ Reading = (Threshold * s_MaxAccelReading)/ (s_MaxGValInMilliGs);
+ RegVal = (NvU8) Reading;
// To set requested Threshold Value.
if(!WRITE_VERIFY(hDevice, kxtf9_WUF_THRESH, RegVal))
{
- NVODMACCELEROMETER_PRINTF(("\nkxtf9:Set WUF_Threshold failed\n"));
+ NvOdmOsPrintf("\nkxtf9:Set WUF_Threshold failed\n");
return NV_FALSE;
}
if(!SetAccelerometerActive(hDevice, NV_TRUE))
return NV_FALSE;
- NVODMACCELEROMETER_PRINTF(("\nkxtf9: set WUF_Threshold val:%d",Threshold));
+ NvOdmOsPrintf("\nkxtf9: set WUF_Threshold val:%d",Threshold);
return NV_TRUE;
}
@@ -542,34 +545,10 @@ void kxtf9_Signal(NvOdmAccelHandle hDevice)
NvOdmOsSemaphoreSignal(hDevice->SemaphoreForINT);
}
-static NvU16 Get2sComplement(NvU16 Val, NvU16 Mask)
-{
- Val = ((~(Val) + 0x01) & Mask);
- Val = -(Val);
- return Val;
-}
-NvBool
-kxtf9_GetAcceleration(
- NvOdmAccelHandle hDevice,
- NvS32 *AccelX,
- NvS32 *AccelY,
- NvS32 *AccelZ)
+#if NVODMACCELEROMETER_ENABLE_PRINTF
+static PrintAccelEventInfo(NvOdmAccelHandle hDevice)
{
- NvS32 data;
- NvS32 TempAccelX = 0;
- NvS32 TempAccelY = 0;
- NvS32 TempAccelZ = 0;
NvU8 RegVal = 0;
- NvU8 Gvalue = 0;
- NvU32 GValVariation = 0;
- NvU32 MaxAccelReading = 0;
- NvBool Is12BitResolution = NV_FALSE;
-
- NV_ASSERT(NULL != hDevice);
- NV_ASSERT(NULL != AccelX);
- NV_ASSERT(NULL != AccelY);
- NV_ASSERT(NULL != AccelZ);
-
if (s_IntSrcReg2 & 1)
{
NVODMACCELEROMETER_PRINTF(("\nkxtf9 Tilt Int set"));
@@ -611,7 +590,7 @@ kxtf9_GetAcceleration(
}
if ((s_IntSrcReg2 >> 1) & 1)
{
-// NVODMACCELEROMETER_PRINTF(("\n kxtf9 Motion event (WUFS) Int set"));
+ NVODMACCELEROMETER_PRINTF(("\n kxtf9 Motion event (WUFS) Int set"));
}
if ((s_IntSrcReg2 >> 4) & 1)
{
@@ -642,52 +621,39 @@ kxtf9_GetAcceleration(
{
NVODMACCELEROMETER_PRINTF(("\nkxtf9 Tap In X- direction"));
}
+}
+#endif
- ReadReg(hDevice, kxtf9_CTRL_REG1, &RegVal, 1);
- if (RegVal & 0x40) // 12 bit resolution
- {
- Is12BitResolution = NV_TRUE;
- MaxAccelReading = 1 << 12;
- }
- else // 8 bit resolution
- {
- MaxAccelReading = 1 << 8;
- }
+NvBool
+kxtf9_GetAcceleration(
+ NvOdmAccelHandle hDevice,
+ NvS32 *AccelX,
+ NvS32 *AccelY,
+ NvS32 *AccelZ)
+{
+ NvS32 data;
+ NvS32 TempAccelX = 0;
+ NvS32 TempAccelY = 0;
+ NvS32 TempAccelZ = 0;
- Gvalue = (RegVal >> 3) & 0x3;
+#if NVODMACCELEROMETER_ENABLE_PRINTF
+ static NvU32 PrintCount;
+ // Print once only in every PRINT_FREQUENCY iterations.
+ #define PRINT_FREQUENCY 50
+#endif
- if (Gvalue == 3)
- NV_ASSERT(0);
- else
- GValVariation = 4 << Gvalue;
- // To avoid floating point numbers, get g-Value in milli-g's
- GValVariation *= 1000;
+ NV_ASSERT(NULL != hDevice);
+ NV_ASSERT(NULL != AccelX);
+ NV_ASSERT(NULL != AccelY);
+ NV_ASSERT(NULL != AccelZ);
+
+#if NVODMACCELEROMETER_ENABLE_PRINTF
+ PrintAccelEventInfo(hDevice);
+#endif
kxtf9_ReadXYZ(hDevice, &TempAccelX, &TempAccelY, &TempAccelZ);
- if (Is12BitResolution)
- {
- if (TempAccelX & 0x800)
- TempAccelX = Get2sComplement(TempAccelX, 0xFFF);
- if (TempAccelY & 0x800)
- TempAccelY = Get2sComplement(TempAccelY, 0xFFF);
- if (TempAccelZ & 0x800)
- TempAccelZ = Get2sComplement(TempAccelZ, 0xFFF);
- }
- else
- {
- // In case of 8 bit resolution, accel data is stored in MSB reg only.
- TempAccelX >>= 4;
- TempAccelY >>= 4;
- TempAccelZ >>= 4;
- if (TempAccelX & 0x80)
- TempAccelX = Get2sComplement(TempAccelX, 0xFF);
- if (TempAccelY & 0x80)
- TempAccelY = Get2sComplement(TempAccelY, 0xFF);
- if (TempAccelZ & 0x80)
- TempAccelZ = Get2sComplement(TempAccelZ, 0xFF);
- }
- data = (TempAccelX * GValVariation) / MaxAccelReading;
+ data = (TempAccelX * s_MaxGValInMilliGs) / s_MaxAccelReading;
switch(hDevice->AxisXMapping)
{
case NvOdmAccelAxis_X:
@@ -703,7 +669,7 @@ kxtf9_GetAcceleration(
return NV_FALSE;
}
- data = (TempAccelY * GValVariation) / MaxAccelReading;
+ data = (TempAccelY * s_MaxGValInMilliGs) / s_MaxAccelReading;
switch(hDevice->AxisYMapping)
{
case NvOdmAccelAxis_X:
@@ -719,7 +685,7 @@ kxtf9_GetAcceleration(
return NV_FALSE;
}
- data = (TempAccelZ * GValVariation) / MaxAccelReading;
+ data = (TempAccelZ * s_MaxGValInMilliGs) / s_MaxAccelReading;
switch(hDevice->AxisZMapping)
{
case NvOdmAccelAxis_X:
@@ -735,15 +701,17 @@ kxtf9_GetAcceleration(
return NV_FALSE;
}
- *AccelX = (*AccelX * 98)/10000;
- *AccelY = (*AccelY * 98)/10000;
- *AccelZ = (*AccelZ * 98)/10000;
-
- NVODMACCELEROMETER_PRINTF(("\nkxtf9 milli g-Vals, x=%d,y=%d,z=%d",
- *AccelX, *AccelY, *AccelZ));
-
if (s_IntSrcReg2)
+ {
+#if NVODMACCELEROMETER_ENABLE_PRINTF
+ if (!(PrintCount++ % PRINT_FREQUENCY))
+ {
+ NVODMACCELEROMETER_PRINTF(("\nkxtf9 milli g-Vals, x=%d,y=%d, z=%d",
+ *AccelX, *AccelY, *AccelZ));
+ }
+#endif
return NV_TRUE;
+ }
else
return NV_FALSE;
}
@@ -829,13 +797,24 @@ NvBool kxtf9_init(NvOdmAccelHandle* hDevice)
hAccel->Caption.MaxSampleRate = 100;
hAccel->Caption.MinSampleRate = 3;
hAccel->PowerState = NvOdmAccelPower_Fullrun;
+#if AXES_MAPPING_FOR_PROPER_DISPLAY_ALIGNMENT
+// Axes mapping for display orientation aligning correctly in 3 orientations
+// (0, 90 & 270 degrees) on Tango with (froyo + K32).
hAccel->AxisXMapping = NvOdmAccelAxis_Y;
- hAccel->AxisXDirection = -1;
+ hAccel->AxisXDirection = 1;
hAccel->AxisYMapping = NvOdmAccelAxis_X;
- hAccel->AxisYDirection = 1;
+ hAccel->AxisYDirection = -1;
hAccel->AxisZMapping = NvOdmAccelAxis_Z;
- hAccel->AxisZDirection = 1;
-
+ hAccel->AxisZDirection = -1;
+#else
+// Axes mapping for matching acceleration on all axes with android mobile phones
+ hAccel->AxisXMapping = NvOdmAccelAxis_X;
+ hAccel->AxisXDirection = -1;
+ hAccel->AxisYMapping = NvOdmAccelAxis_Y;
+ hAccel->AxisYDirection = -1;
+ hAccel->AxisZMapping = NvOdmAccelAxis_Z;
+ hAccel->AxisZDirection = -1;
+#endif
hAccel->hPmu = NvOdmServicesPmuOpen();
if (!hAccel->hPmu)
{
diff --git a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.c b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.c
index 9c6e6f6031b4..aa96185ae2fe 100644
--- a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.c
+++ b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.c
@@ -31,16 +31,6 @@
*/
#include "nvodm_priv_accelerometer.h"
-#define NVODMACCELEROMETER_ENABLE_PRINTF 0
-
-#if NVODMACCELEROMETER_ENABLE_PRINTF
- #define NVODMACCELEROMETER_PRINTF(x) \
- do { \
- NvOdmOsPrintf x; \
- } while (0)
-#else
- #define NVODMACCELEROMETER_PRINTF(x)
-#endif
NvBool NvOdmAccelOpen(NvOdmAccelHandle* hDevice)
{
@@ -50,7 +40,7 @@ NvBool NvOdmAccelOpen(NvOdmAccelHandle* hDevice)
}
else
{
- NVODMACCELEROMETER_PRINTF(("\n BMA150 accelerometer found"));
+ NvOdmOsPrintf("\n Bosch accelerometer found");
return NV_TRUE;
}
@@ -60,7 +50,7 @@ NvBool NvOdmAccelOpen(NvOdmAccelHandle* hDevice)
}
else
{
- NVODMACCELEROMETER_PRINTF(("\n KXTF9 accelerometer found"));
+ NvOdmOsPrintf("\n Kionix accelerometer found");
return NV_TRUE;
}
diff --git a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.h b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.h
index 3ccb616a1a6e..54962dc01773 100644
--- a/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.h
+++ b/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.h
@@ -52,6 +52,23 @@ extern "C"
#include "nvodm_query_discovery.h"
#include "nvos.h"
+#define NVODMACCELEROMETER_ENABLE_PRINTF 0
+
+#if NVODMACCELEROMETER_ENABLE_PRINTF
+ #define NVODMACCELEROMETER_PRINTF(x) \
+ do { \
+ NvOdmOsPrintf x; \
+ } while (0)
+#else
+ #define NVODMACCELEROMETER_PRINTF(x)
+#endif
+
+// Set 1 to have display orientation aligning correctly in 3 orientations
+// (0, 90 & 270 degrees) on Tango with (froyo + K32).
+// set 0 to have acceleration values on different axes matching to android
+// phones, but display orientation not changing properly.
+#define AXES_MAPPING_FOR_PROPER_DISPLAY_ALIGNMENT 1
+
/*
* Defines the threshold source for the accelerometer.
*/