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 ain.cpp
Kjansen 19:3c61197500c4 3 * @brief Implementation of mbed specific analog input 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 "ain.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 Read voltage from analog input pin
Kjansen 19:3c61197500c4 40 * @param desc[in] - Analog input descriptor
Kjansen 19:3c61197500c4 41 * @param value[out] - Buffer to pass analog reading.
Kjansen 19:3c61197500c4 42 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 19:3c61197500c4 43 */
Kjansen 19:3c61197500c4 44 int32_t ain_get_voltage(struct ain_desc *desc, float *value)
Kjansen 19:3c61197500c4 45 {
Kjansen 19:3c61197500c4 46 /* Pointer to analog input object */
Kjansen 19:3c61197500c4 47 mbed::AnalogIn *analog_input;
Kjansen 19:3c61197500c4 48
Kjansen 19:3c61197500c4 49 if (desc && desc->extra) {
Kjansen 19:3c61197500c4 50 analog_input = (AnalogIn *)((mbed_analog_in_desc *)
Kjansen 19:3c61197500c4 51 desc->extra)->analog_in_obj;
Kjansen 19:3c61197500c4 52 *value = analog_input->read_voltage();
Kjansen 19:3c61197500c4 53
Kjansen 19:3c61197500c4 54 return SUCCESS;
Kjansen 19:3c61197500c4 55 }
Kjansen 19:3c61197500c4 56 return FAILURE;
Kjansen 19:3c61197500c4 57 }
Kjansen 19:3c61197500c4 58
Kjansen 19:3c61197500c4 59 /**
Kjansen 19:3c61197500c4 60 * @brief Initialize the Analog Input Pin
Kjansen 19:3c61197500c4 61 * @param desc[in, out] - Analog input descriptor structure
Kjansen 19:3c61197500c4 62 * @param param[in] - Structure that contains analog input
Kjansen 19:3c61197500c4 63 * initialization parameters
Kjansen 19:3c61197500c4 64 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 19:3c61197500c4 65 */
Kjansen 19:3c61197500c4 66 int32_t ain_init(struct ain_desc **desc,
Kjansen 19:3c61197500c4 67 const struct ain_init_param *param)
Kjansen 19:3c61197500c4 68 {
Kjansen 19:3c61197500c4 69 mbed::AnalogIn *analog_input;
Kjansen 19:3c61197500c4 70 struct ain_desc *new_analog_in_desc;
Kjansen 19:3c61197500c4 71 struct mbed_analog_in_desc *new_mbed_analog_in_desc;
Kjansen 19:3c61197500c4 72
Kjansen 19:3c61197500c4 73 if (!desc || !param ) {
Kjansen 19:3c61197500c4 74 return FAILURE;
Kjansen 19:3c61197500c4 75 }
Kjansen 19:3c61197500c4 76
Kjansen 19:3c61197500c4 77 /* Allocate memory for general analog input descriptor */
Kjansen 19:3c61197500c4 78 new_analog_in_desc = (ain_desc *)malloc(sizeof(ain_desc));
Kjansen 19:3c61197500c4 79 if (!new_analog_in_desc) {
Kjansen 19:3c61197500c4 80 goto err_new_in_desc;
Kjansen 19:3c61197500c4 81 }
Kjansen 19:3c61197500c4 82
Kjansen 19:3c61197500c4 83 /* Configure pin number and reference voltage*/
Kjansen 19:3c61197500c4 84 new_analog_in_desc->number = param->number;
Kjansen 19:3c61197500c4 85 new_analog_in_desc->vref = param->vref;
Kjansen 19:3c61197500c4 86
Kjansen 19:3c61197500c4 87 /* Allocate memory for mbed specific analog input descriptor
Kjansen 19:3c61197500c4 88 * for future use */
Kjansen 19:3c61197500c4 89 new_mbed_analog_in_desc = (mbed_analog_in_desc *)malloc(sizeof(
Kjansen 19:3c61197500c4 90 mbed_analog_in_desc));
Kjansen 19:3c61197500c4 91 if (!new_mbed_analog_in_desc) {
Kjansen 19:3c61197500c4 92 goto err_mbed_analog_in_desc;
Kjansen 19:3c61197500c4 93 }
Kjansen 19:3c61197500c4 94
Kjansen 19:3c61197500c4 95 /* Create and initialize mbed analog input object */
Kjansen 19:3c61197500c4 96 analog_input = new AnalogIn((PinName)param->number, param->vref);
Kjansen 19:3c61197500c4 97 if (analog_input) {
Kjansen 19:3c61197500c4 98 new_mbed_analog_in_desc->analog_in_obj = analog_input;
Kjansen 19:3c61197500c4 99 }
Kjansen 19:3c61197500c4 100
Kjansen 19:3c61197500c4 101 else {
Kjansen 19:3c61197500c4 102 goto err_analog_in_instance;
Kjansen 19:3c61197500c4 103 }
Kjansen 19:3c61197500c4 104
Kjansen 19:3c61197500c4 105 new_analog_in_desc->extra = (mbed_analog_in_desc *)new_mbed_analog_in_desc;
Kjansen 19:3c61197500c4 106
Kjansen 19:3c61197500c4 107 *desc = new_analog_in_desc;
Kjansen 19:3c61197500c4 108 return SUCCESS;
Kjansen 19:3c61197500c4 109
Kjansen 19:3c61197500c4 110 err_analog_in_instance:
Kjansen 19:3c61197500c4 111 free(new_mbed_analog_in_desc);
Kjansen 19:3c61197500c4 112 err_mbed_analog_in_desc:
Kjansen 19:3c61197500c4 113 free(new_analog_in_desc);
Kjansen 19:3c61197500c4 114 err_new_in_desc:
Kjansen 19:3c61197500c4 115 // Nothing to free
Kjansen 19:3c61197500c4 116
Kjansen 19:3c61197500c4 117 return FAILURE;
Kjansen 19:3c61197500c4 118 }
Kjansen 19:3c61197500c4 119
Kjansen 19:3c61197500c4 120 /**
Kjansen 19:3c61197500c4 121 * @brief Deallocate resources allocated by ain_init()
Kjansen 19:3c61197500c4 122 * @param desc[in, out] - Analog input descriptor
Kjansen 19:3c61197500c4 123 * @return SUCCESS in case of success, FAILURE otherwise.
Kjansen 19:3c61197500c4 124 */
Kjansen 19:3c61197500c4 125 int32_t ain_remove(struct ain_desc *desc)
Kjansen 19:3c61197500c4 126 {
Kjansen 19:3c61197500c4 127 if (desc) {
Kjansen 19:3c61197500c4 128
Kjansen 19:3c61197500c4 129 if (((mbed_analog_in_desc *)desc->extra)->analog_in_obj) {
Kjansen 19:3c61197500c4 130 delete((mbed::AnalogIn *)((mbed_analog_in_desc *)desc->
Kjansen 19:3c61197500c4 131 extra)->analog_in_obj);
Kjansen 19:3c61197500c4 132 }
Kjansen 19:3c61197500c4 133
Kjansen 19:3c61197500c4 134 if ((mbed_analog_in_desc *)desc->extra) {
Kjansen 19:3c61197500c4 135 free((mbed_analog_in_desc *)desc->extra);
Kjansen 19:3c61197500c4 136 }
Kjansen 19:3c61197500c4 137
Kjansen 19:3c61197500c4 138 if (((mbed_analog_in_desc *)desc->extra)->analog_in_obj) {
Kjansen 19:3c61197500c4 139 delete((mbed::AnalogOut *)((mbed_analog_in_desc *)
Kjansen 19:3c61197500c4 140 desc->extra)->analog_in_obj);
Kjansen 19:3c61197500c4 141 }
Kjansen 19:3c61197500c4 142
Kjansen 19:3c61197500c4 143 if ((mbed_analog_in_desc *)desc->extra) {
Kjansen 19:3c61197500c4 144 free((mbed_analog_in_desc *)desc->extra);
Kjansen 19:3c61197500c4 145 }
Kjansen 19:3c61197500c4 146
Kjansen 19:3c61197500c4 147 free(desc);
Kjansen 19:3c61197500c4 148
Kjansen 19:3c61197500c4 149 return SUCCESS;
Kjansen 19:3c61197500c4 150 }
Kjansen 19:3c61197500c4 151
Kjansen 19:3c61197500c4 152 return FAILURE;
Kjansen 19:3c61197500c4 153 }
Kjansen 19:3c61197500c4 154
Kjansen 19:3c61197500c4 155 /**
Kjansen 19:3c61197500c4 156 * @brief Mbed specific analog input platform ops structure
Kjansen 19:3c61197500c4 157 */
Kjansen 19:3c61197500c4 158 const struct ain_platform_ops mbed_ain_ops = {
Kjansen 19:3c61197500c4 159 .init = &ain_init,
Kjansen 19:3c61197500c4 160 .read = &ain_get_voltage,
Kjansen 19:3c61197500c4 161 .remove = &ain_remove
Kjansen 19:3c61197500c4 162 };
Kjansen 19:3c61197500c4 163
Kjansen 19:3c61197500c4 164 // Platform drivers needs to be C-compatible to work with other drivers
Kjansen 19:3c61197500c4 165 #ifdef __cplusplus
Kjansen 19:3c61197500c4 166 }
Kjansen 19:3c61197500c4 167 #endif // _cplusplus