Changeset 1926

Show
Ignore:
Timestamp:
11/11/08 19:15:01 (2 months ago)
Author:
batt
Message:

Add configurable option to choose at compile time which i2c backend to use.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/bertos/cfg/cfg_i2c.h

    r1883 r1926  
    5151#define CONFIG_I2C_START_TIMEOUT 100 
    5252 
     53/** 
     54 * I2C driver can have 2 backends: 
     55 * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. 
     56 * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. 
     57 */ 
     58#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN 
     59 
    5360/// Module logging level definition. 
    5461#define I2C_LOG_LEVEL      LOG_LVL_INFO 
  • trunk/bertos/cpu/avr/drv/i2c_avr.c

    r1879 r1926  
    6868 * \return true on success, false otherwise. 
    6969 */ 
    70 static bool i2c_start(void) 
     70static bool i2c_builtin_start(void) 
    7171{ 
    7272        TWCR = BV(TWINT) | BV(TWSTA) | BV(TWEN); 
     
    8888 * \return true on success, false otherwise. 
    8989 */ 
    90 bool i2c_start_w(uint8_t id) 
     90bool i2c_builtin_start_w(uint8_t id) 
    9191{ 
    9292        /* 
     
    9797         */ 
    9898        ticks_t start = timer_clock(); 
    99         while (i2c_start()) 
     99        while (i2c_builtin_start()) 
    100100        { 
    101101                TWDR = id & ~I2C_READBIT; 
     
    128128 * \return true on success, false otherwise. 
    129129 */ 
    130 bool i2c_start_r(uint8_t id) 
    131 { 
    132         if (i2c_start()) 
     130bool i2c_builtin_start_r(uint8_t id) 
     131{ 
     132        if (i2c_builtin_start()) 
    133133        { 
    134134                TWDR = id | I2C_READBIT; 
     
    149149 * Send STOP condition. 
    150150 */ 
    151 void i2c_stop(void) 
     151void i2c_builtin_stop(void) 
    152152{ 
    153153        TWCR = BV(TWINT) | BV(TWEN) | BV(TWSTO); 
     
    161161 * \return true on success, false on error. 
    162162 */ 
    163 bool i2c_put(const uint8_t data) 
     163bool i2c_builtin_put(const uint8_t data) 
    164164{ 
    165165        TWDR = data; 
     
    182182 * \return the byte read if ok, EOF on errors. 
    183183 */ 
    184 int i2c_get(bool ack) 
     184int i2c_builtin_get(bool ack) 
    185185{ 
    186186        TWCR = BV(TWINT) | BV(TWEN) | (ack ? BV(TWEA) : 0); 
     
    213213 * Initialize TWI module. 
    214214 */ 
    215 void i2c_init(void) 
     215void i2c_builtin_init(void) 
    216216{ 
    217217        ATOMIC( 
  • trunk/bertos/drv/i2c.h

    r1875 r1926  
    3939#define DRV_I2C_H 
    4040 
     41#include "cfg/cfg_i2c.h" 
    4142#include <cfg/compiler.h> 
    4243 
    4344#define I2C_READBIT BV(0) 
    4445 
    45 void i2c_init(void); 
    46 bool i2c_start_w(uint8_t id); 
    47 bool i2c_start_r(uint8_t id); 
    48 void i2c_stop(void); 
    49 bool i2c_put(uint8_t _data); 
    50 int i2c_get(bool ack); 
     46/** 
     47 * I2C Backends. 
     48 * \{ 
     49 */ 
     50#define I2C_BACKEND_BUILTIN 0 ///< Uses cpu builtin i2c driver 
     51#define I2C_BACKEND_BITBANG 1 ///< Uses emulated bitbang driver 
     52/*\}*/ 
     53 
     54void i2c_builtin_init(void); 
     55bool i2c_builtin_start_w(uint8_t id); 
     56bool i2c_builtin_start_r(uint8_t id); 
     57void i2c_builtin_stop(void); 
     58bool i2c_builtin_put(uint8_t _data); 
     59int i2c_builtin_get(bool ack); 
     60 
     61void i2c_bitbang_init(void); 
     62bool i2c_bitbang_start_w(uint8_t id); 
     63bool i2c_bitbang_start_r(uint8_t id); 
     64void i2c_bitbang_stop(void); 
     65bool i2c_bitbang_put(uint8_t _data); 
     66int i2c_bitbang_get(bool ack); 
     67 
     68 
     69#if CONFIG_I2C_BACKEND == I2C_BACKEND_BUILTIN 
     70        #define i2c_init    i2c_builtin_init 
     71        #define i2c_start_w i2c_builtin_start_w 
     72        #define i2c_start_r i2c_builtin_start_r 
     73        #define i2c_stop    i2c_builtin_stop 
     74        #define i2c_put     i2c_builtin_put 
     75        #define i2c_get     i2c_builtin_get 
     76#elif CONFIG_I2C_BACKEND == I2C_BACKEND_BITBANG 
     77        #define i2c_init    i2c_bitbang_init 
     78        #define i2c_start_w i2c_bitbang_start_w 
     79        #define i2c_start_r i2c_bitbang_start_r 
     80        #define i2c_stop    i2c_bitbang_stop 
     81        #define i2c_put     i2c_bitbang_put 
     82        #define i2c_get     i2c_bitbang_get 
     83#else 
     84        #error Unsupported i2c backend. 
     85#endif 
     86 
    5187bool i2c_send(const void *_buf, size_t count); 
    5288bool i2c_recv(void *_buf, size_t count); 
  • trunk/bertos/drv/i2c_bitbang.c

    r1880 r1926  
    5252#include "hw/hw_i2c_bitbang.h" 
    5353 
    54 INLINE bool i2c_start(void) 
     54INLINE bool i2c_bitbang_start(void) 
    5555{ 
    5656        SDA_HI; 
     
    6363} 
    6464 
    65 void i2c_stop(void) 
     65void i2c_bitbang_stop(void) 
    6666{ 
    6767        SDA_LO; 
     
    7171} 
    7272 
    73 bool i2c_put(uint8_t _data) 
     73bool i2c_bitbang_put(uint8_t _data) 
    7474{ 
    7575        /* Add ACK bit */ 
     
    9595} 
    9696 
    97 bool i2c_start_w(uint8_t id) 
     97bool i2c_bitbang_start_w(uint8_t id) 
    9898{ 
    9999        id &= ~I2C_READBIT; 
     
    105105         */ 
    106106        ticks_t start = timer_clock(); 
    107         while (i2c_start()) 
     107        while (i2c_bitbang_start()) 
    108108        { 
    109                 if (i2c_put(id)) 
     109                if (i2c_bitbang_put(id)) 
    110110                        return true; 
    111111                else if (timer_clock() - start > ms_to_ticks(CONFIG_I2C_START_TIMEOUT)) 
     
    120120} 
    121121 
    122 bool i2c_start_r(uint8_t id) 
     122bool i2c_bitbang_start_r(uint8_t id) 
    123123{ 
    124124        id |= I2C_READBIT; 
    125         if (i2c_start()) 
     125        if (i2c_bitbang_start()) 
    126126        { 
    127                 if (i2c_put(id)) 
     127                if (i2c_bitbang_put(id)) 
    128128                        return true; 
    129129 
     
    134134} 
    135135 
    136 int i2c_get(bool ack) 
     136int i2c_bitbang_get(bool ack) 
    137137{ 
    138138        uint8_t data = 0; 
     
    170170 * Initialize i2c module. 
    171171 */ 
    172 void i2c_init(void) 
     172void i2c_bitbang_init(void) 
    173173{ 
    174174        MOD_CHECK(timer);