Forked repository for pushing changes

Committer:
pmallick
Date:
Mon Sep 27 04:22:15 2021 +0000
Revision:
19:ed7c2dac92bd
Added support for analog read and write functionality

Who changed what in which revision?

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