11
#include <drivers/i2c/i2c.h>
12
#include <drivers/sensors/adxl345.h>
13
#include <framework/mod/options.h>
16
#define ADXL345_DEVID 0x00
17
#define ADXL345_OFSX 0x1E
18
#define ADXL345_OFSY 0x1F
19
#define ADXL345_OFSZ 0x20
20
#define ADXL345_OFS_AXIS(index) (ADXL345_REG_OFSX + (index))
21
#define ADXL345_BW_RATE 0x2C
22
#define ADXL345_POWER_CTL 0x2D
23
# define ADXL345_POWER_CTL_MSR (1 << 3)
24
#define ADXL345_DATA_FORMAT 0x31
25
#define ADXL345_DATAX0 0x32
26
#define ADXL345_DATAY0 0x34
27
#define ADXL345_DATAZ0 0x36
28
#define ADXL345_DATA_AXIS(n) (ADXL345_DATAX0 + (n))
30
#define ADXL345_DEVID_VALUE 0xE5
32
#define ADXL345_BUS OPTION_GET(NUMBER, bus)
33
#define ADXL345_ADDR OPTION_GET(NUMBER, addr)
42
static uint8_t adxl345_readb(struct adxl345_dev *dev, int offset) {
44
i2c_bus_write(dev->i2c_bus, dev->i2c_addr, &ret, sizeof(ret));
45
i2c_bus_read(dev->i2c_bus, dev->i2c_addr, &ret, sizeof(ret));
49
static void adxl345_writeb(struct adxl345_dev *dev, int offset, uint8_t val) {
50
uint16_t tmp = (offset & 0xFF) | (val << 8);
51
i2c_bus_write(dev->i2c_bus, dev->i2c_addr, (void *) &tmp, sizeof(tmp));
54
static struct adxl345_dev adxl345_dev = {
55
.i2c_bus = ADXL345_BUS,
56
.i2c_addr = ADXL345_ADDR
59
int16_t adxl345_get_x(void) {
60
struct adxl345_dev *dev = &adxl345_dev;
61
return (int16_t) (adxl345_readb(dev, ADXL345_DATA_AXIS(0)) +
62
(adxl345_readb(dev, ADXL345_DATA_AXIS(1)) << 8));
65
int16_t adxl345_get_y(void) {
66
struct adxl345_dev *dev = &adxl345_dev;
67
return (int16_t) (adxl345_readb(dev, ADXL345_DATA_AXIS(2)) +
68
(adxl345_readb(dev, ADXL345_DATA_AXIS(3)) << 8));
71
int16_t adxl345_get_z(void) {
72
struct adxl345_dev *dev = &adxl345_dev;
73
return (int16_t) (adxl345_readb(dev, ADXL345_DATA_AXIS(4)) +
74
(adxl345_readb(dev, ADXL345_DATA_AXIS(5)) << 8));
77
int adxl345_init(void) {
79
struct adxl345_dev *dev = &adxl345_dev;
81
tmp = adxl345_readb(dev, ADXL345_DEVID);
82
if (tmp != ADXL345_DEVID_VALUE) {
83
log_error("ADXL345 Device ID mismatch! %2x", tmp);
87
adxl345_writeb(dev, ADXL345_POWER_CTL,
88
ADXL345_POWER_CTL_MSR);