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
Parent:
19:3c61197500c4
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 19:3c61197500c4 1 /***************************************************************************//**
Kjansen 19:3c61197500c4 2 * @file aout.cpp
Kjansen 19:3c61197500c4 3 * @brief Implementation of mbed specific analog output functionality
Kjansen 19:3c61197500c4 4 ********************************************************************************
Kjansen 19:3c61197500c4 5 * Copyright (c) 2021 Analog Devices, Inc.
Kjansen 19:3c61197500c4 6 * All rights reserved.
Kjansen 19:3c61197500c4 7 *
Kjansen 19:3c61197500c4 8 * This software is proprietary to Analog Devices, Inc. and its licensors.
Kjansen 19:3c61197500c4 9 * By using this software you agree to the terms of the associated
Kjansen 19:3c61197500c4 10 * Analog Devices Software License Agreement.
Kjansen 19:3c61197500c4 11 *******************************************************************************/
Kjansen 19:3c61197500c4 12
Kjansen 19:3c61197500c4 13 /******************************************************************************/
Kjansen 19:3c61197500c4 14 /***************************** Include Files **********************************/
Kjansen 19:3c61197500c4 15 /******************************************************************************/
Kjansen 19:3c61197500c4 16 #include <mbed.h>
Kjansen 19:3c61197500c4 17
Kjansen 19:3c61197500c4 18 // Platform drivers needs to be C-compatible to work with other drivers
Kjansen 19:3c61197500c4 19 #ifdef __cplusplus
Kjansen 19:3c61197500c4 20 extern "C"
Kjansen 19:3c61197500c4 21 {
Kjansen 19:3c61197500c4 22 #endif // _cplusplus
Kjansen 19:3c61197500c4 23 #include "aout.h"
Kjansen 19:3c61197500c4 24 #include "mbed_ain_aout_extra.h"
Kjansen 19:3c61197500c4 25 #include "error.h"
Kjansen 19:3c61197500c4 26
Kjansen 19:3c61197500c4 27 /******************************************************************************/
Kjansen 19:3c61197500c4 28 /********************** Variables and User defined data types *****************/
Kjansen 19:3c61197500c4 29 /******************************************************************************/
Kjansen 19:3c61197500c4 30
Kjansen 19:3c61197500c4 31 /******************************************************************************/
Kjansen 19:3c61197500c4 32 /************************ Functions Declarations ******************************/
Kjansen 19:3c61197500c4 33 /******************************************************************************/
Kjansen 19:3c61197500c4 34
Kjansen 19:3c61197500c4 35 /******************************************************************************/
Kjansen 19:3c61197500c4 36 /************************ Functions Definitions *******************************/
Kjansen 19:3c61197500c4 37 /******************************************************************************/
Kjansen 19:3c61197500c4 38 /**
Kjansen 19:3c61197500c4 39 * @brief Write voltage to analog output pin
Kjansen 19:3c61197500c4 40 * @param desc[in] - Analog output descriptor
Kjansen 19:3c61197500c4 41 * @param value[in] - Analog output value in volts
Kjansen 19:3c61197500c4 42 * @return SUCCESS in case of success, FAILURE otherwise.
Kjansen 19:3c61197500c4 43 */
Kjansen 19:3c61197500c4 44 int32_t aout_set_voltage(struct aout_desc *desc, float value)
Kjansen 19:3c61197500c4 45 {
Kjansen 19:3c61197500c4 46 /* Pointer to analog output object */
Kjansen 19:3c61197500c4 47 mbed::AnalogOut *analog_output;
Kjansen 19:3c61197500c4 48 float volt_mapped;
Kjansen 19:3c61197500c4 49
Kjansen 19:3c61197500c4 50 /* Mbed AnalogOut APIs accept voltage in range from 0.0f
Kjansen 19:3c61197500c4 51 * (representing DAC min output range / 0%) to 1.0f (representing
Kjansen 19:3c61197500c4 52 * DAC max output range / 100%). Hence we need to map the voltage levels
Kjansen 19:3c61197500c4 53 * before passing it to mbed APIs */
Kjansen 19:3c61197500c4 54 if (value >= desc->aout_min_v && value <= desc->aout_max_v) {
Kjansen 19:3c61197500c4 55 volt_mapped = ((value - desc->aout_min_v) /
Kjansen 19:3c61197500c4 56 (desc->aout_max_v - desc->aout_min_v));
Kjansen 19:3c61197500c4 57 } else {
Kjansen 19:3c61197500c4 58 return -EINVAL;
Kjansen 19:3c61197500c4 59 }
Kjansen 19:3c61197500c4 60
Kjansen 19:3c61197500c4 61 if (desc && desc->extra) {
Kjansen 19:3c61197500c4 62 analog_output = (AnalogOut *)((mbed_analog_out_desc *)
Kjansen 19:3c61197500c4 63 desc->extra)->analog_out_obj ;
Kjansen 19:3c61197500c4 64 analog_output->write(volt_mapped);
Kjansen 19:3c61197500c4 65
Kjansen 19:3c61197500c4 66 return SUCCESS;
Kjansen 19:3c61197500c4 67 }
Kjansen 19:3c61197500c4 68 return FAILURE;
Kjansen 19:3c61197500c4 69 }
Kjansen 19:3c61197500c4 70
Kjansen 19:3c61197500c4 71 /**
Kjansen 19:3c61197500c4 72 * @brief Initialize the analog output pin
Kjansen 19:3c61197500c4 73 * @param desc[in, out] - Analog output descriptor structure
Kjansen 19:3c61197500c4 74 * @param param[in] - Structure that contains analog output
Kjansen 19:3c61197500c4 75 * initialization parameters
Kjansen 19:3c61197500c4 76 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 19:3c61197500c4 77 */
Kjansen 19:3c61197500c4 78 int32_t aout_init(struct aout_desc **desc,
Kjansen 19:3c61197500c4 79 const struct aout_init_param *param)
Kjansen 19:3c61197500c4 80 {
Kjansen 19:3c61197500c4 81 mbed::AnalogOut *analog_output;
Kjansen 19:3c61197500c4 82 struct aout_desc *new_analog_out_desc;
Kjansen 19:3c61197500c4 83 struct mbed_analog_out_desc *new_mbed_analog_out_desc;
Kjansen 19:3c61197500c4 84
Kjansen 19:3c61197500c4 85 if (!desc || !param ) {
Kjansen 19:3c61197500c4 86 return FAILURE;
Kjansen 19:3c61197500c4 87 }
Kjansen 19:3c61197500c4 88
Kjansen 19:3c61197500c4 89 /* Allocate memory for general analog output descriptor */
Kjansen 19:3c61197500c4 90 new_analog_out_desc = (aout_desc *)malloc(sizeof(aout_desc));
Kjansen 19:3c61197500c4 91 if (!new_analog_out_desc) {
Kjansen 19:3c61197500c4 92 goto err_new_out_desc;
Kjansen 19:3c61197500c4 93 }
Kjansen 19:3c61197500c4 94
Kjansen 19:3c61197500c4 95 /* Configure pin number,DAC max and min range */
Kjansen 19:3c61197500c4 96 new_analog_out_desc->number = param->number;
Kjansen 19:3c61197500c4 97 new_analog_out_desc->aout_min_v = param->aout_min_v;
Kjansen 19:3c61197500c4 98 new_analog_out_desc->aout_max_v = param->aout_max_v;
Kjansen 19:3c61197500c4 99
Kjansen 19:3c61197500c4 100 /* Allocate memory for mbed specific analog output descriptor
Kjansen 19:3c61197500c4 101 * for future use */
Kjansen 19:3c61197500c4 102 new_mbed_analog_out_desc = (mbed_analog_out_desc *)malloc
Kjansen 19:3c61197500c4 103 (sizeof(new_mbed_analog_out_desc));
Kjansen 19:3c61197500c4 104 if (!new_mbed_analog_out_desc) {
Kjansen 19:3c61197500c4 105 goto err_mbed_analog_out_desc;
Kjansen 19:3c61197500c4 106 }
Kjansen 19:3c61197500c4 107
Kjansen 19:3c61197500c4 108 /* Create and initialize mbed analog output object */
Kjansen 19:3c61197500c4 109 analog_output = new AnalogOut((PinName)param->number);
Kjansen 19:3c61197500c4 110 if (analog_output) {
Kjansen 19:3c61197500c4 111 new_mbed_analog_out_desc->analog_out_obj = analog_output;
Kjansen 19:3c61197500c4 112 } else {
Kjansen 19:3c61197500c4 113 goto err_analog_out_instance;
Kjansen 19:3c61197500c4 114 }
Kjansen 19:3c61197500c4 115
Kjansen 19:3c61197500c4 116 new_analog_out_desc->extra = (mbed_analog_out_desc *)
Kjansen 19:3c61197500c4 117 new_mbed_analog_out_desc;
Kjansen 19:3c61197500c4 118
Kjansen 19:3c61197500c4 119 *desc = new_analog_out_desc;
Kjansen 19:3c61197500c4 120 return SUCCESS;
Kjansen 19:3c61197500c4 121
Kjansen 19:3c61197500c4 122 err_analog_out_instance:
Kjansen 19:3c61197500c4 123 free(new_mbed_analog_out_desc);
Kjansen 19:3c61197500c4 124 err_mbed_analog_out_desc:
Kjansen 19:3c61197500c4 125 free(new_analog_out_desc);
Kjansen 19:3c61197500c4 126 err_new_out_desc:
Kjansen 19:3c61197500c4 127 // Nothing to free
Kjansen 19:3c61197500c4 128
Kjansen 19:3c61197500c4 129 return FAILURE;
Kjansen 19:3c61197500c4 130 }
Kjansen 19:3c61197500c4 131
Kjansen 19:3c61197500c4 132 /**
Kjansen 19:3c61197500c4 133 * @brief Deallocate resources allocated by aout_init()
Kjansen 19:3c61197500c4 134 * @param desc[in, out] - Analog output descriptor
Kjansen 19:3c61197500c4 135 * @return SUCCESS in case of success, FAILURE otherwise.
Kjansen 19:3c61197500c4 136 */
Kjansen 19:3c61197500c4 137 int32_t aout_remove(struct aout_desc *desc)
Kjansen 19:3c61197500c4 138 {
Kjansen 19:3c61197500c4 139 if (desc) {
Kjansen 19:3c61197500c4 140
Kjansen 19:3c61197500c4 141 if (((mbed_analog_out_desc *)desc->extra)->analog_out_obj) {
Kjansen 19:3c61197500c4 142 delete((mbed::AnalogIn *)((mbed_analog_out_desc *)desc->
Kjansen 19:3c61197500c4 143 extra)->analog_out_obj);
Kjansen 19:3c61197500c4 144 }
Kjansen 19:3c61197500c4 145
Kjansen 19:3c61197500c4 146 if ((mbed_analog_out_desc *)desc->extra) {
Kjansen 19:3c61197500c4 147 free((mbed_analog_out_desc *)desc->extra);
Kjansen 19:3c61197500c4 148 }
Kjansen 19:3c61197500c4 149
Kjansen 19:3c61197500c4 150 if (((mbed_analog_out_desc *)desc->extra)->analog_out_obj) {
Kjansen 19:3c61197500c4 151 delete((mbed::AnalogOut *)((mbed_analog_out_desc *)
Kjansen 19:3c61197500c4 152 desc->extra)->analog_out_obj);
Kjansen 19:3c61197500c4 153 }
Kjansen 19:3c61197500c4 154
Kjansen 19:3c61197500c4 155 if ((mbed_analog_out_desc *)desc->extra) {
Kjansen 19:3c61197500c4 156 free((mbed_analog_out_desc *)desc->extra);
Kjansen 19:3c61197500c4 157 }
Kjansen 19:3c61197500c4 158
Kjansen 19:3c61197500c4 159 free(desc);
Kjansen 19:3c61197500c4 160
Kjansen 19:3c61197500c4 161 return SUCCESS;
Kjansen 19:3c61197500c4 162 }
Kjansen 19:3c61197500c4 163
Kjansen 19:3c61197500c4 164 return FAILURE;
Kjansen 19:3c61197500c4 165 }
Kjansen 19:3c61197500c4 166
Kjansen 19:3c61197500c4 167 /**
Kjansen 19:3c61197500c4 168 * @brief Mbed specific analog output platform ops structure
Kjansen 19:3c61197500c4 169 */
Kjansen 19:3c61197500c4 170 const struct aout_platform_ops mbed_aout_ops = {
Kjansen 19:3c61197500c4 171 .init = &aout_init,
Kjansen 19:3c61197500c4 172 .write = &aout_set_voltage,
Kjansen 19:3c61197500c4 173 .remove = &aout_remove
Kjansen 19:3c61197500c4 174 };
Kjansen 19:3c61197500c4 175
Kjansen 19:3c61197500c4 176
Kjansen 19:3c61197500c4 177 // Platform drivers needs to be C-compatible to work with other drivers
Kjansen 19:3c61197500c4 178 #ifdef __cplusplus
Kjansen 19:3c61197500c4 179 }
Kjansen 19:3c61197500c4 180 #endif // _cplusplus