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