risc-v/espressif: Add support for Periodic Timers

Signed-off-by: Gustavo Henrique Nihei <gustavo.nihei@espressif.com>
This commit is contained in:
Gustavo Henrique Nihei 2023-03-28 09:45:10 -03:00 • committed by Alan Carvalho de Assis
parent 1ace09cf10
commit 31d68f2dd3
12 changed files with 841 additions and 0 deletions

View file

@ -46,6 +46,10 @@ ifneq ($(CONFIG_DEV_RANDOM)$(CONFIG_DEV_URANDOM_ARCH),)
CHIP_CSRCS += esp_random.c
endif
ifeq ($(CONFIG_TIMER),y)
CHIP_CSRCS += esp_timer.c
endif
ifeq ($(CONFIG_ESPRESSIF_HR_TIMER),y)
CHIP_CSRCS += esp_hr_timer.c
endif

View file

@ -0,0 +1,581 @@
/****************************************************************************
* arch/risc-v/src/espressif/esp_timer.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. 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.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <assert.h>
#include <debug.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <nuttx/timers/timer.h>
#include "esp_irq.h"
#include "esp_timer.h"
#include "clk_tree.h"
#include "esp_attr.h"
#include "hal/timer_hal.h"
#include "hal/timer_ll.h"
#include "periph_ctrl.h"
#include "soc/clk_tree_defs.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/* This structure provides the private representation of the "lower-half"
* driver state structure. This structure must be cast-compatible with the
* well-known timer_lowerhalf_s structure.
*/
struct esp_timer_lowerhalf_s
{
const struct timer_ops_s *ops; /* Lower half operations */
timer_hal_context_t hal; /* HAL context */
int source; /* Timer interrupt source */
int irq; /* IRQ associated with this Timer */
tccb_t callback; /* Current user interrupt callback */
void *arg; /* Argument passed to upper half callback */
bool started; /* True: Timer has been started */
void *upper; /* Pointer to timer_upperhalf_s */
};
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/* Interrupt handling *******************************************************/
static int esp_timer_isr(int irq, void *context, void *arg);
/* "Lower half" driver methods **********************************************/
static int esp_timer_start(struct timer_lowerhalf_s *lower);
static int esp_timer_stop(struct timer_lowerhalf_s *lower);
static int esp_timer_getstatus(struct timer_lowerhalf_s *lower,
struct timer_status_s *status);
static int esp_timer_settimeout(struct timer_lowerhalf_s *lower,
uint32_t timeout);
static void esp_timer_setcallback(struct timer_lowerhalf_s *lower,
tccb_t callback, void *arg);
static int esp_timer_maxtimeout(struct timer_lowerhalf_s *lower,
uint32_t *timeout);
/****************************************************************************
* Private Data
****************************************************************************/
/* "Lower half" driver methods */
static const struct timer_ops_s g_timer_ops =
{
.start = esp_timer_start,
.stop = esp_timer_stop,
.getstatus = esp_timer_getstatus,
.settimeout = esp_timer_settimeout,
.setcallback = esp_timer_setcallback,
.maxtimeout = esp_timer_maxtimeout,
.ioctl = NULL
};
/* TIMER0 lower-half */
static struct esp_timer_lowerhalf_s g_timer0_lowerhalf =
{
.ops = &g_timer_ops,
.source = TG0_T0_LEVEL_INTR_SOURCE,
.irq = ESP_IRQ_TG0_T0_LEVEL
};
/* TIMER1 lower-half */
static struct esp_timer_lowerhalf_s g_timer1_lowerhalf =
{
.ops = &g_timer_ops,
.source = TG1_T0_LEVEL_INTR_SOURCE,
.irq = ESP_IRQ_TG1_T0_LEVEL
};
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: esp_timer_start
*
* Description:
* Start the timer, resetting the time to the current timeout.
*
* Input Parameters:
* lower - A pointer the publicly visible representation of the
* "lower-half" driver state structure.
*
* Returned Values:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
static int esp_timer_start(struct timer_lowerhalf_s *lower)
{
struct esp_timer_lowerhalf_s *priv = (struct esp_timer_lowerhalf_s *)lower;
uint32_t counter_src_hz = 0;
uint32_t prescale;
DEBUGASSERT(priv != NULL);
if (priv->started)
{
/* Return EBUSY to indicate that the timer is already running */
return -EBUSY;
}
timer_hal_context_t *hal = &(priv->hal);
/* Make sure the timer is stopped to avoid unpredictable behavior */
timer_ll_enable_intr(hal->dev, TIMER_LL_EVENT_ALARM(hal->timer_id),
false);
timer_ll_enable_counter(hal->dev, hal->timer_id, false);
/* Configure clock source */
timer_ll_set_clock_source(hal->dev, hal->timer_id,
GPTIMER_CLK_SRC_DEFAULT);
/* Calculate the suitable prescaler according to the current APB
* frequency to generate a period of 1 us.
*/
clk_tree_src_get_freq_hz((soc_module_clk_t)GPTIMER_CLK_SRC_DEFAULT,
CLK_TREE_SRC_FREQ_PRECISION_CACHED,
&counter_src_hz);
prescale = counter_src_hz / USEC_PER_SEC;
/* Configure TIMER prescaler */
timer_ll_set_clock_prescale(hal->dev, hal->timer_id, prescale);
/* Configure TIMER mode */
timer_ll_set_count_direction(hal->dev, hal->timer_id, GPTIMER_COUNT_UP);
/* Clear TIMER counter value */
timer_hal_set_counter_value(hal, 0);
/* Enable autoreload */
timer_ll_enable_auto_reload(hal->dev, hal->timer_id, true);
/* Enable TIMER alarm */
timer_ll_enable_alarm(hal->dev, hal->timer_id, true);
/* Clear Interrupt Bits Status */
timer_ll_clear_intr_status(hal->dev, TIMER_LL_EVENT_ALARM(hal->timer_id));
/* Configure callback, in case a handler was provided before */
if (priv->callback != NULL)
{
timer_ll_enable_intr(hal->dev, TIMER_LL_EVENT_ALARM(hal->timer_id),
true);
}
/* Finally, start the TIMER */
timer_ll_enable_counter(hal->dev, hal->timer_id, true);
priv->started = true;
return OK;
}
/****************************************************************************
* Name: esp_timer_stop
*
* Description:
* Stop the timer. In case a callback was previously configured,
* unregister and deallocate it.
*
* Input Parameters:
* lower - A pointer the publicly visible representation of the
* "lower-half" driver state structure.
*
* Returned Values:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
static int esp_timer_stop(struct timer_lowerhalf_s *lower)
{
struct esp_timer_lowerhalf_s *priv = (struct esp_timer_lowerhalf_s *)lower;
int ret = OK;
DEBUGASSERT(priv != NULL);
if (!priv->started)
{
/* Return ENODEV to indicate that the timer was not running */
return -ENODEV;
}
timer_hal_context_t *hal = &(priv->hal);
timer_ll_enable_intr(hal->dev, TIMER_LL_EVENT_ALARM(hal->timer_id),
false);
timer_ll_enable_counter(hal->dev, hal->timer_id, false);
priv->started = false;
priv->callback = NULL;
return ret;
}
/****************************************************************************
* Name: timer_getstatus
*
* Description:
* Get the current timer status
*
* Input Parameters:
* lower - A pointer the publicly visible representation of the
* "lower-half" driver state structure.
* status - The location to return the timer status information.
*
* Returned Values:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
static int esp_timer_getstatus(struct timer_lowerhalf_s *lower,
struct timer_status_s *status)
{
struct esp_timer_lowerhalf_s *priv = (struct esp_timer_lowerhalf_s *)lower;
uint64_t current_counter_value;
uint64_t alarm_value;
DEBUGASSERT(priv != NULL);
timer_hal_context_t *hal = &(priv->hal);
/* Return the status bit */
status->flags = 0;
if (priv->started)
{
/* TIMER is running */
status->flags |= TCFLAGS_ACTIVE;
}
if (priv->callback != NULL)
{
/* TIMER has a user callback function to be called when
* expiration happens
*/
status->flags |= TCFLAGS_HANDLER;
}
/* Get the current counter value */
current_counter_value = timer_hal_capture_and_get_counter_value(hal);
/* Get the current configured timeout */
volatile timg_hwtimer_reg_t *hw_timer =
&(hal->dev->hw_timer[hal->timer_id]);
alarm_value = ((uint64_t)hw_timer->alarmhi.tx_alarm_hi << 32) |
(hw_timer->alarmlo.tx_alarm_lo);
status->timeout = (uint32_t)alarm_value;
status->timeleft = (uint32_t)(alarm_value - current_counter_value);
return OK;
}
/****************************************************************************
* Name: esp_timer_settimeout
*
* Description:
* Set a new timeout value (and reset the timer)
*
* Input Parameters:
* lower - A pointer the publicly visible representation of the
* "lower-half" driver state structure.
* timeout - The new timeout value in microseconds.
*
* Returned Values:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
static int esp_timer_settimeout(struct timer_lowerhalf_s *lower,
uint32_t timeout)
{
struct esp_timer_lowerhalf_s *priv = (struct esp_timer_lowerhalf_s *)lower;
DEBUGASSERT(priv != NULL);
timer_hal_context_t *hal = &(priv->hal);
/* Set the timeout */
timer_ll_set_alarm_value(hal->dev, hal->timer_id, (uint64_t)timeout);
return OK;
}
/****************************************************************************
* Name: esp_timer_setcallback
*
* Description:
* Call this user provided timeout handler.
*
* Input Parameters:
* lower - A pointer the publicly visible representation of
* the "lower-half" driver state structure.
* callback - The new timer expiration function pointer. If this
* function pointer is NULL, then the timer will be
* disabled.
* arg - Argument that will be provided in the callback
*
* Returned Value:
* The previous timer expiration function pointer or NULL is there was
* no previous function pointer.
*
****************************************************************************/
static void esp_timer_setcallback(struct timer_lowerhalf_s *lower,
tccb_t callback, void *arg)
{
struct esp_timer_lowerhalf_s *priv = (struct esp_timer_lowerhalf_s *)lower;
timer_hal_context_t *hal = &(priv->hal);
DEBUGASSERT(priv != NULL);
/* Save the new callback */
priv->callback = callback;
priv->arg = arg;
/* There is a user callback and the timer has already been started */
bool enable = callback != NULL && priv->started;
timer_ll_enable_intr(hal->dev, TIMER_LL_EVENT_ALARM(hal->timer_id),
enable);
}
/****************************************************************************
* Name: esp_timer_maxtimeout
*
* Description:
* Get the maximum timeout value.
*
* Input Parameters:
* lower - A pointer the publicly visible representation of
* the "lower-half" driver state structure.
* maxtimeout - A pointer to the variable that will store the maximum
* timeout value.
*
* Returned Value:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
static int esp_timer_maxtimeout(struct timer_lowerhalf_s *lower,
uint32_t *max_timeout)
{
DEBUGASSERT(max_timeout != NULL);
*max_timeout = UINT32_MAX;
return OK;
}
/****************************************************************************
* Name: esp_timer_handler
*
* Description:
* This is the Timer interrupt handler. It will be invoked when an
* interrupt is received on the device.
*
* Input Parameters:
* irq - IRQ associated to that interrupt.
* context - Interrupt register state save info.
* arg - A pointer to the argument provided when the interrupt
* was registered.
*
* Returned Value:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
IRAM_ATTR static int esp_timer_isr(int irq, void *context, void *arg)
{
struct esp_timer_lowerhalf_s *priv = (struct esp_timer_lowerhalf_s *)arg;
timer_hal_context_t *hal = &(priv->hal);
uint32_t next_interval_us = 0;
uint32_t intr_status = timer_ll_get_intr_status(hal->dev);
if ((intr_status & TIMER_LL_EVENT_ALARM(hal->timer_id)) == 0)
{
return OK;
}
/* Clear the Interrupt */
timer_ll_clear_intr_status(hal->dev, TIMER_LL_EVENT_ALARM(hal->timer_id));
if (priv->callback(&next_interval_us, priv->arg))
{
if (next_interval_us > 0)
{
/* Set a value to the alarm */
timer_ll_set_alarm_value(hal->dev, hal->timer_id,
(uint64_t)next_interval_us);
}
}
else
{
esp_timer_stop((struct timer_lowerhalf_s *)priv);
}
timer_ll_enable_alarm(hal->dev, hal->timer_id, true);
return OK;
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: esp_timer_initialize
*
* Description:
* Initialize a timer device.
*
* Input Parameters:
* timer_id - ID of the hardware timer to be initialized.
*
* Returned Values:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
int esp_timer_initialize(uint32_t timer_id)
{
struct esp_timer_lowerhalf_s *lower = NULL;
char devpath[PATH_MAX];
uint32_t group_num;
uint32_t timer_num;
switch (timer_id)
{
case 0:
{
periph_module_enable(PERIPH_TIMG0_MODULE);
group_num = 0;
timer_num = 0;
lower = &g_timer0_lowerhalf;
}
break;
case 1:
{
periph_module_enable(PERIPH_TIMG1_MODULE);
group_num = 1;
timer_num = 0;
lower = &g_timer1_lowerhalf;
}
break;
default:
{
return -ENODEV;
}
break;
}
snprintf(devpath, sizeof(devpath), "/dev/timer%" PRIu32, timer_id);
/* Initialize the elements of lower half state structure */
lower->callback = NULL;
lower->started = false;
timer_hal_init(&lower->hal, group_num, timer_num);
/* Register the timer driver as /dev/timerX. If the registration goes
* right the returned value from timer_register is a pointer to
* timer_upperhalf_s that can be either used with timer_unregister()
* or with the handler's arg.
*/
lower->upper = timer_register(devpath, (struct timer_lowerhalf_s *)lower);
if (lower->upper == NULL)
{
/* The actual cause of the failure may have been a failure to allocate
* perhaps a failure to register the timer driver (such as if the
* 'devpath' were not unique). We know here but we return EEXIST to
* indicate the failure (implying the non-unique devpath).
*/
return -EEXIST;
}
esp_setup_irq(lower->source,
ESP_IRQ_PRIORITY_DEFAULT,
ESP_IRQ_TRIGGER_LEVEL);
/* Attach the handler for the timer IRQ */
irq_attach(lower->irq, (xcpt_t)esp_timer_isr, lower);
/* Enable the allocated CPU interrupt */
up_enable_irq(lower->irq);
return OK;
}

View file

@ -0,0 +1,53 @@
/****************************************************************************
* arch/risc-v/src/espressif/esp_timer.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. 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.
*
****************************************************************************/
#ifndef __ARCH_RISCV_SRC_ESPRESSIF_ESP_TIMER_H
#define __ARCH_RISCV_SRC_ESPRESSIF_ESP_TIMER_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: esp_timer_initialize
*
* Description:
* Initialize a timer device.
*
* Input Parameters:
* timer_id - ID of the hardware timer to be initialized.
*
* Returned Values:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
int esp_timer_initialize(uint32_t timer_id);
#endif /* __ARCH_RISCV_SRC_ESPRESSIF_ESP_TIMER_H */

View file

@ -85,6 +85,8 @@ CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/esp_system/port/soc/$(C
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/brownout_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/efuse_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/systimer_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/timer_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/timer_hal_iram.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/uart_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/uart_hal_iram.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/wdt_hal_iram.c

View file

@ -89,6 +89,8 @@ CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/esp_system/port/soc/$(C
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/esp_system/port/soc/$(CHIP_SERIES)/system_internal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/brownout_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/efuse_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/timer_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/timer_hal_iram.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/uart_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/uart_hal_iram.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/$(CHIP_SERIES)/clk_tree_hal.c

View file

@ -89,6 +89,8 @@ CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/esp_system/port/soc/$(C
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/brownout_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/cache_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/efuse_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/timer_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/timer_hal_iram.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/uart_hal.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/uart_hal_iram.c
CHIP_CSRCS += chip/$(ESP_HAL_3RDPARTY_UNPACK)/components/hal/$(CHIP_SERIES)/clk_tree_hal.c

View file

@ -0,0 +1,47 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="risc-v"
CONFIG_ARCH_BOARD="esp32c3-generic"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32C3_GENERIC=y
CONFIG_ARCH_CHIP="espressif"
CONFIG_ARCH_CHIP_ESPRESSIF=y
CONFIG_ARCH_INTERRUPTSTACK=1536
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BOARD_LOOPSPERMSEC=15000
CONFIG_BUILTIN=y
CONFIG_DEV_ZERO=y
CONFIG_EXAMPLES_TIMER=y
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_READLINE=y
CONFIG_NSH_STRERROR=y
CONFIG_PREALLOC_TIMERS=0
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_BACKTRACE=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=28
CONFIG_START_MONTH=03
CONFIG_START_YEAR=2023
CONFIG_SYSTEM_DUMPSTACK=y
CONFIG_SYSTEM_NSH=y
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y
CONFIG_TIMER=y
CONFIG_UART0_SERIAL_CONSOLE=y

View file

@ -38,6 +38,10 @@
# include "esp_wdt.h"
#endif
#ifdef CONFIG_TIMER
# include "esp_timer.h"
#endif
#ifdef CONFIG_ESPRESSIF_HR_TIMER
# include "esp_hr_timer.h"
#endif
@ -105,6 +109,20 @@ int esp_bringup(void)
}
#endif
#ifdef CONFIG_TIMER
ret = esp_timer_initialize(0);
if (ret < 0)
{
_err("Failed to initialize Timer 0: %d\n", ret);
}
ret = esp_timer_initialize(1);
if (ret < 0)
{
_err("Failed to initialize Timer 1: %d\n", ret);
}
#endif
#ifdef CONFIG_ESPRESSIF_HR_TIMER
ret = esp_hr_timer_init();
if (ret < 0)

View file

@ -0,0 +1,48 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="risc-v"
CONFIG_ARCH_BOARD="esp32c6-generic"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32C6_GENERIC=y
CONFIG_ARCH_CHIP="espressif"
CONFIG_ARCH_CHIP_ESPRESSIF=y
CONFIG_ARCH_INTERRUPTSTACK=1536
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BOARD_LOOPSPERMSEC=15000
CONFIG_BUILTIN=y
CONFIG_DEV_ZERO=y
CONFIG_ESPRESSIF_ESP32C6=y
CONFIG_EXAMPLES_TIMER=y
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_READLINE=y
CONFIG_NSH_STRERROR=y
CONFIG_PREALLOC_TIMERS=0
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_BACKTRACE=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=28
CONFIG_START_MONTH=03
CONFIG_START_YEAR=2023
CONFIG_SYSTEM_DUMPSTACK=y
CONFIG_SYSTEM_NSH=y
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y
CONFIG_TIMER=y
CONFIG_UART0_SERIAL_CONSOLE=y

View file

@ -38,6 +38,10 @@
# include "esp_wdt.h"
#endif
#ifdef CONFIG_TIMER
# include "esp_timer.h"
#endif
#ifdef CONFIG_ESPRESSIF_HR_TIMER
# include "esp_hr_timer.h"
#endif
@ -105,6 +109,20 @@ int esp_bringup(void)
}
#endif
#ifdef CONFIG_TIMER
ret = esp_timer_initialize(0);
if (ret < 0)
{
_err("Failed to initialize Timer 0: %d\n", ret);
}
ret = esp_timer_initialize(1);
if (ret < 0)
{
_err("Failed to initialize Timer 1: %d\n", ret);
}
#endif
#ifdef CONFIG_ESPRESSIF_HR_TIMER
ret = esp_hr_timer_init();
if (ret < 0)

View file

@ -0,0 +1,48 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
CONFIG_ARCH="risc-v"
CONFIG_ARCH_BOARD="esp32h2-generic"
CONFIG_ARCH_BOARD_COMMON=y
CONFIG_ARCH_BOARD_ESP32H2_GENERIC=y
CONFIG_ARCH_CHIP="espressif"
CONFIG_ARCH_CHIP_ESPRESSIF=y
CONFIG_ARCH_INTERRUPTSTACK=1536
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BOARD_LOOPSPERMSEC=15000
CONFIG_BUILTIN=y
CONFIG_DEV_ZERO=y
CONFIG_ESPRESSIF_ESP32H2=y
CONFIG_EXAMPLES_TIMER=y
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_READLINE=y
CONFIG_NSH_STRERROR=y
CONFIG_PREALLOC_TIMERS=0
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_BACKTRACE=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=28
CONFIG_START_MONTH=03
CONFIG_START_YEAR=2023
CONFIG_SYSTEM_DUMPSTACK=y
CONFIG_SYSTEM_NSH=y
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y
CONFIG_TIMER=y
CONFIG_UART0_SERIAL_CONSOLE=y

View file

@ -38,6 +38,10 @@
# include "esp_wdt.h"
#endif
#ifdef CONFIG_TIMER
# include "esp_timer.h"
#endif
#ifdef CONFIG_ESPRESSIF_HR_TIMER
# include "esp_hr_timer.h"
#endif
@ -105,6 +109,20 @@ int esp_bringup(void)
}
#endif
#ifdef CONFIG_TIMER
ret = esp_timer_initialize(0);
if (ret < 0)
{
_err("Failed to initialize Timer 0: %d\n", ret);
}
ret = esp_timer_initialize(1);
if (ret < 0)
{
_err("Failed to initialize Timer 1: %d\n", ret);
}
#endif
#ifdef CONFIG_ESPRESSIF_HR_TIMER
ret = esp_hr_timer_init();
if (ret < 0)