mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 06:11:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: Apache-2.0
 | 
						|
 */
 | 
						|
 | 
						|
#include "soc/soc.h"
 | 
						|
#include "hal/ieee802154_ll.h"
 | 
						|
#include "esp_check.h"
 | 
						|
#include "esp_ieee802154_timer.h"
 | 
						|
#include "esp_ieee802154_util.h"
 | 
						|
#include <stdbool.h>
 | 
						|
 | 
						|
static timer_callback_t s_timer0_callback = NULL;
 | 
						|
static timer_callback_t s_timer1_callback = NULL;
 | 
						|
static void* s_timer0_ctx = NULL;
 | 
						|
static void* s_timer1_ctx = NULL;
 | 
						|
 | 
						|
void ieee802154_timer0_start(void)
 | 
						|
{
 | 
						|
    ieee802154_ll_set_cmd(IEEE802154_CMD_TIMER0_START);
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer0_stop(void)
 | 
						|
{
 | 
						|
    s_timer0_callback = NULL;
 | 
						|
    s_timer0_ctx = NULL;
 | 
						|
    ieee802154_ll_set_cmd(IEEE802154_CMD_TIMER0_STOP);
 | 
						|
}
 | 
						|
 | 
						|
esp_err_t ieee802154_timer0_set_threshold(uint32_t value)
 | 
						|
{
 | 
						|
    ESP_RETURN_ON_FALSE((value < IEEE802154_TIMER0_THRESHOLD), ESP_ERR_INVALID_ARG, IEEE802154_TAG, "invalid timer0 threshold");
 | 
						|
 | 
						|
    ieee802154_ll_timer0_set_threshold(value);
 | 
						|
 | 
						|
    return ESP_OK;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t ieee802154_timer0_get_value(void)
 | 
						|
{
 | 
						|
    return ieee802154_ll_timer0_get_value();
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer1_start(void)
 | 
						|
{
 | 
						|
    ieee802154_ll_set_cmd(IEEE802154_CMD_TIMER1_START);
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer1_stop(void)
 | 
						|
{
 | 
						|
    s_timer1_callback = NULL;
 | 
						|
    s_timer1_ctx = NULL;
 | 
						|
    ieee802154_ll_set_cmd(IEEE802154_CMD_TIMER1_STOP);
 | 
						|
}
 | 
						|
 | 
						|
esp_err_t ieee802154_timer1_set_threshold(uint32_t value)
 | 
						|
{
 | 
						|
    ESP_RETURN_ON_FALSE((value < IEEE802154_TIMER1_THRESHOLD), ESP_ERR_INVALID_ARG, IEEE802154_TAG, "invalid timer1 threshold");
 | 
						|
 | 
						|
    ieee802154_ll_timer1_set_threshold(value);
 | 
						|
 | 
						|
    return ESP_OK;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t ieee802154_timer1_get_value(void)
 | 
						|
{
 | 
						|
    return ieee802154_ll_timer1_get_value();
 | 
						|
}
 | 
						|
 | 
						|
FORCE_INLINE_ATTR bool is_target_time_expired(uint32_t target, uint32_t now)
 | 
						|
{
 | 
						|
    return (((now - target) & (1 << 31)) == 0);
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer0_fire_at(uint32_t fire_time)
 | 
						|
{
 | 
						|
    uint32_t current_time = (uint32_t)esp_timer_get_time();
 | 
						|
    ieee802154_timer0_set_threshold((is_target_time_expired(fire_time, current_time) ? 0 : (fire_time - current_time))); //uint: 1us
 | 
						|
    ieee802154_timer0_start();
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer1_fire_at(uint32_t fire_time)
 | 
						|
{
 | 
						|
    uint32_t current_time = (uint32_t)esp_timer_get_time();
 | 
						|
    ieee802154_timer1_set_threshold((is_target_time_expired(fire_time, current_time) ? 0 : (fire_time - current_time))); //uint: 1us
 | 
						|
    ieee802154_timer1_start();
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer0_set_callback(timer_callback_t timer0_cb, void *timer0_ctx)
 | 
						|
{
 | 
						|
    s_timer0_callback = timer0_cb;
 | 
						|
    s_timer0_ctx = timer0_ctx;
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer1_set_callback(timer_callback_t timer1_cb, void *timer1_ctx)
 | 
						|
{
 | 
						|
    s_timer1_callback = timer1_cb;
 | 
						|
    s_timer1_ctx = timer1_ctx;
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer0_fire_at_with_callback(uint32_t fire_time, timer_callback_t timer0_cb, void *timer0_ctx)
 | 
						|
{
 | 
						|
    ieee802154_timer0_set_callback(timer0_cb, timer0_ctx);
 | 
						|
    ieee802154_timer0_fire_at(fire_time);
 | 
						|
}
 | 
						|
 | 
						|
void ieee802154_timer1_fire_at_with_callback(uint32_t fire_time, timer_callback_t timer1_cb, void *timer1_ctx)
 | 
						|
{
 | 
						|
    ieee802154_timer1_set_callback(timer1_cb, timer1_ctx);
 | 
						|
    ieee802154_timer1_fire_at(fire_time);
 | 
						|
}
 | 
						|
 | 
						|
void isr_handle_timer0_done(void)
 | 
						|
{
 | 
						|
    if (s_timer0_callback) {
 | 
						|
        timer_callback_t callback_tmp = s_timer0_callback; // tmp function used to allow new callback function to set a new callback without overwriting it
 | 
						|
        void* ctx_tmp = s_timer0_ctx;
 | 
						|
 | 
						|
        s_timer0_callback = NULL;
 | 
						|
        s_timer0_ctx = NULL;
 | 
						|
 | 
						|
        callback_tmp(ctx_tmp);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void isr_handle_timer1_done(void)
 | 
						|
{
 | 
						|
    if (s_timer1_callback) {
 | 
						|
        timer_callback_t callback_tmp = s_timer1_callback; // tmp function used to allow new callback function to set a new callback without overwriting it
 | 
						|
        void* ctx_tmp = s_timer1_ctx;
 | 
						|
 | 
						|
        s_timer1_callback = NULL;
 | 
						|
        s_timer1_ctx = NULL;
 | 
						|
 | 
						|
        callback_tmp(ctx_tmp);
 | 
						|
    }
 | 
						|
}
 |