Forked repo of Platform Drivers- Analog Devices

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?

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