Skip to content

Commit

Permalink
firmware: drivers: tca4311a: Synchronize the driver implementation wi…
Browse files Browse the repository at this point in the history
…th the OBDH 2.0 repository
  • Loading branch information
mgm8 committed Dec 2, 2021
1 parent 8b2fce7 commit deee7c6
Show file tree
Hide file tree
Showing 2 changed files with 202 additions and 36 deletions.
138 changes: 112 additions & 26 deletions firmware/drivers/tca4311a/tca4311a.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* tca4311a.c
*
* Copyright (C) 2020, SpaceLab.
* Copyright The EPS 2.0 Contributors.
*
* This file is part of EPS 2.0.
*
Expand All @@ -16,18 +16,18 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EPS 2.0. If not, see <http://www.gnu.org/licenses/>.
* along with EPS 2.0. If not, see <http:/\/www.gnu.org/licenses/>.
*
*/

/**
* \brief TCA4311A driver implementation.
*
* \authors Gabriel Mariano Marcelino <gabriel.mm8@gmail.com> and Vinicius Pimenta Bernardo <viniciuspibi@gmail.com>
* \author Gabriel Mariano Marcelino <[email protected]>
*
* \version 0.1.7
* \version 0.2.40
*
* \date 2021/06/05
* \date 2020/02/01
*
* \addtogroup tca4311a
* \{
Expand All @@ -40,77 +40,163 @@

int tca4311a_init(tca4311a_config_t config, bool en)
{
int res_en = gpio_init(config.en_pin, (gpio_config_t){.mode=GPIO_MODE_OUTPUT});
int res_i2c = i2c_init(config.i2c_port, config.i2c_config);

int res_ready = gpio_init(config.ready_pin, (gpio_config_t){.mode=GPIO_MODE_INPUT});
gpio_config_t gpio_conf = {0};

if ((res_en != 0) || (res_ready != 0))
gpio_conf.mode = GPIO_MODE_OUTPUT;

int res_en = gpio_init(config.en_pin, gpio_conf);

gpio_conf.mode = GPIO_MODE_INPUT;

int res_ready = gpio_init(config.ready_pin, gpio_conf);

int err = -1;

if ((res_i2c != 0) || (res_en != 0) || (res_ready != 0))
{
#if CONFIG_DRIVERS_DEBUG_ENABLED == 1
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error during the initialization!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
return TCA4311A_ERROR;
}

if (en)
{
return tca4311a_enable(config);
err = TCA4311A_ERROR;
}
else
{
return tca4311a_disable(config);
if (en)
{
err = tca4311a_enable(config);
}
else
{
err = tca4311a_disable(config);
}
}

return err;
}

int tca4311a_enable(tca4311a_config_t config)
{
int err = TCA4311A_READY;

if (gpio_set_state(config.en_pin, true) != 0)
{
#if CONFIG_DRIVERS_DEBUG_ENABLED == 1
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error during enable!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
return TCA4311A_ERROR;
err = TCA4311A_ERROR;
}

return tca4311a_is_ready(config);
return err;
}

int tca4311a_disable(tca4311a_config_t config)
{
int err = TCA4311A_READY;

if (gpio_set_state(config.en_pin, false) != 0)
{
#if CONFIG_DRIVERS_DEBUG_ENABLED == 1
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error during disable!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
return TCA4311A_ERROR;
err = TCA4311A_ERROR;
}

return tca4311a_is_ready(config);
return err;
}

int tca4311a_is_ready(tca4311a_config_t config)
{
int err = -1;

int result = gpio_get_state(config.ready_pin);

if (result == GPIO_STATE_HIGH)
{
return TCA4311A_READY;
err = TCA4311A_READY;
}
else if (result == GPIO_STATE_LOW)
{
return TCA4311A_NOT_READY;
err = TCA4311A_NOT_READY;
}
else
{
#if CONFIG_DRIVERS_DEBUG_ENABLED == 1
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error reading the state!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
return TCA4311A_ERROR;
err = TCA4311A_ERROR;
}

return err;
}

int tca4311a_write(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t *data, uint16_t len)
{
int err = TCA4311A_READY;

if (i2c_write(config.i2c_port, adr, data, len) != 0)
{
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error during writing!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
err = TCA4311A_ERROR;
}

return err;
}

int tca4311a_read(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t *data, uint16_t len)
{
int err = TCA4311A_READY;

if (i2c_read(config.i2c_port, adr, data, len) != 0)
{
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error during reading!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
err = TCA4311A_ERROR;
}

return err;
}

int tca4311a_write_byte(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t byte)
{
int err = TCA4311A_READY;

if (i2c_write(config.i2c_port, adr, &byte, 1) != 0)
{
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error writing a byte!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
err = TCA4311A_ERROR;
}

return err;
}

int tca4311a_read_byte(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t *byte)
{
int err = TCA4311A_READY;

if (i2c_read(config.i2c_port, adr, byte, 1) != 0)
{
#if defined(CONFIG_DRIVERS_DEBUG_ENABLED) && (CONFIG_DRIVERS_DEBUG_ENABLED == 1)
sys_log_print_event_from_module(SYS_LOG_ERROR, TCA4311A_MODULE_NAME, "Error reading a byte!");
sys_log_new_line();
#endif /* CONFIG_DRIVERS_DEBUG_ENABLED */
err = TCA4311A_ERROR;
}

return err;
}

/** \} End of tca4311a group */
100 changes: 90 additions & 10 deletions firmware/drivers/tca4311a/tca4311a.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* tca4311a.h
*
* Copyright (C) 2020, SpaceLab.
* Copyright The EPS 2.0 Contributors.
*
* This file is part of EPS 2.0.
*
Expand All @@ -23,11 +23,11 @@
/**
* \brief TCA4311A driver definition.
*
* \authors Gabriel Mariano Marcelino <gabriel.mm8@gmail.com>, Vinicius Pimenta Bernardo <[email protected]> and Augusto Cezar Boldori Vassoler <augustovassoler@gmail.com>
* \author Gabriel Mariano Marcelino <[email protected]>
*
* \version 0.2.7
* \version 0.2.40
*
* \date 2021/07/05
* \date 01/02/2020
*
* \defgroup tca4311a TCA4311A
* \ingroup drivers
Expand All @@ -40,7 +40,7 @@
#include <stdint.h>
#include <stdbool.h>

#include <drivers/i2c_slave/i2c_slave.h>
#include <drivers/i2c/i2c.h>
#include <drivers/gpio/gpio.h>

#define TCA4311A_MODULE_NAME "TCA4311A"
Expand All @@ -50,8 +50,8 @@
*/
typedef struct
{
i2c_slave_port_t i2c_port; /**< I2C (as slave) port number.*/
i2c_slave_config_t i2c_config; /**< I2C (as slave) port configuration. */
i2c_port_t i2c_port; /**< I2C port number.*/
i2c_config_t i2c_config; /**< I2C port configuration. */
gpio_pin_t en_pin; /**< EN GPIO pin. */
gpio_pin_t ready_pin; /**< READY GPIO pin. */
} tca4311a_config_t;
Expand All @@ -62,14 +62,14 @@ typedef struct
typedef enum
{
TCA4311A_ERROR=-1, /**< Error during initialization. */
TCA4311A_READY, /**< The chip is ready. */
TCA4311A_NOT_READY /**< The chip is not ready. */
TCA4311A_READY, /**< The chip is not ready. */
TCA4311A_NOT_READY /**< The chip is ready. */
} tca4311a_status_e;

/**
* \brief Driver initialization.
*
* This function initializes the GPIO pins of EN and READY pins.
* This function initializes the given I2C port and the GPIO pins of EN and READY pins.
*
* \param[in] config is the configuration parameters of the TCA4311A chip.
*
Expand Down Expand Up @@ -146,6 +146,86 @@ int tca4311a_disable(tca4311a_config_t config);
*/
int tca4311a_is_ready(tca4311a_config_t config);

/**
* \brief Writes data to a given I2C slave.
*
* \param[in] config is the configuration parameters of the TCA4311A chip.
*
* \param[in] adr is the 7-bit slave address to read.
*
* \param[in] data is the data to write.
*
* \param[in] len is the number of bytes to write.
*
* \return The status of the chip. It can be:
* \parblock
* -\b TCA4311A_ERROR
* -\b TCA4311A_NOT_READY
* -\b TCA4311A_READY
* .
* \endparblock
*/
int tca4311a_write(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t *data, uint16_t len);

/**
* \brief Reads data from a given I2C slave.
*
* \param[in] config is the configuration parameters of the TCA4311A chip.
*
* \param[in] adr is the 7-bit slave address to read.
*
* \param[in] data is a pointer to store the read data.
*
* \param[in] len is the number of bytes to read.
*
* \return The status of the chip. It can be:
* \parblock
* -\b TCA4311A_ERROR
* -\b TCA4311A_NOT_READY
* -\b TCA4311A_READY
* .
* \endparblock
*/
int tca4311a_read(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t *data, uint16_t len);

/**
* \brief Reads data from a given I2C slave.
*
* \param[in] config is the configuration parameters of the TCA4311A chip.
*
* \param[in] adr is the 7-bit slave address to read.
*
* \param[in] byte is the byte to be written to the slave.
*
* \return The status of the chip. It can be:
* \parblock
* -\b TCA4311A_ERROR
* -\b TCA4311A_NOT_READY
* -\b TCA4311A_READY
* .
* \endparblock
*/
int tca4311a_write_byte(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t byte);

/**
* \brief Reads data from a given I2C slave.
*
* \param[in] config is the configuration parameters of the TCA4311A chip.
*
* \param[in] adr is the 7-bit slave address to read.
*
* \param[in] byte is a pointer to store the read byte from the slave.
*
* \return The status of the chip. It can be:
* \parblock
* -\b TCA4311A_ERROR
* -\b TCA4311A_NOT_READY
* -\b TCA4311A_READY
* .
* \endparblock
*/
int tca4311a_read_byte(tca4311a_config_t config, i2c_slave_adr_t adr, uint8_t *byte);

#endif /* TCA4311A_H_ */

/** \} End of tca4311a group */

0 comments on commit deee7c6

Please sign in to comment.