Forked repo of Platform Drivers- Analog Devices

Revision:
17:af1f2416dd26
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i2c.cpp	Tue Jul 13 13:58:07 2021 +0530
@@ -0,0 +1,195 @@
+/***************************************************************************//**
+ *   @file   i2c.cpp
+ *   @brief  Implementation of I2C Mbed platform driver interfaces
+********************************************************************************
+ * Copyright (c) 2019 - 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 <stdio.h>
+#include <mbed.h>
+
+// Platform drivers needs to be C-compatible to work with other drivers
+#ifdef __cplusplus
+extern "C"
+{
+#endif //  _cplusplus
+
+#include "error.h"
+#include "i2c.h"
+#include "i2c_extra.h"
+
+/******************************************************************************/
+/********************** Macros and Constants Definitions **********************/
+/******************************************************************************/
+
+/******************************************************************************/
+/************************ Functions Declarations ******************************/
+/******************************************************************************/
+
+/******************************************************************************/
+/************************ Functions Definitions *******************************/
+/******************************************************************************/
+
+/**
+ * @brief Initialize the I2C communication peripheral.
+ * @param desc - The I2C descriptor.
+ * @param param - The structure that contains the I2C parameters.
+ * @return SUCCESS in case of success, FAILURE otherwise.
+ */
+int32_t i2c_init_noos(struct i2c_desc **desc,
+		      const struct i2c_init_param *param)
+{
+	mbed::I2C *i2c;		// pointer to new I2C instance
+	mbed_i2c_desc *mbed_desc;	// pointer to mbed i2c desc
+	i2c_desc *new_desc;
+
+	if (desc) {
+		// Create an i2c descriptor object for the device
+		new_desc = (i2c_desc *)malloc(sizeof(i2c_desc));
+		if (!new_desc) {
+			goto err_new_desc;
+		}
+
+		// Address passed in parameter shifted left by 1 to form
+		// 7-bit i2c slave address (7 MSBs) and the LSB acts as
+		// r/w bit during i2c read/write operations
+		new_desc->slave_address = ((param->slave_address) << 1);
+
+		// Configure and instantiate I2C protocol
+		i2c = new I2C(
+			(PinName)(((mbed_i2c_init_param *)param->extra)->i2c_sda_pin),
+			(PinName)(((mbed_i2c_init_param *)param->extra)->i2c_scl_pin));
+
+		if (!i2c) {
+			goto err_i2c;
+		}
+
+		// Create the i2c mbed descriptor object to store new i2c instance
+		mbed_desc = (mbed_i2c_desc *)malloc(sizeof(mbed_i2c_desc));
+		if (!mbed_desc) {
+			goto err_mbed_desc;
+		}
+
+		mbed_desc->i2c_port = (I2C *)i2c;
+		new_desc->extra = (mbed_i2c_desc *)mbed_desc;
+
+		*desc = new_desc;
+
+		return SUCCESS;
+	}
+
+err_mbed_desc:
+	free(i2c);
+err_i2c:
+	free(new_desc);
+err_new_desc:
+	// Nothing to free
+
+	return FAILURE;
+}
+
+
+/**
+ * @brief Free the resources allocated by i2c_init_noos().
+ * @param desc - The I2C descriptor.
+ * @return SUCCESS in case of success, FAILURE otherwise.
+ */
+int32_t i2c_remove(struct i2c_desc *desc)
+{
+	if (desc) {
+		// Free the I2C port object
+		if ((I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port)) {
+			delete((I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port));
+		}
+
+		// Free the I2C extra descriptor object
+		if ((mbed_i2c_desc *)(desc->extra)) {
+			free((mbed_i2c_desc *)(desc->extra));
+		}
+
+		// Free the I2C descriptor object
+		free(desc);
+
+		return SUCCESS;
+	}
+
+	return FAILURE;
+}
+
+
+/**
+ * @brief Write data to a slave device.
+ * @param desc - The I2C descriptor.
+ * @param data - Buffer that stores the transmission data.
+ * @param bytes_number - Number of bytes to write.
+ * @param stop_bit - Stop condition control.
+ *                   Example: 0 - A stop condition will not be generated;
+ *                            1 - A stop condition will be generated.
+ * @return SUCCESS in case of success, FAILURE otherwise.
+ */
+
+int32_t i2c_write_noos(struct i2c_desc *desc,
+		       uint8_t *data,
+		       uint8_t bytes_number,
+		       uint8_t stop_bit)
+{
+	mbed::I2C *i2c;
+	i2c = (I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port);
+
+	/**
+	    The MBED I2C API is reversed for parameter 4
+	    Instead of stop_bit - it has
+	    @param repeated   - Repeated start, true - don't send stop at end default value is false.
+	    Inverting here to keep the no-OS/platform_drivers API
+	 */
+	if (!(i2c->write(desc->slave_address, (char *)data, bytes_number, !stop_bit))) {
+		return SUCCESS;
+	} else {
+		return FAILURE;
+	}
+}
+
+
+/**
+ * @brief Read data from a slave device.
+ * @param desc - The I2C descriptor.
+ * @param data - Buffer that will store the received data.
+ * @param bytes_number - Number of bytes to read.
+ * @param stop_bit - Stop condition control.
+ *                   Example: 0 - A stop condition will not be generated;
+ *                            1 - A stop condition will be generated.
+ * @return SUCCESS in case of success, FAILURE otherwise.
+ */
+int32_t i2c_read_noos(struct i2c_desc *desc,
+		      uint8_t *data,
+		      uint8_t bytes_number,
+		      uint8_t stop_bit)
+{
+	mbed::I2C *i2c;
+	i2c = (I2C *)(((mbed_i2c_desc *)(desc->extra))->i2c_port);
+
+	/**
+	    The MBED I2C API is reversed for parameter 4
+	    Instead of stop_bit - it has
+	    @param repeated   - Repeated start, true - don't send stop at end default value is false.
+	    Inverting here to keep the no-OS/platform_drivers API
+	 */
+	if (!(i2c->read(desc->slave_address, (char *)data, bytes_number, !stop_bit))) {
+		return SUCCESS;
+	} else {
+		return FAILURE;
+	}
+}
+
+#ifdef __cplusplus
+}
+#endif //  _cplusplus