mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			
		
			
				
	
	
		
			152 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
/*
 | 
						|
 * Copyright (c) 2018 ARM Limited
 | 
						|
 * SPDX-License-Identifier: Apache-2.0
 | 
						|
 *
 | 
						|
 * Licensed 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.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * \file cmsdk_ticker.h
 | 
						|
 * CMSDK Ticker implements the functionalities of mbed tickers:
 | 
						|
 * 1. Elapsed time measurement
 | 
						|
 * 2. Interval interrupt request
 | 
						|
 *
 | 
						|
 * This ticker service is based on CMSDK APB Timers, abstracting
 | 
						|
 * the HAL logic, the timer driver and interrupt number.
 | 
						|
 * These parameters should be passed to the functions by
 | 
						|
 * an initialized \ref tick_drv_data_t pointer.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef CMSDK_TICKER_H
 | 
						|
#define CMSDK_TICKER_H
 | 
						|
 | 
						|
#include <stdbool.h>
 | 
						|
 | 
						|
#include "CM3DS.h"
 | 
						|
#include "timer_cmsdk_drv.h"
 | 
						|
 | 
						|
#define SEC_TO_USEC_MULTIPLIER    1000000U
 | 
						|
 | 
						|
/**
 | 
						|
 * brief Encapsulating struct for config data \ref tick_cfg_t and
 | 
						|
 *       the current status \ref tick_data_t.
 | 
						|
 */
 | 
						|
struct tick_drv_data_t {
 | 
						|
    const struct tick_cfg_t* const cfg;
 | 
						|
    struct tick_data_t* const data;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * brief Configuration data of the CMSDK ticker
 | 
						|
 */
 | 
						|
struct tick_cfg_t {
 | 
						|
    /** Pointer to the used CMSDK Timer's device structure */
 | 
						|
    struct timer_cmsdk_dev_t* const timer_driver;
 | 
						|
    /** IRQ number of the used CMSDK Timer */
 | 
						|
    const IRQn_Type irq_n;
 | 
						|
    /** Interval callback of mbed*/
 | 
						|
    void (*const interval_callback)();
 | 
						|
    /** Function pointers to call for conversions of clock ticks and defined
 | 
						|
     *  time unit.
 | 
						|
     *  These conversions define the unit of the measured time.
 | 
						|
     */
 | 
						|
    uint32_t (*const convert_tick_to_time)(uint32_t tick);
 | 
						|
    uint32_t (*const convert_time_to_tick)(uint32_t time);
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * brief Current state data of the CMSDK ticker
 | 
						|
 */
 | 
						|
struct tick_data_t {
 | 
						|
    /** True if initialized the ticker, false otherwise */
 | 
						|
    bool is_initialized;
 | 
						|
    /** Measured elapsed time in the defined unit by
 | 
						|
     *  \ref convert_tick_to_time and \ref convert_time_to_tick */
 | 
						|
    uint32_t cumulated_time;
 | 
						|
    /** Max interval time possible to set, in the defined unit by
 | 
						|
     *  \ref convert_tick_to_time and \ref convert_time_to_tick */
 | 
						|
    uint32_t max_interval_time;
 | 
						|
    /** Current reload time in the defined unit by
 | 
						|
     *  \ref convert_tick_to_time and \ref convert_time_to_tick */
 | 
						|
    uint32_t reload_time;
 | 
						|
    /** Interval IRQ callback is requested */
 | 
						|
    bool interval_callback_enabled;
 | 
						|
    /** Previous cumulated time calculated for this ticker. Used in the
 | 
						|
     *  cmsdk_ticker_read function to detect that the timer has wrapped. */
 | 
						|
    uint32_t previous_cumulated_time;
 | 
						|
    /** Previous elapsed value for this ticker. Used in the
 | 
						|
     *  cmsdk_ticker_read function to detect that the timer has wrapped. */
 | 
						|
    uint32_t previous_elapsed;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief Init the CMSDK Ticker
 | 
						|
 *
 | 
						|
 * \param[in] timer_data Pointer to the used CMSDK Timer's device structure
 | 
						|
 */
 | 
						|
void cmsdk_ticker_init(const struct tick_drv_data_t* timer_data);
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief Read elapsed time by CMSDK Ticker
 | 
						|
 *
 | 
						|
 * \param[in] timer_data Pointer to the used CMSDK Timer's device structure
 | 
						|
 *
 | 
						|
 * \return Elapsed time in the unit defined by \ref convert_tick_to_time
 | 
						|
 */
 | 
						|
 | 
						|
uint32_t cmsdk_ticker_read(const struct tick_drv_data_t* timer_data);
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief Request interval interrupt by time stamp \ref timestamp_t
 | 
						|
 *
 | 
						|
 * \param[in] timer_data Pointer to the used CMSDK Timer's device structure
 | 
						|
 * \param[in] timestamp Absolute time \ref timestamp_t value when the interval
 | 
						|
 *                     is requested. Unit of the timestamp is defined by
 | 
						|
 *                     \ref convert_tick_to_time and \ref convert_time_to_tick
 | 
						|
 */
 | 
						|
void cmsdk_ticker_set_interrupt(const struct tick_drv_data_t* timer_data,
 | 
						|
                                uint32_t timestamp);
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief Disable interval interrupt
 | 
						|
 *
 | 
						|
 * \param[in] timer_data Pointer to the used CMSDK Timer's device structure
 | 
						|
 */
 | 
						|
void cmsdk_ticker_disable_interrupt(const struct tick_drv_data_t* timer_data);
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief Clear interval interrupt
 | 
						|
 *
 | 
						|
 * \param[in] timer_data Pointer to the used CMSDK Timer's device structure
 | 
						|
 */
 | 
						|
void cmsdk_ticker_clear_interrupt(const struct tick_drv_data_t* timer_data);
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief Set pending interrupt that should be fired right away.
 | 
						|
 *
 | 
						|
 * \param[in] timer_data Pointer to the used CMSDK Timer's device structure
 | 
						|
 */
 | 
						|
void cmsdk_ticker_fire_interrupt(const struct tick_drv_data_t* timer_data);
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief Interrupt handler of the given CMSDK Timer
 | 
						|
 *
 | 
						|
 * \warning This function may be called from multiple interrupt handlers,
 | 
						|
 *          so extra care must be taken for re-entrancy!
 | 
						|
 *
 | 
						|
 * \param[in] timer_data Pointer to the used CMSDK Timer's device structure
 | 
						|
 */
 | 
						|
void cmsdk_ticker_irq_handler(const struct tick_drv_data_t* timer_data);
 | 
						|
#endif
 |