123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 |
- /*
- * 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__ */
|