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