mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-02 20:24:32 +02:00
Merge branch 'bugfix/esp_timer_before_init_v4.3' into 'release/v4.3'
esp_timer: allow querying the timer before esp_timer_init is called (backport v4.3) See merge request espressif/esp-idf!15772
This commit is contained in:
@@ -244,7 +244,6 @@ static void do_core_init(void)
|
|||||||
fail initializing it properly. */
|
fail initializing it properly. */
|
||||||
heap_caps_init();
|
heap_caps_init();
|
||||||
esp_newlib_init();
|
esp_newlib_init();
|
||||||
esp_newlib_time_init();
|
|
||||||
|
|
||||||
if (g_spiram_ok) {
|
if (g_spiram_ok) {
|
||||||
#if CONFIG_SPIRAM_BOOT_INIT && (CONFIG_SPIRAM_USE_CAPS_ALLOC || CONFIG_SPIRAM_USE_MALLOC)
|
#if CONFIG_SPIRAM_BOOT_INIT && (CONFIG_SPIRAM_USE_CAPS_ALLOC || CONFIG_SPIRAM_USE_MALLOC)
|
||||||
@@ -268,6 +267,12 @@ static void do_core_init(void)
|
|||||||
esp_brownout_init();
|
esp_brownout_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// esp_timer early initialization is required for esp_timer_get_time to work.
|
||||||
|
// This needs to happen before VFS initialization, since some USB_SERIAL_JTAG VFS driver uses
|
||||||
|
// esp_timer_get_time to determine timeout conditions.
|
||||||
|
esp_timer_early_init();
|
||||||
|
esp_newlib_time_init();
|
||||||
|
|
||||||
#ifdef CONFIG_VFS_SUPPORT_IO
|
#ifdef CONFIG_VFS_SUPPORT_IO
|
||||||
#ifdef CONFIG_ESP_CONSOLE_UART
|
#ifdef CONFIG_ESP_CONSOLE_UART
|
||||||
esp_vfs_dev_uart_register();
|
esp_vfs_dev_uart_register();
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2017 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
@@ -85,11 +77,28 @@ typedef struct {
|
|||||||
bool skip_unhandled_events; //!< Skip unhandled events for periodic timers
|
bool skip_unhandled_events; //!< Skip unhandled events for periodic timers
|
||||||
} esp_timer_create_args_t;
|
} esp_timer_create_args_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimal initialization of esp_timer
|
||||||
|
*
|
||||||
|
* @note This function is called from startup code. Applications do not need
|
||||||
|
* to call this function before using other esp_timer APIs.
|
||||||
|
*
|
||||||
|
* This function can be called very early in startup process, after this call
|
||||||
|
* only esp_timer_get_time function can be used.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - ESP_OK on success
|
||||||
|
*/
|
||||||
|
esp_err_t esp_timer_early_init(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize esp_timer library
|
* @brief Initialize esp_timer library
|
||||||
*
|
*
|
||||||
* @note This function is called from startup code. Applications do not need
|
* @note This function is called from startup code. Applications do not need
|
||||||
* to call this function before using other esp_timer APIs.
|
* to call this function before using other esp_timer APIs.
|
||||||
|
* Before calling this function, esp_timer_early_init must be called by the
|
||||||
|
* startup code.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* - ESP_OK on success
|
* - ESP_OK on success
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2017 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
@@ -28,9 +20,20 @@
|
|||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_intr_alloc.h"
|
#include "esp_intr_alloc.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimal initialization of platform specific layer of esp_timer
|
||||||
|
* This function can be called very early in startup process, after this call
|
||||||
|
* only esp_timer_get_time function can be used.
|
||||||
|
* esp_timer_impl_init has to be called after this function to initialize the
|
||||||
|
* rest of esp_timer implementation.
|
||||||
|
* @return ESP_OK
|
||||||
|
*/
|
||||||
|
esp_err_t esp_timer_impl_early_init(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize platform specific layer of esp_timer
|
* @brief Initialize platform specific layer of esp_timer
|
||||||
* @param alarm_handler function to call on timer interrupt
|
* @param alarm_handler function to call on timer interrupt
|
||||||
|
* Before calling this function, esp_timer_impl_early_init must be called.
|
||||||
* @return ESP_OK, ESP_ERR_NO_MEM, or one of the errors from interrupt allocator
|
* @return ESP_OK, ESP_ERR_NO_MEM, or one of the errors from interrupt allocator
|
||||||
*/
|
*/
|
||||||
esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler);
|
esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler);
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2017 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -364,6 +356,15 @@ static IRAM_ATTR inline bool is_initialized(void)
|
|||||||
return s_timer_task != NULL;
|
return s_timer_task != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp_err_t esp_timer_early_init(void)
|
||||||
|
{
|
||||||
|
esp_timer_impl_early_init();
|
||||||
|
#if CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER
|
||||||
|
esp_timer_impl_init_system_time();
|
||||||
|
#endif
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
esp_err_t esp_timer_init(void)
|
esp_err_t esp_timer_init(void)
|
||||||
{
|
{
|
||||||
esp_err_t err;
|
esp_err_t err;
|
||||||
@@ -383,10 +384,6 @@ esp_err_t esp_timer_init(void)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER
|
|
||||||
esp_timer_impl_init_system_time();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2020 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#include "sys/param.h"
|
#include "sys/param.h"
|
||||||
#include "esp_timer_impl.h"
|
#include "esp_timer_impl.h"
|
||||||
@@ -146,9 +138,6 @@ uint64_t IRAM_ATTR esp_timer_impl_get_counter_reg(void)
|
|||||||
|
|
||||||
int64_t IRAM_ATTR esp_timer_impl_get_time(void)
|
int64_t IRAM_ATTR esp_timer_impl_get_time(void)
|
||||||
{
|
{
|
||||||
if (s_alarm_handler == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return esp_timer_impl_get_counter_reg() / TICKS_PER_US;
|
return esp_timer_impl_get_counter_reg() / TICKS_PER_US;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,13 +196,10 @@ void esp_timer_impl_advance(int64_t time_diff_us)
|
|||||||
portEXIT_CRITICAL(&s_time_update_lock);
|
portEXIT_CRITICAL(&s_time_update_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
|
esp_err_t esp_timer_impl_early_init(void)
|
||||||
{
|
{
|
||||||
s_alarm_handler = alarm_handler;
|
|
||||||
|
|
||||||
periph_module_enable(PERIPH_LACT);
|
periph_module_enable(PERIPH_LACT);
|
||||||
|
|
||||||
/* Reset the state */
|
|
||||||
REG_WRITE(CONFIG_REG, 0);
|
REG_WRITE(CONFIG_REG, 0);
|
||||||
REG_WRITE(LOAD_LO_REG, 0);
|
REG_WRITE(LOAD_LO_REG, 0);
|
||||||
REG_WRITE(LOAD_HI_REG, 0);
|
REG_WRITE(LOAD_HI_REG, 0);
|
||||||
@@ -221,6 +207,17 @@ esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
|
|||||||
REG_WRITE(ALARM_HI_REG, UINT32_MAX);
|
REG_WRITE(ALARM_HI_REG, UINT32_MAX);
|
||||||
REG_WRITE(LOAD_REG, 1);
|
REG_WRITE(LOAD_REG, 1);
|
||||||
REG_SET_BIT(INT_CLR_REG, TIMG_LACT_INT_CLR);
|
REG_SET_BIT(INT_CLR_REG, TIMG_LACT_INT_CLR);
|
||||||
|
REG_SET_FIELD(CONFIG_REG, TIMG_LACT_DIVIDER, APB_CLK_FREQ / 1000000 / TICKS_PER_US);
|
||||||
|
REG_SET_BIT(CONFIG_REG, TIMG_LACT_INCREASE |
|
||||||
|
TIMG_LACT_LEVEL_INT_EN |
|
||||||
|
TIMG_LACT_EN);
|
||||||
|
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
|
||||||
|
{
|
||||||
|
s_alarm_handler = alarm_handler;
|
||||||
|
|
||||||
esp_err_t err = esp_intr_alloc(INTR_SOURCE_LACT,
|
esp_err_t err = esp_intr_alloc(INTR_SOURCE_LACT,
|
||||||
ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM,
|
ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_IRAM,
|
||||||
@@ -239,10 +236,6 @@ esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
|
|||||||
|
|
||||||
esp_timer_impl_update_apb_freq(esp_clk_apb_freq() / 1000000);
|
esp_timer_impl_update_apb_freq(esp_clk_apb_freq() / 1000000);
|
||||||
|
|
||||||
REG_SET_BIT(CONFIG_REG, TIMG_LACT_INCREASE |
|
|
||||||
TIMG_LACT_LEVEL_INT_EN |
|
|
||||||
TIMG_LACT_EN);
|
|
||||||
|
|
||||||
// Set the step for the sleep mode when the timer will work
|
// Set the step for the sleep mode when the timer will work
|
||||||
// from a slow_clk frequency instead of the APB frequency.
|
// from a slow_clk frequency instead of the APB frequency.
|
||||||
uint32_t slowclk_ticks_per_us = esp_clk_slowclk_cal_get() * TICKS_PER_US;
|
uint32_t slowclk_ticks_per_us = esp_clk_slowclk_cal_get() * TICKS_PER_US;
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2017-2020 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#include "esp_timer_impl.h"
|
#include "esp_timer_impl.h"
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
@@ -65,9 +57,6 @@ uint64_t IRAM_ATTR esp_timer_impl_get_counter_reg(void)
|
|||||||
|
|
||||||
int64_t IRAM_ATTR esp_timer_impl_get_time(void)
|
int64_t IRAM_ATTR esp_timer_impl_get_time(void)
|
||||||
{
|
{
|
||||||
if (s_alarm_handler == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return systimer_hal_get_time(SYSTIMER_COUNTER_0);
|
return systimer_hal_get_time(SYSTIMER_COUNTER_0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,6 +89,17 @@ void esp_timer_impl_advance(int64_t time_us)
|
|||||||
portEXIT_CRITICAL_SAFE(&s_time_update_lock);
|
portEXIT_CRITICAL_SAFE(&s_time_update_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp_err_t esp_timer_impl_early_init(void)
|
||||||
|
{
|
||||||
|
systimer_hal_init();
|
||||||
|
|
||||||
|
systimer_hal_enable_counter(SYSTIMER_COUNTER_0);
|
||||||
|
systimer_hal_select_alarm_mode(SYSTIMER_ALARM_2, SYSTIMER_ALARM_MODE_ONESHOT);
|
||||||
|
systimer_hal_connect_alarm_counter(SYSTIMER_ALARM_2, SYSTIMER_COUNTER_0);
|
||||||
|
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
|
esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
|
||||||
{
|
{
|
||||||
s_alarm_handler = alarm_handler;
|
s_alarm_handler = alarm_handler;
|
||||||
@@ -117,11 +117,6 @@ esp_err_t esp_timer_impl_init(intr_handler_t alarm_handler)
|
|||||||
goto err_intr_alloc;
|
goto err_intr_alloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
systimer_hal_init();
|
|
||||||
systimer_hal_enable_counter(SYSTIMER_COUNTER_0);
|
|
||||||
systimer_hal_select_alarm_mode(SYSTIMER_ALARM_2, SYSTIMER_ALARM_MODE_ONESHOT);
|
|
||||||
systimer_hal_connect_alarm_counter(SYSTIMER_ALARM_2, SYSTIMER_COUNTER_0);
|
|
||||||
|
|
||||||
/* TODO: if SYSTIMER is used for anything else, access to SYSTIMER_INT_ENA_REG has to be
|
/* TODO: if SYSTIMER is used for anything else, access to SYSTIMER_INT_ENA_REG has to be
|
||||||
* protected by a shared spinlock. Since this code runs as part of early startup, this
|
* protected by a shared spinlock. Since this code runs as part of early startup, this
|
||||||
* is practically not an issue.
|
* is practically not an issue.
|
||||||
|
@@ -50,6 +50,7 @@
|
|||||||
#include "esp_flash.h"
|
#include "esp_flash.h"
|
||||||
#include "esp_attr.h"
|
#include "esp_attr.h"
|
||||||
#include "bootloader_flash.h"
|
#include "bootloader_flash.h"
|
||||||
|
#include "esp_compiler.h"
|
||||||
|
|
||||||
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size);
|
esp_rom_spiflash_result_t IRAM_ATTR spi_flash_write_encrypted_chip(size_t dest_addr, const void *src, size_t size);
|
||||||
|
|
||||||
@@ -230,7 +231,9 @@ static inline void IRAM_ATTR spi_flash_guard_op_unlock(void)
|
|||||||
static void IRAM_ATTR spi_flash_os_yield(void)
|
static void IRAM_ATTR spi_flash_os_yield(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
#ifdef CONFIG_SPI_FLASH_YIELD_DURING_ERASE
|
||||||
vTaskDelay(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS);
|
if (likely(xTaskGetSchedulerState() == taskSCHEDULER_RUNNING)) {
|
||||||
|
vTaskDelay(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// You may obtain a copy of the License at
|
*/
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <sys/param.h> //For max/min
|
#include <sys/param.h> //For max/min
|
||||||
@@ -24,7 +16,7 @@
|
|||||||
#include "hal/spi_types.h"
|
#include "hal/spi_types.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
#include "esp_compiler.h"
|
||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
|
|
||||||
#include "driver/spi_common_internal.h"
|
#include "driver/spi_common_internal.h"
|
||||||
@@ -140,11 +132,13 @@ static IRAM_ATTR esp_err_t spi1_flash_os_check_yield(void *arg, uint32_t chip_st
|
|||||||
|
|
||||||
static IRAM_ATTR esp_err_t spi1_flash_os_yield(void *arg, uint32_t* out_status)
|
static IRAM_ATTR esp_err_t spi1_flash_os_yield(void *arg, uint32_t* out_status)
|
||||||
{
|
{
|
||||||
|
if (likely(xTaskGetSchedulerState() == taskSCHEDULER_RUNNING)) {
|
||||||
#ifdef CONFIG_SPI_FLASH_ERASE_YIELD_TICKS
|
#ifdef CONFIG_SPI_FLASH_ERASE_YIELD_TICKS
|
||||||
vTaskDelay(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS);
|
vTaskDelay(CONFIG_SPI_FLASH_ERASE_YIELD_TICKS);
|
||||||
#else
|
#else
|
||||||
vTaskDelay(1);
|
vTaskDelay(1);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
on_spi1_yielded((spi1_app_func_arg_t*)arg);
|
on_spi1_yielded((spi1_app_func_arg_t*)arg);
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user