summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/nv/include/nvodm_accelerometer.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/nv/include/nvodm_accelerometer.h')
-rw-r--r--arch/arm/mach-tegra/nv/include/nvodm_accelerometer.h414
1 files changed, 414 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/nv/include/nvodm_accelerometer.h b/arch/arm/mach-tegra/nv/include/nvodm_accelerometer.h
new file mode 100644
index 000000000000..54efabc240e5
--- /dev/null
+++ b/arch/arm/mach-tegra/nv/include/nvodm_accelerometer.h
@@ -0,0 +1,414 @@
+/*
+ * Copyright (c) 2006-2009 NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NVIDIA Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/**
+ * @file
+ * <b>NVIDIA Tegra ODM Kit:
+ * Accelerometer Interface</b>
+ *
+ * @b Description: Defines the ODM interface for accelerometer devices.
+ *
+ */
+
+#ifndef INCLUDED_NVODM_ACCELEROMETER_H
+#define INCLUDED_NVODM_ACCELEROMETER_H
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+#include "nvodm_services.h"
+#include "nvassert.h"
+
+/**
+ * @defgroup nvodm_accelerometer Accelerometer Adapation Interface
+ *
+ * This is the accelerometer ODM adaptation interface. Currently, only 3-axis
+ * accelerometers are supported by this interface.
+ *
+ * This section shows the calls made by the NVIDIA&reg; Driver Development Kit
+ * (DDK) accelerometer.
+ *
+ * @par Physical Accelerometer
+ *
+ * All applications share the same physical accelerometer.
+ *
+ * @par Sample Rate
+ *
+ * Every application has its own sample rate in Hz (samples/second).
+ * You can set the sample rate with the NvOdmAccelSetSampleRate() function,
+ * or you can request the sample rate using the NvOdmAccelGetSampleRate()
+ * function.
+ *
+ *
+ * @par Motion/Tap Interrupt Trigger
+ *
+ * Applications can decide to accept motion/tap interrupts in NvOdmAccelOpen().
+ * The motion/tap interrupt threshold is set by the driver. The application
+ * can get a message queue name by \c NvOdmAccelOpen, and then use the name to
+ * create a Windows message queue. Then the application can read interrupt
+ * information from the queue.
+ *
+ * See also <a class="el" href="group__nvodm__example__accel.html">Examples:
+ * Accelerometer</a>
+ *
+ * @ingroup nvodm_adaptation
+ * @{
+ */
+/**
+ * @brief Opaque handle to the vibrate device.
+ */
+typedef struct NvOdmAccelRec *NvOdmAcrDeviceHandle;
+
+/**
+ * Defines interrupt events that accelerometers may generate during
+ * operation.
+ */
+
+typedef enum
+{
+ /// Indicates that no interrupt has been generated (this value is returned
+ /// when interrupt time-outs occur).
+ NvOdmAccelInt_None = 0,
+
+ /// Indicates that an interrupt has been generated due to motion across
+ /// any axis crossing the specified threshold level.
+ NvOdmAccelInt_MotionThreshold,
+
+ /// Indicates that an interrupt has been generated due to a swinging
+ /// (forward and back motion) ocurring within the specified time threshold.
+ NvOdmAccelInt_TapThreshold,
+
+ /// Indicates that an interrupt has been generated due to detection of
+ /// linear freefall motion.
+ NvOdmAccelInt_Freefall,
+
+ NvOdmAccelInt_Num,
+
+ /// Ignore -- Forces compilers to make 32-bit enums.
+ NvOdmAccelInt_Force32 = 0x7fffffffUL,
+} NvOdmAccelIntType;
+
+/**
+ * Defines axis types for accelerometer. Interrupts are trigger by the axis.
+ * An interrupt is triggered for enabled interrupts whenever a forced value
+ * on an axis is greater than the threshold.
+ */
+typedef enum {
+ NvOdmAccelAxis_None = 0x0,
+ NvOdmAccelAxis_X = 0x1,
+ NvOdmAccelAxis_Y = 0x2,
+ NvOdmAccelAxis_Z = 0x4,
+ NvOdmAccelAxis_All = 0x7,
+ NvOdmAccelAxis_Force32 = 0x7fffffffUL,
+} NvOdmAccelAxisType;
+
+/**
+ * Defines the accelerometer power state.
+ */
+typedef enum {
+ /// Specifies the accelerometer is working normally -- sample rate is high.
+ NvOdmAccelPower_Fullrun = 0,
+ /// Specifies the accelerometer is working normally -- sample rate is lower
+ /// than \c NvOdmAccelPower_Fullrun.
+ NvOdmAccelPower_Low,
+ /// Specifies the accelerometer is not working, but the power supply is there.
+ NvOdmAccelPower_Standby,
+ /// Specifies the accelerometer is not working, and there is no power supply
+ /// to the device.
+ NvOdmAccelPower_Off,
+ NvOdmAccelPower_None,
+ /// Ignore -- Forces compilers to make 32-bit enums.
+ NvOdmAccelPower_Force32 =0x7fffffffUL,
+} NvOdmAccelPowerType;
+
+/**
+ * Holds device-specific accelerometer capabilities.
+ */
+typedef struct NvOdmAccelCapsRec
+{
+ /// Holds the maximum force in g-force (\em g) registered by this
+ /// accelerometer.
+ /// The value is in increments of 1000. For example, when the maximum
+ /// force is 2 \em g, the value should return 2000.
+ NvU32 MaxForceInGs;
+
+ /// Holds the size of the register for the g-force values in bits.
+ /// This is to specify the resolution of the force value range.
+ NvU32 ForceResolution;
+
+ /// Holds the number of motion thresholds that clients may use to generate
+ /// interrupts. 0 indicates that no threshold motion interrupts
+ /// are supported.
+ NvU32 NumMotionThresholds;
+
+ /// Holds the maximum amount of time in microseconds (Usecs) that may
+ /// be specified as the threshold for a tap-style interrupt. 0
+ /// indicates that tap interrupts are not supported by the accelerometer.
+ NvU32 MaxTapTimeDeltaInUs;
+
+ /// Holds TRUE if the accelerometer can generate an interrupt when
+ /// linear free-fall motion is detected.
+ NvBool SupportsFreefallInt;
+
+ /// Holds the maximum sample rate the accelerometer supports.
+ NvU32 MaxSampleRate;
+
+ /// Holds the minimum sample rate the accelerometer supports.
+ NvU32 MinSampleRate;
+} NvOdmAccelerometerCaps;
+
+/// Opaque handle to an accelerometer object.
+typedef struct NvOdmAccelRec *NvOdmAccelHandle;
+
+
+/**
+ * Initializes the accelerometer and allocates resources used by the ODM
+ * adaptation driver.
+ *
+ * @return A handle to the accelerometer if initialization is successful, or
+ * NULL if unsuccessful or no accelerometer exists.
+ */
+NvBool
+NvOdmAccelOpen(NvOdmAccelHandle* hDevice);
+
+/**
+ * Disables the accelerometer and frees any resources used by the driver.
+ *
+ * @param hDevice The accelerometer handle.
+ */
+void
+NvOdmAccelClose(NvOdmAccelHandle hDevice);
+
+/**
+ * Sets the threshold value in g-force (\em g) for interrupt types that are
+ * triggered at g-force thresholds, such as NvOdmAccelInt_MotionThreshold().
+ * The threshold is applied to all 3 axes on the accelerometer. This does not
+ * enable or disable the specified interrupt.
+ *
+ * @param hDevice The accelerometer handle.
+ * @param IntType The type of interrupt being configured (::NvOdmAccelIntType).
+ * @param IntNum For accelerometers that support multiple interrupt thresholds
+ * (::NvOdmAccelerometerCaps), specifies which threshold to
+ * configure. If the accelerometer supports a single threshold for
+ * the specified interrupt type, this parameter should be 0.
+ * @param Threshold The desired threshold value, in g-forces. If this value is
+ * outside of the accelerometer's supported range, it will be
+ * clamped to the maximum supported value. If the accelerometer
+ * does not have enough precision to support the exact value
+ * specified, the threshold will be rounded to the nearest
+ * supported value. The value is by increments of 1000.
+ * For example, when the maximum force is 2 \em g, the value
+ * should return 2000.
+ *
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmAccelSetIntForceThreshold(NvOdmAccelHandle hDevice,
+ NvOdmAccelIntType IntType,
+ NvU32 IntNum,
+ NvU32 Threshold);
+
+/**
+ * Sets the threshold value in microseconds (Usecs) for interrupt types that
+ * are triggered at time thresholds. This does not enable or disable the
+ * specified interrupt.
+ *
+ * Sets the threshold value in g-force (\em g) for interrupt types that are
+ * triggered at g-force thresholds, such as NvOdmAccelInt_MotionThreshold().
+ * The threshold is applied to all 3 axes on the accelerometer. This does not
+ * enable or disable the specified interrupt.
+ *
+ * @param hDevice The accelerometer handle.
+ * @param IntType The type of interrupt being configured (::NvOdmAccelIntType).
+ * @param IntNum For accelerometers that support multiple interrupt thresholds
+ * (::NvOdmAccelerometerCaps), specifies which threshold to
+ * configure. If the accelerometer supports a single threshold for
+ * the specified interrupt type, this parameter should be 0.
+ * @param Threshold The desired threshold value in microseconds. If this value
+ * is outside of the accelerometer's supported range, it will be
+ * clamped to the maximum supported value.
+ *
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmAccelSetIntTimeThreshold(NvOdmAccelHandle hDevice,
+ NvOdmAccelIntType IntType,
+ NvU32 IntNum,
+ NvU32 Threshold);
+
+
+/**
+ * Enables/disables the specified interrupt source. If the interrupt
+ * thresholds were not set prior to enabling the interrupt, the ODM-defined
+ * default values are used. If enabling a previously-enabled interrupt,
+ * or disabling a previously-disabled interrupt, this function returns
+ * silently.
+ *
+ * @param hDevice The accelerometer handle.
+ * @param IntType The type of interrupt being configured (::NvOdmAccelIntType).
+ * @param IntAxis The axis interrupt type (::NvOdmAccelAxisType).
+ * @param IntNum For accelerometers that support multiple interrupt thresholds
+ * (::NvOdmAccelerometerCaps), specifies which threshold to
+ * configure. If the accelerometer supports a single threshold for
+ * the specified interrupt type, this parameter should be 0.
+ * @param Toggle NV_TRUE specifies to enable the interrupt source, NV_FALSE to
+ * disable.
+ *
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmAccelSetIntEnable(NvOdmAccelHandle hDevice,
+ NvOdmAccelIntType IntType,
+ NvOdmAccelAxisType IntAxis,
+ NvU32 IntNum,
+ NvBool Toggle);
+
+/**
+ * Waits for any enabled interrupt, and returns the type of interrupt to the
+ * caller. If multiple interrupts occur simultaneously, returns each
+ * separately.
+ *
+ * @param hDevice The accelerometer handle.
+ * @param IntType The type of the interrupt that has been generated
+ * (::NvOdmAccelIntType). If no interrupt occurs before the timeout
+ * interval expires, or no interrupts are enabled, returns
+ * ::NvOdmAccelInt_None.
+ * @param IntMotionAxis The axis that triggered the motion interrupt (::NvOdmAccelAxisType).
+ * If no interrupt occurs before the timeout interval expires, or no
+ * interrupts are enabled, returns ::NvOdmAccelAxis_None.
+ * @param IntTapAxis The axis that triggered the tap interrupt (::NvOdmAccelAxisType).
+ * If no interrupt occurs before the timeout interval expires, or no
+ * interrupts are enabled, returns ::NvOdmAccelAxis_None.
+ */
+
+void
+NvOdmAccelWaitInt(NvOdmAccelHandle hDevice,
+ NvOdmAccelIntType *IntType,
+ NvOdmAccelAxisType *IntMotionAxis,
+ NvOdmAccelAxisType *IntTapAxis);
+
+/**
+ * Signals the waiting semaphore.
+ *
+ * @param hDevice The accelerometer handle.
+ */
+void
+NvOdmAccelSignal(NvOdmAccelHandle hDevice);
+
+
+/**
+ * Returns the current acceleration data in g-forces (\em g) as measured
+ * by the accelerometer.
+ *
+ * To allow higher-level software to be written independently of the
+ * precision and physical orientation of the accelerometer, the values
+ * returned by this function must be normalized by the adaptation to the
+ * following coordinate system:
+ *
+ * - Upright -- when the device is held upright with the primary display
+ * facing the user, the returned acceleration should be (0, 1, 0).
+ * - 90% rotation -- when the device is rotated 90 degrees clockwise, so that
+ * the left edge of the primary display is pointing up, the returned acceleration
+ * should be (1, 0, 0).
+ * - Flat face up -- when the device is laid flat, like on a desk, with
+ * the primary display face-up, the returned acceleration should be
+ * (0, 0, 1).
+ *
+ * @param [in] hDevice The accelerometer handle.
+ * @param [out] AccelX Measured acceleration along the X axis. The value is by
+ * increments of 1000. For example, 1 \em g is equal to 1000.
+ * @param [out] AccelY Measured acceleration along the Y axis. The value is by
+ * increments of 1000. For example, 1 \em g is equal to 1000.
+ * @param [out] AccelZ Measured acceleration along the Z axis. The value is by
+ * increments of 1000. For example, 1 \em g is equal to 1000.
+ *
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmAccelGetAcceleration(NvOdmAccelHandle hDevice,
+ NvS32 *AccelX,
+ NvS32 *AccelY,
+ NvS32 *AccelZ);
+
+/**
+ * Gets the accelerometer's character.
+ *
+ * @param hDevice The accelerometer handle.
+ * @return The accelerometer's character.
+ */
+NvOdmAccelerometerCaps
+NvOdmAccelGetCaps(NvOdmAccelHandle hDevice);
+
+
+/**
+ * Sets the accelerometer's power state.
+ *
+ * @param hDevice The accelerometer handle.
+ * @param PowerState The accelerometer power state to set.
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmAccelSetPowerState(NvOdmAccelHandle hDevice, NvOdmAccelPowerType PowerState);
+
+
+/**
+ * Sets the accelerometer's current sample rate state.
+ *
+ * @param hDevice The accelerometer handle.
+ * @param SampleRate The ::NvOdmAccelPowerType accelerometer
+ * sample rate in Hz (samples/second); if there
+ * is none suitable, the nearest sample rate is set.
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmAccelSetSampleRate(NvOdmAccelHandle hDevice, NvU32 SampleRate);
+
+/**
+ * Gets the accelerometer's current sample rate state.
+ *
+ * @param hDevice The accelerometer handle.
+ * @param pSampleRate The ::NvOdmAccelPowerType accelerometer
+ * sample rate in Hz (samples/second); if there
+ * is none suitable, the nearest sample rate is set.
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmAccelGetSampleRate(NvOdmAccelHandle hDevice, NvU32* pSampleRate);
+
+
+#if defined(__cplusplus)
+}
+#endif
+/** @} */
+#endif // INCLUDED_NVODM_ACCELEROMETER_H