Platform drivers for Mbed.
Dependents: EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more
timer.cpp@20:4951ea6abee5, 2021-11-29 (annotated)
- Committer:
- Kjansen
- Date:
- Mon Nov 29 12:39:54 2021 +0000
- Revision:
- 20:4951ea6abee5
The following changes were made:
1.) Modified udelay() function for generating more accurate smaller usec delays
2.) Implemented the irq_enable and irq_disable functions
3.) Removed the confusion b/w application created peripheral object and interrupt specific object
4.) Created PWM extra init structure and added PWM pin
5.) Added a module for timer and its related header file
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Kjansen |
20:4951ea6abee5 | 1 | /**************************************************************************//** |
Kjansen |
20:4951ea6abee5 | 2 | * @file timer.cpp |
Kjansen |
20:4951ea6abee5 | 3 | * @brief Implementation of Timer MBED Platform Driver Interfaces |
Kjansen |
20:4951ea6abee5 | 4 | ******************************************************************************* |
Kjansen |
20:4951ea6abee5 | 5 | * Copyright (c) 2021 Analog Devices, Inc. |
Kjansen |
20:4951ea6abee5 | 6 | * All rights reserved. |
Kjansen |
20:4951ea6abee5 | 7 | * |
Kjansen |
20:4951ea6abee5 | 8 | * This software is proprietary to Analog Devices, Inc. and its licensors. |
Kjansen |
20:4951ea6abee5 | 9 | * By using this software you agree to the terms of the associated |
Kjansen |
20:4951ea6abee5 | 10 | * Analog Devices Software License Agreement. |
Kjansen |
20:4951ea6abee5 | 11 | ******************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 12 | |
Kjansen |
20:4951ea6abee5 | 13 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 14 | /***************************** Include Files *********************************/ |
Kjansen |
20:4951ea6abee5 | 15 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 16 | |
Kjansen |
20:4951ea6abee5 | 17 | #include <stdio.h> |
Kjansen |
20:4951ea6abee5 | 18 | #include <mbed.h> |
Kjansen |
20:4951ea6abee5 | 19 | |
Kjansen |
20:4951ea6abee5 | 20 | //Platform Drivers need to be C-compatible to work with other drivers |
Kjansen |
20:4951ea6abee5 | 21 | #ifdef __cplusplus |
Kjansen |
20:4951ea6abee5 | 22 | extern "C" |
Kjansen |
20:4951ea6abee5 | 23 | { |
Kjansen |
20:4951ea6abee5 | 24 | #endif //__cplusplus |
Kjansen |
20:4951ea6abee5 | 25 | |
Kjansen |
20:4951ea6abee5 | 26 | #include "timer.h" |
Kjansen |
20:4951ea6abee5 | 27 | #include "error.h" |
Kjansen |
20:4951ea6abee5 | 28 | #include "timer_extra.h" |
Kjansen |
20:4951ea6abee5 | 29 | using namespace std::chrono; |
Kjansen |
20:4951ea6abee5 | 30 | |
Kjansen |
20:4951ea6abee5 | 31 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 32 | /******************** Variables and User Defined Data Types ******************/ |
Kjansen |
20:4951ea6abee5 | 33 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 34 | |
Kjansen |
20:4951ea6abee5 | 35 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 36 | /************************** Functions Declarations ***************************/ |
Kjansen |
20:4951ea6abee5 | 37 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 38 | |
Kjansen |
20:4951ea6abee5 | 39 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 40 | /************************** Functions Definitions ****************************/ |
Kjansen |
20:4951ea6abee5 | 41 | /*****************************************************************************/ |
Kjansen |
20:4951ea6abee5 | 42 | |
Kjansen |
20:4951ea6abee5 | 43 | /** |
Kjansen |
20:4951ea6abee5 | 44 | * @brief Initialize the timer peripheral |
Kjansen |
20:4951ea6abee5 | 45 | * @param desc[in, out] - The Timer descriptor |
Kjansen |
20:4951ea6abee5 | 46 | * @param init_param[in] - Structure that contains Timer Initialization Parameters |
Kjansen |
20:4951ea6abee5 | 47 | * @return SUCCESS in case of success, FAILURE otherwise |
Kjansen |
20:4951ea6abee5 | 48 | */ |
Kjansen |
20:4951ea6abee5 | 49 | int32_t timer_init(struct timer_desc **desc, |
Kjansen |
20:4951ea6abee5 | 50 | struct timer_init_param *param) |
Kjansen |
20:4951ea6abee5 | 51 | { |
Kjansen |
20:4951ea6abee5 | 52 | timer_desc *new_timer; // Pointer to timer descriptor |
Kjansen |
20:4951ea6abee5 | 53 | mbed_timer_desc *mbed_desc; // Pointer to mbed timer descriptor |
Kjansen |
20:4951ea6abee5 | 54 | mbed::Timer *timer; // Pointer to new Timer instance |
Kjansen |
20:4951ea6abee5 | 55 | |
Kjansen |
20:4951ea6abee5 | 56 | if (desc && param) { |
Kjansen |
20:4951ea6abee5 | 57 | new_timer = (timer_desc *)malloc(sizeof(timer_desc)); |
Kjansen |
20:4951ea6abee5 | 58 | if (!new_timer) { |
Kjansen |
20:4951ea6abee5 | 59 | goto err_new_desc; |
Kjansen |
20:4951ea6abee5 | 60 | } |
Kjansen |
20:4951ea6abee5 | 61 | new_timer->freq_hz = param->freq_hz; |
Kjansen |
20:4951ea6abee5 | 62 | new_timer->id = param->id; |
Kjansen |
20:4951ea6abee5 | 63 | new_timer->load_value = param->load_value; |
Kjansen |
20:4951ea6abee5 | 64 | |
Kjansen |
20:4951ea6abee5 | 65 | mbed_desc = (mbed_timer_desc *)malloc(sizeof(mbed_timer_desc)); |
Kjansen |
20:4951ea6abee5 | 66 | if (!mbed_desc) { |
Kjansen |
20:4951ea6abee5 | 67 | goto err_mbed_desc; |
Kjansen |
20:4951ea6abee5 | 68 | } |
Kjansen |
20:4951ea6abee5 | 69 | |
Kjansen |
20:4951ea6abee5 | 70 | timer = new Timer(); |
Kjansen |
20:4951ea6abee5 | 71 | if (!timer) { |
Kjansen |
20:4951ea6abee5 | 72 | goto err_timer_instance; |
Kjansen |
20:4951ea6abee5 | 73 | } |
Kjansen |
20:4951ea6abee5 | 74 | |
Kjansen |
20:4951ea6abee5 | 75 | mbed_desc->timer = timer; |
Kjansen |
20:4951ea6abee5 | 76 | new_timer->extra = (mbed_timer_desc *) mbed_desc; |
Kjansen |
20:4951ea6abee5 | 77 | |
Kjansen |
20:4951ea6abee5 | 78 | *desc = new_timer; |
Kjansen |
20:4951ea6abee5 | 79 | return SUCCESS; |
Kjansen |
20:4951ea6abee5 | 80 | } |
Kjansen |
20:4951ea6abee5 | 81 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 82 | |
Kjansen |
20:4951ea6abee5 | 83 | err_timer_instance: |
Kjansen |
20:4951ea6abee5 | 84 | free(mbed_desc); |
Kjansen |
20:4951ea6abee5 | 85 | free(new_timer); |
Kjansen |
20:4951ea6abee5 | 86 | err_mbed_desc: |
Kjansen |
20:4951ea6abee5 | 87 | free(new_timer); |
Kjansen |
20:4951ea6abee5 | 88 | err_new_desc: |
Kjansen |
20:4951ea6abee5 | 89 | // Nothing to free |
Kjansen |
20:4951ea6abee5 | 90 | |
Kjansen |
20:4951ea6abee5 | 91 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 92 | } |
Kjansen |
20:4951ea6abee5 | 93 | |
Kjansen |
20:4951ea6abee5 | 94 | |
Kjansen |
20:4951ea6abee5 | 95 | /** |
Kjansen |
20:4951ea6abee5 | 96 | * @brief Start Timer. |
Kjansen |
20:4951ea6abee5 | 97 | * @param desc[in] - The Timer Descriptor. |
Kjansen |
20:4951ea6abee5 | 98 | * @return SUCCESS in case of success, FAILURE otherwise. |
Kjansen |
20:4951ea6abee5 | 99 | */ |
Kjansen |
20:4951ea6abee5 | 100 | int32_t timer_start(struct timer_desc *desc) |
Kjansen |
20:4951ea6abee5 | 101 | { |
Kjansen |
20:4951ea6abee5 | 102 | mbed::Timer *timer; |
Kjansen |
20:4951ea6abee5 | 103 | |
Kjansen |
20:4951ea6abee5 | 104 | if (!desc) { |
Kjansen |
20:4951ea6abee5 | 105 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 106 | } |
Kjansen |
20:4951ea6abee5 | 107 | timer = (Timer *)(((mbed_timer_desc *)(desc->extra))->timer); |
Kjansen |
20:4951ea6abee5 | 108 | if (!timer) { |
Kjansen |
20:4951ea6abee5 | 109 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 110 | } |
Kjansen |
20:4951ea6abee5 | 111 | timer->start(); |
Kjansen |
20:4951ea6abee5 | 112 | |
Kjansen |
20:4951ea6abee5 | 113 | return SUCCESS; |
Kjansen |
20:4951ea6abee5 | 114 | } |
Kjansen |
20:4951ea6abee5 | 115 | |
Kjansen |
20:4951ea6abee5 | 116 | |
Kjansen |
20:4951ea6abee5 | 117 | /** |
Kjansen |
20:4951ea6abee5 | 118 | * @brief Stop Timer. |
Kjansen |
20:4951ea6abee5 | 119 | * @param desc[in] - The Timer Descriptor. |
Kjansen |
20:4951ea6abee5 | 120 | * @return SUCCESS in case of success, FAILURE otherwise. |
Kjansen |
20:4951ea6abee5 | 121 | */ |
Kjansen |
20:4951ea6abee5 | 122 | int32_t timer_stop(struct timer_desc *desc) |
Kjansen |
20:4951ea6abee5 | 123 | { |
Kjansen |
20:4951ea6abee5 | 124 | mbed::Timer *timer; |
Kjansen |
20:4951ea6abee5 | 125 | |
Kjansen |
20:4951ea6abee5 | 126 | if (!desc) { |
Kjansen |
20:4951ea6abee5 | 127 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 128 | } |
Kjansen |
20:4951ea6abee5 | 129 | timer = (Timer *)(((mbed_timer_desc *)(desc->extra))->timer); |
Kjansen |
20:4951ea6abee5 | 130 | if (!timer) { |
Kjansen |
20:4951ea6abee5 | 131 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 132 | } |
Kjansen |
20:4951ea6abee5 | 133 | timer->stop(); |
Kjansen |
20:4951ea6abee5 | 134 | |
Kjansen |
20:4951ea6abee5 | 135 | return SUCCESS; |
Kjansen |
20:4951ea6abee5 | 136 | } |
Kjansen |
20:4951ea6abee5 | 137 | |
Kjansen |
20:4951ea6abee5 | 138 | |
Kjansen |
20:4951ea6abee5 | 139 | /** |
Kjansen |
20:4951ea6abee5 | 140 | * @brief Release all the resources allocated by Timer. |
Kjansen |
20:4951ea6abee5 | 141 | * @param desc[in] - The Timer Descriptor. |
Kjansen |
20:4951ea6abee5 | 142 | * @return SUCCESS in case of success, FAILURE otherwise |
Kjansen |
20:4951ea6abee5 | 143 | */ |
Kjansen |
20:4951ea6abee5 | 144 | int32_t timer_remove(struct timer_desc *desc) |
Kjansen |
20:4951ea6abee5 | 145 | { |
Kjansen |
20:4951ea6abee5 | 146 | if (desc) { |
Kjansen |
20:4951ea6abee5 | 147 | // Free the timer object |
Kjansen |
20:4951ea6abee5 | 148 | if ((Timer *)(((mbed_timer_desc *)(desc->extra))->timer)) { |
Kjansen |
20:4951ea6abee5 | 149 | delete((Timer *)(((mbed_timer_desc *)(desc->extra))->timer)); |
Kjansen |
20:4951ea6abee5 | 150 | } |
Kjansen |
20:4951ea6abee5 | 151 | // Free the extra descriptor object |
Kjansen |
20:4951ea6abee5 | 152 | if ((mbed_timer_desc *)(desc->extra)) { |
Kjansen |
20:4951ea6abee5 | 153 | free((mbed_timer_desc *)(desc->extra)); |
Kjansen |
20:4951ea6abee5 | 154 | } |
Kjansen |
20:4951ea6abee5 | 155 | // Free the Timer descriptor |
Kjansen |
20:4951ea6abee5 | 156 | free(desc); |
Kjansen |
20:4951ea6abee5 | 157 | |
Kjansen |
20:4951ea6abee5 | 158 | return SUCCESS; |
Kjansen |
20:4951ea6abee5 | 159 | } |
Kjansen |
20:4951ea6abee5 | 160 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 161 | } |
Kjansen |
20:4951ea6abee5 | 162 | |
Kjansen |
20:4951ea6abee5 | 163 | |
Kjansen |
20:4951ea6abee5 | 164 | /** |
Kjansen |
20:4951ea6abee5 | 165 | * @brief Get the elapsed time in nanoseconds. |
Kjansen |
20:4951ea6abee5 | 166 | * @param desc[in] - The Timer descriptor |
Kjansen |
20:4951ea6abee5 | 167 | * @param elapsed_time[out] - Pointer where the elapsed time value is stored |
Kjansen |
20:4951ea6abee5 | 168 | * @return SUCCESS in case of success, FAILURE otherwise |
Kjansen |
20:4951ea6abee5 | 169 | */ |
Kjansen |
20:4951ea6abee5 | 170 | int32_t get_elapsed_time_in_nsec(struct timer_desc *desc, |
Kjansen |
20:4951ea6abee5 | 171 | uint64_t *elapsed_time) |
Kjansen |
20:4951ea6abee5 | 172 | { |
Kjansen |
20:4951ea6abee5 | 173 | mbed::Timer *timer; |
Kjansen |
20:4951ea6abee5 | 174 | |
Kjansen |
20:4951ea6abee5 | 175 | if (!desc) { |
Kjansen |
20:4951ea6abee5 | 176 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 177 | } |
Kjansen |
20:4951ea6abee5 | 178 | |
Kjansen |
20:4951ea6abee5 | 179 | timer = (Timer *)(((mbed_timer_desc *)(desc->extra))->timer); |
Kjansen |
20:4951ea6abee5 | 180 | if (!timer) { |
Kjansen |
20:4951ea6abee5 | 181 | return FAILURE; |
Kjansen |
20:4951ea6abee5 | 182 | } |
Kjansen |
20:4951ea6abee5 | 183 | *elapsed_time = duration_cast<nanoseconds>(timer->elapsed_time()).count(); |
Kjansen |
20:4951ea6abee5 | 184 | |
Kjansen |
20:4951ea6abee5 | 185 | return SUCCESS; |
Kjansen |
20:4951ea6abee5 | 186 | } |
Kjansen |
20:4951ea6abee5 | 187 | |
Kjansen |
20:4951ea6abee5 | 188 | #ifdef __cplusplus |
Kjansen |
20:4951ea6abee5 | 189 | } |
Kjansen |
20:4951ea6abee5 | 190 | #endif // __cplusplus |