/* ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, 2011,2012 Giovanni Di Sirio. This file is part of ChibiOS/RT. ChibiOS/RT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ChibiOS/RT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** * @file AVR/i2c_lld.h * @brief AVR I2C subsystem low level driver header. * * @addtogroup I2C * @{ */ #ifndef _I2C_LLD_H_ #define _I2C_LLD_H_ #if HAL_USE_I2C || defined(__DOXYGEN__) /*===========================================================================*/ /* Driver constants. */ /*===========================================================================*/ /** START transmitted */ #define TWI_START 0x08 /** Repeated START transmitted */ #define TWI_REPEAT_START 0x10 /** Arbitration Lost */ #define TWI_ARBITRATION_LOST 0x38 /** Bus errors */ #define TWI_BUS_ERROR 0x00 /** SLA+W transmitted with ACK response */ #define TWI_MASTER_TX_ADDR_ACK 0x18 /** SLA+W transmitted with NACK response */ #define TWI_MASTER_TX_ADDR_NACK 0x20 /** DATA transmitted with ACK response */ #define TWI_MASTER_TX_DATA_ACK 0x28 /** DATA transmitted with NACK response */ #define TWI_MASTER_TX_DATA_NACK 0x30 /** SLA+R transmitted with ACK response */ #define TWI_MASTER_RX_ADDR_ACK 0x40 /** SLA+R transmitted with NACK response */ #define TWI_MASTER_RX_ADDR_NACK 0x48 /** DATA received with ACK response */ #define TWI_MASTER_RX_DATA_ACK 0x50 /** DATA received with NACK response */ #define TWI_MASTER_RX_DATA_NACK 0x58 /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ /** * @name Configuration options * @{ */ /** * @brief I2C driver enable switch. * @details If set to @p TRUE the support for I2C is included. * @note The default is @p FALSE. */ #if !defined(USE_AVR_I2C) || defined(__DOXYGEN__) #define USE_AVR_I2C FALSE #endif /*===========================================================================*/ /* Derived constants and error checks. */ /*===========================================================================*/ /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ /** * @brief Type representing I2C address. */ typedef uint8_t i2caddr_t; /** * @brief I2C Driver condition flags type. */ typedef uint8_t i2cflags_t; /** * @brief Driver configuration structure. * @note Implementations may extend this structure to contain more, * architecture dependent, fields. */ typedef struct { /** * @brief Specifies the I2C clock frequency. */ uint32_t clock_speed; } I2CConfig; /** * @brief Structure representing an I2C driver. */ struct I2CDriver { /** * @brief Driver state. */ i2cstate_t state; /** * @brief Current configuration data. */ const I2CConfig *config; /** * @brief Error flags. */ i2cflags_t errors; #if I2C_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__) #if CH_USE_MUTEXES || defined(__DOXYGEN__) /** * @brief Mutex protecting the bus. */ Mutex mutex; #elif CH_USE_SEMAPHORES Semaphore semaphore; #endif #endif /* I2C_USE_MUTUAL_EXCLUSION */ #if defined(I2C_DRIVER_EXT_FIELDS) I2C_DRIVER_EXT_FIELDS #endif /* End of the mandatory fields.*/ /** * @brief Thread waiting for I/O completion. */ Thread *thread; /** * @brief Address of slave device */ i2caddr_t addr; /** * @brief Pointer to the buffer with data to send. */ const uint8_t *txbuf; /** * @brief Number of bytes of data to send. */ size_t txbytes; /** * @brief Current index in buffer when sending data. */ size_t txidx; /** * @brief Pointer to the buffer to put received data. */ uint8_t *rxbuf; /** * @brief Number of bytes of data to receive. */ size_t rxbytes; /** * @brief Current index in buffer when receiving data. */ size_t rxidx; }; /** * @brief Type of a structure representing an I2C driver. */ typedef struct I2CDriver I2CDriver; /*===========================================================================*/ /* Driver macros. */ /*===========================================================================*/ /** * @brief Get errors from I2C driver. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ #define i2c_lld_get_errors(i2cp) ((i2cp)->errors) /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ #if !defined(__DOXYGEN__) #if USE_AVR_I2C extern I2CDriver I2CD; #endif #endif /* !defined(__DOXYGEN__) */ #ifdef __cplusplus extern "C" { #endif void i2c_lld_init(void); void i2c_lld_start(I2CDriver *i2cp); void i2c_lld_stop(I2CDriver *i2cp); msg_t i2c_lld_master_transmit_timeout(I2CDriver *i2cp, i2caddr_t addr, const uint8_t *txbuf, size_t txbytes, uint8_t *rxbuf, size_t rxbytes, systime_t timeout); msg_t i2c_lld_master_receive_timeout(I2CDriver *i2cp, i2caddr_t addr, uint8_t *rxbuf, size_t rxbytes, systime_t timeout); #ifdef __cplusplus } #endif #endif /* HAL_USE_I2C */ #endif /* _I2C_LLD_H_ */ /** @} */