Forked repository for pushing changes
Revision 19:ed7c2dac92bd, committed 2021-09-27
- Comitter:
- pmallick
- Date:
- Mon Sep 27 04:22:15 2021 +0000
- Parent:
- 18:5ae03a197e59
- Commit message:
- Added support for analog read and write functionality
Changed in this revision
diff -r 5ae03a197e59 -r ed7c2dac92bd ain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ain.cpp Mon Sep 27 04:22:15 2021 +0000 @@ -0,0 +1,167 @@ +/***************************************************************************//** + * @file ain.cpp + * @brief Implementation of mbed specific analog input functionality +******************************************************************************** + * Copyright (c) 2021 Analog Devices, Inc. + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*******************************************************************************/ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#include <mbed.h> + +// Platform drivers needs to be C-compatible to work with other drivers +#ifdef __cplusplus +extern "C" +{ +#endif // _cplusplus +#include "ain.h" +#include "mbed_ain_aout_extra.h" +#include "error.h" + +/******************************************************************************/ +/********************** Variables and User defined data types *****************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Definitions *******************************/ +/******************************************************************************/ +/** + * @brief Read voltage from analog input pin + * @param desc[in] - Analog input descriptor + * @param value[out] - Buffer to pass analog reading. + * @return SUCCESS in case of success, FAILURE otherwise + */ +int32_t ain_get_voltage(struct ain_desc *desc, float *value) +{ + /* Pointer to analog input object */ + mbed::AnalogIn *analog_input; + + if (desc && desc->extra) { + analog_input = (AnalogIn *)((mbed_analog_in_desc *) + desc->extra)->analog_in_obj; + *value = analog_input->read_voltage(); + + return SUCCESS; + } + return FAILURE; +} + +/** + * @brief Initialize the Analog Input Pin + * @param desc[in, out] - Analog input descriptor structure + * @param param[in] - Structure that contains analog input + * initialization parameters + * @return SUCCESS in case of success, FAILURE otherwise + */ +int32_t ain_init(struct ain_desc **desc, + const struct ain_init_param *param) +{ + mbed::AnalogIn *analog_input; + struct ain_desc *new_analog_in_desc; + struct mbed_analog_in_desc *new_mbed_analog_in_desc; + + if (!desc || !param ) { + return FAILURE; + } + + /* Allocate memory for general analog input descriptor */ + new_analog_in_desc = (ain_desc *)malloc(sizeof(ain_desc)); + if (!new_analog_in_desc) { + goto err_new_in_desc; + } + + /* Configure pin number and reference voltage*/ + new_analog_in_desc->number = param->number; + new_analog_in_desc->vref = param->vref; + + /* Allocate memory for mbed specific analog input descriptor + * for future use */ + new_mbed_analog_in_desc = (mbed_analog_in_desc *)malloc(sizeof( + mbed_analog_in_desc)); + if (!new_mbed_analog_in_desc) { + goto err_mbed_analog_in_desc; + } + + /* Create and initialize mbed analog input object */ + analog_input = new AnalogIn((PinName)param->number, param->vref); + if (analog_input) { + new_mbed_analog_in_desc->analog_in_obj = analog_input; + } + + else { + goto err_analog_in_instance; + } + + new_analog_in_desc->extra = (mbed_analog_in_desc *)new_mbed_analog_in_desc; + + *desc = new_analog_in_desc; + return SUCCESS; + +err_analog_in_instance: + free(new_mbed_analog_in_desc); +err_mbed_analog_in_desc: + free(new_analog_in_desc); +err_new_in_desc: + // Nothing to free + + return FAILURE; +} + +/** + * @brief Deallocate resources allocated by ain_init() + * @param desc[in, out] - Analog input descriptor + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t ain_remove(struct ain_desc *desc) +{ + if (desc) { + + if (((mbed_analog_in_desc *)desc->extra)->analog_in_obj) { + delete((mbed::AnalogIn *)((mbed_analog_in_desc *)desc-> + extra)->analog_in_obj); + } + + if ((mbed_analog_in_desc *)desc->extra) { + free((mbed_analog_in_desc *)desc->extra); + } + + if (((mbed_analog_in_desc *)desc->extra)->analog_in_obj) { + delete((mbed::AnalogOut *)((mbed_analog_in_desc *) + desc->extra)->analog_in_obj); + } + + if ((mbed_analog_in_desc *)desc->extra) { + free((mbed_analog_in_desc *)desc->extra); + } + + free(desc); + + return SUCCESS; + } + + return FAILURE; +} + +/** + * @brief Mbed specific analog input platform ops structure + */ +const struct ain_platform_ops mbed_ain_ops = { + .init = &ain_init, + .read = &ain_get_voltage, + .remove = &ain_remove +}; + +// Platform drivers needs to be C-compatible to work with other drivers +#ifdef __cplusplus +} +#endif // _cplusplus
diff -r 5ae03a197e59 -r ed7c2dac92bd ain.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ain.h Mon Sep 27 04:22:15 2021 +0000 @@ -0,0 +1,84 @@ +/***************************************************************************//** + * @file ain.h + * @author PMallick (Pratyush.Mallick@analog.com) +******************************************************************************** + * Copyright (c) 2021 Analog Devices, Inc. + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*******************************************************************************/ + +#ifndef AIN_H +#define AIN_H + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +#include <stdint.h> + +/******************************************************************************/ +/********************** Macros and Constants Definitions **********************/ +/******************************************************************************/ + +/******************************************************************************/ +/*************************** Types Declarations *******************************/ +/******************************************************************************/ +/** + * @struct ain_init_param + * @brief Structure holding parameters for analog input initialization + */ +struct ain_init_param { + /* Analog input pin number */ + int32_t number; + /* Analog input reference voltage */ + float vref; + /* Analog input platform specific functions */ + const struct ain_platform_ops *platform_ops; +}; + +/** + * @struct ain_desc + * @brief Structure holding analog input descriptor + */ +struct ain_desc { + /* Analog input pin number */ + int32_t number; + /* Analog input reference voltage */ + float vref; + /* Analog input platform specific functions */ + const struct ain_platform_ops *platform_ops; + /* Analog extra parameters (device specific) */ + void *extra; +}; + +/** + * @struct ain_platform_ops + * @brief Structure holding analog input function pointers that + * point to the platform specific function + */ +struct ain_platform_ops { + /** Analog input initialization function pointer */ + int32_t(*init)(struct ain_desc **, const struct ain_init_param *); + /** Analog input read function pointer */ + int32_t(*read)(struct ain_desc *, float *); + /** Analog input remove function pointer */ + int32_t(*remove)(struct ain_desc *); +}; + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +/* Read analog input voltage */ +int32_t ain_get_voltage(struct ain_desc *desc, float *value); + +/* Initialize the analog input pin */ +int32_t ain_init(struct ain_desc **desc, + const struct ain_init_param *param); + +/* Free the resources allocated by ain_init() */ +int32_t ain_remove(struct ain_desc *desc); + +#endif
diff -r 5ae03a197e59 -r ed7c2dac92bd aout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aout.cpp Mon Sep 27 04:22:15 2021 +0000 @@ -0,0 +1,180 @@ +/***************************************************************************//** + * @file aout.cpp + * @brief Implementation of mbed specific analog output functionality +******************************************************************************** + * Copyright (c) 2021 Analog Devices, Inc. + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*******************************************************************************/ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#include <mbed.h> + +// Platform drivers needs to be C-compatible to work with other drivers +#ifdef __cplusplus +extern "C" +{ +#endif // _cplusplus +#include "aout.h" +#include "mbed_ain_aout_extra.h" +#include "error.h" + +/******************************************************************************/ +/********************** Variables and User defined data types *****************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Definitions *******************************/ +/******************************************************************************/ +/** + * @brief Write voltage to analog output pin + * @param desc[in] - Analog output descriptor + * @param value[in] - Analog output value in volts + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t aout_set_voltage(struct aout_desc *desc, float value) +{ + /* Pointer to analog output object */ + mbed::AnalogOut *analog_output; + float volt_mapped; + + /* Mbed AnalogOut APIs accept voltage in range from 0.0f + * (representing DAC min output range / 0%) to 1.0f (representing + * DAC max output range / 100%). Hence we need to map the voltage levels + * before passing it to mbed APIs */ + if (value >= desc->aout_min_v && value <= desc->aout_max_v) { + volt_mapped = ((value - desc->aout_min_v) / + (desc->aout_max_v - desc->aout_min_v)); + } else { + return -EINVAL; + } + + if (desc && desc->extra) { + analog_output = (AnalogOut *)((mbed_analog_out_desc *) + desc->extra)->analog_out_obj ; + analog_output->write(volt_mapped); + + return SUCCESS; + } + return FAILURE; +} + +/** + * @brief Initialize the analog output pin + * @param desc[in, out] - Analog output descriptor structure + * @param param[in] - Structure that contains analog output + * initialization parameters + * @return SUCCESS in case of success, FAILURE otherwise + */ +int32_t aout_init(struct aout_desc **desc, + const struct aout_init_param *param) +{ + mbed::AnalogOut *analog_output; + struct aout_desc *new_analog_out_desc; + struct mbed_analog_out_desc *new_mbed_analog_out_desc; + + if (!desc || !param ) { + return FAILURE; + } + + /* Allocate memory for general analog output descriptor */ + new_analog_out_desc = (aout_desc *)malloc(sizeof(aout_desc)); + if (!new_analog_out_desc) { + goto err_new_out_desc; + } + + /* Configure pin number,DAC max and min range */ + new_analog_out_desc->number = param->number; + new_analog_out_desc->aout_min_v = param->aout_min_v; + new_analog_out_desc->aout_max_v = param->aout_max_v; + + /* Allocate memory for mbed specific analog output descriptor + * for future use */ + new_mbed_analog_out_desc = (mbed_analog_out_desc *)malloc + (sizeof(new_mbed_analog_out_desc)); + if (!new_mbed_analog_out_desc) { + goto err_mbed_analog_out_desc; + } + + /* Create and initialize mbed analog output object */ + analog_output = new AnalogOut((PinName)param->number); + if (analog_output) { + new_mbed_analog_out_desc->analog_out_obj = analog_output; + } else { + goto err_analog_out_instance; + } + + new_analog_out_desc->extra = (mbed_analog_out_desc *) + new_mbed_analog_out_desc; + + *desc = new_analog_out_desc; + return SUCCESS; + +err_analog_out_instance: + free(new_mbed_analog_out_desc); +err_mbed_analog_out_desc: + free(new_analog_out_desc); +err_new_out_desc: + // Nothing to free + + return FAILURE; +} + +/** + * @brief Deallocate resources allocated by aout_init() + * @param desc[in, out] - Analog output descriptor + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t aout_remove(struct aout_desc *desc) +{ + if (desc) { + + if (((mbed_analog_out_desc *)desc->extra)->analog_out_obj) { + delete((mbed::AnalogIn *)((mbed_analog_out_desc *)desc-> + extra)->analog_out_obj); + } + + if ((mbed_analog_out_desc *)desc->extra) { + free((mbed_analog_out_desc *)desc->extra); + } + + if (((mbed_analog_out_desc *)desc->extra)->analog_out_obj) { + delete((mbed::AnalogOut *)((mbed_analog_out_desc *) + desc->extra)->analog_out_obj); + } + + if ((mbed_analog_out_desc *)desc->extra) { + free((mbed_analog_out_desc *)desc->extra); + } + + free(desc); + + return SUCCESS; + } + + return FAILURE; +} + +/** + * @brief Mbed specific analog output platform ops structure + */ +const struct aout_platform_ops mbed_aout_ops = { + .init = &aout_init, + .write = &aout_set_voltage, + .remove = &aout_remove +}; + + +// Platform drivers needs to be C-compatible to work with other drivers +#ifdef __cplusplus +} +#endif // _cplusplus
diff -r 5ae03a197e59 -r ed7c2dac92bd aout.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aout.h Mon Sep 27 04:22:15 2021 +0000 @@ -0,0 +1,92 @@ +/***************************************************************************//** + * @file aout.h + * @author PMallick (Pratyush.Mallick@analog.com) +******************************************************************************** + * Copyright (c) 2021 Analog Devices, Inc. + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*******************************************************************************/ + +#ifndef AOUT_H +#define AOUT_H + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +#include <stdint.h> + +/******************************************************************************/ +/********************** Macros and Constants Definitions **********************/ +/******************************************************************************/ + +/******************************************************************************/ +/*************************** Types Declarations *******************************/ +/******************************************************************************/ +/** + * @struct aout_init_param + * @brief Structure holding the parameters for analog output initialization + */ +struct aout_init_param { + /* Analog output pin number */ + int32_t number; + /* Min output range of DAC in volts */ + float aout_min_v; + /* Max output range of DAC in volts */ + float aout_max_v; + /* Analog output reference voltage */ + float vref; + /* Analog output platform specific functions */ + const struct aout_platform_ops *platform_ops; +}; + +/** + * @struct aout_desc + * @brief Structure holding analog output descriptor + */ +struct aout_desc { + /* Analog output pin number */ + int32_t number; + /* Min output value of DAC in volts */ + float aout_min_v; + /* Max output value of DAC in volts */ + float aout_max_v; + /* Analog output reference voltage */ + float vref; + /* Analog output platform specific functions */ + const struct aout_platform_ops *platform_ops; + /* Analog extra parameters (device specific) */ + void *extra; +}; + +/** + * @struct aout_platform_ops + * @brief Structure holding analog output function pointers that + * point to the platform specific function + */ +struct aout_platform_ops { + /** Analog output initialization function pointer */ + int32_t(*init)(struct aout_desc **, const struct aout_init_param *); + /** Analog output write function pointer */ + int32_t(*write)(struct aout_desc *, float); + /** Analog output remove function pointer */ + int32_t(*remove)(struct aout_desc *); +}; + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ +/* Write analog output voltage */ +int32_t aout_set_voltage(struct aout_desc *desc, float value); + +/* Initialize the analog output pin */ +int32_t aout_init(struct aout_desc **desc, + const struct aout_init_param *param); + +/* Free the resources allocated by analog_out_init() */ +int32_t aout_remove(struct aout_desc *desc); + +#endif
diff -r 5ae03a197e59 -r ed7c2dac92bd mbed_ain_aout_extra.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_ain_aout_extra.h Mon Sep 27 04:22:15 2021 +0000 @@ -0,0 +1,74 @@ +/***************************************************************************//* +* @file mbed_ain_aout_extra.h +* @brief Header containing extra types required for +* analog in/output functionality +****************************************************************************** +* Copyright (c) 2021 Analog Devices, Inc. +* All rights reserved. +* +* This software is proprietary to Analog Devices, Inc. and its licensors. +* By using this software you agree to the terms of the associated +* Analog Devices Software License Agreement. +******************************************************************************/ + +#ifndef MBED_AIN_AOUT_EXTRA_H_ +#define MBED_AIN_AOUT_EXTRA_H_ + +// Platform support needs to be C-compatible to work with other drivers +#ifdef __cplusplus +extern "C" +{ +#endif + +/*****************************************************************************/ +/***************************** Include Files *********************************/ +/*****************************************************************************/ + +#include "stdio.h" +#include "stdint.h" + +/*****************************************************************************/ +/********************** Macros and Constants Definition **********************/ +/*****************************************************************************/ + +/******************************************************************************/ +/********************** Variables and User defined data types *****************/ +/******************************************************************************/ +/** + * @struct mbed_analog_in_desc + * @brief Analog input pin specific descriptor for the mbed platform. + */ +struct mbed_analog_in_desc { + /* Analog Input instance (mbed::AnalogIn) */ + void *analog_in_obj; +}; + +/** + * @struct mbed_analog_out_desc + * @brief Analog output pin specific descriptor for the mbed platform. + */ +struct mbed_analog_out_desc { + /* Analog Output instance (mbed::AnalogOut) */ + void *analog_out_obj; +}; + +/** + * @brief mbed specific analog input platform ops structure + */ +extern const struct ain_platform_ops mbed_ain_ops; + +/** + * @brief mbed specific analog output platform ops structure + */ +extern const struct aout_platform_ops mbed_out_ops; + +/******************************************************************************/ +/*****************************Function Declarations****************************/ +/******************************************************************************/ + +#ifdef __cplusplus // Closing extern c +} +#endif + +#endif /* MBED_AIN_AOUT_EXTRA_H_ */ +