14
#include "lsm6dsl_transfer.h"
16
#define LSM6DSL_WHO_AM_I 0xf
17
#define LSM6DSL_CTRL_REG(i) (0x10 + i - 1)
18
#define LSM6DSL_STATUS_REG 0x1e
19
#define LSM6DSL_OUT_TEMP_L 0x20
20
#define LSM6DSL_OUT_TEMP_H 0x21
21
#define LSM6DSL_OUT_X_L_G 0x22
22
#define LSM6DSL_OUT_X_H_G 0x23
23
#define LSM6DSL_OUT_Y_L_G 0x24
24
#define LSM6DSL_OUT_Y_H_G 0x25
25
#define LSM6DSL_OUT_Z_L_G 0x26
26
#define LSM6DSL_OUT_Z_H_G 0x27
27
#define LSM6DSL_OUT_X_L_XL 0x28
28
#define LSM6DSL_OUT_X_H_XL 0x29
29
#define LSM6DSL_OUT_Y_L_XL 0x2a
30
#define LSM6DSL_OUT_Y_H_XL 0x2b
31
#define LSM6DSL_OUT_Z_L_XL 0x2c
32
#define LSM6DSL_OUT_Z_H_XL 0x2d
33
#define LSM6DSL_TIMESTAMP0_REG 0x40
34
#define LSM6DSL_TIMESTAMP1_REG 0x41
35
#define LSM6DSL_TIMESTAMP2_REG 0x42
36
#define LSM6DSL_WAKE_UP_DUR 0x5c
38
#define LSM6DSL_WHO_AM_I_VALUE 0x6A
40
#define LSM6DSL_TEMP_OFFSET (25*256)
41
#define LSM6DSL_TIMEST_STEP 25
43
extern struct lsm6dsl_dev lsm6dsl_dev0;
45
void lsm6dsl_get_data(struct lsm6dsl_s *data) {
46
struct lsm6dsl_dev *dev = &lsm6dsl_dev0;
47
union {int16_t val; uint8_t b[2];}m;
48
lsm6dsl_readb(dev, LSM6DSL_OUT_X_L_G, &(m.b[0]));
49
lsm6dsl_readb(dev, LSM6DSL_OUT_X_H_G, &(m.b[1]));
50
data->g_x = le16toh(m.val);
51
lsm6dsl_readb(dev, LSM6DSL_OUT_Y_L_G, &(m.b[0]));
52
lsm6dsl_readb(dev, LSM6DSL_OUT_Y_H_G, &(m.b[1]));
53
data->g_y = le16toh(m.val);
54
lsm6dsl_readb(dev, LSM6DSL_OUT_Z_L_G, &(m.b[0]));
55
lsm6dsl_readb(dev, LSM6DSL_OUT_Z_H_G, &(m.b[1]));
56
data->g_z = le16toh(m.val);
57
lsm6dsl_readb(dev, LSM6DSL_OUT_X_L_XL, &(m.b[0]));
58
lsm6dsl_readb(dev, LSM6DSL_OUT_X_H_XL, &(m.b[1]));
59
data->xl_x = le16toh(m.val);
60
lsm6dsl_readb(dev, LSM6DSL_OUT_Y_L_XL, &(m.b[0]));
61
lsm6dsl_readb(dev, LSM6DSL_OUT_Y_H_XL, &(m.b[1]));
62
data->xl_y = le16toh(m.val);
63
lsm6dsl_readb(dev, LSM6DSL_OUT_Z_L_XL, &(m.b[0]));
64
lsm6dsl_readb(dev, LSM6DSL_OUT_Z_H_XL, &(m.b[1]));
65
data->xl_z = le16toh(m.val);
68
int16_t lsm6dsl_get_temp_x256(void) {
69
struct lsm6dsl_dev *dev = &lsm6dsl_dev0;
70
union {int16_t val; uint8_t b[2];}t;
71
lsm6dsl_readb(dev, LSM6DSL_OUT_TEMP_L, &(t.b[0]));
72
lsm6dsl_readb(dev, LSM6DSL_OUT_TEMP_H, &(t.b[1]));
74
return le16toh(t.val) + LSM6DSL_TEMP_OFFSET;
77
int32_t lsm6dsl_get_timestamp_us(void) {
78
struct lsm6dsl_dev *dev = &lsm6dsl_dev0;
79
union {int32_t val; uint8_t b[4];}t;
80
lsm6dsl_readb(dev, LSM6DSL_TIMESTAMP0_REG, &(t.b[0]));
81
lsm6dsl_readb(dev, LSM6DSL_TIMESTAMP1_REG, &(t.b[1]));
82
lsm6dsl_readb(dev, LSM6DSL_TIMESTAMP2_REG, &(t.b[2]));
85
return le32toh(t.val)*LSM6DSL_TIMEST_STEP;
88
int lsm6dsl_init(void) {
91
struct lsm6dsl_dev *dev = &lsm6dsl_dev0;
93
if (lsm6dsl_hw_init(dev) < 0) {
94
log_error("LSM6DSL hw init failed!");
98
if (lsm6dsl_readb(dev, LSM6DSL_WHO_AM_I, &tmp) < 0) {
99
log_error("LSM6DSL readb failed!");
102
log_info("WHO_AM_I = 0x%02x", tmp);
103
if (tmp != LSM6DSL_WHO_AM_I_VALUE) {
104
log_error("LSM6DSL Device ID mismatch! %2x", tmp);
110
lsm6dsl_writeb(dev, LSM6DSL_CTRL_REG(1), tmp);
114
lsm6dsl_writeb(dev, LSM6DSL_CTRL_REG(2), tmp);
118
lsm6dsl_writeb(dev, LSM6DSL_CTRL_REG(3), tmp);
127
lsm6dsl_writeb(dev, LSM6DSL_WAKE_UP_DUR, tmp);
129
lsm6dsl_writeb(dev, LSM6DSL_TIMESTAMP2_REG, tmp);
131
lsm6dsl_writeb(dev, LSM6DSL_CTRL_REG(10), tmp);
133
for (i = 1; i <= 10; i++) {
134
lsm6dsl_readb(dev, LSM6DSL_CTRL_REG(i), &tmp);
135
log_info("CTRL_REG%d = 0x%02x", i, tmp);
137
lsm6dsl_readb(dev, LSM6DSL_STATUS_REG, &tmp);
138
log_info("STATUS_REG = 0x%02x", tmp);