{"id":9138,"date":"2026-10-11T01:57:16","date_gmt":"2026-10-11T07:57:16","guid":{"rendered":"https:\/\/www.openflyworld.com\/?page_id=9138"},"modified":"2026-10-11T02:54:58","modified_gmt":"2026-10-11T08:54:58","slug":"betaflight-dps368-barometer-driver-porting-summary","status":"publish","type":"page","link":"https:\/\/www.openflyworld.com\/?page_id=9138","title":{"rendered":"Betaflight DPS368 Barometer Driver Porting Guide"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Draft<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Openflyworld Technical Documentation<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Overview<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Openflyworld flight controllers use the Infineon DPS368 digital barometric pressure sensor. However, the Betaflight firmware version used by Openflyworld does not provide a dedicated driver for this sensor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Due to similarities between the DPS368 and DPS310 sensors, the existing Betaflight DPS310 driver is commonly used as a compatibility workaround.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To provide dedicated support for the DPS368, Openflyworld has adapted the existing Betaflight DPS310 driver to create a DPS368-specific driver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The DPS368 driver is based on the original Betaflight DPS310 driver. It was developed by following the DPS310 driver&#8217;s code structure and implementation, with modifications made to support the DPS368 sensor. It is not an independently developed driver written entirely from scratch.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Purpose of This Document<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This document summarizes the modifications required to port the DPS310 driver for DPS368 support.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is intended for developers and Openflyworld customers who wish to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Recompile Betaflight firmware for Openflyworld flight controllers.<\/li>\n\n\n\n<li>Integrate the DPS368 driver into their own Betaflight source code.<\/li>\n\n\n\n<li>Understand the changes made to the original DPS310 driver.<\/li>\n\n\n\n<li>Maintain or update customized Betaflight firmware.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Important Notes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Driver Origin and Attribution<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The DPS368 driver is a derivative implementation based on the existing DPS310 driver from the open-source Betaflight project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Openflyworld acknowledges the original Betaflight developers and contributors for their work on the DPS310 driver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The DPS368 adaptation should retain applicable original copyright notices and comply with the licensing requirements of the Betaflight project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Compatibility<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This driver is an Openflyworld modification and should not be considered part of the official Betaflight firmware unless it has been accepted into the upstream project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Users compiling customized firmware should verify compatibility with their specific Betaflight version and flight controller hardware.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. DPS368 Driver Porting Procedure<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">4.1 `src\/main\/drivers\/barometer\/barometer.h`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Change: Add `BARO_DPS368` enum entry inside `baroSensor_e`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why: This enum defines all supported barometer hardware IDs for Betaflight CLI, sensor detection and configuration storage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">typedef enum {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_DEFAULT = 0,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_NONE = 1,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_BMP085 = 2,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_MS5611 = 3,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_BMP280 = 4,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_LPS = 5,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_QMP6988 = 6,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_BMP388 = 7,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_DPS310 = 8,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_2SMPB_02B = 9,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_LPS22DF = 10,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_VIRTUAL = 11,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; BARO_DPS368 = 12, \/\/ &lt;&lt;&lt; Added<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">} baroSensor_e;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;4.2 `src\/main\/sensors\/barometer.c`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Change: Add `case BARO_DPS368:` in barometer detection switch block<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why: When Betaflight scans barometer sensors or user manually sets `baro_hardware = DPS368`, this branch invokes `baroDPS368Detect()` probe function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">case BARO_DPS310:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#if defined(USE_BARO_DPS310)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (baroDPS310Detect(&amp;baro.dev)) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; baroHardware = BARO_DPS310;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#endif<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">break;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">case BARO_DPS368: \/\/ &lt;&lt;&lt; Added<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#if defined(USE_BARO_DPS368)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (baroDPS368Detect(&amp;baro.dev)) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; baroHardware = BARO_DPS368;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#endif<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">break;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;4.3 `mk\/source.mk`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Change: Add driver source file entry under barometer source list<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why: Makefile build script, tells compiler to compile `barometer_dps368.c` only when `USE_BARO_DPS368` is enabled.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">drivers\/barometer\/barometer_dps310.c \\<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">drivers\/barometer\/barometer_dps368.c \\ # &lt;&lt;&lt; Added<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;4.4 Target `config.h` (your target header, e.g STM32H743 target)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Change: Add compile macro definition<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why: Enable conditional compilation for DPS368 driver, only build this driver when this macro exists.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define USE_BARO_DPS368<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;4.5 `src\/main\/drivers\/barometer\/barometer_dps368.c` (NEW FILE)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Change: Create new driver source file<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why: Full DPS368 read, coefficient parsing, measurement setup and sensor detection logic. The driver reuses Betaflight native bus API (I2C). Extra register check for `COEF_SRCE (0x28)` to separate DPS310 \/ DPS368.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> Full source of `barometer_dps368.c` <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/*<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* This file is part of Betaflight.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* This Source Code Form is subject to the terms of the Mozilla Public<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* License, v. 2.0. If a copy of the MPL was not distributed with this file,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* You can obtain one at [http:\/\/mozilla.org\/MPL\/2.0\/](http:\/\/mozilla.org\/MPL\/2.0\/).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* Alternatively, the contents of this file may be used under the terms<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* of the GNU General Public License Version 3, as described below:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* This file is free software: you may copy, redistribute and\/or modify<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* it under the terms of the GNU General Public License as published by the<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* Free Software Foundation, either version 3 of the License, or (at your<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* option) any later version.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* This file is distributed in the hope that it will be useful, but<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* WITHOUT ANY WARRANTY; without even the implied warranty of<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* Public License for more details.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* You should have received a copy of the GNU General Public License<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* along with this program. If not, see [http:\/\/www.gnu.org\/licenses\/](http:\/\/www.gnu.org\/licenses\/).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &lt;stdbool.h&gt;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &lt;stdint.h&gt;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &lt;string.h&gt;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;platform.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;build\/build_config.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;build\/debug.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;common\/utils.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;common\/maths.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;drivers\/io.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;drivers\/bus.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;drivers\/bus_spi.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;drivers\/time.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#include &#8220;drivers\/barometer\/barometer.h&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#if defined(USE_BARO) &amp;&amp; defined(USE_BARO_DPS368)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_I2C_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x77<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_PSR_B2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x00<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_TMP_B2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x03<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_PRS_CFG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x06<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_TMP_CFG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x07<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_MEAS_CFG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x08<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_RESET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0C<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0D<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_COEF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x10<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_REG_COEF_SRCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x28<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_CHIP_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (0x10)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#define DPS368_RESET_BIT_SOFT_RST&nbsp;&nbsp; (0x09)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">typedef struct {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c0;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c1;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c00;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c01;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c10;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c11;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c20;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c21;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; int32_t c30;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">} dps368Coef_t;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static dps368Coef_t dpsCoef;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static int32_t rawTemp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static int32_t rawPress;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Read multiple bytes from register buffer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param dev extDevice bus handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param reg target register address<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param data output buffer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param len number of bytes to read<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on success<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368ReadRegisterBuffer(extDevice_t *dev, uint8_t reg, uint8_t *data, uint8_t len)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return busReadRegisterBuffer(dev, reg, data, len);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Write single byte to register<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param dev extDevice bus handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param reg target register address<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param data value to write<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on success<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368WriteRegister(extDevice_t *dev, uint8_t reg, uint8_t data)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return busWriteRegister(dev, reg, data);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Perform software reset on DPS368<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param dev extDevice bus handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static void dps368Reset(extDevice_t *dev)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dps368WriteRegister(dev, DPS368_REG_RESET, DPS368_RESET_BIT_SOFT_RST);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; delay(10);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Read and parse calibration coefficients<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param dev extDevice bus handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true if coefficients read successfully<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368ReadCoefficients(extDevice_t *dev)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; uint8_t raw[18];<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (!dps368ReadRegisterBuffer(dev, DPS368_REG_COEF, raw, 18)) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c0&nbsp; = ((int16_t)((raw[0] &lt;&lt; 4) | (raw[1] &gt;&gt; 4)));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c0 &amp; 0x800)&nbsp; dpsCoef.c0&nbsp; -= 0x1000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c1&nbsp; = ((int16_t)(((raw[1] &amp; 0x0F) &lt;&lt; 8) | raw[2]));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c1 &amp; 0x800)&nbsp; dpsCoef.c1&nbsp; -= 0x1000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c00 = ((int32_t)((raw[3] &lt;&lt; 12) | (raw[4] &lt;&lt; 4) | (raw[5] &gt;&gt; 4)));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c00 &amp; 0x80000) dpsCoef.c00 -= 0x100000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c01 = ((int32_t)(((raw[5] &amp; 0x0F) &lt;&lt; 16) | (raw[6] &lt;&lt; 8) | raw[7]));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c01 &amp; 0x80000) dpsCoef.c01 -= 0x100000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c10 = ((int32_t)((raw[8] &lt;&lt; 12) | (raw[9] &lt;&lt; 4) | (raw[10] &gt;&gt; 4)));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c10 &amp; 0x80000) dpsCoef.c10 -= 0x100000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c11 = ((int32_t)(((raw[10] &amp; 0x0F) &lt;&lt; 16) | (raw[11] &lt;&lt; 8) | raw[12]));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c11 &amp; 0x80000) dpsCoef.c11 -= 0x100000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c20 = ((int32_t)((raw[13] &lt;&lt; 12) | (raw[14] &lt;&lt; 4) | (raw[15] &gt;&gt; 4)));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c20 &amp; 0x80000) dpsCoef.c20 -= 0x100000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c21 = ((int32_t)(((raw[15] &amp; 0x0F) &lt;&lt; 16) | (raw[16] &lt;&lt; 8) | raw[17]));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (dpsCoef.c21 &amp; 0x80000) dpsCoef.c21 -= 0x100000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dpsCoef.c30 = ((int16_t)((raw[17] &lt;&lt; 4)));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Prepare temperature sensor before read<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param baro barometer device handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on success<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368StartUT(baroDev_t *baro)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; UNUSED(baro);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Read raw temperature sample<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param baro barometer device handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on success<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368ReadUT(baroDev_t *baro)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; extDevice_t *dev = &amp;baro-&gt;dev;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; uint8_t buf[3];<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (!dps368ReadRegisterBuffer(dev, DPS368_REG_TMP_B2, buf, 3)) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; rawTemp = (int32_t)((buf[0] &lt;&lt; 16) | (buf[1] &lt;&lt; 8) | buf[2]);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (rawTemp &amp; 0x800000) rawTemp -= 0x1000000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Wait for temperature measurement ready<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param baro barometer device handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on measurement ready<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368GetUT(baroDev_t *baro)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; UNUSED(baro);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Prepare pressure sensor before read<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param baro barometer device handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on success<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368StartUP(baroDev_t *baro)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; UNUSED(baro);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Read raw pressure sample<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param baro barometer device handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on success<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368ReadUP(baroDev_t *baro)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; extDevice_t *dev = &amp;baro-&gt;dev;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; uint8_t buf[3];<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (!dps368ReadRegisterBuffer(dev, DPS368_REG_PSR_B2, buf, 3)) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; rawPress = (int32_t)((buf[0] &lt;&lt; 16) | (buf[1] &lt;&lt; 8) | buf[2]);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (rawPress &amp; 0x800000) rawPress -= 0x1000000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Wait for pressure measurement ready<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param baro barometer device handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true on measurement ready<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static bool dps368GetUP(baroDev_t *baro)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; UNUSED(baro);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief Calculate compensated pressure and temperature<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param pressure output pressure in centi-Pascal<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param temperature output temperature in centi-degree Celsius<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">static void dps368Calculate(int32_t *pressure, int32_t *temperature)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; const float tRawScaled = rawTemp \/ 1048576.0f;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; const float pRawScaled = rawPress \/ 1048576.0f;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; const float temp = dpsCoef.c0 * 0.5f + dpsCoef.c1 * tRawScaled;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; const float press = dpsCoef.c00<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + pRawScaled * (dpsCoef.c10 + pRawScaled * (dpsCoef.c20 + pRawScaled * dpsCoef.c30))<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + tRawScaled * (dpsCoef.c01 + pRawScaled * (dpsCoef.c11 + pRawScaled * dpsCoef.c21));<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; *temperature = (int32_t)(temp * 100.0f);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; *pressure&nbsp;&nbsp;&nbsp; = (int32_t)(press * 100.0f);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @brief DPS368 sensor detection and initialization<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @param baro barometer device handle<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @return true if DPS368 detected and initialized<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* @note DPS310 and DPS368 share same chip ID 0x10.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* DPS310 has COEF_SRCE register(0x28), DPS368 does NOT have this register.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;* Read 0x28, if returns not 0xFF, treat it as DPS310 and reject.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;*\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bool baroDPS368Detect(baroDev_t *baro)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; extDevice_t *dev = &amp;baro-&gt;dev;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; uint8_t chipId = busReadRegister(dev, DPS368_REG_ID);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (chipId != DPS368_CHIP_ID)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; \/\/ Distinguish DPS310 from DPS368<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; uint8_t coefSrce = busReadRegister(dev, DPS368_REG_COEF_SRCE);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (coefSrce != 0xFF)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ Register exists, this is DPS310<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; dps368Reset(dev);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (!dps368ReadCoefficients(dev))<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; \/\/ Configure oversampling: Pressure OSR16, Temperature OSR16<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (!dps368WriteRegister(dev, DPS368_REG_PRS_CFG, 0x06)) { return false; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (!dps368WriteRegister(dev, DPS368_REG_TMP_CFG, 0x86)) { return false; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; if (!dps368WriteRegister(dev, DPS368_REG_MEAS_CFG, 0x07)){ return false; }<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;ut_delay = 25000;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;start_ut = dps368StartUT;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;read_ut&nbsp; = dps368ReadUT;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;get_ut&nbsp;&nbsp; = dps368GetUT;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;start_up = dps368StartUP;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;read_up&nbsp; = dps368ReadUP;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;get_up&nbsp;&nbsp; = dps368GetUP;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;calculate = dps368Calculate;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; baro-&gt;combined_read = true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; return true;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#endif<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. CLI usage<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"># Manual selection<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">set baro_hardware = DPS368<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">set baro_bustype = I2C<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">set baro_i2c_device = 2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">set baro_i2c_address = 119<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">save<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Known limitation &amp; upstream note<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">1. DPS310 and DPS368 have identical Chip ID `0x10`. The differentiation method relies on reading register `0x28`. I2C read of non-existing register returns `0xFF` on this bus driver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. If your hardware\/I2C implementation returns different value for missing register, detection logic needs adjustment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. This driver is I2C-only for now. SPI support can be added later following DPS310 SPI pattern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">&nbsp;6. Next step for upstream PR<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">1. Add `barometer_dps368.h` header (optional, match DPS310 structure)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2. Add CLI string table entry for DPS368 (so `set baro_hardware` auto complete works)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3. Add target `#define USE_BARO_DPS368` into default target config if needed<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Draft Openflyworld Technical Documentation 1. Overview Openflyworld flight controllers use the Infineon DPS368 digital barometric pressure sensor. However, the Betaflight firmware version used by Openflyworld does not provide a dedicated driver for this sensor. Due to similarities between the DPS368 and DPS310 sensors, the existing Betaflight DPS310 driver is commonly used as a compatibility workaround. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-9138","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=\/wp\/v2\/pages\/9138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9138"}],"version-history":[{"count":8,"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=\/wp\/v2\/pages\/9138\/revisions"}],"predecessor-version":[{"id":9147,"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=\/wp\/v2\/pages\/9138\/revisions\/9147"}],"wp:attachment":[{"href":"https:\/\/www.openflyworld.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}