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:
17:af1f2416dd26
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
mahphalke 17:af1f2416dd26 1 /***************************************************************************//**
mahphalke 17:af1f2416dd26 2 * @file i2c.cpp
mahphalke 17:af1f2416dd26 3 * @brief Implementation of I2C Mbed platform driver interfaces
mahphalke 17:af1f2416dd26 4 ********************************************************************************
mahphalke 17:af1f2416dd26 5 * Copyright (c) 2019 - 2021 Analog Devices, Inc.
mahphalke 17:af1f2416dd26 6 * All rights reserved.
mahphalke 17:af1f2416dd26 7 *
mahphalke 17:af1f2416dd26 8 * This software is proprietary to Analog Devices, Inc. and its licensors.
mahphalke 17:af1f2416dd26 9 * By using this software you agree to the terms of the associated
mahphalke 17:af1f2416dd26 10 * Analog Devices Software License Agreement.
mahphalke 17:af1f2416dd26 11 *******************************************************************************/
mahphalke 17:af1f2416dd26 12
mahphalke 17:af1f2416dd26 13 /******************************************************************************/
mahphalke 17:af1f2416dd26 14 /***************************** Include Files **********************************/
mahphalke 17:af1f2416dd26 15 /******************************************************************************/
mahphalke 17:af1f2416dd26 16
mahphalke 17:af1f2416dd26 17 #include <stdio.h>
mahphalke 17:af1f2416dd26 18 #include <mbed.h>
mahphalke 17:af1f2416dd26 19
mahphalke 17:af1f2416dd26 20 // Platform drivers needs to be C-compatible to work with other drivers
mahphalke 17:af1f2416dd26 21 #ifdef __cplusplus
mahphalke 17:af1f2416dd26 22 extern "C"
mahphalke 17:af1f2416dd26 23 {
mahphalke 17:af1f2416dd26 24 #endif // _cplusplus
mahphalke 17:af1f2416dd26 25
mahphalke 17:af1f2416dd26 26 #include "error.h"
mahphalke 17:af1f2416dd26 27 #include "i2c.h"
mahphalke 17:af1f2416dd26 28 #include "i2c_extra.h"
mahphalke 17:af1f2416dd26 29
mahphalke 17:af1f2416dd26 30 /******************************************************************************/
mahphalke 17:af1f2416dd26 31 /********************** Macros and Constants Definitions **********************/
mahphalke 17:af1f2416dd26 32 /******************************************************************************/
mahphalke 17:af1f2416dd26 33
mahphalke 17:af1f2416dd26 34 /******************************************************************************/
mahphalke 17:af1f2416dd26 35 /************************ Functions Declarations ******************************/
mahphalke 17:af1f2416dd26 36 /******************************************************************************/
mahphalke 17:af1f2416dd26 37
mahphalke 17:af1f2416dd26 38 /******************************************************************************/
mahphalke 17:af1f2416dd26 39 /************************ Functions Definitions *******************************/
mahphalke 17:af1f2416dd26 40 /******************************************************************************/
mahphalke 17:af1f2416dd26 41
mahphalke 17:af1f2416dd26 42 /**
mahphalke 17:af1f2416dd26 43 * @brief Initialize the I2C communication peripheral.
mahphalke 17:af1f2416dd26 44 * @param desc - The I2C descriptor.
mahphalke 17:af1f2416dd26 45 * @param param - The structure that contains the I2C parameters.
mahphalke 17:af1f2416dd26 46 * @return SUCCESS in case of success, FAILURE otherwise.
mahphalke 17:af1f2416dd26 47 */
mahphalke 17:af1f2416dd26 48 int32_t i2c_init_noos(struct i2c_desc **desc,
mahphalke 17:af1f2416dd26 49 const struct i2c_init_param *param)
mahphalke 17:af1f2416dd26 50 {
mahphalke 17:af1f2416dd26 51 mbed::I2C *i2c; // pointer to new I2C instance
mahphalke 17:af1f2416dd26 52 mbed_i2c_desc *mbed_desc; // pointer to mbed i2c desc
mahphalke 17:af1f2416dd26 53 i2c_desc *new_desc;
mahphalke 17:af1f2416dd26 54
mahphalke 17:af1f2416dd26 55 if (desc) {
mahphalke 17:af1f2416dd26 56 // Create an i2c descriptor object for the device
mahphalke 17:af1f2416dd26 57 new_desc = (i2c_desc *)malloc(sizeof(i2c_desc));
mahphalke 17:af1f2416dd26 58 if (!new_desc) {
mahphalke 17:af1f2416dd26 59 goto err_new_desc;
mahphalke 17:af1f2416dd26 60 }
mahphalke 17:af1f2416dd26 61
mahphalke 17:af1f2416dd26 62 // Address passed in parameter shifted left by 1 to form
mahphalke 17:af1f2416dd26 63 // 7-bit i2c slave address (7 MSBs) and the LSB acts as
mahphalke 17:af1f2416dd26 64 // r/w bit during i2c read/write operations
mahphalke 17:af1f2416dd26 65 new_desc->slave_address = ((param->slave_address) << 1);
mahphalke 17:af1f2416dd26 66
mahphalke 17:af1f2416dd26 67 // Configure and instantiate I2C protocol
mahphalke 17:af1f2416dd26 68 i2c = new I2C(
mahphalke 17:af1f2416dd26 69 (PinName)(((mbed_i2c_init_param *)param->extra)->i2c_sda_pin),
mahphalke 17:af1f2416dd26 70 (PinName)(((mbed_i2c_init_param *)param->extra)->i2c_scl_pin));
mahphalke 17:af1f2416dd26 71
mahphalke 17:af1f2416dd26 72 if (!i2c) {
mahphalke 17:af1f2416dd26 73 goto err_i2c;
mahphalke 17:af1f2416dd26 74 }
mahphalke 17:af1f2416dd26 75
mahphalke 17:af1f2416dd26 76 // Create the i2c mbed descriptor object to store new i2c instance
mahphalke 17:af1f2416dd26 77 mbed_desc = (mbed_i2c_desc *)malloc(sizeof(mbed_i2c_desc));
mahphalke 17:af1f2416dd26 78 if (!mbed_desc) {
mahphalke 17:af1f2416dd26 79 goto err_mbed_desc;
mahphalke 17:af1f2416dd26 80 }
mahphalke 17:af1f2416dd26 81
mahphalke 17:af1f2416dd26 82 mbed_desc->i2c_port = (I2C *)i2c;
mahphalke 17:af1f2416dd26 83 new_desc->extra = (mbed_i2c_desc *)mbed_desc;
mahphalke 17:af1f2416dd26 84
mahphalke 17:af1f2416dd26 85 *desc = new_desc;
mahphalke 17:af1f2416dd26 86
mahphalke 17:af1f2416dd26 87 return SUCCESS;
mahphalke 17:af1f2416dd26 88 }
mahphalke 17:af1f2416dd26 89
mahphalke 17:af1f2416dd26 90 err_mbed_desc:
mahphalke 17:af1f2416dd26 91 free(i2c);
mahphalke 17:af1f2416dd26 92 err_i2c:
mahphalke 17:af1f2416dd26 93 free(new_desc);
mahphalke 17:af1f2416dd26 94 err_new_desc:
mahphalke 17:af1f2416dd26 95 // Nothing to free
mahphalke 17:af1f2416dd26 96
mahphalke 17:af1f2416dd26 97 return FAILURE;
mahphalke 17:af1f2416dd26 98 }
mahphalke 17:af1f2416dd26 99
mahphalke 17:af1f2416dd26 100
mahphalke 17:af1f2416dd26 101 /**
mahphalke 17:af1f2416dd26 102 * @brief Free the resources allocated by i2c_init_noos().
mahphalke 17:af1f2416dd26 103 * @param desc - The I2C descriptor.
mahphalke 17:af1f2416dd26 104 * @return SUCCESS in case of success, FAILURE otherwise.
mahphalke 17:af1f2416dd26 105 */
mahphalke 17:af1f2416dd26 106 int32_t i2c_remove(struct i2c_desc *desc)
mahphalke 17:af1f2416dd26 107 {
mahphalke 17:af1f2416dd26 108 if (desc) {
mahphalke 17:af1f2416dd26 109 // Free the I2C port object
mahphalke 17:af1f2416dd26 110 if ((I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port)) {
mahphalke 17:af1f2416dd26 111 delete((I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port));
mahphalke 17:af1f2416dd26 112 }
mahphalke 17:af1f2416dd26 113
mahphalke 17:af1f2416dd26 114 // Free the I2C extra descriptor object
mahphalke 17:af1f2416dd26 115 if ((mbed_i2c_desc *)(desc->extra)) {
mahphalke 17:af1f2416dd26 116 free((mbed_i2c_desc *)(desc->extra));
mahphalke 17:af1f2416dd26 117 }
mahphalke 17:af1f2416dd26 118
mahphalke 17:af1f2416dd26 119 // Free the I2C descriptor object
mahphalke 17:af1f2416dd26 120 free(desc);
mahphalke 17:af1f2416dd26 121
mahphalke 17:af1f2416dd26 122 return SUCCESS;
mahphalke 17:af1f2416dd26 123 }
mahphalke 17:af1f2416dd26 124
mahphalke 17:af1f2416dd26 125 return FAILURE;
mahphalke 17:af1f2416dd26 126 }
mahphalke 17:af1f2416dd26 127
mahphalke 17:af1f2416dd26 128
mahphalke 17:af1f2416dd26 129 /**
mahphalke 17:af1f2416dd26 130 * @brief Write data to a slave device.
mahphalke 17:af1f2416dd26 131 * @param desc - The I2C descriptor.
mahphalke 17:af1f2416dd26 132 * @param data - Buffer that stores the transmission data.
mahphalke 17:af1f2416dd26 133 * @param bytes_number - Number of bytes to write.
mahphalke 17:af1f2416dd26 134 * @param stop_bit - Stop condition control.
mahphalke 17:af1f2416dd26 135 * Example: 0 - A stop condition will not be generated;
mahphalke 17:af1f2416dd26 136 * 1 - A stop condition will be generated.
mahphalke 17:af1f2416dd26 137 * @return SUCCESS in case of success, FAILURE otherwise.
mahphalke 17:af1f2416dd26 138 */
mahphalke 17:af1f2416dd26 139
mahphalke 17:af1f2416dd26 140 int32_t i2c_write_noos(struct i2c_desc *desc,
mahphalke 17:af1f2416dd26 141 uint8_t *data,
mahphalke 17:af1f2416dd26 142 uint8_t bytes_number,
mahphalke 17:af1f2416dd26 143 uint8_t stop_bit)
mahphalke 17:af1f2416dd26 144 {
mahphalke 17:af1f2416dd26 145 mbed::I2C *i2c;
mahphalke 17:af1f2416dd26 146 i2c = (I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port);
mahphalke 17:af1f2416dd26 147
mahphalke 17:af1f2416dd26 148 /**
mahphalke 17:af1f2416dd26 149 The MBED I2C API is reversed for parameter 4
mahphalke 17:af1f2416dd26 150 Instead of stop_bit - it has
mahphalke 17:af1f2416dd26 151 @param repeated - Repeated start, true - don't send stop at end default value is false.
mahphalke 17:af1f2416dd26 152 Inverting here to keep the no-OS/platform_drivers API
mahphalke 17:af1f2416dd26 153 */
mahphalke 17:af1f2416dd26 154 if (!(i2c->write(desc->slave_address, (char *)data, bytes_number, !stop_bit))) {
mahphalke 17:af1f2416dd26 155 return SUCCESS;
mahphalke 17:af1f2416dd26 156 } else {
mahphalke 17:af1f2416dd26 157 return FAILURE;
mahphalke 17:af1f2416dd26 158 }
mahphalke 17:af1f2416dd26 159 }
mahphalke 17:af1f2416dd26 160
mahphalke 17:af1f2416dd26 161
mahphalke 17:af1f2416dd26 162 /**
mahphalke 17:af1f2416dd26 163 * @brief Read data from a slave device.
mahphalke 17:af1f2416dd26 164 * @param desc - The I2C descriptor.
mahphalke 17:af1f2416dd26 165 * @param data - Buffer that will store the received data.
mahphalke 17:af1f2416dd26 166 * @param bytes_number - Number of bytes to read.
mahphalke 17:af1f2416dd26 167 * @param stop_bit - Stop condition control.
mahphalke 17:af1f2416dd26 168 * Example: 0 - A stop condition will not be generated;
mahphalke 17:af1f2416dd26 169 * 1 - A stop condition will be generated.
mahphalke 17:af1f2416dd26 170 * @return SUCCESS in case of success, FAILURE otherwise.
mahphalke 17:af1f2416dd26 171 */
mahphalke 17:af1f2416dd26 172 int32_t i2c_read_noos(struct i2c_desc *desc,
mahphalke 17:af1f2416dd26 173 uint8_t *data,
mahphalke 17:af1f2416dd26 174 uint8_t bytes_number,
mahphalke 17:af1f2416dd26 175 uint8_t stop_bit)
mahphalke 17:af1f2416dd26 176 {
mahphalke 17:af1f2416dd26 177 mbed::I2C *i2c;
mahphalke 17:af1f2416dd26 178 i2c = (I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port);
mahphalke 17:af1f2416dd26 179
mahphalke 17:af1f2416dd26 180 /**
mahphalke 17:af1f2416dd26 181 The MBED I2C API is reversed for parameter 4
mahphalke 17:af1f2416dd26 182 Instead of stop_bit - it has
mahphalke 17:af1f2416dd26 183 @param repeated - Repeated start, true - don't send stop at end default value is false.
mahphalke 17:af1f2416dd26 184 Inverting here to keep the no-OS/platform_drivers API
mahphalke 17:af1f2416dd26 185 */
mahphalke 17:af1f2416dd26 186 if (!(i2c->read(desc->slave_address, (char *)data, bytes_number, !stop_bit))) {
mahphalke 17:af1f2416dd26 187 return SUCCESS;
mahphalke 17:af1f2416dd26 188 } else {
mahphalke 17:af1f2416dd26 189 return FAILURE;
mahphalke 17:af1f2416dd26 190 }
mahphalke 17:af1f2416dd26 191 }
mahphalke 17:af1f2416dd26 192
mahphalke 17:af1f2416dd26 193 #ifdef __cplusplus
mahphalke 17:af1f2416dd26 194 }
mahphalke 17:af1f2416dd26 195 #endif // _cplusplus