blob: 3dec1621272557895659e7cb20e4220dcb197729 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef __SENSOR_ADXL345_H__
#define __SENSOR_ADXL345_H__
#include "os/mynewt.h"
#include "sensor/sensor.h"
#ifdef __cplusplus
extern "C" {
#endif
#define ADXL345_INT_OVERRUN_BIT 0x1
#define ADXL345_INT_WATERMARK_BIT 0x2
#define ADXL345_INT_FREEFALL_BIT 0x4
#define ADXL345_INT_INACTIVITY_BIT 0x8
#define ADXL345_INT_ACTIVITY_BIT 0x10
#define ADXL345_INT_DOUBLE_TAP_BIT 0x20
#define ADXL345_INT_SINGLE_TAP_BIT 0x40
#define ADXL345_INT_DATA_READY_BIT 0x80
enum adxl345_accel_range {
ADXL345_ACCEL_RANGE_2 = 0, /* +/- 2g */
ADXL345_ACCEL_RANGE_4 = 1, /* +/- 4g */
ADXL345_ACCEL_RANGE_8 = 2, /* +/- 8g */
ADXL345_ACCEL_RANGE_16 = 3, /* +/- 16g */
};
enum adxl345_power_mode {
ADXL345_POWER_STANDBY = 0,
ADXL345_POWER_SLEEP = 1,
ADXL345_POWER_MEASURE = 2
};
enum adxl345_sample_rate {
ADXL345_RATE_0_1_HZ = 0, /* 0.1Hz */
ADXL345_RATE_0_2_HZ = 1, /* 0.2Hz */
ADXL345_RATE_0_39_HZ = 2, /* 0.39Hz */
ADXL345_RATE_0_78_HZ = 3, /* 0.78Hz */
ADXL345_RATE_1_56_HZ = 4, /* 1.56Hz */
ADXL345_RATE_3_13_HZ = 5, /* 3.13Hz */
ADXL345_RATE_6_25_HZ = 6, /* 6.25Hz */
ADXL345_RATE_12_5_HZ = 7, /* 12.5Hz */
ADXL345_RATE_25_HZ = 8, /* 25Hz */
ADXL345_RATE_50_HZ = 9, /* 50Hz */
ADXL345_RATE_100_HZ = 10, /* 1001Hz */
ADXL345_RATE_200_HZ = 11, /* 200Hz */
ADXL345_RATE_400_HZ = 12, /* 400Hz */
ADXL345_RATE_800_HZ = 13, /* 800Hz */
ADXL345_RATE_1600_HZ = 14, /* 1600Hz */
ADXL345_RATE_3200_HZ = 15 /* 3200Hz */
};
struct adxl345_tap_settings {
uint8_t threshold; /* threshold compared with data to identify a tap event
16g range, 62.5 mg/LSB */
uint8_t duration; /* maximum time data is above threshold to be a tap event
625us/LSB */
uint8_t latency; /* time to wait after a tap before window starts for detecting
a double tap. 1.25ms/LSB */
uint8_t window; /* length of time in which a double tap can be triggered, this
time starts after the latency time expires. 1.25ms/LSB */
uint8_t x_enable:1; /* enables tap/double tap detection on X axis */
uint8_t y_enable:1; /* enables tap/double tap detection on Y axis */
uint8_t z_enable:1; /* enables tap/double tap detection on Z axis */
uint8_t suppress:1; /* if enabled suppresses double tap detection if acceleration
greater than threshold is present between taps */
};
struct adxl345_act_inact_enables {
uint8_t act_x:1; /* enable detection of activity from X axis data */
uint8_t act_y:1; /* enable detection of activity from Y axis data */
uint8_t act_z:1; /* enable detection of activity from Z axis data */
uint8_t inact_x:1; /* enable detection of inactivity from X axis data */
uint8_t inact_y:1; /* enable detection of inactivity from Y axis data */
uint8_t inact_z:1; /* enable detection of inactivity from Z axis data */
uint8_t act_ac_dc:1; /* 0 = dc-coupled operation, 1 = ac-coupled operation */
uint8_t inact_ac_dc:1; /* 0 = dc-coupled operation, 1 = ac-coupled operation */
};
struct adxl345_cfg {
enum adxl345_power_mode power_mode;
uint8_t low_power_enable;
enum adxl345_accel_range accel_range;
enum adxl345_sample_rate sample_rate;
/* offsets used to calibrate data */
int8_t offset_x;
int8_t offset_y;
int8_t offset_z;
/* configuration of tap/double tap detection interrupts */
struct adxl345_tap_settings tap_cfg;
/* configuration of freefall detection interrupt */
uint8_t freefall_threshold;
uint8_t freefall_time;
sensor_type_t mask;
};
/* Device private data */
struct adxl345_private_driver_data {
struct sensor_notify_ev_ctx notify_ctx;
struct sensor_read_ev_ctx read_ctx;
uint8_t registered_mask;
uint8_t int_num;
uint8_t int_route;
uint8_t int_enable;
};
struct adxl345 {
struct os_dev dev;
struct sensor sensor;
struct adxl345_cfg cfg;
struct adxl345_private_driver_data pdd;
};
int adxl345_set_power_mode(struct sensor_itf *itf, enum adxl345_power_mode state);
int adxl345_get_power_mode(struct sensor_itf *itf, enum adxl345_power_mode *state);
int adxl345_set_low_power_enable(struct sensor_itf *itf, uint8_t enable);
int adxl345_get_low_power_enable(struct sensor_itf *itf, uint8_t *enable);
int adxl345_set_accel_range(struct sensor_itf *itf,
enum adxl345_accel_range range);
int adxl345_get_accel_range(struct sensor_itf *itf,
enum adxl345_accel_range *range);
int adxl345_set_offsets(struct sensor_itf *itf, int8_t offset_x,
int8_t offset_y, int8_t offset_z);
int adxl345_get_offsets(struct sensor_itf *itf, int8_t *offset_x,
int8_t *offset_y, int8_t *offset_z);
int adxl345_set_tap_settings(struct sensor_itf *itf, struct adxl345_tap_settings settings);
int adxl345_get_tap_settings(struct sensor_itf *itf, struct adxl345_tap_settings *settings);
int adxl345_set_active_threshold(struct sensor_itf *itf, uint8_t threshold);
int adxl345_get_active_threshold(struct sensor_itf *itf, uint8_t *threshold);
int adxl345_set_inactive_settings(struct sensor_itf *itf, uint8_t threshold, uint8_t time);
int adxl345_get_inactive_settings(struct sensor_itf *itf, uint8_t *threshold, uint8_t *time);
int adxl345_set_freefall_settings(struct sensor_itf *itf, uint8_t threshold, uint8_t time);
int adxl345_get_freefall_settings(struct sensor_itf *itf, uint8_t *threshold, uint8_t *time);
int adxl345_set_sample_rate(struct sensor_itf *itf, enum adxl345_sample_rate rate);
int adxl345_get_sample_rate(struct sensor_itf *itf, enum adxl345_sample_rate *rate);
int adxl345_setup_interrupts(struct sensor_itf *itf, uint8_t enables, uint8_t mapping);
int adxl345_clear_interrupts(struct sensor_itf *itf, uint8_t *int_status);
int adxl345_set_act_inact_enables(struct sensor_itf *itf, struct adxl345_act_inact_enables cfg);
int adxl345_get_act_inact_enables(struct sensor_itf *itf, struct adxl345_act_inact_enables *cfg);
int adxl345_init(struct os_dev *, void *);
int adxl345_config(struct adxl345 *, struct adxl345_cfg *);
int adxl345_get_accel_data(struct sensor_itf *itf, struct sensor_accel_data *sad);
#if MYNEWT_VAL(ADXL345_CLI)
int adxl345_shell_init(void);
#endif
#ifdef __cplusplus
}
#endif
#endif /* __SENSOR_ADXL345_H__ */