bool compassDetect(magDev_t *dev) { magSensor_e magHardware = MAG_NONE; busDevice_t *busdev = &dev->busdev; #ifdef USE_MAG_DATA_READY_SIGNAL dev->magIntExtiTag = compassConfig()->interruptTag; #endif switch (compassConfig()->mag_bustype) { #ifdef USE_I2C case BUSTYPE_I2C: busdev->bustype = BUSTYPE_I2C; busdev->busdev_u.i2c.device = I2C_CFG_TO_DEV(compassConfig()->mag_i2c_device); busdev->busdev_u.i2c.address = compassConfig()->mag_i2c_address; #endif break; #ifdef USE_SPI case BUSTYPE_SPI: busdev->bustype = BUSTYPE_SPI; spiBusSetInstance(busdev, spiInstanceByDevice(SPI_CFG_TO_DEV(compassConfig()->mag_spi_device))); busdev->busdev_u.spi.csnPin = IOGetByTag(compassConfig()->mag_spi_csn); #endif break; #if defined(USE_MAG_AK8963) && (defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_MPU9250)) case BUSTYPE_MPU_SLAVE: { if (gyroMpuDetectionResult()->sensor == MPU_9250_SPI) { busdev->bustype = BUSTYPE_MPU_SLAVE; busdev->busdev_u.mpuSlave.master = gyroSensorBus(); busdev->busdev_u.mpuSlave.address = compassConfig()->mag_i2c_address; } else { return false; } } #endif break; default: return false; } dev->magAlign = ALIGN_DEFAULT; switch (compassConfig()->mag_hardware) { case MAG_DEFAULT: FALLTHROUGH; case MAG_HMC5883: #if defined(USE_MAG_HMC5883) || defined(USE_MAG_SPI_HMC5883) if (busdev->bustype == BUSTYPE_I2C) { busdev->busdev_u.i2c.address = compassConfig()->mag_i2c_address; } if (hmc5883lDetect(dev)) { #ifdef MAG_HMC5883_ALIGN dev->magAlign = MAG_HMC5883_ALIGN; #endif magHardware = MAG_HMC5883; break; } #endif FALLTHROUGH; case MAG_AK8975: #ifdef USE_MAG_AK8975 if (busdev->bustype == BUSTYPE_I2C) { busdev->busdev_u.i2c.address = compassConfig()->mag_i2c_address; } if (ak8975Detect(dev)) { #ifdef MAG_AK8975_ALIGN dev->magAlign = MAG_AK8975_ALIGN; #endif magHardware = MAG_AK8975; break; } #endif FALLTHROUGH; case MAG_AK8963: #if defined(USE_MAG_AK8963) || defined(USE_MAG_SPI_AK8963) if (busdev->bustype == BUSTYPE_I2C) { busdev->busdev_u.i2c.address = compassConfig()->mag_i2c_address; } if (gyroMpuDetectionResult()->sensor == MPU_9250_SPI) { dev->busdev.bustype = BUSTYPE_MPU_SLAVE; busdev->busdev_u.mpuSlave.address = compassConfig()->mag_i2c_address; dev->busdev.busdev_u.mpuSlave.master = gyroSensorBus(); } if (ak8963Detect(dev)) { #ifdef MAG_AK8963_ALIGN dev->magAlign = MAG_AK8963_ALIGN; #endif magHardware = MAG_AK8963; break; } #endif FALLTHROUGH; case MAG_NONE: magHardware = MAG_NONE; break; } if (magHardware == MAG_NONE) { return false; } detectedSensors[SENSOR_INDEX_MAG] = magHardware; sensorsSet(SENSOR_MAG); return true; }
void max7456Init(const max7456Config_t *max7456Config, const vcdProfile_t *pVcdProfile, bool cpuOverclock) { max7456HardwareReset(); if (!max7456Config->csTag) { return; } busdev->busdev_u.spi.csnPin = IOGetByTag(max7456Config->csTag); if (!IOIsFreeOrPreinit(busdev->busdev_u.spi.csnPin)) { return; } IOInit(busdev->busdev_u.spi.csnPin, OWNER_OSD_CS, 0); IOConfigGPIO(busdev->busdev_u.spi.csnPin, SPI_IO_CS_CFG); IOHi(busdev->busdev_u.spi.csnPin); spiBusSetInstance(busdev, spiInstanceByDevice(SPI_CFG_TO_DEV(max7456Config->spiDevice))); // Detect device type by writing and reading CA[8] bit at CMAL[6]. // Do this at half the speed for safety. spiSetDivisor(busdev->busdev_u.spi.instance, MAX7456_SPI_CLK * 2); max7456Send(MAX7456ADD_CMAL, (1 << 6)); // CA[8] bit if (max7456Send(MAX7456ADD_CMAL|MAX7456ADD_READ, 0xff) & (1 << 6)) { max7456DeviceType = MAX7456_DEVICE_TYPE_AT; } else { max7456DeviceType = MAX7456_DEVICE_TYPE_MAX; } #if defined(USE_OVERCLOCK) // Determine SPI clock divisor based on config and the device type. switch (max7456Config->clockConfig) { case MAX7456_CLOCK_CONFIG_HALF: max7456SpiClock = MAX7456_SPI_CLK * 2; break; case MAX7456_CLOCK_CONFIG_OC: max7456SpiClock = (cpuOverclock && (max7456DeviceType == MAX7456_DEVICE_TYPE_MAX)) ? MAX7456_SPI_CLK * 2 : MAX7456_SPI_CLK; break; case MAX7456_CLOCK_CONFIG_FULL: max7456SpiClock = MAX7456_SPI_CLK; break; } DEBUG_SET(DEBUG_MAX7456_SPICLOCK, DEBUG_MAX7456_SPICLOCK_OVERCLOCK, cpuOverclock); DEBUG_SET(DEBUG_MAX7456_SPICLOCK, DEBUG_MAX7456_SPICLOCK_DEVTYPE, max7456DeviceType); DEBUG_SET(DEBUG_MAX7456_SPICLOCK, DEBUG_MAX7456_SPICLOCK_DIVISOR, max7456SpiClock); #else UNUSED(max7456Config); UNUSED(cpuOverclock); #endif spiSetDivisor(busdev->busdev_u.spi.instance, max7456SpiClock); // force soft reset on Max7456 __spiBusTransactionBegin(busdev); max7456Send(MAX7456ADD_VM0, MAX7456_RESET); __spiBusTransactionEnd(busdev); // Setup values to write to registers videoSignalCfg = pVcdProfile->video_system; hosRegValue = 32 - pVcdProfile->h_offset; vosRegValue = 16 - pVcdProfile->v_offset; #ifdef MAX7456_DMA_CHANNEL_TX dmaSetHandler(MAX7456_DMA_IRQ_HANDLER_ID, max7456_dma_irq_handler, NVIC_PRIO_MAX7456_DMA, 0); #endif // Real init will be made later when driver detect idle. }
bool baroDetect(baroDev_t *dev, baroSensor_e baroHardwareToUse) { // Detect what pressure sensors are available. baro->update() is set to sensor-specific update function baroSensor_e baroHardware = baroHardwareToUse; #if !defined(USE_BARO_BMP085) && !defined(USE_BARO_MS5611) && !defined(USE_BARO_SPI_MS5611) && !defined(USE_BARO_BMP280) && !defined(USE_BARO_SPI_BMP280)&& !defined(USE_BARO_QMP6988) && !defined(USE_BARO_SPI_QMP6988) UNUSED(dev); #endif switch (barometerConfig()->baro_bustype) { #ifdef USE_I2C case BUSTYPE_I2C: dev->busdev.bustype = BUSTYPE_I2C; dev->busdev.busdev_u.i2c.device = I2C_CFG_TO_DEV(barometerConfig()->baro_i2c_device); dev->busdev.busdev_u.i2c.address = barometerConfig()->baro_i2c_address; break; #endif #ifdef USE_SPI case BUSTYPE_SPI: { SPI_TypeDef *instance = spiInstanceByDevice(SPI_CFG_TO_DEV(barometerConfig()->baro_spi_device)); if (!instance) { return false; } dev->busdev.bustype = BUSTYPE_SPI; spiBusSetInstance(&dev->busdev, instance); dev->busdev.busdev_u.spi.csnPin = IOGetByTag(barometerConfig()->baro_spi_csn); } break; #endif default: return false; } switch (baroHardware) { case BARO_DEFAULT: FALLTHROUGH; case BARO_BMP085: #ifdef USE_BARO_BMP085 { const bmp085Config_t *bmp085Config = NULL; #if defined(BARO_XCLR_GPIO) && defined(BARO_EOC_GPIO) static const bmp085Config_t defaultBMP085Config = { .xclrIO = IO_TAG(BARO_XCLR_PIN), .eocIO = IO_TAG(BARO_EOC_PIN), }; bmp085Config = &defaultBMP085Config; #endif if (bmp085Detect(bmp085Config, dev)) { baroHardware = BARO_BMP085; break; } } #endif FALLTHROUGH; case BARO_MS5611: #if defined(USE_BARO_MS5611) || defined(USE_BARO_SPI_MS5611) if (ms5611Detect(dev)) { baroHardware = BARO_MS5611; break; } #endif FALLTHROUGH; case BARO_LPS: #if defined(USE_BARO_SPI_LPS) if (lpsDetect(dev)) { baroHardware = BARO_LPS; break; } #endif FALLTHROUGH; case BARO_BMP280: #if defined(USE_BARO_BMP280) || defined(USE_BARO_SPI_BMP280) if (bmp280Detect(dev)) { baroHardware = BARO_BMP280; break; } #endif FALLTHROUGH; case BARO_QMP6988: #if defined(USE_BARO_QMP6988) || defined(USE_BARO_SPI_QMP6988) if (qmp6988Detect(dev)) { baroHardware = BARO_QMP6988; break; } #endif FALLTHROUGH; case BARO_NONE: baroHardware = BARO_NONE; break; } if (baroHardware == BARO_NONE) { return false; } detectedSensors[SENSOR_INDEX_BARO] = baroHardware; sensorsSet(SENSOR_BARO); return true; }