Files
android_kernel_samsung_msm8…/include/linux/yas.h
T
Francescodario Cuzzocrea 85baa390bf misc: Import SM-G900H kernel source code
* Samsung Package Version: G800HXXU1CRJ1
    * CAF Tag: LA.BF.1.1.3-00110-8x26.0
2019-08-02 15:14:10 +02:00

435 lines
12 KiB
C

/*
* Copyright (c) 2010-2011 Yamaha Corporation
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
#ifndef __YAS_H__
#define __YAS_H__
#include "yas_cfg.h"
#define YAS_VERSION "6.0.2"
/* ------------------ */
/* Typedef definition */
/* ------------------- */
#include <linux/types.h>
/* -------------------------- */
/* Macro definition */
/* ------------------------- */
/* Debugging */
#define DEBUG (0)
#if DEBUG
#include <linux/kernel.h>
#define YLOGD(args) (printk args)
#define YLOGI(args) (printk args)
#define YLOGE(args) (printk args)
#define YLOGW(args) (printk args)
#else /* DEBUG */
#define YLOGD(args)
#define YLOGI(args)
#define YLOGW(args)
#define YLOGE(args)
#endif /* DEBUG */
#define YAS_REPORT_DATA (0x01)
#define YAS_REPORT_CALIB (0x02)
#define YAS_REPORT_OVERFLOW_OCCURED (0x04)
#define YAS_REPORT_HARD_OFFSET_CHANGED (0x08)
#define YAS_REPORT_CALIB_OFFSET_CHANGED (0x10)
#define YAS_HARD_OFFSET_UNKNOWN (0x7f)
#define YAS_CALIB_OFFSET_UNKNOWN (0x7fffffff)
#define YAS_NO_ERROR (0)
#define YAS_ERROR_ARG (-1)
#define YAS_ERROR_NOT_INITIALIZED (-2)
#define YAS_ERROR_BUSY (-3)
#define YAS_ERROR_DEVICE_COMMUNICATION (-4)
#define YAS_ERROR_CHIP_ID (-5)
#define YAS_ERROR_NOT_ACTIVE (-6)
#define YAS_ERROR_RESTARTSYS (-7)
#define YAS_ERROR_HARDOFFSET_NOT_WRITTEN (-8)
#define YAS_ERROR_INTERRUPT (-9)
#define YAS_ERROR_ERROR (-128)
#ifndef NULL
#define NULL ((void *)(0))
#endif
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (!(0))
#endif
#ifndef NELEMS
#define NELEMS(a) ((int)(sizeof(a)/sizeof(a[0])))
#endif
#ifndef ABS
#define ABS(a) ((a) > 0 ? (a) : -(a))
#endif
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
/* -------------------------------------------------------------------------- */
/* Structure definition */
/* -------------------------------------------------------------------------- */
struct mag_platform_data {
int position;
void (*init_gpio)(void);
};
struct yas_mag_filter {
int len;
int noise[3];
int threshold; /* nT */
};
struct yas_vector {
int32_t v[3];
};
struct yas_matrix {
int32_t matrix[9];
};
struct yas_acc_data {
struct yas_vector xyz;
struct yas_vector raw;
};
struct yas_gyro_data {
struct yas_vector xyz;
struct yas_vector raw;
int overrun;
int num;
};
struct yas_mag_data {
struct yas_vector xyz; /* without offset, filtered */
struct yas_vector raw; /* with offset, not filtered */
struct yas_vector xy1y2;
int16_t temperature;
};
struct yas_mag_offset {
int8_t hard_offset[3];
struct yas_vector calib_offset;
};
struct yas_mag_status {
struct yas_mag_offset offset;
int accuracy;
struct yas_matrix dynamic_matrix;
};
struct yas_offset {
struct yas_mag_status mag[YAS_MAGCALIB_SHAPE_NUM];
};
struct yas_mag_driver_callback {
int (*lock) (void);
int (*unlock) (void);
int (*device_open) (void);
int (*device_close) (void);
#if YAS_MAG_DRIVER == YAS_MAG_DRIVER_YAS529
int (*device_write) (const uint8_t *buf, int len);
int (*device_read) (uint8_t *buf, int len);
#else
int (*device_write) (uint8_t addr, const uint8_t *buf, int len);
int (*device_read) (uint8_t addr, uint8_t *buf, int len);
#endif
void (*msleep) (int msec);
void (*current_time) (int32_t *sec, int32_t *msec);
};
struct yas_mag_driver {
int (*init) (void);
int (*term) (void);
int (*get_delay) (void);
int (*set_delay) (int msec);
int (*get_offset) (struct yas_mag_offset *offset);
int (*set_offset) (struct yas_mag_offset *offset);
#ifdef YAS_MAG_MANUAL_OFFSET
int (*get_manual_offset) (struct yas_vector *offset);
int (*set_manual_offset) (struct yas_vector *offset);
#endif
int (*get_static_matrix) (struct yas_matrix *static_matrix);
int (*set_static_matrix) (struct yas_matrix *static_matrix);
int (*get_dynamic_matrix) (struct yas_matrix *dynamic_matrix);
int (*set_dynamic_matrix) (struct yas_matrix *dynamic_matrix);
int (*get_enable) (void);
int (*set_enable) (int enable);
int (*get_filter) (struct yas_mag_filter *filter);
int (*set_filter) (struct yas_mag_filter *filter);
int (*get_filter_enable) (void);
int (*set_filter_enable) (int enable);
int (*get_position) (void);
int (*set_position) (int position);
#if YAS_MAG_DRIVER == YAS_MAG_DRIVER_YAS529
int (*read_reg) (uint8_t *buf, int len);
int (*write_reg) (const uint8_t *buf, int len);
#else
int (*read_reg) (uint8_t addr, uint8_t *buf, int len);
int (*write_reg) (uint8_t addr, const uint8_t *buf, int len);
#endif
int (*measure) (struct yas_mag_data *data, int *time_delay_ms);
struct yas_mag_driver_callback callback;
};
struct yas_mag_calibration_result {
int32_t spread;
int32_t variation;
int32_t radius;
int8_t axis;
int8_t level;
int8_t accuracy;
struct yas_matrix dynamic_matrix;
};
struct yas_mag_calibration_threshold {
int32_t spread;
int32_t variation[3];
};
struct yas_mag_calibration_callback {
int (*lock) (void);
int (*unlock) (void);
};
#define YAS_MAGCALIB_MODE_SPHERE (1)
#define YAS_MAGCALIB_MODE_ELLIPSOID (1)
struct yas_mag_calibration {
int (*init) (void);
int (*term) (void);
int (*update) (struct yas_vector *mag,
struct yas_mag_calibration_result *result);
int (*get_accuracy) (void);
int (*set_accuracy) (int accuracy);
int (*get_offset) (struct yas_vector *offset);
int (*set_offset) (struct yas_vector *offset);
int (*get_shape) (void);
int (*set_shape) (int shape);
int (*get_threshold) (struct yas_mag_calibration_threshold *threshold);
int (*set_threshold) (struct yas_mag_calibration_threshold *threshold);
int (*get_mode) (void);
int (*set_mode) (int mode);
int (*get_max_sample) (void);
int (*set_max_sample) (int num_samples);
int (*get_dynamic_matrix) (struct yas_matrix *dynamic_matrix);
struct yas_mag_calibration_callback callback;
};
#if YAS_SUPPORT_FUSION_DRIVER
struct yas_quaternion {
int32_t q[4];
};
struct yas_fusion_callback {
int (*lock) (void);
int (*unlock) (void);
void (*current_time) (int32_t *sec, int32_t *msec);
};
struct yas_fusion {
int (*init) (void);
int (*term) (void);
int (*update) (struct yas_vector *acc, struct yas_vector *mag,
struct yas_vector *gyro);
int (*get_quaternion) (struct yas_quaternion *quaternion);
int (*get_fusion) (struct yas_quaternion *quaternion,
struct yas_vector *acc, struct yas_vector *gravity,
struct yas_vector *linear_acceleration,
struct yas_vector *rotation_vector);
struct yas_fusion_callback callback;
};
#endif
#if YAS_SUPPORT_SOFTWARE_GYROSCOPE
struct yas_swgyro_callback {
int (*lock) (void);
int (*unlock) (void);
};
struct yas_swgyro {
int (*init) (void);
int (*term) (void);
int (*get_delay) (void);
int (*set_delay) (int msec);
int (*update) (struct yas_vector *acc, struct yas_vector *mag,
struct yas_vector *gyro);
struct yas_swgyro_callback callback;
};
#endif
struct yas_acc_filter {
int threshold; /* um/s^2 */
};
struct yas_acc_driver_callback {
int (*lock) (void);
int (*unlock) (void);
int (*device_open) (void);
int (*device_close) (void);
int (*device_write) (uint8_t adr, const uint8_t *buf, int len);
int (*device_read) (uint8_t adr, uint8_t *buf, int len);
void (*msleep) (int msec);
};
struct yas_acc_driver {
int (*init) (void);
int (*term) (void);
int (*get_delay) (void);
int (*set_delay) (int delay);
int (*get_offset) (struct yas_vector *offset);
int (*set_offset) (struct yas_vector *offset);
int (*get_enable) (void);
int (*set_enable) (int enable);
int (*get_filter) (struct yas_acc_filter *filter);
int (*set_filter) (struct yas_acc_filter *filter);
int (*get_filter_enable) (void);
int (*set_filter_enable) (int enable);
int (*get_position) (void);
int (*set_position) (int position);
int (*measure) (struct yas_acc_data *data);
#if DEBUG
int (*get_register) (uint8_t adr, uint8_t *val);
#endif
struct yas_acc_driver_callback callback;
};
struct yas_acc_calibration_threshold {
int32_t variation;
};
struct yas_acc_calibration_callback {
int (*lock) (void);
int (*unlock) (void);
};
struct yas_acc_calibration {
int (*init) (void);
int (*term) (void);
int (*update) (struct yas_vector *acc);
int (*get_offset) (struct yas_vector *offset);
int (*get_threshold) (struct yas_acc_calibration_threshold *threshold);
int (*set_threshold) (struct yas_acc_calibration_threshold *threshold);
struct yas_acc_calibration_callback callback;
};
struct yas_gyro_filter {
int threshold; /*mdegree/s */
};
struct yas_gyro_driver_callback {
int (*lock) (void);
int (*unlock) (void);
int (*device_open) (void);
int (*device_close) (void);
int (*device_write) (uint8_t adr, const uint8_t *buf, int len);
int (*device_read) (uint8_t adr, uint8_t *buf, int len);
int (*interrupt_enable) (void);
int (*interrupt_disable) (void);
void (*interrupt_notify) (int num);
void (*msleep) (int msec);
};
struct yas_gyro_driver {
int (*init) (void);
int (*term) (void);
int (*get_delay) (void);
int (*set_delay) (int delay);
int (*get_offset) (struct yas_vector *offset);
int (*set_offset) (struct yas_vector *offset);
int (*get_enable) (void);
int (*set_enable) (int enable);
int (*get_filter) (struct yas_gyro_filter *filter);
int (*set_filter) (struct yas_gyro_filter *filter);
int (*get_filter_enable) (void);
int (*set_filter_enable) (int enable);
int (*get_position) (void);
int (*set_position) (int position);
int (*get_interrupt) (void);
int (*set_interrupt) (int interrupt);
int (*measure) (struct yas_gyro_data *data, int num);
void (*interrupt_handler) (void);
#if DEBUG
int (*get_register) (uint8_t adr, uint8_t *val);
int (*set_register) (uint8_t adr, uint8_t val);
#endif
struct yas_gyro_driver_callback callback;
};
struct yas_gyro_calibration_threshold {
int32_t variation;
};
struct yas_gyro_calibration_callback {
int (*lock) (void);
int (*unlock) (void);
};
struct yas_gyro_calibration {
int (*init) (void);
int (*term) (void);
int (*update) (struct yas_vector *gyro);
int (*get_offset) (struct yas_vector *offset);
int (*get_threshold) (struct yas_gyro_calibration_threshold *
threshold);
int (*set_threshold) (struct yas_gyro_calibration_threshold *
threshold);
struct yas_gyro_calibration_callback callback;
};
struct yas_utility {
int (*get_rotation_matrix) (struct yas_vector *acc,
struct yas_vector *mag,
struct yas_matrix *rotation_matrix);
int (*get_euler) (struct yas_matrix *rotation_matrix,
struct yas_vector *euler);
};
struct yas_platform_data {
void (*poweron) (int);
};
/*-------------------------------------------------------------------------- */
/* Global function definition */
/*-------------------------------------------------------------------------- */
int yas_mag_driver_init(struct yas_mag_driver *f);
int yas_mag_calibration_init(struct yas_mag_calibration *f);
int yas_acc_driver_init(struct yas_acc_driver *f);
int yas_acc_calibration_init(struct yas_acc_calibration *f);
int yas_gyro_driver_init(struct yas_gyro_driver *f, int interrupt);
int yas_gyro_calibration_init(struct yas_gyro_calibration *f);
int yas_utility_init(struct yas_utility *f);
#if YAS_SUPPORT_FUSION_DRIVER
int yas_fusion_init(struct yas_fusion *f);
#endif
#if YAS_SUPPORT_SOFTWARE_GYROSCOPE
int yas_swgyro_init(struct yas_swgyro *f);
#endif
#endif /*__YAS_H__ */