| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /* Copyright 2018 Canaan Inc.
- *
- * 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.
- */
- #ifndef _DRIVER_TIMER_H
- #define _DRIVER_TIMER_H
- #include <stddef.h>
- #include <stdint.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* clang-format off */
- typedef struct _timer_channel
- {
- /* TIMER_N Load Count Register (0x00+(N-1)*0x14) */
- volatile uint32_t load_count;
- /* TIMER_N Current Value Register (0x04+(N-1)*0x14) */
- volatile uint32_t current_value;
- /* TIMER_N Control Register (0x08+(N-1)*0x14) */
- volatile uint32_t control;
- /* TIMER_N Interrupt Clear Register (0x0c+(N-1)*0x14) */
- volatile uint32_t eoi;
- /* TIMER_N Interrupt Status Register (0x10+(N-1)*0x14) */
- volatile uint32_t intr_stat;
- } __attribute__((packed, aligned(4))) timer_channel_t;
- typedef struct _kendryte_timer
- {
- /* TIMER_N Register (0x00-0x4c) */
- volatile timer_channel_t channel[4];
- /* reserverd (0x50-0x9c) */
- volatile uint32_t resv1[20];
- /* TIMER Interrupt Status Register (0xa0) */
- volatile uint32_t intr_stat;
- /* TIMER Interrupt Clear Register (0xa4) */
- volatile uint32_t eoi;
- /* TIMER Raw Interrupt Status Register (0xa8) */
- volatile uint32_t raw_intr_stat;
- /* TIMER Component Version Register (0xac) */
- volatile uint32_t comp_version;
- /* TIMER_N Load Count2 Register (0xb0-0xbc) */
- volatile uint32_t load_count2[4];
- } __attribute__((packed, aligned(4))) kendryte_timer_t;
- typedef enum _timer_deivce_number
- {
- TIMER_DEVICE_0,
- TIMER_DEVICE_1,
- TIMER_DEVICE_2,
- TIMER_DEVICE_MAX,
- } timer_device_number_t;
- typedef enum _timer_channel_number
- {
- TIMER_CHANNEL_0,
- TIMER_CHANNEL_1,
- TIMER_CHANNEL_2,
- TIMER_CHANNEL_3,
- TIMER_CHANNEL_MAX,
- } timer_channel_number_t;
- /* TIMER Control Register */
- #define TIMER_CR_ENABLE 0x00000001
- #define TIMER_CR_MODE_MASK 0x00000002
- #define TIMER_CR_FREE_MODE 0x00000000
- #define TIMER_CR_USER_MODE 0x00000002
- #define TIMER_CR_INTERRUPT_MASK 0x00000004
- #define TIMER_CR_PWM_ENABLE 0x00000008
- /* clang-format on */
- extern volatile kendryte_timer_t *const timer[3];
- /**
- * @brief Definitions for the timer callbacks
- */
- typedef int (*timer_callback_t)(void *ctx);
- /**
- * @brief Set timer timeout
- *
- * @param[in] timer timer
- * @param[in] channel channel
- * @param[in] nanoseconds timeout
- *
- * @return the real timeout
- */
- size_t timer_set_interval(timer_device_number_t timer_number, timer_channel_number_t channel, size_t nanoseconds);
- /**
- * @brief Init timer
- *
- * @param[in] timer timer
- */
- void timer_init(timer_device_number_t timer_number);
- /**
- * @brief [DEPRECATED] Set timer timeout function
- *
- * @param[in] timer timer
- * @param[in] channel channel
- * @param[in] func timeout function
- * @param[in] priority interrupt priority
- *
- */
- void timer_set_irq(timer_device_number_t timer_number, timer_channel_number_t channel, void (*func)(), uint32_t priority);
- /**
- * @brief Register timer interrupt user callback function
- *
- * @param[in] device The timer device number
- * @param[in] channel The channel
- * @param[in] is_one_shot Indicates if single shot
- * @param[in] priority The priority
- * @param[in] callback The callback function
- * @param[in] ctx The context
- *
- * @return result
- * - 0 Success
- * - Other Fail
- */
- int timer_irq_register(timer_device_number_t device, timer_channel_number_t channel, int is_single_shot, uint32_t priority, timer_callback_t callback, void *ctx);
- /**
- * @brief Deregister timer interrupt user callback function
- *
- * @param[in] device The timer device number
- * @param[in] channel The channel
- *
- * @return result
- * - 0 Success
- * - Other Fail
- */
- int timer_irq_unregister(timer_device_number_t device, timer_channel_number_t channel);
- /**
- * @brief Enable timer
- *
- * @param[in] timer timer
- * @param[in] channel channel
- * @param[in] enable Enable or disable
- *
- */
- void timer_set_enable(timer_device_number_t timer_number, timer_channel_number_t channel, uint32_t enable);
- #ifdef __cplusplus
- }
- #endif
- #endif /* _DRIVER_TIMER_H */
|