summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/odm_kit/platform/accelerometer/nvodm_priv_accelerometer.h
blob: 51d6411168b97c1c53095481c8e11a1341549a3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
 * Copyright (c) 2010 NVIDIA Corporation.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#ifndef INCLUDED_NVODM_PRIV_ACCELEROMETER_H
#define INCLUDED_NVODM_PRIV_ACCELEROMETER_H

#if defined(__cplusplus)
extern "C"
{
#endif

#include "nvodm_accelerometer.h"
#include "nvodm_services.h"
#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.
 */
typedef enum
{
    /// Indicates the accelerometer generated interrupt by exceeding the x threshold.
    NvOdmAccelerometerThresholdSource_X = 0,

    /// Indicates the accelerometer generated interrupt by exceeding the y threshold.
    NvOdmAccelerometerThresholdSource_Y,

    /// Indicates the accelerometer generated interrupt by exceeding the z threshold.
    NvOdmAccelerometerThresholdSource_Z,

    NvOdmAccelerometerThresholdSource_Force32 = 0x7FFFFFFF
} NvOdmAccelerometerThresholdSource;

// Timeout for I2C transaction.
enum { I2C_ACCELRATOR_TRANSACTION_TIMEOUT = 1000 };
// Maximum number of packetsize supported by the I2C controller.
enum { I2C_ACCELRATOR_PACKET_SIZE = 8};

NvBool bma150_init(NvOdmAccelHandle* hDevice);
NvBool kxtf9_init(NvOdmAccelHandle* hDevice);

typedef NvBool (*NvOdmPrivAccelOpen)(NvOdmAccelHandle hDevice);

typedef void (*NvOdmPrivAccelClose)(NvOdmAccelHandle hDevice);

typedef NvBool
(*NvOdmPrivAccelSetIntForceThreshold)(NvOdmAccelHandle  hDevice,
                               NvOdmAccelIntType IntType,
                               NvU32             IntNum,
                               NvU32             Threshold);

typedef NvBool
(*NvOdmPrivAccelSetIntTimeThreshold)(NvOdmAccelHandle  hDevice,
                              NvOdmAccelIntType IntType,
                              NvU32             IntNum,
                              NvU32             Threshold);

typedef NvBool
(*NvOdmPrivAccelSetIntEnable)(NvOdmAccelHandle  hDevice,
                           NvOdmAccelIntType  IntType,
                           NvOdmAccelAxisType IntAxis,
                           NvU32              IntNum,
                           NvBool             Toggle);
typedef void
(*NvOdmPrivAccelWaitInt)(NvOdmAccelHandle    hDevice,
                  NvOdmAccelIntType  *IntType,
                  NvOdmAccelAxisType *IntMotionAxis,
                  NvOdmAccelAxisType *IntTapAxis);

typedef void (*NvOdmPrivAccelSignal)(NvOdmAccelHandle hDevice);

typedef NvBool (*NvOdmPrivAccelGetAcceleration)(NvOdmAccelHandle hDevice,
                          NvS32           *AccelX,
                          NvS32           *AccelY,
                          NvS32           *AccelZ);

typedef NvOdmAccelerometerCaps (*NvOdmPrivAccelGetCaps)(NvOdmAccelHandle hDevice);

typedef NvBool (*NvOdmPrivAccelSetPowerState)(NvOdmAccelHandle hDevice,
                NvOdmAccelPowerType PowerState);

typedef NvBool
(*NvOdmPrivAccelSetSampleRate)(NvOdmAccelHandle hDevice,
                             NvU32 SampleRate);

typedef NvBool
(*NvOdmPrivAccelGetSampleRate)(NvOdmAccelHandle hDevice, NvU32* pSampleRate);

/*
 * Holds register address and value pairs.
 */
typedef struct NvDevCtrlRegRec {
   /// Holds the register offset.
   NvU8 RegAddr;
   /// Holds the value programmed into the upper address.
   NvU8 RegValue;
} NvDevCtrlReg;
/*
 * Max accelerometer registers number.
 */
#define ACCELEROMETER_CONTROL_REGS_MAX_LENGHT 100
/*
 * Max accelerometer callback functions number.
 */
#define ACCELEROMETER_CALLBACK_ARRAY_LENGTH   5
/*
 * Defines the way to read accelerometer registers.
 */
typedef NvBool
(*AccelerometerRegsRead)(
    NvOdmAccelHandle hDevice,
    NvU8 nRegOffset,
    NvU8* nData,
    NvU32 nLen);
/*
 * Defines the way to write accelerometer registers.
 */
typedef NvBool
(*AccelerometerRegsWrite)(
    NvOdmAccelHandle hDevice,
    NvU8 nRegOffset,
    NvU8* nData,
    NvU32 nLen);

typedef struct NvOdmAccelRec
{
    // Specifies use I2C or SPI to configure accelerometer registers.
    NvU8 nBusType;
    // Specifies accelerometer device address, for example, I2C write address.
    NvU8 nDevAddr;
    // Specifies the initial value that make accelerometer work,
    // ACCELEROMETER_CONTROL_REGS_MAX_LENGHT is always 100.
    NvDevCtrlReg CtrlRegsList[ACCELEROMETER_CONTROL_REGS_MAX_LENGHT];
    // Specifies the initial CtrlRegsList length.
    NvU8 nLength;
    // Specifies accelerometer chip ID.
    NvU8 nChipID;
    // Specifies the way to get accelerometer register information.
    AccelerometerRegsRead RegsRead;
    // Specifies the way to set accelerometer register information.
    AccelerometerRegsWrite RegsWrite;
    // various pointers to access accelerometer functions
    NvOdmPrivAccelOpen AccelOpen;
    NvOdmPrivAccelClose AccelClose;
    NvOdmPrivAccelSetIntForceThreshold AccelSetIntForceThreshold;
    NvOdmPrivAccelSetIntTimeThreshold AccelSetIntTimeThreshold;
    NvOdmPrivAccelSetIntEnable AccelSetIntEnable;
    NvOdmPrivAccelWaitInt AccelWaitInt;
    NvOdmPrivAccelSignal AccelSignal;
    NvOdmPrivAccelGetAcceleration AccelGetAcceleration;
    NvOdmPrivAccelGetCaps AccelGetCaps;
    NvOdmPrivAccelSetPowerState AccelSetPowerState;
    NvOdmPrivAccelSetSampleRate AccelSetSampleRate;
    NvOdmPrivAccelGetSampleRate AccelGetSampleRate;

    // Specifies I2C handle from the system.
    NvOdmServicesI2cHandle  hOdmI2C;
    // Interrupt pin to ap15.
    NvOdmServicesGpioHandle hGpioINT;
    NvOdmGpioPinHandle      hPinINT;
    NvU32 GPIOPortINT;
    NvU32 GPIOPinINT;
    NvOdmOsSemaphoreHandle SemaphoreForINT;
    NvOdmServicesGpioIntrHandle hGpioInterrupt;
    NvOdmAccelIntType Data;
    NvOdmServicesPmuHandle hPmu;
    NvU32 VddId;
    NvU32 I2CChannelId;
    NvOdmAccelerometerCaps Caption;
    NvOdmAccelPowerType PowerState;
    // In real case, when the board put in frontispiece, the value from z axis
    // should be g, but due to physical connect on different board, the axis
    // should be remapped to the correct one.
    NvOdmAccelAxisType AxisXMapping;
    // If the physical direct is the same with our expection, the value
    // should be set to 1, or else the value should be -1.
    NvS32              AxisXDirection;
    NvOdmAccelAxisType AxisYMapping;
    NvS32              AxisYDirection;
    NvOdmAccelAxisType AxisZMapping;
    NvS32              AxisZDirection;
} NvOdmAccel;

#if defined(__cplusplus)
}
#endif
/** @} */
#endif // INCLUDED_NVODM_PRIV_ACCELEROMETER_H