2 * This file is part of INAV.
4 * INAV is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * INAV is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with INAV. If not, see <http://www.gnu.org/licenses/>.
19 #include "drivers/io.h"
20 #include "drivers/bus.h"
21 #include "drivers/sensor.h"
23 #if !defined(USE_TARGET_HARDWARE_DESCRIPTORS)
26 #if !defined(USE_TARGET_IMU_HARDWARE_DESCRIPTORS)
27 #if !defined(GYRO_INT_EXTI)
28 #define GYRO_INT_EXTI NONE
31 #if !defined(MPU_ADDRESS)
32 #define MPU_ADDRESS 0x68
35 #if defined(USE_IMU_L3GD20)
36 #if defined(GYRO_L3GD20_ALIGN)
37 #define GYRO_0_ALIGN GYRO_L3GD20_ALIGN
39 #define GYRO_0_ALIGN ALIGN_DEFAULT
41 BUSDEV_REGISTER_SPI(busdev_l3gd20
, DEVHW_L3GD20
, L3GD20_SPI_BUS
, L3GD20_CS_PIN
, NONE
, DEVFLAGS_NONE
, IMU_L3GD20_ALIGN
);
44 #if defined(USE_IMU_LSM303DLHC)
45 BUSDEV_REGISTER_I2C(busdev_lsm303
, DEVHW_LSM303DLHC
, LSM303DLHC_I2C_BUS
, 0x19, NONE
, DEVFLAGS_NONE
, IMU_LSM303DLHC_ALIGN
);
48 #if defined(USE_IMU_MPU6000)
49 BUSDEV_REGISTER_SPI(busdev_mpu6000
, DEVHW_MPU6000
, MPU6000_SPI_BUS
, MPU6000_CS_PIN
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_MPU6000_ALIGN
);
52 #if defined(USE_IMU_MPU6050)
53 BUSDEV_REGISTER_I2C(busdev_mpu6050
, DEVHW_MPU6050
, MPU6050_I2C_BUS
, MPU_ADDRESS
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_MPU6050_ALIGN
);
56 #if defined(USE_IMU_MPU6500)
57 #if defined(MPU6500_SPI_BUS)
58 BUSDEV_REGISTER_SPI(busdev_mpu6500
, DEVHW_MPU6500
, MPU6500_SPI_BUS
, MPU6500_CS_PIN
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_MPU6500_ALIGN
);
59 #elif defined(MPU6500_I2C_BUS)
60 BUSDEV_REGISTER_I2C(busdev_mpu6500
, DEVHW_MPU6500
, MPU6500_I2C_BUS
, MPU_ADDRESS
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_MPU6500_ALIGN
);
64 #if defined(USE_IMU_MPU9250)
65 #if defined(MPU9250_SPI_BUS)
66 BUSDEV_REGISTER_SPI(busdev_mpu9250
, DEVHW_MPU9250
, MPU9250_SPI_BUS
, MPU9250_CS_PIN
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_MPU9250_ALIGN
);
67 #elif defined(MPU9250_I2C_BUS)
68 BUSDEV_REGISTER_I2C(busdev_mpu9250
, DEVHW_MPU9250
, MPU9250_I2C_BUS
, MPU_ADDRESS
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_MPU9250_ALIGN
);
72 #if defined(USE_IMU_ICM20689)
73 BUSDEV_REGISTER_SPI(busdev_icm20689
, DEVHW_ICM20689
, ICM20689_SPI_BUS
, ICM20689_CS_PIN
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_ICM20689_ALIGN
);
76 #if defined(USE_IMU_BMI160)
77 #if defined(BMI160_SPI_BUS)
78 BUSDEV_REGISTER_SPI(busdev_bmi160
, DEVHW_BMI160
, BMI160_SPI_BUS
, BMI160_CS_PIN
, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_BMI160_ALIGN
);
79 #elif defined(BMI160_I2C_BUS)
80 BUSDEV_REGISTER_I2C(busdev_bmi160
, DEVHW_BMI160
, BMI160_I2C_BUS
, 0x68, GYRO_INT_EXTI
, DEVFLAGS_NONE
, IMU_BMI160_ALIGN
);
88 #if defined(USE_BARO_BMP085)
89 #if !defined(BMP085_I2C_BUS)
90 #define BMP085_I2C_BUS BARO_I2C_BUS
92 BUSDEV_REGISTER_I2C(busdev_bmp085
, DEVHW_BMP085
, BMP085_I2C_BUS
, 0x77, NONE
, DEVFLAGS_NONE
, 0);
95 #if defined(USE_BARO_BMP280)
96 #if defined(BMP280_SPI_BUS)
97 BUSDEV_REGISTER_SPI(busdev_bmp280
, DEVHW_BMP280
, BMP280_SPI_BUS
, BMP280_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
98 #elif defined(BMP280_I2C_BUS) || defined(BARO_I2C_BUS)
99 #if !defined(BMP280_I2C_BUS)
100 #define BMP280_I2C_BUS BARO_I2C_BUS
102 BUSDEV_REGISTER_I2C(busdev_bmp280
, DEVHW_BMP280
, BMP280_I2C_BUS
, 0x76, NONE
, DEVFLAGS_NONE
, 0);
106 #if defined(USE_BARO_BMP388)
107 #if defined(BMP388_SPI_BUS)
108 BUSDEV_REGISTER_SPI(busdev_bmp388
, DEVHW_BMP388
, BMP388_SPI_BUS
, BMP388_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
109 #elif defined(BMP388_I2C_BUS) || defined(BARO_I2C_BUS)
110 #if !defined(BMP388_I2C_BUS)
111 #define BMP388_I2C_BUS BARO_I2C_BUS
113 BUSDEV_REGISTER_I2C(busdev_bmp388
, DEVHW_BMP388
, BMP388_I2C_BUS
, 0x76, NONE
, DEVFLAGS_NONE
, 0);
117 #if defined(USE_BARO_SPL06)
118 #if defined(SPL06_SPI_BUS)
119 BUSDEV_REGISTER_SPI(busdev_spl06
, DEVHW_SPL06
, SPL06_SPI_BUS
, SPL06_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
120 #elif defined(SPL06_I2C_BUS) || defined(BARO_I2C_BUS)
121 #if !defined(SPL06_I2C_BUS)
122 #define SPL06_I2C_BUS BARO_I2C_BUS
124 BUSDEV_REGISTER_I2C(busdev_spl06
, DEVHW_SPL06
, SPL06_I2C_BUS
, 0x76, NONE
, DEVFLAGS_NONE
, 0);
128 #if defined(USE_BARO_LPS25H)
129 #if defined(LPS25H_SPI_BUS)
130 BUSDEV_REGISTER_SPI(busdev_lps25h
, DEVHW_LPS25H
, LPS25H_SPI_BUS
, LPS25H_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
134 #if defined(USE_BARO_MS5607)
135 #if !defined(MS5607_I2C_BUS)
136 #define MS5607_I2C_BUS BARO_I2C_BUS
138 BUSDEV_REGISTER_I2C(busdev_ms5607
, DEVHW_MS5607
, MS5607_I2C_BUS
, 0x77, NONE
, DEVFLAGS_USE_RAW_REGISTERS
, 0);
141 #if defined(USE_BARO_MS5611)
142 #if defined(MS5611_SPI_BUS)
143 BUSDEV_REGISTER_SPI(busdev_ms5611
, DEVHW_MS5611
, MS5611_SPI_BUS
, MS5611_CS_PIN
, NONE
, DEVFLAGS_USE_RAW_REGISTERS
, 0);
144 #elif defined(MS5611_I2C_BUS) || defined(BARO_I2C_BUS)
145 #if !defined(MS5611_I2C_BUS)
146 #define MS5611_I2C_BUS BARO_I2C_BUS
148 BUSDEV_REGISTER_I2C(busdev_ms5611
, DEVHW_MS5611
, MS5611_I2C_BUS
, 0x77, NONE
, DEVFLAGS_USE_RAW_REGISTERS
, 0);
152 #if defined(USE_BARO_DPS310)
153 #if defined(DPS310_SPI_BUS)
154 BUSDEV_REGISTER_SPI(busdev_dps310
, DEVHW_DPS310
, DPS310_SPI_BUS
, DPS310_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
155 #elif defined(DPS310_I2C_BUS) || defined(BARO_I2C_BUS)
156 #if !defined(DPS310_I2C_BUS)
157 #define DPS310_I2C_BUS BARO_I2C_BUS
159 BUSDEV_REGISTER_I2C(busdev_dps310
, DEVHW_DPS310
, DPS310_I2C_BUS
, 0x76, NONE
, DEVFLAGS_NONE
, 0);
164 /** COMPASS SENSORS **/
165 #if !defined(USE_TARGET_MAG_HARDWARE_DESCRIPTORS)
166 #if defined(USE_MAG_HMC5883)
167 #if !defined(HMC5883_I2C_BUS)
168 #define HMC5883_I2C_BUS MAG_I2C_BUS
170 BUSDEV_REGISTER_I2C(busdev_hmc5883
, DEVHW_HMC5883
, HMC5883_I2C_BUS
, 0x1E, NONE
, DEVFLAGS_NONE
, 0);
173 #if defined(USE_MAG_QMC5883)
174 #if !defined(QMC5883_I2C_BUS)
175 #define QMC5883_I2C_BUS MAG_I2C_BUS
177 BUSDEV_REGISTER_I2C(busdev_qmc5883
, DEVHW_QMC5883
, QMC5883_I2C_BUS
, 0x0D, NONE
, DEVFLAGS_NONE
, 0);
180 #if defined(USE_MAG_AK8963)
181 #if defined(AK8963_SPI_BUS)
182 BUSDEV_REGISTER_SPI(busdev_ak8963
, DEVHW_AK8963
, AK8963_SPI_BUS
, AK8963_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
183 #elif defined(AK8963_I2C_BUS) || defined(MAG_I2C_BUS)
184 #if !defined(AK8963_I2C_BUS)
185 #define AK8963_I2C_BUS MAG_I2C_BUS
187 BUSDEV_REGISTER_I2C(busdev_ak8963
, DEVHW_AK8963
, AK8963_I2C_BUS
, 0x0C, NONE
, DEVFLAGS_NONE
, 0);
191 #if defined(USE_MAG_AK8975)
192 #if defined(AK8975_SPI_BUS)
193 BUSDEV_REGISTER_SPI(busdev_ak8975
, DEVHW_AK8975
, AK8975_SPI_BUS
, AK8975_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
194 #elif defined(AK8975_I2C_BUS) || defined(MAG_I2C_BUS)
195 #if !defined(AK8975_I2C_BUS)
196 #define AK8975_I2C_BUS MAG_I2C_BUS
198 BUSDEV_REGISTER_I2C(busdev_ak8975
, DEVHW_AK8975
, AK8975_I2C_BUS
, 0x0C, NONE
, DEVFLAGS_NONE
, 0);
202 #if defined(USE_MAG_MAG3110)
203 #if !defined(MAG3110_I2C_BUS)
204 #define MAG3110_I2C_BUS MAG_I2C_BUS
206 BUSDEV_REGISTER_I2C(busdev_mag3110
, DEVHW_MAG3110
, MAG3110_I2C_BUS
, 0x0E, NONE
, DEVFLAGS_NONE
, 0);
209 #if defined(USE_MAG_LIS3MDL)
210 #if !defined(LIS3MDL_I2C_BUS)
211 #define LIS3MDL_I2C_BUS MAG_I2C_BUS
213 BUSDEV_REGISTER_I2C(busdev_lis3mdl
, DEVHW_LIS3MDL
, LIS3MDL_I2C_BUS
, 0x1E, NONE
, DEVFLAGS_NONE
, 0);
214 // ST LIS3MDL address can be changed by connecting it's SDO/SA1 pin to either supply or ground.
215 // BUSDEV_REGISTER_I2C(busdev_lis3mdl, DEVHW_LIS3MDL, LIS3MDL_I2C_BUS, 0x1C, NONE, DEVFLAGS_NONE);
218 #if defined(USE_MAG_IST8310)
219 #if !defined(IST8310_I2C_BUS)
220 #define IST8310_I2C_BUS MAG_I2C_BUS
222 BUSDEV_REGISTER_I2C(busdev_ist8310_0
, DEVHW_IST8310_0
, IST8310_I2C_BUS
, 0x0C, NONE
, DEVFLAGS_NONE
, 0);
223 BUSDEV_REGISTER_I2C(busdev_ist8310_1
, DEVHW_IST8310_1
, IST8310_I2C_BUS
, 0x0E, NONE
, DEVFLAGS_NONE
, 0);
226 #if defined(USE_MAG_IST8308)
227 #if !defined(IST8308_I2C_BUS)
228 #define IST8308_I2C_BUS MAG_I2C_BUS
230 BUSDEV_REGISTER_I2C(busdev_ist8308
, DEVHW_IST8308
, IST8308_I2C_BUS
, 0x0C, NONE
, DEVFLAGS_NONE
, 0);
239 #if defined(TEMPERATURE_I2C_BUS) && !defined(DS2482_I2C_BUS)
240 #define DS2482_I2C_BUS TEMPERATURE_I2C_BUS
243 #if defined(USE_1WIRE_DS2482) && defined(DS2482_I2C_BUS)
244 BUSDEV_REGISTER_I2C(busdev_ds2482
, DEVHW_DS2482
, DS2482_I2C_BUS
, 0x18, NONE
, DEVFLAGS_USE_RAW_REGISTERS
, 0);
252 #if defined(TEMPERATURE_I2C_BUS) && !defined(LM75_I2C_BUS)
253 #define LM75_I2C_BUS TEMPERATURE_I2C_BUS
256 #if defined(USE_TEMPERATURE_LM75) && defined(LM75_I2C_BUS)
257 BUSDEV_REGISTER_I2C(busdev_lm75_0
, DEVHW_LM75_0
, LM75_I2C_BUS
, 0x48, NONE
, DEVFLAGS_NONE
, 0);
258 BUSDEV_REGISTER_I2C(busdev_lm75_1
, DEVHW_LM75_1
, LM75_I2C_BUS
, 0x49, NONE
, DEVFLAGS_NONE
, 0);
259 BUSDEV_REGISTER_I2C(busdev_lm75_2
, DEVHW_LM75_2
, LM75_I2C_BUS
, 0x4A, NONE
, DEVFLAGS_NONE
, 0);
260 BUSDEV_REGISTER_I2C(busdev_lm75_3
, DEVHW_LM75_3
, LM75_I2C_BUS
, 0x4B, NONE
, DEVFLAGS_NONE
, 0);
261 BUSDEV_REGISTER_I2C(busdev_lm75_4
, DEVHW_LM75_4
, LM75_I2C_BUS
, 0x4C, NONE
, DEVFLAGS_NONE
, 0);
262 BUSDEV_REGISTER_I2C(busdev_lm75_5
, DEVHW_LM75_5
, LM75_I2C_BUS
, 0x4D, NONE
, DEVFLAGS_NONE
, 0);
263 BUSDEV_REGISTER_I2C(busdev_lm75_6
, DEVHW_LM75_6
, LM75_I2C_BUS
, 0x4E, NONE
, DEVFLAGS_NONE
, 0);
264 BUSDEV_REGISTER_I2C(busdev_lm75_7
, DEVHW_LM75_7
, LM75_I2C_BUS
, 0x4F, NONE
, DEVFLAGS_NONE
, 0);
268 /** RANGEFINDER SENSORS **/
270 #if defined(USE_RANGEFINDER_SRF10)
271 #if !defined(SRF10_I2C_BUS)
272 #define SRF10_I2C_BUS RANGEFINDER_I2C_BUS
274 #if defined(SRF10_I2C_BUS)
275 BUSDEV_REGISTER_I2C(busdev_srf10
, DEVHW_SRF10
, SRF10_I2C_BUS
, 0x70, NONE
, DEVFLAGS_NONE
, 0);
279 #if defined(USE_RANGEFINDER_HCSR04_I2C) && (defined(HCSR04_I2C_BUS) || defined(RANGEFINDER_I2C_BUS))
280 #if !defined(HCSR04_I2C_BUS)
281 #define HCSR04_I2C_BUS RANGEFINDER_I2C_BUS
283 #if defined(HCSR04_I2C_BUS)
284 BUSDEV_REGISTER_I2C(busdev_hcsr04
, DEVHW_HCSR04_I2C
, HCSR04_I2C_BUS
, 0x14, NONE
, DEVFLAGS_NONE
, 0);
288 #if defined(USE_RANGEFINDER_VL53L0X)
289 #if !defined(VL53L0X_I2C_BUS) && defined(RANGEFINDER_I2C_BUS)
290 #define VL53L0X_I2C_BUS RANGEFINDER_I2C_BUS
293 #if defined(VL53L0X_I2C_BUS)
294 BUSDEV_REGISTER_I2C(busdev_vl53l0x
, DEVHW_VL53L0X
, VL53L0X_I2C_BUS
, 0x29, NONE
, DEVFLAGS_NONE
, 0);
299 /** AIRSPEED SENSORS **/
301 #if defined(PITOT_I2C_BUS) && !defined(MS4525_I2C_BUS)
302 #define MS4525_I2C_BUS PITOT_I2C_BUS
305 #if defined(USE_PITOT_MS4525) && defined(MS4525_I2C_BUS)
306 BUSDEV_REGISTER_I2C(busdev_ms5425
, DEVHW_MS4525
, MS4525_I2C_BUS
, 0x28, NONE
, DEVFLAGS_USE_RAW_REGISTERS
, 0); // Requires 0xFF to passthrough
310 /** OTHER HARDWARE **/
312 #if defined(USE_MAX7456)
313 BUSDEV_REGISTER_SPI(busdev_max7456
, DEVHW_MAX7456
, MAX7456_SPI_BUS
, MAX7456_CS_PIN
, NONE
, DEVFLAGS_USE_RAW_REGISTERS
, 0);
316 #if defined(USE_FLASH_M25P16)
317 BUSDEV_REGISTER_SPI(busdev_m25p16
, DEVHW_M25P16
, M25P16_SPI_BUS
, M25P16_CS_PIN
, NONE
, DEVFLAGS_NONE
, 0);
320 #if defined(USE_SDCARD) && defined(USE_SDCARD_SPI)
321 BUSDEV_REGISTER_SPI(busdev_sdcard_spi
, DEVHW_SDCARD
, SDCARD_SPI_BUS
, SDCARD_CS_PIN
, NONE
, DEVFLAGS_USE_MANUAL_DEVICE_SELECT
| DEVFLAGS_SPI_MODE_0
, 0);
325 // FIXME(digitalentity): This is unnecessary at the moment as SDIO is not part of BusDevice infrastructure
326 #if defined(USE_SDCARD) && defined(USE_SDCARD_SDIO)
327 BUSDEV_REGISTER_SDIO(busdev_sdcard_sdio,DEVHW_SDCARD, SDCARD_SDIO_BUS, SDCARD_CS_PIN, NONE, DEVFLAGS_USE_MANUAL_DEVICE_SELECT);
331 #if defined(USE_OLED_UG2864)
332 #if !defined(UG2864_I2C_BUS)
333 #define UG2864_I2C_BUS BUS_I2C1
335 BUSDEV_REGISTER_I2C(busdev_ug2864
, DEVHW_UG2864
, UG2864_I2C_BUS
, 0x3C, NONE
, DEVFLAGS_NONE
, 0);
338 #if defined(USE_PWM_SERVO_DRIVER)
339 #if defined(USE_PWM_DRIVER_PCA9685) && defined(USE_I2C)
340 #if !defined(PCA9685_I2C_BUS)
341 #define PCA9685_I2C_BUS BUS_I2C1
343 BUSDEV_REGISTER_I2C(busdev_pca9685
, DEVHW_PCA9685
, PCA9685_I2C_BUS
, 0x40, NONE
, DEVFLAGS_NONE
, 0);
347 #if defined(USE_IRLOCK) && defined(USE_I2C)
348 #if !defined(IRLOCK_I2C_BUS) && defined(EXTERNAL_I2C_BUS)
349 #define IRLOCK_I2C_BUS EXTERNAL_I2C_BUS
351 #define IRLOCK_I2C_BUS BUS_I2C1
353 BUSDEV_REGISTER_I2C(busdev_irlock
, DEVHW_IRLOCK
, IRLOCK_I2C_BUS
, 0x54, NONE
, DEVFLAGS_USE_RAW_REGISTERS
);
356 #endif // USE_TARGET_HARDWARE_DESCRIPTORS