Merge pull request #17386 from fjmolinas/pr_esp_ztimer

cpu/esp: migrate to ztimer
This commit is contained in:
Kaspar Schleiser 2021-12-14 23:39:56 +01:00 committed by GitHub
commit dad01c17f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 117 additions and 99 deletions

View File

@ -1,6 +1,8 @@
# Define the module that is built: # Define the module that is built:
MODULE = cpu MODULE = cpu
SRC = irq_arch.c startup.c syscalls.c
# Add a list of subdirectories, that should also be built: # Add a list of subdirectories, that should also be built:
DIRS += $(RIOTCPU)/esp_common DIRS += $(RIOTCPU)/esp_common
DIRS += periph DIRS += periph
@ -14,4 +16,8 @@ ifneq (, $(filter esp_freertos, $(USEMODULE)))
DIRS += freertos DIRS += freertos
endif endif
ifneq (,$(filter esp_wifi% esp_eth, $(USEMODULE)))
SRC += esp_ztimer.c
endif
include $(RIOTBASE)/Makefile.base include $(RIOTBASE)/Makefile.base

View File

@ -16,7 +16,7 @@ ifneq (,$(filter esp_eth,$(USEMODULE)))
USEMODULE += esp_idf_eth_phy USEMODULE += esp_idf_eth_phy
USEMODULE += netdev_eth USEMODULE += netdev_eth
USEMODULE += netopt USEMODULE += netopt
USEMODULE += xtimer USEMODULE += ztimer_msec
endif endif
ifneq (,$(filter esp_wifi_any,$(USEMODULE))) ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
@ -55,7 +55,7 @@ endif
ifneq (,$(filter periph_i2c,$(USEMODULE))) ifneq (,$(filter periph_i2c,$(USEMODULE)))
ifneq (,$(filter esp_i2c_hw,$(USEMODULE))) ifneq (,$(filter esp_i2c_hw,$(USEMODULE)))
USEMODULE += core_thread_flags USEMODULE += core_thread_flags
USEMODULE += xtimer USEMODULE += ztimer_msec
USEMODULE += periph_i2c_hw USEMODULE += periph_i2c_hw
else else
# PLEASE NOTE: because of the very poor and faulty hardware implementation # PLEASE NOTE: because of the very poor and faulty hardware implementation

View File

@ -1212,7 +1212,7 @@ Possible wake-up sources for the _Light-sleep_ mode are:
`ESP_PM_WUP_UART1`) `ESP_PM_WUP_UART1`)
@note Since the digital core (MCU) is stalled during _Light-sleep_, it @note Since the digital core (MCU) is stalled during _Light-sleep_, it
is not possible timers like `periph_timer` or `xtimer` as wake-up source. is not possible to use timers like `periph_timer` or `ztimer` as wake-up source.
@warning @warning
Since only level interrupts are supported in _Light-sleep_ mode, Since only level interrupts are supported in _Light-sleep_ mode,
@ -1569,7 +1569,7 @@ The following parameters are defined for ESP-NOW nodes. These parameters can be
Parameter | Default | Description Parameter | Default | Description
:-----------------------|:--------------------------|:----------- :-----------------------|:--------------------------|:-----------
ESP_NOW_SCAN_PERIOD | 10000000UL | Defines the period in us at which an node scans for other nodes in its range. The default period is 10 s. ESP_NOW_SCAN_PERIOD_MS | 10000UL | Defines the period in ms at which an node scans for other nodes in its range. The default period is 10 s.
ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network. ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network.
ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together. ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together.
ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type `uint8_t[16]` and has to be exactly 16 bytes long. ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type `uint8_t[16]` and has to be exactly 16 bytes long.

View File

@ -32,7 +32,8 @@
#include "net/ethernet.h" #include "net/ethernet.h"
#include "net/netdev/eth.h" #include "net/netdev/eth.h"
#include "xtimer.h" #include "timex.h"
#include "ztimer.h"
#include "esp_common.h" #include "esp_common.h"
#include "esp_attr.h" #include "esp_attr.h"
@ -43,6 +44,7 @@
#include "esp32/esp_event_loop.h" #include "esp32/esp_event_loop.h"
#include "board.h"
#if !defined(EMAC_PHY_SMI_MDC_PIN) || !defined(EMAC_PHY_SMI_MDIO_PIN) #if !defined(EMAC_PHY_SMI_MDC_PIN) || !defined(EMAC_PHY_SMI_MDIO_PIN)
#error Board definition does not provide EMAC configuration #error Board definition does not provide EMAC configuration
#endif #endif
@ -50,7 +52,7 @@
#define SYSTEM_EVENT_ETH_RX_DONE (SYSTEM_EVENT_MAX + 1) #define SYSTEM_EVENT_ETH_RX_DONE (SYSTEM_EVENT_MAX + 1)
#define SYSTEM_EVENT_ETH_TX_DONE (SYSTEM_EVENT_MAX + 2) #define SYSTEM_EVENT_ETH_TX_DONE (SYSTEM_EVENT_MAX + 2)
#define EMAC_PHY_CLOCK_DELAY (500 * USEC_PER_MSEC) /* given in us */ #define EMAC_PHY_CLOCK_DELAY_MS (500)
#ifdef EMAC_PHY_LAN8720 #ifdef EMAC_PHY_LAN8720
#include "eth_phy/phy_lan8720.h" #include "eth_phy/phy_lan8720.h"
@ -130,7 +132,7 @@ static void _esp_eth_phy_power_enable_gpio(bool enable)
gpio_init(EMAC_PHY_POWER_PIN, GPIO_OUT); gpio_init(EMAC_PHY_POWER_PIN, GPIO_OUT);
gpio_write(EMAC_PHY_POWER_PIN, enable); gpio_write(EMAC_PHY_POWER_PIN, enable);
xtimer_usleep (USEC_PER_MSEC); ztimer_sleep(ZTIMER_MSEC, 1);
if (enable) { if (enable) {
EMAC_ETHERNET_PHY_CONFIG.phy_power_enable(true); EMAC_ETHERNET_PHY_CONFIG.phy_power_enable(true);
@ -171,7 +173,7 @@ static int _esp_eth_init(netdev_t *netdev)
* after activating clock logic it can take some time before we can * after activating clock logic it can take some time before we can
* enable EMAC * enable EMAC
*/ */
xtimer_usleep (EMAC_PHY_CLOCK_DELAY); ztimer_sleep(ZTIMER_MSEC, EMAC_PHY_CLOCK_DELAY_MS);
if (ret == ESP_OK && (ret = esp_eth_enable()) != ESP_OK) { if (ret == ESP_OK && (ret = esp_eth_enable()) != ESP_OK) {
LOG_TAG_ERROR("esp_eth", "enable failed"); LOG_TAG_ERROR("esp_eth", "enable failed");

View File

@ -11,7 +11,7 @@
* @{ * @{
* *
* @file * @file
* @brief ETS timer to xtimer mapper * @brief ETS timer to ztimer mapper
* *
* @author Gunar Schorcht <gunar@schorcht.net> * @author Gunar Schorcht <gunar@schorcht.net>
* *
@ -29,24 +29,25 @@
#include "esp_attr.h" #include "esp_attr.h"
#include "irq_arch.h" #include "irq_arch.h"
#include "xtimer.h" #include "ztimer.h"
#include "timex.h"
#include "rom/ets_sys.h" #include "rom/ets_sys.h"
struct _ets_to_xtimer { struct _ets_to_ztimer {
ETSTimer *ets_timer; ETSTimer *ets_timer;
xtimer_t xtimer; ztimer_t ztimer;
}; };
/* maximum number of ETS timer to xtimer mapper objects */ /* maximum number of ETS timer to ztimer mapper objects */
/* TODO tune the value */ /* TODO tune the value */
#define ETS_TO_TIMER_NUM 40 #define ETS_TO_TIMER_NUM 40
/* table of ETS timer to xtimer mapper objects */ /* table of ETS timer to ztimer mapper objects */
static struct _ets_to_xtimer _ets_to_xtimer_map[ETS_TO_TIMER_NUM] = {}; static struct _ets_to_ztimer _ets_to_ztimer_map[ETS_TO_TIMER_NUM] = {};
/** /**
* @brief Get the ETS timer to xtimer mapper object for the given timer. * @brief Get the ETS timer to ztimer mapper object for the given timer.
* *
* If there is no object, the function registers a new one and returns it. * If there is no object, the function registers a new one and returns it.
* If there is no more object available, it returns NULL. * If there is no more object available, it returns NULL.
@ -54,47 +55,47 @@ static struct _ets_to_xtimer _ets_to_xtimer_map[ETS_TO_TIMER_NUM] = {};
* @param pointer to the ETS timer * @param pointer to the ETS timer
* @return pointer to the mapper object or NULL in case of error * @return pointer to the mapper object or NULL in case of error
*/ */
struct _ets_to_xtimer* _ets_to_xtimer_get(ETSTimer *timer) struct _ets_to_ztimer* _ets_to_ztimer_get(ETSTimer *timer)
{ {
/* search for an existing mapper object */ /* search for an existing mapper object */
for (int i = 0; i < ETS_TO_TIMER_NUM; i++) { for (int i = 0; i < ETS_TO_TIMER_NUM; i++) {
if (_ets_to_xtimer_map[i].ets_timer == timer) { if (_ets_to_ztimer_map[i].ets_timer == timer) {
return &_ets_to_xtimer_map[i]; return &_ets_to_ztimer_map[i];
} }
} }
/* search for a free mapper object */ /* search for a free mapper object */
for (int i = 0; i < ETS_TO_TIMER_NUM; i++) { for (int i = 0; i < ETS_TO_TIMER_NUM; i++) {
if (_ets_to_xtimer_map[i].ets_timer == NULL) { if (_ets_to_ztimer_map[i].ets_timer == NULL) {
_ets_to_xtimer_map[i].ets_timer = timer; _ets_to_ztimer_map[i].ets_timer = timer;
return &_ets_to_xtimer_map[i]; return &_ets_to_ztimer_map[i];
} }
} }
LOG_TAG_ERROR("esp_xtimer", "There is no free ETS timer to xtimer mapper " LOG_TAG_ERROR("esp_ztimer", "There is no free ETS timer to ztimer mapper "
"object available\n"); "object available\n");
return NULL; return NULL;
} }
/** /**
* @brief Free the ETS timer to xtimer mapper object for the given timer. * @brief Free the ETS timer to ztimer mapper object for the given timer.
* @param pointer to the ETS timer * @param pointer to the ETS timer
*/ */
void _ets_to_xtimer_free(ETSTimer *timer) void _ets_to_ztimer_free(ETSTimer *timer)
{ {
/* search for an existing mapper object */ /* search for an existing mapper object */
for (int i = 0; i < ETS_TO_TIMER_NUM; i++) { for (int i = 0; i < ETS_TO_TIMER_NUM; i++) {
if (_ets_to_xtimer_map[i].ets_timer == timer) { if (_ets_to_ztimer_map[i].ets_timer == timer) {
_ets_to_xtimer_map[i].ets_timer = NULL; _ets_to_ztimer_map[i].ets_timer = NULL;
return; return;
} }
} }
DEBUG("%s There is no ETS timer to xtimer for ETS timer %p\n", DEBUG("%s There is no ETS timer to ztimer for ETS timer %p\n",
__func__, timer); __func__, timer);
} }
/* xtimer call back function, distributes ets_timer callbacks */ /* ztimer call back function, distributes ets_timer callbacks */
void IRAM_ATTR _ets_to_xtimer_callback (void *arg) void IRAM_ATTR _ets_to_ztimer_callback (void *arg)
{ {
struct _ets_to_xtimer* e2xt = (struct _ets_to_xtimer*)arg; struct _ets_to_ztimer* e2xt = (struct _ets_to_ztimer*)arg;
assert(arg != NULL); assert(arg != NULL);
assert(e2xt->ets_timer != NULL); assert(e2xt->ets_timer != NULL);
@ -115,22 +116,22 @@ void ets_timer_setfn(ETSTimer *ptimer, ETSTimerFunc *pfunc, void *parg)
{ {
DEBUG("%s timer=%p pfunc=%p parg=%p\n", __func__, ptimer, pfunc, parg); DEBUG("%s timer=%p pfunc=%p parg=%p\n", __func__, ptimer, pfunc, parg);
struct _ets_to_xtimer* e2xt = _ets_to_xtimer_get(ptimer); struct _ets_to_ztimer* e2xt = _ets_to_ztimer_get(ptimer);
assert(e2xt != NULL); assert(e2xt != NULL);
e2xt->ets_timer->timer_func = pfunc; e2xt->ets_timer->timer_func = pfunc;
e2xt->ets_timer->timer_arg = parg; e2xt->ets_timer->timer_arg = parg;
e2xt->xtimer.callback = &_ets_to_xtimer_callback; e2xt->ztimer.callback = &_ets_to_ztimer_callback;
e2xt->xtimer.arg = (void*)e2xt; e2xt->ztimer.arg = (void*)e2xt;
} }
void ets_timer_done(ETSTimer *ptimer) void ets_timer_done(ETSTimer *ptimer)
{ {
DEBUG("%s timer=%p\n", __func__, ptimer); DEBUG("%s timer=%p\n", __func__, ptimer);
struct _ets_to_xtimer* e2xt = _ets_to_xtimer_get(ptimer); struct _ets_to_ztimer* e2xt = _ets_to_ztimer_get(ptimer);
assert(e2xt != NULL); assert(e2xt != NULL);
@ -142,31 +143,35 @@ void ets_timer_arm_us(ETSTimer *timer, uint32_t tmout, bool repeat)
{ {
DEBUG("%s timer=%p tmout=%u repeat=%d\n", __func__, timer, tmout, repeat); DEBUG("%s timer=%p tmout=%u repeat=%d\n", __func__, timer, tmout, repeat);
struct _ets_to_xtimer* e2xt = _ets_to_xtimer_get(timer); struct _ets_to_ztimer* e2xt = _ets_to_ztimer_get(timer);
assert(e2xt != NULL); assert(e2xt != NULL);
assert(e2xt->xtimer.callback != NULL); assert(e2xt->ztimer.callback != NULL);
xtimer_set(&e2xt->xtimer, tmout); tmout = (tmout + 500) / 1000;
uint32_t now = ztimer_set(ZTIMER_MSEC, &e2xt->ztimer, tmout);
e2xt->ets_timer->timer_expire = e2xt->xtimer.start_time + e2xt->xtimer.offset; /* Note: this is approximating the expiry time since for very short timeout
e2xt->ets_timer->timer_period = repeat ? tmout : 0; this might be set to a minimum value that guarantees the ISR
being executed */
e2xt->ets_timer->timer_expire = (now + tmout) * 1000;
e2xt->ets_timer->timer_period = repeat ? (tmout * 1000) : 0;
} }
void ets_timer_arm(ETSTimer *timer, uint32_t tmout, bool repeat) void ets_timer_arm(ETSTimer *timer, uint32_t tmout, bool repeat)
{ {
ets_timer_arm_us(timer, tmout * USEC_PER_MSEC, repeat); ets_timer_arm_us(timer, tmout * US_PER_MS, repeat);
} }
void ets_timer_disarm(ETSTimer *timer) void ets_timer_disarm(ETSTimer *timer)
{ {
DEBUG("%s timer=%p\n", __func__, timer); DEBUG("%s timer=%p\n", __func__, timer);
struct _ets_to_xtimer* e2xt = _ets_to_xtimer_get(timer); struct _ets_to_ztimer* e2xt = _ets_to_ztimer_get(timer);
assert(e2xt != NULL); assert(e2xt != NULL);
xtimer_remove(&e2xt->xtimer); ztimer_remove(ZTIMER_MSEC, &e2xt->ztimer);
} }
void ets_timer_init(void) void ets_timer_init(void)

View File

@ -21,7 +21,8 @@ config MODULE_ESP_I2C_SW
config MODULE_ESP_I2C_HW config MODULE_ESP_I2C_HW
bool "Hardware" bool "Hardware"
select MODULE_CORE_THREAD_FLAGS select MODULE_CORE_THREAD_FLAGS
select MODULE_XTIMER select MODULE_ZTIMER
select MODULE_ZTIMER_MSEC
select MODULE_PERIPH_I2C_HW select MODULE_PERIPH_I2C_HW
endchoice endchoice

View File

@ -672,11 +672,11 @@ static const uint32_t transfer_int_mask = I2C_TRANS_COMPLETE_INT_ENA
| I2C_TIME_OUT_INT_ENA; | I2C_TIME_OUT_INT_ENA;
/* at I2C_SPEED_NORMAL a transfer takes at most 33 byte * 9 clock cycles * 1/100000 s */ /* at I2C_SPEED_NORMAL a transfer takes at most 33 byte * 9 clock cycles * 1/100000 s */
#define I2C_TRANSFER_TIMEOUT 3000 #define I2C_TRANSFER_TIMEOUT_MS 3
#define I2C_THREAD_FLAG BIT (0) #define I2C_THREAD_FLAG BIT (0)
#include "xtimer.h" #include "ztimer.h"
void _i2c_transfer_timeout (void *arg) void _i2c_transfer_timeout (void *arg)
{ {
@ -713,10 +713,10 @@ static void _i2c_transfer (i2c_t dev)
_i2c_hw[dev].regs->int_clr.val = transfer_int_mask; _i2c_hw[dev].regs->int_clr.val = transfer_int_mask;
/* set a timer for the case the I2C hardware gets stuck */ /* set a timer for the case the I2C hardware gets stuck */
xtimer_t i2c_timeout = {}; ztimer_t i2c_timeout = {};
i2c_timeout.callback = _i2c_transfer_timeout; i2c_timeout.callback = _i2c_transfer_timeout;
i2c_timeout.arg = (void*)(uintptr_t)dev; i2c_timeout.arg = (void*)(uintptr_t)dev;
xtimer_set(&i2c_timeout, I2C_TRANSFER_TIMEOUT); ztimer_set(ZTIMER_MSEC, &i2c_timeout, I2C_TRANSFER_TIMEOUT_MS);
/* start execution of commands in command pipeline registers */ /* start execution of commands in command pipeline registers */
_i2c_bus[dev].pid = thread_getpid(); _i2c_bus[dev].pid = thread_getpid();
@ -726,7 +726,7 @@ static void _i2c_transfer (i2c_t dev)
/* wait for transfer results and remove timeout timer*/ /* wait for transfer results and remove timeout timer*/
thread_flags_wait_one(I2C_THREAD_FLAG); thread_flags_wait_one(I2C_THREAD_FLAG);
xtimer_remove(&i2c_timeout); ztimer_remove(ZTIMER_MSEC, &i2c_timeout);
/* returned from transmission */ /* returned from transmission */
DEBUG("%s results=%08x\n", __func__, _i2c_bus[dev].results); DEBUG("%s results=%08x\n", __func__, _i2c_bus[dev].results);

View File

@ -26,7 +26,6 @@
#include "gpio_arch.h" #include "gpio_arch.h"
#include "rtt_arch.h" #include "rtt_arch.h"
#include "syscalls.h" #include "syscalls.h"
#include "xtimer.h"
#include "periph/rtc.h" #include "periph/rtc.h"
#include "rom/rtc.h" #include "rom/rtc.h"

View File

@ -40,7 +40,6 @@
#include "esp_common.h" #include "esp_common.h"
#include "irq_arch.h" #include "irq_arch.h"
#include "syscalls.h" #include "syscalls.h"
#include "xtimer.h"
#define RTC_PLL_480M 480 /* PLL with 480 MHz at maximum */ #define RTC_PLL_480M 480 /* PLL with 480 MHz at maximum */
#define RTC_PLL_320M 320 /* PLL with 480 MHz at maximum */ #define RTC_PLL_320M 320 /* PLL with 480 MHz at maximum */
@ -74,6 +73,7 @@
#define HW_TIMER_CLK_DIV (rtc_clk_apb_freq_get() / 1000000) #define HW_TIMER_CLK_DIV (rtc_clk_apb_freq_get() / 1000000)
#define HW_TIMER_CORRECTION (RTC_PLL_320M / CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ) #define HW_TIMER_CORRECTION (RTC_PLL_320M / CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ)
#define HW_TIMER_DELTA_MIN (MAX(HW_TIMER_CORRECTION << 1, 5)) #define HW_TIMER_DELTA_MIN (MAX(HW_TIMER_CORRECTION << 1, 5))
#define HW_TIMER_FREQUENCY (1000000UL) /* only 1MHz is supported */
struct hw_timer_regs_t { struct hw_timer_regs_t {
/* see Technical Reference, section 17.4 */ /* see Technical Reference, section 17.4 */
@ -198,7 +198,7 @@ int timer_init (tim_t dev, uint32_t freq, timer_cb_t cb, void *arg)
__func__, dev, freq, cb, arg); __func__, dev, freq, cb, arg);
CHECK_PARAM_RET (dev < HW_TIMER_NUMOF, -1); CHECK_PARAM_RET (dev < HW_TIMER_NUMOF, -1);
CHECK_PARAM_RET (freq == XTIMER_HZ_BASE, -1); CHECK_PARAM_RET (freq == HW_TIMER_FREQUENCY, -1);
CHECK_PARAM_RET (cb != NULL, -1); CHECK_PARAM_RET (cb != NULL, -1);
if (timers[dev].initialized) { if (timers[dev].initialized) {
@ -367,6 +367,7 @@ void IRAM timer_stop(tim_t dev)
#define HW_TIMER_DELTA_MAX 0x00ffffff /* in us */ #define HW_TIMER_DELTA_MAX 0x00ffffff /* in us */
#define HW_TIMER_DELTA_MASK 0x00ffffff #define HW_TIMER_DELTA_MASK 0x00ffffff
#define HW_TIMER_DELTA_RSHIFT 24 #define HW_TIMER_DELTA_RSHIFT 24
#define HW_TIMER_FREQUENCY (1000000UL) /* only 1MHz is supported */
#define HW_TIMER_CORRECTION (RTC_PLL_480M / CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ) #define HW_TIMER_CORRECTION (RTC_PLL_480M / CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ)
#define HW_TIMER_DELTA_MIN (MAX(HW_TIMER_CORRECTION, 5)) #define HW_TIMER_DELTA_MIN (MAX(HW_TIMER_CORRECTION, 5))
@ -442,7 +443,7 @@ int timer_init (tim_t dev, uint32_t freq, timer_cb_t cb, void *arg)
DEBUG("%s dev=%u freq=%u cb=%p arg=%p\n", __func__, dev, freq, cb, arg); DEBUG("%s dev=%u freq=%u cb=%p arg=%p\n", __func__, dev, freq, cb, arg);
CHECK_PARAM_RET (dev < HW_TIMER_NUMOF, -1); CHECK_PARAM_RET (dev < HW_TIMER_NUMOF, -1);
CHECK_PARAM_RET (freq == XTIMER_HZ_BASE, -1); CHECK_PARAM_RET (freq == HW_TIMER_FREQUENCY, -1);
CHECK_PARAM_RET (cb != NULL, -1); CHECK_PARAM_RET (cb != NULL, -1);
if (timers[dev].initialized) { if (timers[dev].initialized) {

View File

@ -182,7 +182,7 @@ uint32_t system_get_time(void)
uint32_t system_get_time_ms(void) uint32_t system_get_time_ms(void)
{ {
return system_get_time_64() / USEC_PER_MSEC; return system_get_time_64() / US_PER_MS;
} }
uint64_t system_get_time_64(void) uint64_t system_get_time_64(void)

View File

@ -828,7 +828,7 @@ be overridden by [application-specific board configurations](#esp8266_applicatio
Parameter | Default | Description Parameter | Default | Description
:---------|:--------|:----------- :---------|:--------|:-----------
#ESP_NOW_SCAN_PERIOD | 10000000UL | Defines the period in us at which an node scans for other nodes in its range. The default period is 10 s. #ESP_NOW_SCAN_PERIOD_MS | 10000UL | Defines the period in ms at which an node scans for other nodes in its range. The default period is 10 s.
#ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network. #ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network.
#ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together. #ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together.
#ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type `uint8_t[16]` and has to be exactly 16 bytes long. #ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type `uint8_t[16]` and has to be exactly 16 bytes long.

View File

@ -242,7 +242,7 @@ SECTIONS
*freertos/*(.literal .text .literal.* .text.*) *freertos/*(.literal .text .literal.* .text.*)
*freertos_common/*(.literal .text .literal.* .text.*) *freertos_common/*(.literal .text .literal.* .text.*)
*periph/*(.literal .text .literal.* .text.*) *periph/*(.literal .text .literal.* .text.*)
*xtimer/*(.literal .text .literal.* .text.*) *ztimer/*(.literal .text .literal.* .text.*)
*libhal.a:clock.o(.literal .text .literal.* .text.*) *libhal.a:clock.o(.literal .text .literal.* .text.*)
*libhal.a:int_asm--set_intclear.o(.literal .text .literal.* .text.*) *libhal.a:int_asm--set_intclear.o(.literal .text .literal.* .text.*)

View File

@ -26,7 +26,6 @@
#include "debug.h" #include "debug.h"
#include "log.h" #include "log.h"
#include "xtimer.h"
#include "periph/timer.h" #include "periph/timer.h"
#include "esp/common_macros.h" #include "esp/common_macros.h"
@ -49,6 +48,7 @@
#define HW_TIMER_DELTA_MASK 0x00ffffff #define HW_TIMER_DELTA_MASK 0x00ffffff
#define HW_TIMER_DELTA_RSHIFT 24 #define HW_TIMER_DELTA_RSHIFT 24
#define HW_TIMER_CORRECTION 2 /* overhead in us */ #define HW_TIMER_CORRECTION 2 /* overhead in us */
#define HW_TIMER_FREQUENCY (1000000UL) /* only 1MHz is supported */
#define HW_TIMER_CLOCK (APB_CLK_FREQ) #define HW_TIMER_CLOCK (APB_CLK_FREQ)
@ -121,7 +121,7 @@ int timer_init (tim_t dev, uint32_t freq, timer_cb_t cb, void *arg)
__func__, dev, freq, cb, arg); __func__, dev, freq, cb, arg);
CHECK_PARAM_RET (dev < HW_TIMER_NUMOF, -1); CHECK_PARAM_RET (dev < HW_TIMER_NUMOF, -1);
CHECK_PARAM_RET (freq == XTIMER_HZ_BASE, -1); CHECK_PARAM_RET (freq == HW_TIMER_FREQUENCY, -1);
CHECK_PARAM_RET (cb != NULL, -1); CHECK_PARAM_RET (cb != NULL, -1);
if (timers[dev].initialized) { if (timers[dev].initialized) {
@ -317,6 +317,7 @@ void timer_print_config(void)
#define OS_TIMER_DELTA_MASK 0x0000ffff #define OS_TIMER_DELTA_MASK 0x0000ffff
#define OS_TIMER_DELTA_RSHIFT 16 #define OS_TIMER_DELTA_RSHIFT 16
#define OS_TIMER_CORRECTION 4 #define OS_TIMER_CORRECTION 4
#define OS_TIMER_FREQUENCY (1000000UL) /* only 1MHz is supported */
extern void os_timer_arm_us(os_timer_t *ptimer, uint32_t time, bool repeat_flag); extern void os_timer_arm_us(os_timer_t *ptimer, uint32_t time, bool repeat_flag);
@ -385,7 +386,7 @@ int timer_init (tim_t dev, uint32_t freq, timer_cb_t cb, void *arg)
DEBUG("%s dev=%u freq=%u cb=%p arg=%p\n", __func__, dev, freq, cb, arg); DEBUG("%s dev=%u freq=%u cb=%p arg=%p\n", __func__, dev, freq, cb, arg);
CHECK_PARAM_RET (dev < OS_TIMER_NUMOF, -1); CHECK_PARAM_RET (dev < OS_TIMER_NUMOF, -1);
CHECK_PARAM_RET (freq == XTIMER_HZ_BASE, -1); CHECK_PARAM_RET (freq == OS_TIMER_FREQUENCY, -1);
CHECK_PARAM_RET (cb != NULL, -1); CHECK_PARAM_RET (cb != NULL, -1);
if (timers[dev].initialized) { if (timers[dev].initialized) {

View File

@ -21,6 +21,7 @@
#include "esp_attr.h" #include "esp_attr.h"
#include "esp_common.h" #include "esp_common.h"
#include "sdk/sdk.h" #include "sdk/sdk.h"
#include "timex.h"
#ifdef MODULE_ESP_IDF_HEAP #ifdef MODULE_ESP_IDF_HEAP
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
@ -66,7 +67,7 @@ uint32_t system_get_time(void)
uint32_t system_get_time_ms(void) uint32_t system_get_time_ms(void)
{ {
return system_get_time() / USEC_PER_MSEC; return system_get_time() / US_PER_MS;
} }
void IRAM_ATTR syscalls_init_arch(void) void IRAM_ATTR syscalls_init_arch(void)

View File

@ -83,5 +83,5 @@ endif
ifneq (,$(filter esp_wifi_any,$(USEMODULE))) ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
USEMODULE += netopt USEMODULE += netopt
USEMODULE += xtimer USEMODULE += ztimer_msec
endif endif

View File

@ -34,7 +34,7 @@ The following parameters are defined for ESP-NOW nodes.
Parameter | Default | Description Parameter | Default | Description
:---------|:--------|:----------- :---------|:--------|:-----------
ESP_NOW_SCAN_PERIOD | 10000000UL | Defines the period in us at which an node scans for other nodes in its range. The default period is 10 s. ESP_NOW_SCAN_PERIOD_MS | 10000UL | Defines the period in ms at which an node scans for other nodes in its range. The default period is 10 s.
ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network. ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network.
ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together. ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together.
ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type ```uint8_t[16]``` and has to be exactly 16 bytes long. ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type ```uint8_t[16]``` and has to be exactly 16 bytes long.

View File

@ -24,7 +24,7 @@
#include <errno.h> #include <errno.h>
#include "net/gnrc.h" #include "net/gnrc.h"
#include "xtimer.h" #include "ztimer.h"
#include "esp_common.h" #include "esp_common.h"
#include "esp_attr.h" #include "esp_attr.h"
@ -91,7 +91,7 @@ static bool _esp_now_add_peer(const uint8_t* bssid, uint8_t channel, const uint8
#if ESP_NOW_UNICAST #if ESP_NOW_UNICAST
static xtimer_t _esp_now_scan_peers_timer; static ztimer_t _esp_now_scan_peers_timer;
static bool _esp_now_scan_peers_done = false; static bool _esp_now_scan_peers_done = false;
#define ESP_NOW_APS_BLOCK_SIZE 8 /* has to be power of two */ #define ESP_NOW_APS_BLOCK_SIZE 8 /* has to be power of two */
@ -117,7 +117,7 @@ static void IRAM_ATTR esp_now_scan_peers_done(void)
uint16_t ap_num; uint16_t ap_num;
ret = esp_wifi_scan_get_ap_num(&ap_num); ret = esp_wifi_scan_get_ap_num(&ap_num);
DEBUG("wifi_scan_get_ap_num ret=%d num=%d\n", ret ,ap_num); DEBUG("wifi_scan_get_ap_num ret=%d num=%d\n", ret, ap_num);
if (ret == ESP_OK && ap_num) { if (ret == ESP_OK && ap_num) {
uint32_t state; uint32_t state;
@ -173,7 +173,7 @@ static void esp_now_scan_peers_start(void)
/* start the scan */ /* start the scan */
esp_wifi_scan_start(&scan_cfg, false); esp_wifi_scan_start(&scan_cfg, false);
/* set the time for next scan */ /* set the time for next scan */
xtimer_set(&_esp_now_scan_peers_timer, esp_now_params.scan_period); ztimer_set(ZTIMER_MSEC, &_esp_now_scan_peers_timer, esp_now_params.scan_period);
} }
static void IRAM_ATTR esp_now_scan_peers_timer_cb(void* arg) static void IRAM_ATTR esp_now_scan_peers_timer_cb(void* arg)

View File

@ -44,12 +44,12 @@
#endif #endif
/** /**
* @brief Period in microseconds at which an ESP-NOW node scans for other * @brief Period in milliseconds at which an ESP-NOW node scans for other
* ESP-NOW nodes in its range. * ESP-NOW nodes in its range.
* @ingroup cpu_esp_common_conf * @ingroup cpu_esp_common_conf
*/ */
#ifndef ESP_NOW_SCAN_PERIOD #ifndef ESP_NOW_SCAN_PERIOD_MS
#define ESP_NOW_SCAN_PERIOD (10000000UL) #define ESP_NOW_SCAN_PERIOD_MS (10000UL)
#endif #endif
/** /**
@ -92,7 +92,7 @@
*/ */
#ifndef ESP_NOW_PARAMS #ifndef ESP_NOW_PARAMS
#define ESP_NOW_PARAMS { .key = ESP_NOW_KEY, \ #define ESP_NOW_PARAMS { .key = ESP_NOW_KEY, \
.scan_period = ESP_NOW_SCAN_PERIOD, \ .scan_period = ESP_NOW_SCAN_PERIOD_MS, \
.softap_pass = ESP_NOW_SOFT_AP_PASS, \ .softap_pass = ESP_NOW_SOFT_AP_PASS, \
.channel = ESP_NOW_CHANNEL \ .channel = ESP_NOW_CHANNEL \
} }

View File

@ -25,7 +25,6 @@
#include "net/ethernet.h" #include "net/ethernet.h"
#include "net/netdev/eth.h" #include "net/netdev/eth.h"
#include "od.h" #include "od.h"
#include "xtimer.h"
#include "esp_common.h" #include "esp_common.h"
#include "esp_attr.h" #include "esp_attr.h"
@ -49,6 +48,7 @@
#include "esp_wifi_netdev.h" #include "esp_wifi_netdev.h"
#include "log.h" #include "log.h"
#include "board.h"
#define ESP_WIFI_DEBUG(f, ...) \ #define ESP_WIFI_DEBUG(f, ...) \
DEBUG("[esp_wifi] %s: " f "\n", __func__, ## __VA_ARGS__) DEBUG("[esp_wifi] %s: " f "\n", __func__, ## __VA_ARGS__)

View File

@ -22,7 +22,7 @@
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
uint32_t xPortGetTickRateHz(void) { uint32_t xPortGetTickRateHz(void) {
return MSEC_PER_SEC / portTICK_PERIOD_MS; return MS_PER_SEC / portTICK_PERIOD_MS;
} }
BaseType_t xPortInIsrContext(void) BaseType_t xPortInIsrContext(void)

View File

@ -21,7 +21,10 @@
#include "log.h" #include "log.h"
#include "syscalls.h" #include "syscalls.h"
#include "thread.h" #include "thread.h"
#include "xtimer.h" #if defined(MODULE_ESP_WIFI_ANY) || defined(MODULE_ESP_ETH)
#include "ztimer.h"
#endif
#include "timex.h"
#ifdef MCU_ESP32 #ifdef MCU_ESP32
#include "soc/soc.h" #include "soc/soc.h"
@ -134,14 +137,14 @@ void vTaskDelay( const TickType_t xTicksToDelay )
{ {
DEBUG("%s xTicksToDelay=%d\n", __func__, xTicksToDelay); DEBUG("%s xTicksToDelay=%d\n", __func__, xTicksToDelay);
#if defined(MODULE_ESP_WIFI_ANY) #if defined(MODULE_ESP_WIFI_ANY)
uint64_t us = xTicksToDelay * MHZ / xPortGetTickRateHz(); uint64_t ms = xTicksToDelay * MS_PER_SEC / xPortGetTickRateHz();
xtimer_usleep(us); ztimer_sleep(ZTIMER_MSEC, ms);
#endif #endif
} }
TickType_t xTaskGetTickCount (void) TickType_t xTaskGetTickCount (void)
{ {
return system_get_time() / USEC_PER_MSEC / portTICK_PERIOD_MS; return system_get_time() / US_PER_MS / portTICK_PERIOD_MS;
} }
void vTaskEnterCritical( portMUX_TYPE *mux ) void vTaskEnterCritical( portMUX_TYPE *mux )

View File

@ -19,28 +19,29 @@
#include "esp_common.h" #include "esp_common.h"
#include "esp_attr.h" #include "esp_attr.h"
#include "log.h" #include "log.h"
#include "xtimer.h" #include "ztimer.h"
#include "timex.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/timers.h" #include "freertos/timers.h"
typedef struct { typedef struct {
xtimer_t xtimer; /* xtimer object */ ztimer_t ztimer; /* ztimer object */
const char* name; /* FreeRTOS timer name */ const char* name; /* FreeRTOS timer name */
uint32_t period; /* in us */ uint32_t period; /* in us */
bool autoreload; /* FreeRTOS timer reload indicator */ bool autoreload; /* FreeRTOS timer reload indicator */
const void* timerid; /* FreeRTOS timer id */ const void* timerid; /* FreeRTOS timer id */
TimerCallbackFunction_t cb; /* FreeRTOS callback function */ TimerCallbackFunction_t cb; /* FreeRTOS callback function */
} freertos_xtimer_t; } freertos_ztimer_t;
static void IRAM_ATTR _xtimer_callback (void *arg) static void IRAM_ATTR _ztimer_callback (void *arg)
{ {
assert(arg != NULL); assert(arg != NULL);
freertos_xtimer_t* timer = (freertos_xtimer_t*)arg; freertos_ztimer_t* timer = (freertos_ztimer_t*)arg;
if (timer->autoreload) { if (timer->autoreload) {
xtimer_set(&timer->xtimer, timer->period); ztimer_set(ZTIMER_MSEC, &timer->ztimer, timer->period);
} }
if (timer->cb) { if (timer->cb) {
@ -54,21 +55,21 @@ TimerHandle_t xTimerCreate (const char * const pcTimerName,
void * const pvTimerID, void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction) TimerCallbackFunction_t pxCallbackFunction)
{ {
freertos_xtimer_t* timer = malloc(sizeof(freertos_xtimer_t)); freertos_ztimer_t* timer = malloc(sizeof(freertos_ztimer_t));
if (timer == NULL) { if (timer == NULL) {
return NULL; return NULL;
} }
/* FreeRTOS timer parameter */ /* FreeRTOS timer parameter */
timer->name = pcTimerName; timer->name = pcTimerName;
timer->period = xTimerPeriod * portTICK_PERIOD_MS * USEC_PER_MSEC; timer->period = xTimerPeriod * portTICK_PERIOD_MS;
timer->autoreload = uxAutoReload; timer->autoreload = uxAutoReload;
timer->timerid = pvTimerID; timer->timerid = pvTimerID;
timer->cb = pxCallbackFunction; timer->cb = pxCallbackFunction;
/* xtimer parameter */ /* ztimer parameter */
timer->xtimer.callback = _xtimer_callback; timer->ztimer.callback = _ztimer_callback;
timer->xtimer.arg = timer; timer->ztimer.arg = timer;
DEBUG("%s %p %s %d %u\n", __func__, timer, pcTimerName, xTimerPeriod, uxAutoReload); DEBUG("%s %p %s %d %u\n", __func__, timer, pcTimerName, xTimerPeriod, uxAutoReload);
return timer; return timer;
@ -79,8 +80,8 @@ BaseType_t xTimerDelete(TimerHandle_t xTimer, TickType_t xBlockTime)
DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime); DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime);
assert(xTimer != NULL); assert(xTimer != NULL);
freertos_xtimer_t* timer = (freertos_xtimer_t*)xTimer; freertos_ztimer_t* timer = (freertos_ztimer_t*)xTimer;
xtimer_remove(&timer->xtimer); ztimer_remove(ZTIMER_MSEC, &timer->ztimer);
free(timer); free(timer);
return pdTRUE; return pdTRUE;
@ -91,8 +92,8 @@ BaseType_t xTimerStart (TimerHandle_t xTimer, TickType_t xBlockTime)
DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime); DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime);
assert(xTimer != NULL); assert(xTimer != NULL);
freertos_xtimer_t* timer = (freertos_xtimer_t*)xTimer; freertos_ztimer_t* timer = (freertos_ztimer_t*)xTimer;
xtimer_set(&timer->xtimer, timer->period); ztimer_set(ZTIMER_MSEC, &timer->ztimer, timer->period);
return pdTRUE; return pdTRUE;
} }
@ -102,8 +103,8 @@ BaseType_t xTimerStop (TimerHandle_t xTimer, TickType_t xBlockTime)
DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime); DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime);
assert(xTimer != NULL); assert(xTimer != NULL);
freertos_xtimer_t* timer = (freertos_xtimer_t*)xTimer; freertos_ztimer_t* timer = (freertos_ztimer_t*)xTimer;
xtimer_remove(&timer->xtimer); ztimer_remove(ZTIMER_MSEC, &timer->ztimer);
return pdTRUE; return pdTRUE;
} }
@ -113,8 +114,8 @@ BaseType_t xTimerReset (TimerHandle_t xTimer, TickType_t xBlockTime)
DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime); DEBUG("%s %p %d\n", __func__, xTimer, xBlockTime);
assert(xTimer != NULL); assert(xTimer != NULL);
freertos_xtimer_t* timer = (freertos_xtimer_t*)xTimer; freertos_ztimer_t* timer = (freertos_ztimer_t*)xTimer;
xtimer_set(&timer->xtimer, xBlockTime * portTICK_PERIOD_MS * USEC_PER_MSEC); ztimer_set(ZTIMER_MSEC, &timer->ztimer, xBlockTime * portTICK_PERIOD_MS * US_PER_MS);
return pdTRUE; return pdTRUE;
} }
@ -123,7 +124,7 @@ void *pvTimerGetTimerID(const TimerHandle_t xTimer)
{ {
assert(xTimer != NULL); assert(xTimer != NULL);
freertos_xtimer_t* timer = (freertos_xtimer_t*)xTimer; freertos_ztimer_t* timer = (freertos_ztimer_t*)xTimer;
return (void*)timer->timerid; return (void*)timer->timerid;
} }

View File

@ -14,15 +14,13 @@
#ifndef DOXYGEN #ifndef DOXYGEN
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "xtimer.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef void* TimerHandle_t; typedef void* TimerHandle_t;
typedef void (*TimerCallbackFunction_t)(void*);
#define TimerCallbackFunction_t xtimer_callback_t
#define tmrTIMER_CALLBACK TimerCallbackFunction_t #define tmrTIMER_CALLBACK TimerCallbackFunction_t
TimerHandle_t xTimerCreate (const char * const pcTimerName, TimerHandle_t xTimerCreate (const char * const pcTimerName,