MBED platform drivers library
Revision 0:d61bb2021c34, committed 2019-09-05
- Comitter:
- MitchAD
- Date:
- Thu Sep 05 20:46:11 2019 +0000
- Commit message:
- Initial Commit for the MBED platform drivers
Changed in this revision
platform_drivers.cpp | Show annotated file Show diff for this revision Revisions of this file |
platform_drivers.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r d61bb2021c34 platform_drivers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/platform_drivers.cpp Thu Sep 05 20:46:11 2019 +0000 @@ -0,0 +1,366 @@ +/***************************************************************************//** + * @file platform_drivers.cpp + * @brief Implementation of Generic Platform Drivers. + * @author DBogdan (dragos.bogdan@analog.com) +******************************************************************************** + * Copyright 2017,2019(c) Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#include <stdint.h> +#include <mbed.h> +#include "platform_drivers.h" + +/** + Provide implementations for the following extern functions. + For Example - in main.cpp + DigitalOut SS(SPI_CS); + mbed::SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK); + mbed::I2C i2c(I2C_SDA, I2C_SCL); + **/ +extern DigitalOut SS; +extern SPI spi; +extern I2C i2c; +/******************************************************************************/ +/************************ 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 mbed_i2c_init(struct i2c_desc **desc, + const struct i2c_init_param *param) +{ + i2c_desc * new_desc = (i2c_desc*) malloc(sizeof(i2c_desc)); + new_desc->id = param->id; + new_desc->slave_address = param->slave_address; + new_desc->type = param->type; + + *desc = new_desc; + + return SUCCESS; +} + + +/** + * @brief Free the resources allocated by i2c_init(). + * @param desc - The I2C descriptor. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t i2c_remove(struct i2c_desc *desc) +{ + if (desc) { + // Unused variable - fix compiler warning + } + + return SUCCESS; +} + +/** + * @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 mbed_i2c_write(struct i2c_desc *desc, + uint8_t *data, + uint8_t bytes_number, + uint8_t stop_bit) +{ +/** + 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 + */ + i2c.write(desc->slave_address , (char *)data, bytes_number, !stop_bit); + return SUCCESS; +} + +/** + * @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 mbed_i2c_read(struct i2c_desc *desc, + uint8_t *data, + uint8_t bytes_number, + uint8_t stop_bit) +{ +/** + 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 + */ + i2c.read(desc->slave_address, (char *)data, bytes_number, !stop_bit); + + return SUCCESS; +} + +/** + * @brief Initialize the SPI communication peripheral. + * @param desc - The SPI descriptor. + * @param init_param - The structure that contains the SPI parameters. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t mbed_spi_init(struct spi_desc **desc, + const struct spi_init_param *param) +{ + + // Create the spi description object for the device + spi_desc * new_desc = (spi_desc*) malloc(sizeof(*new_desc)); + new_desc->chip_select = param->chip_select; + new_desc->mode = param->mode; + new_desc->max_speed_hz = param->max_speed_hz; + *desc = new_desc; + + spi.format(SEND_BYTE, param->mode); //Stick to byte-multiples + /** + NOTE: Actual frequency of SPI clk will be somewhat device + dependent, relating to clock-settings, prescalars etc. If absolute + SPI frequency is required, consult your device documentation. + **/ + spi.frequency(param->max_speed_hz); + spi.set_default_write_value(0x00); //code to write when reading back + SS = GPIO_HIGH; //set SS high + + return SUCCESS; +} + +/** + * @brief Free the resources allocated by spi_init(). + * @param desc - The SPI descriptor. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t spi_remove(struct spi_desc *desc) +{ + if (desc) { + // Unused variable - fix compiler warning + } + + return SUCCESS; +} + + +/** + * @brief Write and read data to/from SPI. + * + * This function will be updated to improve performance + * + * @param desc - The SPI descriptor. + * @param data - The buffer with the transmitted/received data. + * @param bytes_number - Number of bytes to write/read. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t spi_write_and_read(struct spi_desc *desc, + uint8_t *data, + uint8_t bytes_number) +{ + if (desc) { + // Unused variable - fix compiler warning + } + + volatile uint8_t rxData; + + + SS = GPIO_LOW; //!select SS + for(size_t byte = 0 ; byte < bytes_number ; byte++) + { + rxData= spi.write(data[byte]); + data[byte] = rxData; + } + SS = GPIO_HIGH; //!deselect SS + + return SUCCESS; +} + +/** + * @brief Obtain the GPIO decriptor. + * @param desc - The GPIO descriptor. + * @param gpio_number - The number of the GPIO. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t gpio_get(struct gpio_desc **desc, + gpio_desc init_values) +{ + gpio_desc * new_gpio = new gpio_desc; + new_gpio->id = init_values.id; + new_gpio->number = init_values.number; + new_gpio->pin = init_values.pin; + new_gpio->type = init_values.type; + + *desc = new_gpio; + + return SUCCESS; +} + +/** + * @brief Free the resources allocated by gpio_get(). + * @param desc - The SPI descriptor. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t gpio_remove(struct gpio_desc *desc) +{ + if (desc) { + // Unused variable - fix compiler warning + } + + return SUCCESS; +} + +/** + * @brief Enable the input direction of the specified GPIO. + * @param desc - The GPIO descriptor. + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t gpio_direction_input(struct gpio_desc *desc) +{ + //unnessary for MBED + if(desc) { } + // Unused variable - fix compiler warning + + return 0; +} + +/** + * @brief Enable the output direction of the specified GPIO. + * @param desc - The GPIO descriptor. + * @param value - The value. + * Example: GPIO_HIGH + * GPIO_LOW + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t gpio_direction_output(struct gpio_desc *desc, + uint8_t value) +{ + //unnessary for MBED ? + if(desc) { } + // Unused variable - fix compiler warning + + return SUCCESS; +} + +/** + * @brief Get the direction of the specified GPIO. + * @param desc - The GPIO descriptor. + * @param direction - The direction. + * Example: GPIO_OUT + * GPIO_IN + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t gpio_get_direction(struct gpio_desc *desc, + uint8_t *direction) +{ + if (desc) { + // Unused variable - fix compiler warning + } + + if (direction) { + // Unused variable - fix compiler warning + } + + return SUCCESS; +} + +/** + * @brief Set the value of the specified GPIO. + * @param desc - The GPIO descriptor. + * @param value - The value. + * Example: GPIO_HIGH + * GPIO_LOW + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t gpio_set_value(struct gpio_desc *desc, + uint8_t value) +{ + if (desc) + DigitalOut(desc->pin, value); + else + return FAILURE; + + return SUCCESS; +} + +/** + * @brief Get the value of the specified GPIO. + * @param desc - The GPIO descriptor. + * @param value - The value. + * Example: GPIO_HIGH + * GPIO_LOW + * @return SUCCESS in case of success, FAILURE otherwise. + */ +int32_t gpio_get_value(struct gpio_desc *desc, uint8_t *value) +{ + uint8_t returnVal = FAILURE; + if (desc) { + { + DigitalIn gpio(desc->pin); + *value = (uint8_t)gpio.read(); + *value = gpio; + returnVal = gpio.is_connected() ? SUCCESS : FAILURE; + } + + return returnVal; + } + return FAILURE; +} + +/** + * @brief Generate miliseconds delay. + * @param msecs - Delay in miliseconds. + * @return None. + */ +void mdelay(uint32_t msecs) +{ + if (msecs) + { + //unused variable - fix compiler warning + } +}
diff -r 000000000000 -r d61bb2021c34 platform_drivers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/platform_drivers.h Thu Sep 05 20:46:11 2019 +0000 @@ -0,0 +1,245 @@ +/***************************************************************************/ /** + * @file platform_drivers.h + * @brief Header file of Generic Platform Drivers. + * @author DBogdan (dragos.bogdan@analog.com) +******************************************************************************** + * Copyright 2017(c) Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef PLATFORM_DRIVERS_H_ +#define PLATFORM_DRIVERS_H_ + +// Our platform driver needs to be C-compatible to work with the drivers +#ifdef __cplusplus +extern "C" +{ +#endif + +#include <stdint.h> + +/** + TODO: The use of PinNames introduces a dependency on the MBED library + Investigate if this dependency can be cleanly removed. + ***/ +#include "PinNames.h" + + /******************************************************************************/ + /********************** Macros and Constants Definitions **********************/ + /******************************************************************************/ +#define MBED_ACTIVE + +#define SUCCESS 0 +#define FAILURE -1 + +#define SPI_CPHA 0x01 +#define SPI_CPOL 0x02 + +#define GPIO_OUT 0x01 +#define GPIO_IN 0x00 + +#define GPIO_HIGH 0x01 +#define GPIO_LOW 0x00 + +#define INTERNAL 1 +#define EXTERNAL 2 + +#define SEND_BYTE 8 + +/** + There is a naming collision with CMD_OFFSET, in the MBED API. To keep the code + clean and avoid changes to the noOS layer, it will be undefined here. If + your code uses this file, this will need to be re-introduce and the the + name changed in the driver. + stm32f4xx_ll_sdmmc.h(660) + **/ +#undef CMD_OFFSET + +/** + There is a naming collision withe following functions in the no-OS drivers + and the mbed API. Functions are redefined here to avoid changes to the + no-OS driver code. + **/ +#define spi_init mbed_spi_init +#define i2c_init mbed_i2c_init +#define i2c_read mbed_i2c_read +#define i2c_write mbed_i2c_write + +/******************************************************************************/ +/*************************** Types Declarations *******************************/ +/******************************************************************************/ + + typedef enum i2c_type + { + GENERIC_I2C + } i2c_type; + + typedef struct i2c_init_param + { + enum i2c_type type; + uint32_t id; + uint32_t max_speed_hz; + uint8_t slave_address; + + } i2c_init_param; + + typedef struct i2c_desc + { + enum i2c_type type; + uint32_t id; + uint8_t slave_address; + } i2c_desc; + + typedef enum platforms + { + ARDUINO, + MBED, + }platforms; + + + typedef enum spi_type + { + GENERIC_SPI + } spi_type; + + typedef enum spi_mode + { + SPI_MODE_0 = (0 | 0), + SPI_MODE_1 = (0 | SPI_CPHA), + SPI_MODE_2 = (SPI_CPOL | 0), + SPI_MODE_3 = (SPI_CPOL | SPI_CPHA) + } spi_mode; + + typedef struct spi_init_param + { + enum platforms platform; + enum spi_type type; + uint32_t id; + uint32_t max_speed_hz; + enum spi_mode mode; + uint8_t chip_select; + } spi_init_param; + + typedef struct spi_desc + { + enum spi_type type; + uint32_t id; + uint32_t max_speed_hz; + enum spi_mode mode; + uint8_t chip_select; + } spi_desc; + + typedef enum gpio_type + { + GENERIC_GPIO + } gpio_type; + + typedef struct gpio_desc + { + enum gpio_type type; + uint32_t id; + uint8_t number; + PinName pin; + } gpio_desc; + + /******************************************************************************/ + /************************ Functions Declarations ******************************/ + /******************************************************************************/ + + /* Initialize the I2C communication peripheral. */ + int32_t mbed_i2c_init(struct i2c_desc **desc, + const struct i2c_init_param *param); + + /* Free the resources allocated by i2c_init(). */ + int32_t i2c_remove(struct i2c_desc *desc); + + /* Write data to a slave device. */ + int32_t mbed_i2c_write(struct i2c_desc *desc, + uint8_t *data, + uint8_t bytes_number, + uint8_t stop_bit); + + /* Read data from a slave device. */ + int32_t mbed_i2c_read(struct i2c_desc *desc, + uint8_t *data, + uint8_t bytes_number, + uint8_t stop_bit); + + /* Initialize the SPI communication peripheral. */ + int32_t mbed_spi_init(struct spi_desc **desc, + const struct spi_init_param *param); + + /* Free the resources allocated by spi_init() */ + int32_t spi_remove(struct spi_desc *desc); + + /* Write and read data to/from SPI. */ + int32_t spi_write_and_read(struct spi_desc *desc, + uint8_t *data, + uint8_t bytes_number); + + /* Obtain the GPIO decriptor. */ + int32_t gpio_get(struct gpio_desc **desc, + gpio_desc gpio_number); + //uint8_t gpio_number); + + /* Free the resources allocated by gpio_get() */ + int32_t gpio_remove(struct gpio_desc *desc); + + /* Enable the input direction of the specified GPIO. */ + int32_t gpio_direction_input(struct gpio_desc *desc); + + /* Enable the output direction of the specified GPIO. */ + int32_t gpio_direction_output(struct gpio_desc *desc, + uint8_t value); + + /* Get the direction of the specified GPIO. */ + int32_t gpio_get_direction(struct gpio_desc *desc, + uint8_t *direction); + + /* Set the value of the specified GPIO. */ + int32_t gpio_set_value(struct gpio_desc *desc, + uint8_t value); + + /* Get the value of the specified GPIO. */ + int32_t gpio_get_value(struct gpio_desc *desc, + uint8_t *value); + + /* Generate miliseconds delay. */ + void mdelay(uint32_t msecs); + + +#ifdef __cplusplus // Closing extern c +} +#endif + +#endif // PLATFORM_DRIVERS_H_