diff --git a/Makefile b/Makefile index cf01b5b54f..97498d33bc 100644 --- a/Makefile +++ b/Makefile @@ -113,31 +113,33 @@ VALID_TARGETS := $(sort $(VALID_TARGETS)) GROUP_1_TARGETS := \ AFROMINI \ AIORACERF3 \ - AIR32 \ - AIRBOTF4 \ - AIRHEROF3 \ - ALIENFLIGHTF1 \ + AIR32 \ + AIRBOTF4 \ + AIRBOTF4SD \ + AIRHEROF3 \ + ALIENFLIGHTF1 \ ALIENFLIGHTF3 \ ALIENFLIGHTF4 \ ALIENFLIGHTNGF7 \ - ANYFCF7 \ - BEEBRAIN \ + ANYFCF7 \ + BEEBRAIN \ BEEROTORF4 \ BETAFLIGHTF3 \ + BLUEJAYF4 \ CC3D \ - CC3D_OPBL \ + CC3D_OPBL \ + +GROUP_2_TARGETS := \ CHEBUZZF3 \ CJMCU \ CL_RACINGF4 \ COLIBRI \ - -GROUP_2_TARGETS := \ COLIBRI_OPBL \ COLIBRI_RACE \ DOGE \ ELLE0 \ F4BY \ - FISHDRONEF4 \ + FISHDRONEF4 \ FLIP32F3OSD \ FURYF3 \ FURYF4 \ @@ -145,35 +147,35 @@ GROUP_2_TARGETS := \ IMPULSERCF3 \ IRCFUSIONF3 \ ISHAPEDF3 \ - BLUEJAYF4 \ - KAKUTEF4 \ - KISSCC \ GROUP_3_TARGETS := \ + KAKUTEF4 \ + KISSCC \ KIWIF4 \ LUX_RACE \ LUXV2_RACE \ MICROSCISKY \ - MOTOLAB \ + MOTOLAB \ MULTIFLITEPICO \ NAZE \ NERO \ + NUCLEOF7 \ OMNIBUS \ + OMNIBUSF4 \ OMNIBUSF4SD \ PIKOBLX \ PLUMF4 \ PODIUMF4 \ - RACEBASE \ + +GROUP_4_TARGETS := \ RCEXPLORERF3 \ REVO \ REVO_OPBL \ REVOLT \ REVONANO \ - -GROUP_4_TARGETS := \ RMDO \ SINGULARITY \ - SIRINFPV \ + SIRINFPV \ SOULF4 \ SPARKY \ SPARKY2 \ @@ -181,10 +183,8 @@ GROUP_4_TARGETS := \ SPRACINGF3EVO \ SPRACINGF3MINI \ SPRACINGF3NEO \ - KROOZX \ - NUCLEOF7 \ - OMNIBUSF4 \ STM32F3DISCOVERY \ + TINYBEEF3 \ GROUP_OTHER_TARGETS := $(filter-out $(GROUP_1_TARGETS) $(GROUP_2_TARGETS) $(GROUP_3_TARGETS) $(GROUP_4_TARGETS), $(VALID_TARGETS)) diff --git a/src/main/drivers/accgyro_mpu.h b/src/main/drivers/accgyro_mpu.h index a4666549b8..4ba15bf3f1 100644 --- a/src/main/drivers/accgyro_mpu.h +++ b/src/main/drivers/accgyro_mpu.h @@ -175,9 +175,10 @@ typedef enum { MPU_65xx_I2C, MPU_65xx_SPI, MPU_9250_SPI, - ICM_20689_SPI, - ICM_20608_SPI, + ICM_20601_SPI, ICM_20602_SPI, + ICM_20608_SPI, + ICM_20689_SPI, BMI_160_SPI, } mpuSensor_e; diff --git a/src/main/drivers/accgyro_mpu6500.h b/src/main/drivers/accgyro_mpu6500.h index 7a13bf26f7..a176543e55 100644 --- a/src/main/drivers/accgyro_mpu6500.h +++ b/src/main/drivers/accgyro_mpu6500.h @@ -20,8 +20,9 @@ #define MPU6500_WHO_AM_I_CONST (0x70) #define MPU9250_WHO_AM_I_CONST (0x71) #define MPU9255_WHO_AM_I_CONST (0x73) -#define ICM20608G_WHO_AM_I_CONST (0xAF) +#define ICM20601_WHO_AM_I_CONST (0xAC) #define ICM20602_WHO_AM_I_CONST (0x12) +#define ICM20608G_WHO_AM_I_CONST (0xAF) #define MPU6500_BIT_RESET (0x80) diff --git a/src/main/drivers/accgyro_spi_mpu6500.c b/src/main/drivers/accgyro_spi_mpu6500.c index 928f13ff68..e1e82e793a 100755 --- a/src/main/drivers/accgyro_spi_mpu6500.c +++ b/src/main/drivers/accgyro_spi_mpu6500.c @@ -91,12 +91,15 @@ uint8_t mpu6500SpiDetect(const busDevice_t *bus) case MPU9255_WHO_AM_I_CONST: mpuDetected = MPU_9250_SPI; break; - case ICM20608G_WHO_AM_I_CONST: - mpuDetected = ICM_20608_SPI; + case ICM20601_WHO_AM_I_CONST: + mpuDetected = ICM_20601_SPI; break; case ICM20602_WHO_AM_I_CONST: mpuDetected = ICM_20602_SPI; break; + case ICM20608G_WHO_AM_I_CONST: + mpuDetected = ICM_20608_SPI; + break; default: mpuDetected = MPU_NONE; } diff --git a/src/main/fc/cli.c b/src/main/fc/cli.c index 1bfe384725..2e32aed022 100755 --- a/src/main/fc/cli.c +++ b/src/main/fc/cli.c @@ -170,9 +170,11 @@ static const char * const lookupTableAccHardware[] = { "MPU6000", "MPU6500", "MPU9250", - "ICM20689", + "ICM20601", "ICM20602", - "BMI160", + "ICM20608", + "ICM20689", + "BMI160", "FAKE" }; @@ -207,8 +209,8 @@ static const char * const sensorTypeNames[] = { #define SENSOR_NAMES_MASK (SENSOR_GYRO | SENSOR_ACC | SENSOR_BARO | SENSOR_MAG) static const char * const sensorHardwareNames[4][16] = { - { "", "None", "MPU6050", "L3G4200D", "MPU3050", "L3GD20", "MPU6000", "MPU6500", "MPU9250", "ICM20689", "ICM20608G", "ICM20602", "BMI160", "FAKE", NULL }, - { "", "None", "ADXL345", "MPU6050", "MMA845x", "BMA280", "LSM303DLHC", "MPU6000", "MPU6500", "ICM20689", "MPU9250", "ICM20608G", "ICM20602", "BMI160", "FAKE", NULL }, + { "", "None", "MPU6050", "L3G4200D", "MPU3050", "L3GD20", "MPU6000", "MPU6500", "MPU9250", "ICM20601", "ICM20602", "ICM20608G", "ICM20689", "BMI160", "FAKE", NULL }, + { "", "None", "ADXL345", "MPU6050", "MMA845x", "BMA280", "LSM303DLHC", "MPU6000", "MPU6500", "MPU9250", "ICM20601", "ICM20602", "ICM20608G", "ICM20689", "BMI160", "FAKE", NULL }, { "", "None", "BMP085", "MS5611", "BMP280", NULL }, { "", "None", "HMC5883", "AK8975", "AK8963", NULL } }; diff --git a/src/main/sensors/acceleration.c b/src/main/sensors/acceleration.c index d4dec6b468..9539ae8c50 100644 --- a/src/main/sensors/acceleration.c +++ b/src/main/sensors/acceleration.c @@ -214,8 +214,9 @@ retry: #endif ; // fallthrough case ACC_MPU6500: - case ACC_ICM20608G: + case ACC_ICM20601: case ACC_ICM20602: + case ACC_ICM20608G: #if defined(USE_ACC_MPU6500) || defined(USE_ACC_SPI_MPU6500) #ifdef USE_ACC_SPI_MPU6500 if (mpu6500AccDetect(dev) || mpu6500SpiAccDetect(dev)) @@ -230,12 +231,15 @@ retry: case MPU_9250_SPI: accHardware = ACC_MPU9250; break; - case ICM_20608_SPI: - accHardware = ACC_ICM20608G; + case ICM_20601_SPI: + accHardware = ACC_ICM20601; break; case ICM_20602_SPI: accHardware = ACC_ICM20602; break; + case ICM_20608_SPI: + accHardware = ACC_ICM20608G; + break; default: accHardware = ACC_MPU6500; } diff --git a/src/main/sensors/acceleration.h b/src/main/sensors/acceleration.h index 8ea59f1e01..2560dfd96c 100644 --- a/src/main/sensors/acceleration.h +++ b/src/main/sensors/acceleration.h @@ -32,10 +32,11 @@ typedef enum { ACC_LSM303DLHC, ACC_MPU6000, ACC_MPU6500, - ACC_ICM20689, ACC_MPU9250, - ACC_ICM20608G, + ACC_ICM20601, ACC_ICM20602, + ACC_ICM20608G, + ACC_ICM20689, ACC_BMI160, ACC_FAKE } accelerationSensor_e; diff --git a/src/main/sensors/gyro.c b/src/main/sensors/gyro.c index 65c2edadf3..ac374c7a14 100644 --- a/src/main/sensors/gyro.c +++ b/src/main/sensors/gyro.c @@ -87,7 +87,7 @@ static void *notchFilter2[3]; #ifdef STM32F10X #define GYRO_SYNC_DENOM_DEFAULT 8 -#elif defined(USE_GYRO_SPI_MPU6000) || defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_ICM20689) +#elif defined(USE_GYRO_SPI_MPU6000) || defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_ICM20601) || defined(USE_GYRO_SPI_ICM20689) #define GYRO_SYNC_DENOM_DEFAULT 1 #else #define GYRO_SYNC_DENOM_DEFAULT 4 @@ -111,7 +111,7 @@ PG_RESET_TEMPLATE(gyroConfig_t, gyroConfig, .gyro_soft_notch_cutoff_2 = 100 ); -#if defined(USE_GYRO_MPU6050) || defined(USE_GYRO_MPU3050) || defined(USE_GYRO_MPU6500) || defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_MPU6000) || defined(USE_ACC_MPU6050) || defined(USE_GYRO_SPI_MPU9250) || defined(USE_GYRO_SPI_ICM20689) +#if defined(USE_GYRO_MPU6050) || defined(USE_GYRO_MPU3050) || defined(USE_GYRO_MPU6500) || defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_MPU6000) || defined(USE_ACC_MPU6050) || defined(USE_GYRO_SPI_MPU9250) || defined(USE_GYRO_SPI_ICM20601) || defined(USE_GYRO_SPI_ICM20689) static const extiConfig_t *selectMPUIntExtiConfig(void) { #if defined(MPU_INT_EXTI) @@ -204,8 +204,9 @@ STATIC_UNIT_TESTED gyroSensor_e gyroDetect(gyroDev_t *dev) #if defined(USE_GYRO_MPU6500) || defined(USE_GYRO_SPI_MPU6500) case GYRO_MPU6500: - case GYRO_ICM20608G: + case GYRO_ICM20601: case GYRO_ICM20602: + case GYRO_ICM20608G: #ifdef USE_GYRO_SPI_MPU6500 if (mpu6500GyroDetect(dev) || mpu6500SpiGyroDetect(dev)) { #else @@ -215,12 +216,15 @@ STATIC_UNIT_TESTED gyroSensor_e gyroDetect(gyroDev_t *dev) case MPU_9250_SPI: gyroHardware = GYRO_MPU9250; break; - case ICM_20608_SPI: - gyroHardware = GYRO_ICM20608G; + case ICM_20601_SPI: + gyroHardware = GYRO_ICM20601; break; case ICM_20602_SPI: gyroHardware = GYRO_ICM20602; break; + case ICM_20608_SPI: + gyroHardware = GYRO_ICM20608G; + break; default: gyroHardware = GYRO_MPU6500; } @@ -289,7 +293,7 @@ STATIC_UNIT_TESTED gyroSensor_e gyroDetect(gyroDev_t *dev) bool gyroInit(void) { memset(&gyro, 0, sizeof(gyro)); -#if defined(USE_GYRO_MPU6050) || defined(USE_GYRO_MPU3050) || defined(USE_GYRO_MPU6500) || defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_MPU6000) || defined(USE_ACC_MPU6050) || defined(USE_GYRO_SPI_MPU9250) || defined(USE_GYRO_SPI_ICM20689) +#if defined(USE_GYRO_MPU6050) || defined(USE_GYRO_MPU3050) || defined(USE_GYRO_MPU6500) || defined(USE_GYRO_SPI_MPU6500) || defined(USE_GYRO_SPI_MPU6000) || defined(USE_ACC_MPU6050) || defined(USE_GYRO_SPI_MPU9250) || defined(USE_GYRO_SPI_ICM20601) || defined(USE_GYRO_SPI_ICM20689) gyroDev0.mpuIntExtiConfig = selectMPUIntExtiConfig(); #ifdef USE_DUAL_GYRO // set cnsPin using GYRO_n_CS_PIN defined in target.h @@ -308,9 +312,10 @@ bool gyroInit(void) switch (gyroHardware) { case GYRO_MPU6500: case GYRO_MPU9250: - case GYRO_ICM20689: - case GYRO_ICM20608G: + case GYRO_ICM20601: case GYRO_ICM20602: + case GYRO_ICM20608G: + case GYRO_ICM20689: // do nothing, as gyro supports 32kHz break; default: diff --git a/src/main/sensors/gyro.h b/src/main/sensors/gyro.h index 053972403f..ac46fe2324 100644 --- a/src/main/sensors/gyro.h +++ b/src/main/sensors/gyro.h @@ -32,9 +32,10 @@ typedef enum { GYRO_MPU6000, GYRO_MPU6500, GYRO_MPU9250, - GYRO_ICM20689, - GYRO_ICM20608G, + GYRO_ICM20601, GYRO_ICM20602, + GYRO_ICM20608G, + GYRO_ICM20689, GYRO_BMI160, GYRO_FAKE } gyroSensor_e; diff --git a/src/main/target/REVO/AIRBOTF4SD.mk b/src/main/target/REVO/AIRBOTF4SD.mk new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/target/REVO/target.h b/src/main/target/REVO/target.h index f2891dac15..d290f49373 100644 --- a/src/main/target/REVO/target.h +++ b/src/main/target/REVO/target.h @@ -21,6 +21,10 @@ #define TARGET_BOARD_IDENTIFIER "AIR4" #define USBD_PRODUCT_STRING "AirbotF4" +#elif defined(AIRBOTF4SD) +#define TARGET_BOARD_IDENTIFIER "A4SD" +#define USBD_PRODUCT_STRING "AirbotF4SD" + #elif defined(REVOLT) #define TARGET_BOARD_IDENTIFIER "RVLT" #define USBD_PRODUCT_STRING "Revolt" @@ -53,7 +57,7 @@ #endif // Disable LED1, conflicts with AirbotF4/Flip32F4/Revolt beeper -#if defined(AIRBOTF4) +#if defined(AIRBOTF4) || defined(AIRBOTF4SD) #define BEEPER PB4 #define BEEPER_INVERTED #elif defined(REVOLT) @@ -68,7 +72,11 @@ #endif // PC0 used as inverter select GPIO +#ifdef AIRBOTF4SD +#define INVERTER_PIN_UART6 PD2 +#else #define INVERTER_PIN_UART1 PC0 +#endif #define MPU6000_CS_PIN PA4 #define MPU6000_SPI_INSTANCE SPI1 @@ -79,6 +87,15 @@ #define GYRO #define ACC +#ifdef AIRBOTF4SD +#define USE_GYRO_SPI_ICM20601 +#define ICM20601_CS_PIN PB13 // served through MPU6500 code +#define ICM20601_SPI_INSTANCE SPI1 +#define USE_DUAL_GYRO +#define GYRO_0_CS_PIN MPU6000_CS_PIN +#define GYRO_1_CS_PIN ICM20601_CS_PIN +#endif + #if defined(SOULF4) #define USE_GYRO_SPI_MPU6000 #define GYRO_MPU6000_ALIGN CW180_DEG @@ -126,15 +143,39 @@ #define BARO #define USE_BARO_MS5611 - #endif +#if defined(AIRBOTF4SD) +// SDCARD support for AIRBOTF4SD +#define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT +#define USE_SDCARD +#define USE_SDCARD_SPI3 + +#define SDCARD_DETECT_INVERTED +#define SDCARD_DETECT_PIN PC0 +#define SDCARD_SPI_INSTANCE SPI3 +#define SDCARD_SPI_CS_PIN SPI3_NSS_PIN + +// SPI2 is on the APB1 bus whose clock runs at 84MHz. Divide to under 400kHz for init: +#define SDCARD_SPI_INITIALIZATION_CLOCK_DIVIDER 256 // 328kHz +// Divide to under 25MHz for normal operation: +#define SDCARD_SPI_FULL_SPEED_CLOCK_DIVIDER 4 // 21MHz + +#define SDCARD_DMA_CHANNEL_TX DMA1_Stream5 +#define SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG DMA_FLAG_TCIF5 +#define SDCARD_DMA_CLK RCC_AHB1Periph_DMA1 +#define SDCARD_DMA_CHANNEL DMA_Channel_0 + +#else + #define M25P16_CS_PIN PB3 #define M25P16_SPI_INSTANCE SPI3 - #define USE_FLASHFS #define USE_FLASH_M25P16 +#endif // AIRBOTF4SD + + #define USE_VCP #if defined(PODIUMF4) #define VBUS_SENSING_PIN PA8 @@ -186,6 +227,10 @@ #define VBAT_ADC_CHANNEL ADC_Channel_13 #endif +#if defined(AIRBOTF4SD) +#define RSSI_ADC_PIN PA0 +#endif + #define DEFAULT_RX_FEATURE FEATURE_RX_SERIAL #if defined(PODIUMF4) #define SERIALRX_PROVIDER SERIALRX_SBUS @@ -207,12 +252,11 @@ #ifdef REVOLT #define USABLE_TIMER_CHANNEL_COUNT 11 #define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(4) | TIM_N(8) | TIM_N(12) ) -#else -#define USABLE_TIMER_CHANNEL_COUNT 12 -#ifdef AIRBOTF4 +#elif defined(AIRBOTF4) || defined(AIRBOTF4SD) +#define USABLE_TIMER_CHANNEL_COUNT 13 #define USED_TIMERS ( TIM_N(1) | TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(8) | TIM_N(12) ) #else +#define USABLE_TIMER_CHANNEL_COUNT 12 #define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(8) | TIM_N(12) ) -#endif // AIRBOTF4 -#endif // REVOLT +#endif diff --git a/src/main/target/REVO/target.mk b/src/main/target/REVO/target.mk index 3d8b57a8a6..c1844c7f13 100644 --- a/src/main/target/REVO/target.mk +++ b/src/main/target/REVO/target.mk @@ -1,5 +1,9 @@ F405_TARGETS += $(TARGET) -FEATURES += VCP ONBOARDFLASH +ifeq ($(TARGET), AIRBOTF4SD) +FEATURES = VCP SDCARD +else +FEATURES = VCP ONBOARDFLASH +endif TARGET_SRC = \ drivers/accgyro_spi_mpu6000.c \