Platform drivers for Mbed.

Dependents:   EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more

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?

UserRevisionLine numberNew 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