xref: /nrf52832-nimble/rt-thread/components/drivers/sensors/mpu6050_sensor.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2014-12-20     Bernard      the first version
9*10465441SEvalZero  * 2015-1-11     RT_learning   modify the mpu6050 ID
10*10465441SEvalZero  */
11*10465441SEvalZero 
12*10465441SEvalZero #ifndef MPU6050_SENSOR_H__
13*10465441SEvalZero #define MPU6050_SENSOR_H__
14*10465441SEvalZero 
15*10465441SEvalZero #include <sensor.h>
16*10465441SEvalZero 
17*10465441SEvalZero #define MPU6050_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
18*10465441SEvalZero #define MPU6050_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
19*10465441SEvalZero #define MPU6050_DEFAULT_ADDRESS     MPU6050_ADDRESS_AD0_LOW
20*10465441SEvalZero 
21*10465441SEvalZero #define MPU6050_XG_OFFS_TC          0x00
22*10465441SEvalZero #define MPU6050_YG_OFFS_TC          0x01
23*10465441SEvalZero #define MPU6050_ZG_OFFS_TC          0x02
24*10465441SEvalZero #define MPU6050_X_FINE_GAIN         0x03
25*10465441SEvalZero #define MPU6050_Y_FINE_GAIN         0x04
26*10465441SEvalZero #define MPU6050_Z_FINE_GAIN         0x05
27*10465441SEvalZero #define MPU6050_XA_OFFS_H           0x06
28*10465441SEvalZero #define MPU6050_XA_OFFS_L           0x07
29*10465441SEvalZero #define MPU6050_YA_OFFS_H           0x08
30*10465441SEvalZero #define MPU6050_YA_OFFS_L           0x09
31*10465441SEvalZero #define MPU6050_ZA_OFFS_H           0x0A
32*10465441SEvalZero #define MPU6050_ZA_OFFS_L           0x0B
33*10465441SEvalZero #define MPU6050_PRODUCT_ID          0x0C
34*10465441SEvalZero #define MPU6050_SELF_TEST_X         0x0D
35*10465441SEvalZero #define MPU6050_SELF_TEST_Y         0x0E
36*10465441SEvalZero #define MPU6050_SELF_TEST_Z         0x0F
37*10465441SEvalZero #define MPU6050_SELF_TEST_A         0x10
38*10465441SEvalZero #define MPU6050_XG_OFFS_USRH        0x13
39*10465441SEvalZero #define MPU6050_XG_OFFS_USRL        0x14
40*10465441SEvalZero #define MPU6050_YG_OFFS_USRH        0x15
41*10465441SEvalZero #define MPU6050_YG_OFFS_USRL        0x16
42*10465441SEvalZero #define MPU6050_ZG_OFFS_USRH        0x17
43*10465441SEvalZero #define MPU6050_ZG_OFFS_USRL        0x18
44*10465441SEvalZero #define MPU6050_SMPLRT_DIV          0x19
45*10465441SEvalZero #define MPU6050_CONFIG              0x1A
46*10465441SEvalZero #define MPU6050_GYRO_CONFIG         0x1B
47*10465441SEvalZero #define MPU6050_ACCEL_CONFIG        0x1C
48*10465441SEvalZero #define MPU6050_ACCEL_CONFIG_2      0x1D
49*10465441SEvalZero #define MPU6050_LP_ACCEL_ODR        0x1E
50*10465441SEvalZero #define MPU6050_MOT_THR             0x1F
51*10465441SEvalZero #define MPU6050_FIFO_EN             0x23
52*10465441SEvalZero #define MPU6050_I2C_MST_CTRL        0x24
53*10465441SEvalZero #define MPU6050_I2C_SLV0_ADDR       0x25
54*10465441SEvalZero #define MPU6050_I2C_SLV0_REG        0x26
55*10465441SEvalZero #define MPU6050_I2C_SLV0_CTRL       0x27
56*10465441SEvalZero #define MPU6050_I2C_SLV1_ADDR       0x28
57*10465441SEvalZero #define MPU6050_I2C_SLV1_REG        0x29
58*10465441SEvalZero #define MPU6050_I2C_SLV1_CTRL       0x2A
59*10465441SEvalZero #define MPU6050_I2C_SLV2_ADDR       0x2B
60*10465441SEvalZero #define MPU6050_I2C_SLV2_REG        0x2C
61*10465441SEvalZero #define MPU6050_I2C_SLV2_CTRL       0x2D
62*10465441SEvalZero #define MPU6050_I2C_SLV3_ADDR       0x2E
63*10465441SEvalZero #define MPU6050_I2C_SLV3_REG        0x2F
64*10465441SEvalZero #define MPU6050_I2C_SLV3_CTRL       0x30
65*10465441SEvalZero #define MPU6050_I2C_SLV4_ADDR       0x31
66*10465441SEvalZero #define MPU6050_I2C_SLV4_REG        0x32
67*10465441SEvalZero #define MPU6050_I2C_SLV4_DO         0x33
68*10465441SEvalZero #define MPU6050_I2C_SLV4_CTRL       0x34
69*10465441SEvalZero #define MPU6050_I2C_SLV4_DI         0x35
70*10465441SEvalZero #define MPU6050_I2C_MST_STATUS      0x36
71*10465441SEvalZero #define MPU6050_INT_PIN_CFG         0x37
72*10465441SEvalZero #define MPU6050_INT_ENABLE          0x38
73*10465441SEvalZero #define MPU6050_ACCEL_XOUT_H        0x3B
74*10465441SEvalZero #define MPU6050_ACCEL_XOUT_L        0x3C
75*10465441SEvalZero #define MPU6050_ACCEL_YOUT_H        0x3D
76*10465441SEvalZero #define MPU6050_ACCEL_YOUT_L        0x3E
77*10465441SEvalZero #define MPU6050_ACCEL_ZOUT_H        0x3F
78*10465441SEvalZero #define MPU6050_ACCEL_ZOUT_L        0x40
79*10465441SEvalZero #define MPU6050_TEMP_OUT_H          0x41
80*10465441SEvalZero #define MPU6050_TEMP_OUT_L          0x42
81*10465441SEvalZero #define MPU6050_GYRO_XOUT_H         0x43
82*10465441SEvalZero #define MPU6050_GYRO_XOUT_L         0x44
83*10465441SEvalZero #define MPU6050_GYRO_YOUT_H         0x45
84*10465441SEvalZero #define MPU6050_GYRO_YOUT_L         0x46
85*10465441SEvalZero #define MPU6050_GYRO_ZOUT_H         0x47
86*10465441SEvalZero #define MPU6050_GYRO_ZOUT_L         0x48
87*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_00    0x49
88*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_01    0x4A
89*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_02    0x4B
90*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_03    0x4C
91*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_04    0x4D
92*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_05    0x4E
93*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_06    0x4F
94*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_07    0x50
95*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_08    0x51
96*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_09    0x52
97*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_10    0x53
98*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_11    0x54
99*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_12    0x55
100*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_13    0x56
101*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_14    0x57
102*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_15    0x58
103*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_16    0x59
104*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_17    0x5A
105*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_18    0x5B
106*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_19    0x5C
107*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_20    0x5D
108*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_21    0x5E
109*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_22    0x5F
110*10465441SEvalZero #define MPU6050_EXT_SENS_DATA_23    0x60
111*10465441SEvalZero #define MPU6050_I2C_SLV0_DO         0x63
112*10465441SEvalZero #define MPU6050_I2C_SLV1_DO         0x64
113*10465441SEvalZero #define MPU6050_I2C_SLV2_DO         0x65
114*10465441SEvalZero #define MPU6050_I2C_SLV3_DO         0x66
115*10465441SEvalZero #define MPU6050_I2C_MST_DELAY_CTRL  0x67
116*10465441SEvalZero #define MPU6050_SIGNAL_PATH_RESET   0x68
117*10465441SEvalZero #define MPU6050_MOT_DETECT_CTRL     0x69
118*10465441SEvalZero #define MPU6050_USER_CTRL           0x6A
119*10465441SEvalZero #define MPU6050_PWR_MGMT_1          0x6B
120*10465441SEvalZero #define MPU6050_PWR_MGMT_2          0x6C
121*10465441SEvalZero #define MPU6050_BANK_SEL            0x6D
122*10465441SEvalZero #define MPU6050_MEM_START_ADDR      0x6E
123*10465441SEvalZero #define MPU6050_MEM_R_W             0x6F
124*10465441SEvalZero #define MPU6050_DMP_CFG_1           0x70
125*10465441SEvalZero #define MPU6050_DMP_CFG_2           0x71
126*10465441SEvalZero #define MPU6050_FIFO_COUNTH         0x72
127*10465441SEvalZero #define MPU6050_FIFO_COUNTL         0x73
128*10465441SEvalZero #define MPU6050_FIFO_R_W            0x74
129*10465441SEvalZero #define MPU6050_WHOAMI              0x75
130*10465441SEvalZero #define MPU6050_XA_OFFSET_H         0x77
131*10465441SEvalZero #define MPU6050_XA_OFFSET_L         0x78
132*10465441SEvalZero #define MPU6050_YA_OFFSET_H         0x7A
133*10465441SEvalZero #define MPU6050_YA_OFFSET_L         0x7B
134*10465441SEvalZero #define MPU6050_ZA_OFFSET_H         0x7D
135*10465441SEvalZero #define MPU6050_ZA_OFFSET_L         0x7E
136*10465441SEvalZero 
137*10465441SEvalZero #define MPU6050_ID					0x68
138*10465441SEvalZero 
139*10465441SEvalZero class MPU6050 :public SensorBase
140*10465441SEvalZero {
141*10465441SEvalZero public:
142*10465441SEvalZero     MPU6050(int sensor_type, const char* iic_bus, int addr);
143*10465441SEvalZero 
144*10465441SEvalZero     int read_reg(rt_uint8_t reg, rt_uint8_t* value);
145*10465441SEvalZero     int write_reg(rt_uint8_t reg, rt_uint8_t value);
146*10465441SEvalZero     int read_buffer(rt_uint8_t reg, rt_uint8_t* value, rt_size_t size);
147*10465441SEvalZero 
148*10465441SEvalZero private:
149*10465441SEvalZero     struct rt_i2c_bus_device *i2c_bus;
150*10465441SEvalZero     int i2c_addr;
151*10465441SEvalZero };
152*10465441SEvalZero 
153*10465441SEvalZero class MPU6050_Accelerometer:public MPU6050
154*10465441SEvalZero {
155*10465441SEvalZero public:
156*10465441SEvalZero     MPU6050_Accelerometer(const char* iic_name, int addr);
157*10465441SEvalZero 
158*10465441SEvalZero     virtual int configure(SensorConfig *config);
159*10465441SEvalZero     virtual int activate(int enable);
160*10465441SEvalZero 
161*10465441SEvalZero     virtual int poll(sensors_event_t *event);
162*10465441SEvalZero     virtual void getSensor(sensor_t *sensor);
163*10465441SEvalZero 
164*10465441SEvalZero private:
165*10465441SEvalZero 	rt_int16_t x_offset, y_offset, z_offset;
166*10465441SEvalZero 
167*10465441SEvalZero 	rt_bool_t enable;
168*10465441SEvalZero 	float sensitivity;
169*10465441SEvalZero };
170*10465441SEvalZero 
171*10465441SEvalZero class MPU6050_Gyroscope:public MPU6050
172*10465441SEvalZero {
173*10465441SEvalZero public:
174*10465441SEvalZero     MPU6050_Gyroscope(const char* iic_name, int addr);
175*10465441SEvalZero 
176*10465441SEvalZero     virtual int configure(SensorConfig *config);
177*10465441SEvalZero     virtual int activate(int enable);
178*10465441SEvalZero 
179*10465441SEvalZero     virtual int poll(sensors_event_t *event);
180*10465441SEvalZero     virtual void getSensor(sensor_t *sensor);
181*10465441SEvalZero 
182*10465441SEvalZero private:
183*10465441SEvalZero 	rt_int16_t x_offset, y_offset, z_offset;
184*10465441SEvalZero 
185*10465441SEvalZero 	rt_bool_t enable;
186*10465441SEvalZero 	float sensitivity;
187*10465441SEvalZero };
188*10465441SEvalZero 
189*10465441SEvalZero #endif
190