Skip to content

Commit

Permalink
Merge pull request #18000 from fjmolinas/pr_uwb_dw1000_fix_group_delay
Browse files Browse the repository at this point in the history
pkg/uwb-dw1000: fix default group delay, use OTP values when possible
  • Loading branch information
fjmolinas authored Apr 26, 2022
2 parents a771b4f + 0f610c6 commit 1850f97
Show file tree
Hide file tree
Showing 11 changed files with 206 additions and 112 deletions.
4 changes: 2 additions & 2 deletions pkg/uwb-core/Makefile.include
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ PSEUDOMODULES += uwb-core_rng_trx_info
DIRS += $(RIOTPKG)/uwb-core/contrib \
#

ifneq (,$(filter uwb-core_uwb_rng_trx_info,$(USEMODULE)))
ifneq (,$(filter uwb-core_rng_trx_info,$(USEMODULE)))
# Enable RX diagnostics
CFLAGS += -DDW1000_RX_DIAGNOSTIC=1
CFLAGS += -DCONFIG_DW1000_RX_DIAGNOSTIC=1
endif
2 changes: 1 addition & 1 deletion pkg/uwb-core/include/dpl_syscfg/syscfg_twr_ds.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extern "C" {
* @brief Enable toplevel ranging services
*/
#ifndef MYNEWT_VAL_TWR_DS_ENABLED
#define MYNEWT_VAL_TWR_DS_ENABLED (IS_ACTIVE(MODULE_UWB_CORE_TWR_DS))
#define MYNEWT_VAL_TWR_DS_ENABLED (IS_USED(MODULE_UWB_CORE_TWR_DS))
#endif

/**
Expand Down
2 changes: 1 addition & 1 deletion pkg/uwb-core/include/dpl_syscfg/syscfg_twr_ds_ext.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extern "C" {
* @brief Enable double sided extended two way ranging
*/
#ifndef MYNEWT_VAL_TWR_DS_EXT_ENABLED
#define MYNEWT_VAL_TWR_DS_EXT_ENABLED IS_ACTIVE(MODULE_UWB_CORE_TWR_DS_EXT)
#define MYNEWT_VAL_TWR_DS_EXT_ENABLED IS_USED(MODULE_UWB_CORE_TWR_DS_EXT)
#endif

/**
Expand Down
2 changes: 1 addition & 1 deletion pkg/uwb-core/include/dpl_syscfg/syscfg_twr_ss.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extern "C" {
* @brief Enable ranging services
*/
#ifndef MYNEWT_VAL_TWR_SS_ENABLED
#define MYNEWT_VAL_TWR_SS_ENABLED (IS_ACTIVE(MODULE_UWB_CORE_TWR_SS))
#define MYNEWT_VAL_TWR_SS_ENABLED (IS_USED(MODULE_UWB_CORE_TWR_SS))
#endif

/**
Expand Down
2 changes: 1 addition & 1 deletion pkg/uwb-core/include/dpl_syscfg/syscfg_twr_ss_ack.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extern "C" {
* @brief Enable toplevel ranging services
*/
#ifndef MYNEWT_VAL_TWR_SS_ACK_ENABLED
#define MYNEWT_VAL_TWR_SS_ACK_ENABLED (IS_ACTIVE(MODULE_UWB_CORE_TWR_SS_ACK))
#define MYNEWT_VAL_TWR_SS_ACK_ENABLED (IS_USED(MODULE_UWB_CORE_TWR_SS_ACK))
#endif

/**
Expand Down
2 changes: 1 addition & 1 deletion pkg/uwb-core/include/dpl_syscfg/syscfg_twr_ss_ext.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extern "C" {
* @brief Enable Single Sided extended ranging services
*/
#ifndef MYNEWT_VAL_TWR_SS_EXT_ENABLED
#define MYNEWT_VAL_TWR_SS_EXT_ENABLED (IS_ACTIVE(MODULE_UWB_CORE_TWR_SS_EXT))
#define MYNEWT_VAL_TWR_SS_EXT_ENABLED (IS_USED(MODULE_UWB_CORE_TWR_SS_EXT))
#endif

/**
Expand Down
2 changes: 1 addition & 1 deletion pkg/uwb-core/include/dpl_syscfg/syscfg_uwb_rng.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extern "C" {
* @brief uwb-core uwb_rng module is enabled
*/
#ifndef MYNEWT_VAL_UWB_RNG_ENABLED
#define MYNEWT_VAL_UWB_RNG_ENABLED ((IS_ACTIVE(MODULE_UWB_CORE_RNG)))
#define MYNEWT_VAL_UWB_RNG_ENABLED ((IS_USED(MODULE_UWB_CORE_RNG)))
#endif

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
From 2edefd222d20da75252f89645c13a332b8098acd Mon Sep 17 00:00:00 2001
From: Francisco Molina <femolina@uc.cl>
Date: Thu, 24 Mar 2022 17:15:06 +0100
Subject: [PATCH 6/6] hw/drivers/dw1000_otp: fix function signature

---
hw/drivers/uwb/uwb_dw1000/include/dw1000/dw1000_otp.h | 2 +-
hw/drivers/uwb/uwb_dw1000/src/dw1000_otp.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/drivers/uwb/uwb_dw1000/include/dw1000/dw1000_otp.h b/hw/drivers/uwb/uwb_dw1000/include/dw1000/dw1000_otp.h
index 0651606..0e665ae 100644
--- a/hw/drivers/uwb/uwb_dw1000/include/dw1000/dw1000_otp.h
+++ b/hw/drivers/uwb/uwb_dw1000/include/dw1000/dw1000_otp.h
@@ -50,7 +50,7 @@ extern "C" {
#define OTP_XTRIM_ADDRESS (0x1E) //!< OTP address definition for crystal trim

uint32_t _dw1000_otp_read(struct _dw1000_dev_instance_t * inst, uint16_t address);
-void dw1000_opt_read(struct _dw1000_dev_instance_t * inst, uint32_t address, uint32_t * buffer, uint16_t length);
+void dw1000_otp_read(struct _dw1000_dev_instance_t * inst, uint32_t address, uint32_t * buffer, uint16_t length);

#ifdef __cplusplus
}
diff --git a/hw/drivers/uwb/uwb_dw1000/src/dw1000_otp.c b/hw/drivers/uwb/uwb_dw1000/src/dw1000_otp.c
index a8fdf3c..444e93a 100644
--- a/hw/drivers/uwb/uwb_dw1000/src/dw1000_otp.c
+++ b/hw/drivers/uwb/uwb_dw1000/src/dw1000_otp.c
@@ -51,7 +51,7 @@
* @return void
*
*/
-void dw1000_phy_otp_read(struct _dw1000_dev_instance_t * inst, uint32_t address, uint32_t * buffer, uint16_t length)
+void dw1000_otp_read(struct _dw1000_dev_instance_t * inst, uint32_t address, uint32_t * buffer, uint16_t length)
{
uint16_t i;
dw1000_phy_sysclk_XTAL(inst); // NOTE: Set system clock to XTAL - this is necessary to make sure the values read by _dwt_otpread are reliable
--
2.32.0

122 changes: 79 additions & 43 deletions pkg/uwb-dw1000/hal/uwb_dw1000.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "dpl/dpl.h"
#include "dw1000/dw1000_phy.h"
#include "dw1000/dw1000_hal.h"
#include "dw1000/dw1000_otp.h"
#include "uwb_dw1000.h"
#include "uwb_dw1000_config.h"

Expand All @@ -38,73 +39,79 @@
#define DW1000_THREAD_PRIORITY MYNEWT_VAL_UWB_DEV_TASK_PRIO
#endif

#define OTP_CH1_TX_POWER_PRF_16_ADDRESS (0x0010)
#define OTP_CH5_PG_DELAY_ADDRESS (0x001E)
#define OTP_CH5_PG_DELAY_MASK (0x00FF00ff)
#define OTP_CH5_PG_DELAY_SHIFT (16)

/* Link list head */
static struct _dw1000_dev_instance_t * dw1000_instance_head;
static struct _dw1000_dev_instance_t *dw1000_instance_head;

/* Default instance configuration */
static const dw1000_dev_instance_t dw1000_instance_config_default = {
.uwb_dev = {
.idx = 0,
.role = DW1000_ROLE_DEFAULT,
.role = CONFIG_DW1000_ROLE_DEFAULT,
.task_prio = DW1000_THREAD_PRIORITY,
.status = {0},
.rx_ant_separation = DW1000_RX_ANTSEP_DEFAULT,
.status = { 0 },
.rx_ant_separation = CONFIG_DW1000_RX_ANTSEP_DEFAULT,
.attrib = {
.nsfd = DW1000_NSFD_DEFAULT,
.nsync = DW1000_NSYNC_DEFAULT,
.nphr = DW1000_NPHR_DEFAULT ,
.nsfd = CONFIG_DW1000_NSFD_DEFAULT,
.nsync = CONFIG_DW1000_NSYNC_DEFAULT,
.nphr = CONFIG_DW1000_NPHR_DEFAULT,
},
.config = {
.channel = DW1000_CHANNEL_DEFAULT,
.prf = DW1000_PRF_DEFAULT,
.dataRate = DW1000_DATARATE_DEFAULT,
.channel = CONFIG_DW1000_CHANNEL_DEFAULT,
.prf = CONFIG_DW1000_PRF_DEFAULT,
.dataRate = CONFIG_DW1000_DATARATE_DEFAULT,
.rx = {
.pacLength = DW1000_PACLEN_DEFAULT,
.preambleCodeIndex = DW1000_RX_PREAM_CIDX_DEFAULT,
.sfdType = DW1000_RX_SFD_TYPE_DEFAULT,
.phrMode = DW1000_RX_PHR_MODE_DEFAULT,
.sfdTimeout = DW1000_RX_SFD_TO_DEFAULT,
.timeToRxStable = DW1000_RX_STABLE_TIME_US ,
.frameFilter = DW1000_FRAME_FILTER_DEFAULT,
.xtalTrim = DW1000_XTAL_TRIM_DEFAULT,
.pacLength = CONFIG_DW1000_PACLEN_DEFAULT,
.preambleCodeIndex = CONFIG_DW1000_RX_PREAM_CIDX_DEFAULT,
.sfdType = CONFIG_DW1000_RX_SFD_TYPE_DEFAULT,
.phrMode = CONFIG_DW1000_RX_PHR_MODE_DEFAULT,
.sfdTimeout = CONFIG_DW1000_RX_SFD_TO_DEFAULT,
.timeToRxStable = CONFIG_DW1000_RX_STABLE_TIME_US,
.frameFilter = CONFIG_DW1000_FRAME_FILTER_DEFAULT,
.xtalTrim = CONFIG_DW1000_XTAL_TRIM_DEFAULT,
},
.tx ={
.preambleCodeIndex = DW1000_TX_PREAM_CIDX_DEAULT,
.preambleLength = DW1000_TX_PREAM_LEN_DEFAULT,
.tx = {
.preambleCodeIndex = CONFIG_DW1000_TX_PREAM_CIDX_DEAULT,
.preambleLength = CONFIG_DW1000_TX_PREAM_LEN_DEFAULT,
},
.txrf={
.PGdly = DW1000_CHANNEL_DEFAULT,
.txrf = {
.PGdly = CONFIG_DW1000_TX_PGDELAY_DEFAULT,
.BOOSTNORM = dw1000_power_value(DW1000_txrf_config_9db, 2.5),
.BOOSTP500 = dw1000_power_value(DW1000_txrf_config_9db, 2.5),
.BOOSTP250 = dw1000_power_value(DW1000_txrf_config_9db, 2.5),
.BOOSTP125 = dw1000_power_value(DW1000_txrf_config_9db, 2.5)
},
.trxoff_enable = DW1000_TRXOFF_ENABLE,
.rxdiag_enable = DW1000_RX_DIAGNOSTIC,
.trxoff_enable = CONFIG_DW1000_TRXOFF_ENABLE,
.rxdiag_enable = CONFIG_DW1000_RX_DIAGNOSTIC,
.dblbuffon_enabled = DW1000_DOUBLE_BUFFER_ENABLE,
.LDE_enable = DW1000_LDE_ENABLE,
.LDO_enable = DW1000_LDO_ENABLE,
.sleep_enable = DW1000_SLEEP_ENABLE,
.wakeup_rx_enable = DW1000_WAKEUP_RX_ENABLE,
.rxauto_enable = DW1000_RX_AUTO_ENABLE,
.cir_enable = 0, /**< Default behavior for CIR interface */
.cir_pdoa_slave = 0, /**< First instance should not act as pdoa slave */
.blocking_spi_transfers = 1, /**< Nonblocking spi transfers are not supported */
.LDE_enable = CONFIG_DW1000_LDE_ENABLE,
.LDO_enable = CONFIG_DW1000_LDO_ENABLE,
.sleep_enable = CONFIG_DW1000_SLEEP_ENABLE,
.wakeup_rx_enable = CONFIG_DW1000_WAKEUP_RX_ENABLE,
.rxauto_enable = CONFIG_DW1000_RX_AUTO_ENABLE,
.cir_enable = 0, /**< Default behavior for CIR interface */
.cir_pdoa_slave = 0, /**< First instance should not act as pdoa slave */
.blocking_spi_transfers = 1, /**< Nonblocking spi transfers are not supported */
},
}
};

void _uwb_dw1000_set_idx(dw1000_dev_instance_t* dev)
void _uwb_dw1000_set_idx(dw1000_dev_instance_t *dev)
{
int count = 0;
dw1000_dev_instance_t *elt = NULL;

LL_COUNT(dw1000_instance_head, elt, count);
dev->uwb_dev.idx = count++;
/* prepend to list */
LL_PREPEND(dw1000_instance_head, dev);
}

void uwb_dw1000_setup(dw1000_dev_instance_t* dev, dw1000_params_t* params)
void uwb_dw1000_setup(dw1000_dev_instance_t *dev, dw1000_params_t *params)
{
/* set semaphore */
dpl_sem_init(params->spi_sem, 0x1);
Expand All @@ -115,16 +122,45 @@ void uwb_dw1000_setup(dw1000_dev_instance_t* dev, dw1000_params_t* params)
_uwb_dw1000_set_idx(dev);
/* this will set the configuration and init uwb_dev which ATM only
allocates an RX and TX buffer if none is yet available */
dw1000_dev_init((struct os_dev *) dev, (void *) params);
dw1000_dev_init((struct os_dev *)dev, (void *)params);
}

void uwb_dw1000_config_and_start(dw1000_dev_instance_t* dev)
void uwb_dw1000_config_and_start(dw1000_dev_instance_t *dev)
{
dw1000_dev_config(dev);
uwb_dw1000_update_config_from_otp(dev);
}

void uwb_dw1000_update_config_from_otp(dw1000_dev_instance_t *dev)
{
/* every channel has to registers, first for PRF16, second PRF64 */
uint16_t address = OTP_CH1_TX_POWER_PRF_16_ADDRESS + (2 * (dev->uwb_dev.config.channel - 1)) +
(dev->uwb_dev.config.prf - DWT_PRF_16M);

/* channel 6 is missing, so channel 7 is actually to addresses earlier */
if (dev->uwb_dev.config.channel == 7) {
address -= 2;
}
uint32_t tx_power = _dw1000_otp_read(dev, address);

LOG_DEBUG("uwb-dw1000: OTP addr=(%" PRIx16 "),val=(%" PRIx32 ")\n", address, tx_power);
if (tx_power != 0) {
dev->uwb_dev.config.txrf.power = tx_power;
}

if (dev->uwb_dev.config.channel == 5) {
uint8_t pg_delay =
((_dw1000_otp_read(dev,
OTP_CH5_PG_DELAY_ADDRESS) & OTP_CH5_PG_DELAY_MASK) >>
OTP_CH5_PG_DELAY_SHIFT);
LOG_DEBUG("uwb-dw1000: pg-delay addr=(%" PRIx16 "),val=(%" PRIx16 ")\n",
OTP_CH5_PG_DELAY_ADDRESS, pg_delay);
dev->uwb_dev.config.txrf.PGdly = pg_delay;
}
}

void uwb_dw1000_set_buffs(dw1000_dev_instance_t* dev, uint8_t* tx_buf,
uint8_t* rx_buf)
void uwb_dw1000_set_buffs(dw1000_dev_instance_t *dev, uint8_t *tx_buf,
uint8_t *rx_buf)
{
dev->uwb_dev.rxbuf = rx_buf;
dev->uwb_dev.txbuf = tx_buf;
Expand All @@ -135,19 +171,19 @@ void uwb_dw1000_init(void)
dw1000_instance_head = NULL;
}

struct uwb_dev* uwb_dev_idx_lookup(int idx)
struct uwb_dev *uwb_dev_idx_lookup(int idx)
{
dw1000_dev_instance_t *current = dw1000_instance_head;

while (current) {
if (current->uwb_dev.idx == idx) {
LOG_DEBUG("uwb_dev: found dev of idx %d\n", idx);
LOG_DEBUG("uwb-dw1000: found dev of idx %d\n", idx);
break;
}
current = current->next;
}

return (struct uwb_dev*) &current->uwb_dev;
return (struct uwb_dev *)&current->uwb_dev;
}

/**
Expand All @@ -157,7 +193,7 @@ struct uwb_dev* uwb_dev_idx_lookup(int idx)
* @return dw1000_dev_instance_t
*/

struct _dw1000_dev_instance_t * hal_dw1000_inst(uint8_t idx)
struct _dw1000_dev_instance_t *hal_dw1000_inst(uint8_t idx)
{
dw1000_dev_instance_t *current = dw1000_instance_head;

Expand Down
8 changes: 8 additions & 0 deletions pkg/uwb-dw1000/include/uwb_dw1000.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,14 @@ void uwb_dw1000_setup(dw1000_dev_instance_t* dev, dw1000_params_t* params);
*/
void uwb_dw1000_config_and_start(dw1000_dev_instance_t* dev);

/**
* @brief Updates tx_power config from OTP is any
*
*
* @param[out] dev dw1000 device descriptor
*/
void uwb_dw1000_update_config_from_otp(dw1000_dev_instance_t* dev);

#ifdef __cplusplus
}
#endif
Expand Down
Loading

0 comments on commit 1850f97

Please sign in to comment.