diff --git a/docs/development/msp/README.md b/docs/development/msp/README.md
index f35a79211b4..5ec4d1be69d 100644
--- a/docs/development/msp/README.md
+++ b/docs/development/msp/README.md
@@ -461,6 +461,9 @@ When the MSP JSON specification changes, bump `msp_messages.json` version:
[8744 - MSP2_INAV_TIMESYNC](#msp2_inav_timesync)
[8752 - MSP2_INAV_SET_AUX_RC](#msp2_inav_set_aux_rc)
[8753 - MSP2_INAV_WIND](#msp2_inav_wind)
+[8754 - MSP2_INAV_MAG_UNALIGNED](#msp2_inav_mag_unaligned)
+[8755 - MSP2_INAV_ESC_SRXL2_STATUS](#msp2_inav_esc_srxl2_status)
+[8756 - MSP2_INAV_ESC_SRXL2_CALIBRATE](#msp2_inav_esc_srxl2_calibrate)
[12288 - MSP2_BETAFLIGHT_BIND](#msp2_betaflight_bind)
[12289 - MSP2_RX_BIND](#msp2_rx_bind)
@@ -4878,6 +4881,46 @@ When the MSP JSON specification changes, bump `msp_messages.json` version:
**Notes:** Requires `USE_WIND_ESTIMATOR`; returns zeroes when wind estimation is not compiled in or not yet valid. Check bit 0 of `flags` before using speed/angle values.
+## `MSP2_INAV_MAG_UNALIGNED (8754 / 0x2232)`
+**Description:** Reads the unaligned magnetometer vector.
+
+**Request Payload:** **None**
+
+**Reply Payload:**
+|Field|C Type|Size (Bytes)|Description|
+|---|---|---|---|
+| `magADCUnaligned` | `int16_t[3]` | 6 | X, Y and Z components, rounded to signed 16-bit values. |
+
+**Notes:** Returns rounded mag.magADCUnaligned values before board alignment. Returns three zeroes without USE_MAG.
+
+## `MSP2_INAV_ESC_SRXL2_STATUS (8755 / 0x2233)`
+**Description:** Reads SRXL2 ESC calibration and connection status.
+
+**Request Payload:** **None**
+
+**Reply Payload:**
+|Field|C Type|Size (Bytes)|Description|
+|---|---|---|---|
+| `phase` | `uint8_t` | 1 | Calibration phase (srxl2CalPhase_e). |
+| `connected` | `uint8_t` | 1 | 1 when every opened ESC is connected; otherwise 0. |
+| `lastResult` | `uint8_t` | 1 | Last calibration start result (srxl2CalResult_e). |
+| `portCount` | `uint8_t` | 1 | Number of opened SRXL2 motor ports. |
+| `motorCount` | `uint8_t` | 1 | Number of motors in the current mixer. |
+
+**Notes:** Requires USE_MOTOR_SRXL2. Counts report opened motor ports and the current mixer motor count, not hardware capacity.
+
+## `MSP2_INAV_ESC_SRXL2_CALIBRATE (8756 / 0x2234)`
+**Description:** Controls SRXL2 ESC throttle-range calibration.
+
+**Request Payload:**
+|Field|C Type|Size (Bytes)|Description|
+|---|---|---|---|
+| `phase` | `uint8_t` | 1 | Requested calibration action (srxl2CalPhase_e): 0, 1, 4 or 5. |
+
+**Reply Payload:** **None**
+
+**Notes:** Requires USE_MOTOR_SRXL2 and at least one request byte. Accepted commands: 0 abort, 1 automatic start, 4 manual high, 5 manual low. Driver safety checks can reject start requests; read MSP2_INAV_ESC_SRXL2_STATUS for the reason. Other command values return an MSP error. Remove propellers before calibration.
+
## `MSP2_BETAFLIGHT_BIND (12288 / 0x3000)`
**Description:** Initiates the receiver binding procedure for supported serial protocols (CRSF, SRXL2).
diff --git a/docs/development/msp/inav_enums.json b/docs/development/msp/inav_enums.json
index 7f5e0f6f1cb..45b94ae26ca 100644
--- a/docs/development/msp/inav_enums.json
+++ b/docs/development/msp/inav_enums.json
@@ -833,48 +833,49 @@
"DEVHW_LPS25H": "17",
"DEVHW_SPL06": "18",
"DEVHW_BMP388": "19",
- "DEVHW_DPS310": "20",
- "DEVHW_B2SMPB": "21",
- "DEVHW_HMC5883": "22",
- "DEVHW_AK8963": "23",
- "DEVHW_AK8975": "24",
- "DEVHW_IST8310_0": "25",
- "DEVHW_IST8310_1": "26",
- "DEVHW_IST8308": "27",
- "DEVHW_QMC5883": "28",
- "DEVHW_QMC5883P": "29",
- "DEVHW_MAG3110": "30",
- "DEVHW_LIS3MDL": "31",
- "DEVHW_RM3100": "32",
- "DEVHW_VCM5883": "33",
- "DEVHW_MLX90393": "34",
- "DEVHW_LIS2MDL": "35",
- "DEVHW_LM75_0": "36",
- "DEVHW_LM75_1": "37",
- "DEVHW_LM75_2": "38",
- "DEVHW_LM75_3": "39",
- "DEVHW_LM75_4": "40",
- "DEVHW_LM75_5": "41",
- "DEVHW_LM75_6": "42",
- "DEVHW_LM75_7": "43",
- "DEVHW_DS2482": "44",
- "DEVHW_MAX7456": "45",
- "DEVHW_SRF10": "46",
- "DEVHW_VL53L0X": "47",
- "DEVHW_VL53L1X": "48",
- "DEVHW_US42": "49",
- "DEVHW_TOF10120_I2C": "50",
- "DEVHW_TERARANGER_EVO_I2C": "51",
- "DEVHW_MS4525": "52",
- "DEVHW_MS5525": "53",
- "DEVHW_DLVR": "54",
- "DEVHW_M25P16": "55",
- "DEVHW_W25N": "56",
- "DEVHW_UG2864": "57",
- "DEVHW_SDCARD": "58",
- "DEVHW_IRLOCK": "59",
- "DEVHW_PCF8574": "60",
- "DEVHW_INA226": "61"
+ "DEVHW_DPS310_0": "20",
+ "DEVHW_DPS310_1": "21",
+ "DEVHW_B2SMPB": "22",
+ "DEVHW_HMC5883": "23",
+ "DEVHW_AK8963": "24",
+ "DEVHW_AK8975": "25",
+ "DEVHW_IST8310_0": "26",
+ "DEVHW_IST8310_1": "27",
+ "DEVHW_IST8308": "28",
+ "DEVHW_QMC5883": "29",
+ "DEVHW_QMC5883P": "30",
+ "DEVHW_MAG3110": "31",
+ "DEVHW_LIS3MDL": "32",
+ "DEVHW_RM3100": "33",
+ "DEVHW_VCM5883": "34",
+ "DEVHW_MLX90393": "35",
+ "DEVHW_LIS2MDL": "36",
+ "DEVHW_LM75_0": "37",
+ "DEVHW_LM75_1": "38",
+ "DEVHW_LM75_2": "39",
+ "DEVHW_LM75_3": "40",
+ "DEVHW_LM75_4": "41",
+ "DEVHW_LM75_5": "42",
+ "DEVHW_LM75_6": "43",
+ "DEVHW_LM75_7": "44",
+ "DEVHW_DS2482": "45",
+ "DEVHW_MAX7456": "46",
+ "DEVHW_SRF10": "47",
+ "DEVHW_VL53L0X": "48",
+ "DEVHW_VL53L1X": "49",
+ "DEVHW_US42": "50",
+ "DEVHW_TOF10120_I2C": "51",
+ "DEVHW_TERARANGER_EVO_I2C": "52",
+ "DEVHW_MS4525": "53",
+ "DEVHW_MS5525": "54",
+ "DEVHW_DLVR": "55",
+ "DEVHW_M25P16": "56",
+ "DEVHW_W25N": "57",
+ "DEVHW_UG2864": "58",
+ "DEVHW_SDCARD": "59",
+ "DEVHW_IRLOCK": "60",
+ "DEVHW_PCF8574": "61",
+ "DEVHW_INA226": "62"
},
"deviceFlags_e": {
"_source": "inav/src/main/drivers/bus.h",
diff --git a/docs/development/msp/inav_enums_ref.md b/docs/development/msp/inav_enums_ref.md
index 87168663713..763911dc171 100644
--- a/docs/development/msp/inav_enums_ref.md
+++ b/docs/development/msp/inav_enums_ref.md
@@ -1460,48 +1460,49 @@
| `DEVHW_LPS25H` | 17 | |
| `DEVHW_SPL06` | 18 | |
| `DEVHW_BMP388` | 19 | |
-| `DEVHW_DPS310` | 20 | |
-| `DEVHW_B2SMPB` | 21 | |
-| `DEVHW_HMC5883` | 22 | |
-| `DEVHW_AK8963` | 23 | |
-| `DEVHW_AK8975` | 24 | |
-| `DEVHW_IST8310_0` | 25 | |
-| `DEVHW_IST8310_1` | 26 | |
-| `DEVHW_IST8308` | 27 | |
-| `DEVHW_QMC5883` | 28 | |
-| `DEVHW_QMC5883P` | 29 | |
-| `DEVHW_MAG3110` | 30 | |
-| `DEVHW_LIS3MDL` | 31 | |
-| `DEVHW_RM3100` | 32 | |
-| `DEVHW_VCM5883` | 33 | |
-| `DEVHW_MLX90393` | 34 | |
-| `DEVHW_LIS2MDL` | 35 | |
-| `DEVHW_LM75_0` | 36 | |
-| `DEVHW_LM75_1` | 37 | |
-| `DEVHW_LM75_2` | 38 | |
-| `DEVHW_LM75_3` | 39 | |
-| `DEVHW_LM75_4` | 40 | |
-| `DEVHW_LM75_5` | 41 | |
-| `DEVHW_LM75_6` | 42 | |
-| `DEVHW_LM75_7` | 43 | |
-| `DEVHW_DS2482` | 44 | |
-| `DEVHW_MAX7456` | 45 | |
-| `DEVHW_SRF10` | 46 | |
-| `DEVHW_VL53L0X` | 47 | |
-| `DEVHW_VL53L1X` | 48 | |
-| `DEVHW_US42` | 49 | |
-| `DEVHW_TOF10120_I2C` | 50 | |
-| `DEVHW_TERARANGER_EVO_I2C` | 51 | |
-| `DEVHW_MS4525` | 52 | |
-| `DEVHW_MS5525` | 53 | |
-| `DEVHW_DLVR` | 54 | |
-| `DEVHW_M25P16` | 55 | |
-| `DEVHW_W25N` | 56 | |
-| `DEVHW_UG2864` | 57 | |
-| `DEVHW_SDCARD` | 58 | |
-| `DEVHW_IRLOCK` | 59 | |
-| `DEVHW_PCF8574` | 60 | |
-| `DEVHW_INA226` | 61 | |
+| `DEVHW_DPS310_0` | 20 | |
+| `DEVHW_DPS310_1` | 21 | |
+| `DEVHW_B2SMPB` | 22 | |
+| `DEVHW_HMC5883` | 23 | |
+| `DEVHW_AK8963` | 24 | |
+| `DEVHW_AK8975` | 25 | |
+| `DEVHW_IST8310_0` | 26 | |
+| `DEVHW_IST8310_1` | 27 | |
+| `DEVHW_IST8308` | 28 | |
+| `DEVHW_QMC5883` | 29 | |
+| `DEVHW_QMC5883P` | 30 | |
+| `DEVHW_MAG3110` | 31 | |
+| `DEVHW_LIS3MDL` | 32 | |
+| `DEVHW_RM3100` | 33 | |
+| `DEVHW_VCM5883` | 34 | |
+| `DEVHW_MLX90393` | 35 | |
+| `DEVHW_LIS2MDL` | 36 | |
+| `DEVHW_LM75_0` | 37 | |
+| `DEVHW_LM75_1` | 38 | |
+| `DEVHW_LM75_2` | 39 | |
+| `DEVHW_LM75_3` | 40 | |
+| `DEVHW_LM75_4` | 41 | |
+| `DEVHW_LM75_5` | 42 | |
+| `DEVHW_LM75_6` | 43 | |
+| `DEVHW_LM75_7` | 44 | |
+| `DEVHW_DS2482` | 45 | |
+| `DEVHW_MAX7456` | 46 | |
+| `DEVHW_SRF10` | 47 | |
+| `DEVHW_VL53L0X` | 48 | |
+| `DEVHW_VL53L1X` | 49 | |
+| `DEVHW_US42` | 50 | |
+| `DEVHW_TOF10120_I2C` | 51 | |
+| `DEVHW_TERARANGER_EVO_I2C` | 52 | |
+| `DEVHW_MS4525` | 53 | |
+| `DEVHW_MS5525` | 54 | |
+| `DEVHW_DLVR` | 55 | |
+| `DEVHW_M25P16` | 56 | |
+| `DEVHW_W25N` | 57 | |
+| `DEVHW_UG2864` | 58 | |
+| `DEVHW_SDCARD` | 59 | |
+| `DEVHW_IRLOCK` | 60 | |
+| `DEVHW_PCF8574` | 61 | |
+| `DEVHW_INA226` | 62 | |
---
## `deviceFlags_e`
diff --git a/docs/development/msp/msp_messages.json b/docs/development/msp/msp_messages.json
index 176833915ad..9416201ebcc 100644
--- a/docs/development/msp/msp_messages.json
+++ b/docs/development/msp/msp_messages.json
@@ -11674,6 +11674,83 @@
},
"notes": "Requires a receiver using MSP as the protocol, sends MSP2_RX_BIND to the receiver.",
"description": "Initiates binding for MSP receivers (mLRS)."
+ },
+ "MSP2_INAV_MAG_UNALIGNED": {
+ "code": 8754,
+ "mspv": 2,
+ "request": null,
+ "reply": {
+ "payload": [
+ {
+ "name": "magADCUnaligned",
+ "ctype": "int16_t",
+ "desc": "X, Y and Z components, rounded to signed 16-bit values.",
+ "units": "",
+ "array": true,
+ "array_size": 3
+ }
+ ]
+ },
+ "notes": "Returns rounded mag.magADCUnaligned values before board alignment. Returns three zeroes without USE_MAG.",
+ "description": "Reads the unaligned magnetometer vector."
+ },
+ "MSP2_INAV_ESC_SRXL2_STATUS": {
+ "code": 8755,
+ "mspv": 2,
+ "request": null,
+ "reply": {
+ "payload": [
+ {
+ "name": "phase",
+ "ctype": "uint8_t",
+ "desc": "Calibration phase (srxl2CalPhase_e).",
+ "units": ""
+ },
+ {
+ "name": "connected",
+ "ctype": "uint8_t",
+ "desc": "1 when every opened ESC is connected; otherwise 0.",
+ "units": ""
+ },
+ {
+ "name": "lastResult",
+ "ctype": "uint8_t",
+ "desc": "Last calibration start result (srxl2CalResult_e).",
+ "units": ""
+ },
+ {
+ "name": "portCount",
+ "ctype": "uint8_t",
+ "desc": "Number of opened SRXL2 motor ports.",
+ "units": ""
+ },
+ {
+ "name": "motorCount",
+ "ctype": "uint8_t",
+ "desc": "Number of motors in the current mixer.",
+ "units": ""
+ }
+ ]
+ },
+ "notes": "Requires USE_MOTOR_SRXL2. Counts report opened motor ports and the current mixer motor count, not hardware capacity.",
+ "description": "Reads SRXL2 ESC calibration and connection status."
+ },
+ "MSP2_INAV_ESC_SRXL2_CALIBRATE": {
+ "code": 8756,
+ "mspv": 2,
+ "request": {
+ "payload": [
+ {
+ "name": "phase",
+ "ctype": "uint8_t",
+ "desc": "Requested calibration action (srxl2CalPhase_e): 0, 1, 4 or 5.",
+ "units": ""
+ }
+ ]
+ },
+ "reply": null,
+ "notes": "Requires USE_MOTOR_SRXL2 and at least one request byte. Accepted commands: 0 abort, 1 automatic start, 4 manual high, 5 manual low. Driver safety checks can reject start requests; read MSP2_INAV_ESC_SRXL2_STATUS for the reason. Other command values return an MSP error. Remove propellers before calibration.",
+ "description": "Controls SRXL2 ESC throttle-range calibration."
}
}
}
diff --git a/src/main/drivers/barometer/barometer_dps310.c b/src/main/drivers/barometer/barometer_dps310.c
index 663dcb27117..7b4fa7579eb 100644
--- a/src/main/drivers/barometer/barometer_dps310.c
+++ b/src/main/drivers/barometer/barometer_dps310.c
@@ -343,18 +343,23 @@ static bool deviceDetect(busDevice_t * busDev)
bool baroDPS310Detect(baroDev_t *baro)
{
- baro->busDev = busDeviceInit(BUSTYPE_ANY, DEVHW_DPS310, 0, OWNER_BARO);
- if (baro->busDev == NULL) {
- return false;
- }
+ // The sensor may sit on either of its two I2C addresses, depending on how SDO is wired
+ bool detected = false;
- if (!deviceDetect(baro->busDev)) {
- busDeviceDeInit(baro->busDev);
- return false;
+ for (uint8_t index = 0; index < 2 && !detected; index++) {
+ baro->busDev = busDeviceInit(BUSTYPE_ANY, DEVHW_DPS310_0 + index, 0, OWNER_BARO);
+ if (baro->busDev == NULL) {
+ continue;
+ }
+
+ if (deviceDetect(baro->busDev) && deviceConfigure(baro->busDev)) {
+ detected = true;
+ } else {
+ busDeviceDeInit(baro->busDev);
+ }
}
- if (!deviceConfigure(baro->busDev)) {
- busDeviceDeInit(baro->busDev);
+ if (!detected) {
return false;
}
diff --git a/src/main/drivers/bus.h b/src/main/drivers/bus.h
index 75da648427b..0416f516ea1 100644
--- a/src/main/drivers/bus.h
+++ b/src/main/drivers/bus.h
@@ -98,7 +98,8 @@ typedef enum {
DEVHW_LPS25H,
DEVHW_SPL06,
DEVHW_BMP388,
- DEVHW_DPS310,
+ DEVHW_DPS310_0,
+ DEVHW_DPS310_1,
DEVHW_B2SMPB,
/* Compass chips */
diff --git a/src/main/target/HUMMINGBIRD_FC305/target.c b/src/main/target/HUMMINGBIRD_FC305/target.c
index 275d3f27935..476d31c71b3 100644
--- a/src/main/target/HUMMINGBIRD_FC305/target.c
+++ b/src/main/target/HUMMINGBIRD_FC305/target.c
@@ -27,7 +27,7 @@
BUSDEV_REGISTER_SPI_TAG(busdev_icm42688, DEVHW_ICM42605, ICM42605_SPI_BUS, ICM42605_CS_PIN, NONE, 0, DEVFLAGS_NONE, IMU_ICM42605_ALIGN);
BUSDEV_REGISTER_SPI(busdev_sdcard_spi, DEVHW_SDCARD, SDCARD_SPI_BUS, SDCARD_CS_PIN, NONE, DEVFLAGS_SPI_MODE_0, 0);
BUSDEV_REGISTER_SPI(busdev_max7456, DEVHW_MAX7456, MAX7456_SPI_BUS, MAX7456_CS_PIN, NONE, DEVFLAGS_USE_RAW_REGISTERS, 0);
-BUSDEV_REGISTER_I2C(busdev_dps310, DEVHW_DPS310, BARO_I2C_BUS, DPS310_I2C_ADDR, NONE, DEVFLAGS_NONE, 0);
+BUSDEV_REGISTER_I2C(busdev_dps310_0, DEVHW_DPS310_0, BARO_I2C_BUS, DPS310_I2C_ADDR, NONE, DEVFLAGS_NONE, 0);
BUSDEV_REGISTER_I2C(busdev_qmc5883, DEVHW_QMC5883, MAG_I2C_BUS, 0x0D, NONE, DEVFLAGS_NONE, 0);
BUSDEV_REGISTER_I2C(busdev_hmc5883, DEVHW_HMC5883, MAG_I2C_BUS, 0x1E, NONE, DEVFLAGS_NONE, 0);
diff --git a/src/main/target/common_hardware.c b/src/main/target/common_hardware.c
index f59d87c0be2..a8a85336259 100755
--- a/src/main/target/common_hardware.c
+++ b/src/main/target/common_hardware.c
@@ -175,15 +175,19 @@
#if defined(USE_BARO_DPS310)
#if defined(DPS310_SPI_BUS)
- BUSDEV_REGISTER_SPI(busdev_dps310, DEVHW_DPS310, DPS310_SPI_BUS, DPS310_CS_PIN, NONE, DEVFLAGS_NONE, 0);
+ BUSDEV_REGISTER_SPI(busdev_dps310_0, DEVHW_DPS310_0, DPS310_SPI_BUS, DPS310_CS_PIN, NONE, DEVFLAGS_NONE, 0);
#elif defined(DPS310_I2C_BUS) || defined(BARO_I2C_BUS)
#if !defined(DPS310_I2C_BUS)
#define DPS310_I2C_BUS BARO_I2C_BUS
#endif
- #if !defined(DPS310_I2C_ADDR)
- #define DPS310_I2C_ADDR (0x76)
+ #if defined(DPS310_I2C_ADDR)
+ BUSDEV_REGISTER_I2C(busdev_dps310_0, DEVHW_DPS310_0, DPS310_I2C_BUS, DPS310_I2C_ADDR, NONE, DEVFLAGS_NONE, 0);
+ #else
+ // The DPS310 answers on 0x77 when SDO is pulled high and on 0x76 when it is pulled low.
+ // Both wirings are in use, so register both and let the driver probe them
+ BUSDEV_REGISTER_I2C(busdev_dps310_0, DEVHW_DPS310_0, DPS310_I2C_BUS, 0x76, NONE, DEVFLAGS_NONE, 0);
+ BUSDEV_REGISTER_I2C(busdev_dps310_1, DEVHW_DPS310_1, DPS310_I2C_BUS, 0x77, NONE, DEVFLAGS_NONE, 0);
#endif
- BUSDEV_REGISTER_I2C(busdev_dps310, DEVHW_DPS310, DPS310_I2C_BUS, DPS310_I2C_ADDR, NONE, DEVFLAGS_NONE, 0);
#endif
#endif