[FLYWOOF411] add board documentation
[inav/snaewe.git] / src / main / target / common_hardware.c
blobb372e9c8f747daa9ca5e29588ec2fafef20fd4dd
1 /*
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/>.
18 #include <platform.h>
19 #include "drivers/io.h"
20 #include "drivers/bus.h"
21 #include "drivers/sensor.h"
23 #if !defined(USE_TARGET_HARDWARE_DESCRIPTORS)
25 /** IMU **/
26 #if !defined(USE_TARGET_IMU_HARDWARE_DESCRIPTORS)
27 #if !defined(GYRO_INT_EXTI)
28 #define GYRO_INT_EXTI NONE
29 #endif
31 #if !defined(MPU_ADDRESS)
32 #define MPU_ADDRESS 0x68
33 #endif
35 #if defined(USE_IMU_L3GD20)
36 #if defined(GYRO_L3GD20_ALIGN)
37 #define GYRO_0_ALIGN GYRO_L3GD20_ALIGN
38 #else
39 #define GYRO_0_ALIGN ALIGN_DEFAULT
40 #endif
41 BUSDEV_REGISTER_SPI(busdev_l3gd20, DEVHW_L3GD20, L3GD20_SPI_BUS, L3GD20_CS_PIN, NONE, DEVFLAGS_NONE, IMU_L3GD20_ALIGN);
42 #endif
44 #if defined(USE_IMU_LSM303DLHC)
45 BUSDEV_REGISTER_I2C(busdev_lsm303, DEVHW_LSM303DLHC, LSM303DLHC_I2C_BUS, 0x19, NONE, DEVFLAGS_NONE, IMU_LSM303DLHC_ALIGN);
46 #endif
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);
50 #endif
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);
54 #endif
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);
61 #endif
62 #endif
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);
69 #endif
70 #endif
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);
74 #endif
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);
81 #endif
82 #endif
83 #endif
86 /** BAROMETERS **/
88 #if defined(USE_BARO_BMP085)
89 #if !defined(BMP085_I2C_BUS)
90 #define BMP085_I2C_BUS BARO_I2C_BUS
91 #endif
92 BUSDEV_REGISTER_I2C(busdev_bmp085, DEVHW_BMP085, BMP085_I2C_BUS, 0x77, NONE, DEVFLAGS_NONE, 0);
93 #endif
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
101 #endif
102 BUSDEV_REGISTER_I2C(busdev_bmp280, DEVHW_BMP280, BMP280_I2C_BUS, 0x76, NONE, DEVFLAGS_NONE, 0);
103 #endif
104 #endif
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
112 #endif
113 BUSDEV_REGISTER_I2C(busdev_bmp388, DEVHW_BMP388, BMP388_I2C_BUS, 0x76, NONE, DEVFLAGS_NONE, 0);
114 #endif
115 #endif
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
123 #endif
124 BUSDEV_REGISTER_I2C(busdev_spl06, DEVHW_SPL06, SPL06_I2C_BUS, 0x76, NONE, DEVFLAGS_NONE, 0);
125 #endif
126 #endif
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);
131 #endif
132 #endif
134 #if defined(USE_BARO_MS5607)
135 #if !defined(MS5607_I2C_BUS)
136 #define MS5607_I2C_BUS BARO_I2C_BUS
137 #endif
138 BUSDEV_REGISTER_I2C(busdev_ms5607, DEVHW_MS5607, MS5607_I2C_BUS, 0x77, NONE, DEVFLAGS_USE_RAW_REGISTERS, 0);
139 #endif
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
147 #endif
148 BUSDEV_REGISTER_I2C(busdev_ms5611, DEVHW_MS5611, MS5611_I2C_BUS, 0x77, NONE, DEVFLAGS_USE_RAW_REGISTERS, 0);
149 #endif
150 #endif
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
158 #endif
159 BUSDEV_REGISTER_I2C(busdev_dps310, DEVHW_DPS310, DPS310_I2C_BUS, 0x76, NONE, DEVFLAGS_NONE, 0);
160 #endif
161 #endif
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
169 #endif
170 BUSDEV_REGISTER_I2C(busdev_hmc5883, DEVHW_HMC5883, HMC5883_I2C_BUS, 0x1E, NONE, DEVFLAGS_NONE, 0);
171 #endif
173 #if defined(USE_MAG_QMC5883)
174 #if !defined(QMC5883_I2C_BUS)
175 #define QMC5883_I2C_BUS MAG_I2C_BUS
176 #endif
177 BUSDEV_REGISTER_I2C(busdev_qmc5883, DEVHW_QMC5883, QMC5883_I2C_BUS, 0x0D, NONE, DEVFLAGS_NONE, 0);
178 #endif
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
186 #endif
187 BUSDEV_REGISTER_I2C(busdev_ak8963, DEVHW_AK8963, AK8963_I2C_BUS, 0x0C, NONE, DEVFLAGS_NONE, 0);
188 #endif
189 #endif
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
197 #endif
198 BUSDEV_REGISTER_I2C(busdev_ak8975, DEVHW_AK8975, AK8975_I2C_BUS, 0x0C, NONE, DEVFLAGS_NONE, 0);
199 #endif
200 #endif
202 #if defined(USE_MAG_MAG3110)
203 #if !defined(MAG3110_I2C_BUS)
204 #define MAG3110_I2C_BUS MAG_I2C_BUS
205 #endif
206 BUSDEV_REGISTER_I2C(busdev_mag3110, DEVHW_MAG3110, MAG3110_I2C_BUS, 0x0E, NONE, DEVFLAGS_NONE, 0);
207 #endif
209 #if defined(USE_MAG_LIS3MDL)
210 #if !defined(LIS3MDL_I2C_BUS)
211 #define LIS3MDL_I2C_BUS MAG_I2C_BUS
212 #endif
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);
216 #endif
218 #if defined(USE_MAG_IST8310)
219 #if !defined(IST8310_I2C_BUS)
220 #define IST8310_I2C_BUS MAG_I2C_BUS
221 #endif
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);
224 #endif
226 #if defined(USE_MAG_IST8308)
227 #if !defined(IST8308_I2C_BUS)
228 #define IST8308_I2C_BUS MAG_I2C_BUS
229 #endif
230 BUSDEV_REGISTER_I2C(busdev_ist8308, DEVHW_IST8308, IST8308_I2C_BUS, 0x0C, NONE, DEVFLAGS_NONE, 0);
231 #endif
232 #endif
235 /** 1-Wire IF **/
237 #ifdef USE_1WIRE
239 #if defined(TEMPERATURE_I2C_BUS) && !defined(DS2482_I2C_BUS)
240 #define DS2482_I2C_BUS TEMPERATURE_I2C_BUS
241 #endif
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);
245 #endif
247 #endif
250 /** TEMP SENSORS **/
252 #if defined(TEMPERATURE_I2C_BUS) && !defined(LM75_I2C_BUS)
253 #define LM75_I2C_BUS TEMPERATURE_I2C_BUS
254 #endif
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);
265 #endif
268 /** RANGEFINDER SENSORS **/
270 #if defined(USE_RANGEFINDER_SRF10)
271 #if !defined(SRF10_I2C_BUS)
272 #define SRF10_I2C_BUS RANGEFINDER_I2C_BUS
273 #endif
274 #if defined(SRF10_I2C_BUS)
275 BUSDEV_REGISTER_I2C(busdev_srf10, DEVHW_SRF10, SRF10_I2C_BUS, 0x70, NONE, DEVFLAGS_NONE, 0);
276 #endif
277 #endif
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
282 #endif
283 #if defined(HCSR04_I2C_BUS)
284 BUSDEV_REGISTER_I2C(busdev_hcsr04, DEVHW_HCSR04_I2C, HCSR04_I2C_BUS, 0x14, NONE, DEVFLAGS_NONE, 0);
285 #endif
286 #endif
288 #if defined(USE_RANGEFINDER_VL53L0X)
289 #if !defined(VL53L0X_I2C_BUS) && defined(RANGEFINDER_I2C_BUS)
290 #define VL53L0X_I2C_BUS RANGEFINDER_I2C_BUS
291 #endif
293 #if defined(VL53L0X_I2C_BUS)
294 BUSDEV_REGISTER_I2C(busdev_vl53l0x, DEVHW_VL53L0X, VL53L0X_I2C_BUS, 0x29, NONE, DEVFLAGS_NONE, 0);
295 #endif
296 #endif
299 /** AIRSPEED SENSORS **/
301 #if defined(PITOT_I2C_BUS) && !defined(MS4525_I2C_BUS)
302 #define MS4525_I2C_BUS PITOT_I2C_BUS
303 #endif
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
307 #endif
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);
314 #endif
316 #if defined(USE_FLASH_M25P16)
317 BUSDEV_REGISTER_SPI(busdev_m25p16, DEVHW_M25P16, M25P16_SPI_BUS, M25P16_CS_PIN, NONE, DEVFLAGS_NONE, 0);
318 #endif
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);
322 #endif
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);
328 #endif
331 #if defined(USE_OLED_UG2864)
332 #if !defined(UG2864_I2C_BUS)
333 #define UG2864_I2C_BUS BUS_I2C1
334 #endif
335 BUSDEV_REGISTER_I2C(busdev_ug2864, DEVHW_UG2864, UG2864_I2C_BUS, 0x3C, NONE, DEVFLAGS_NONE, 0);
336 #endif
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
342 #endif
343 BUSDEV_REGISTER_I2C(busdev_pca9685, DEVHW_PCA9685, PCA9685_I2C_BUS, 0x40, NONE, DEVFLAGS_NONE, 0);
344 #endif
345 #endif
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
350 #else
351 #define IRLOCK_I2C_BUS BUS_I2C1
352 #endif
353 BUSDEV_REGISTER_I2C(busdev_irlock, DEVHW_IRLOCK, IRLOCK_I2C_BUS, 0x54, NONE, DEVFLAGS_USE_RAW_REGISTERS);
354 #endif
356 #endif // USE_TARGET_HARDWARE_DESCRIPTORS