i2c doesn't support at91 cpus.
[bertos.git] / bertos / drv / i2c.h
index f09ec44f8b7a8f53e8a7b3e9d5f70aa0812feff9..a962d171548d6050cf80047732337e49b0c90a22 100644 (file)
  *
  * -->
  *
- * \brief I2C generic driver functions (interface).
+ * \brief I2C generic driver functions.
  *
  * \version $Id$
  * \author Francesco Sacchi <batt@develer.com>
+ *
+ * $WIZ$ module_name = "i2c"
+ * $WIZ$ module_configuration = "bertos/cfg/cfg_i2c.h"
+ * $WIZ$ module_hw = "bertos/hw/hw_i2c_bitbang.h"
+ * $WIZ$ module_supports = "not atmega103 and not atmega168 and not at91"
  */
+
 #ifndef DRV_I2C_H
 #define DRV_I2C_H
 
+#include "cfg/cfg_i2c.h"
 #include <cfg/compiler.h>
 
 #define I2C_READBIT BV(0)
 
-void i2c_init(void);
-bool i2c_start_w(uint8_t id);
-bool i2c_start_r(uint8_t id);
-void i2c_stop(void);
-bool i2c_put(uint8_t _data);
-int i2c_get(bool ack);
+/**
+ * I2C Backends.
+ * Sometimes your cpu does not have a builtin
+ * i2c driver or you don't want, for some reason, to
+ * use that.
+ * With this you can choose, at compile time, which backend to use.
+ *
+ * $WIZ$ i2c_backend = "I2C_BACKEND_BUILTIN", "I2C_BACKEND_BITBANG"
+ */
+#define I2C_BACKEND_BUILTIN 0 ///< Uses cpu builtin i2c driver
+#define I2C_BACKEND_BITBANG 1 ///< Uses emulated bitbang driver
+
+
+/**
+ * I2c builtin prototypes.
+ * Do NOT use these function directly, instead,
+ * you can call the ones named without "_builtin_"
+ * and specify in cfg_i2c.h ( \see CONFIG_I2C_BACKEND)
+ * that you want the builtin backend.
+ * \{
+ */
+void i2c_builtin_init(void);
+bool i2c_builtin_start_w(uint8_t id);
+bool i2c_builtin_start_r(uint8_t id);
+void i2c_builtin_stop(void);
+bool i2c_builtin_put(uint8_t _data);
+int i2c_builtin_get(bool ack);
+/*\}*/
+
+/**
+ * I2c bitbang prototypes.
+ * Same thing here: do NOT use these function directly, instead,
+ * you can call the ones named without "_bitbang_"
+ * and specify in cfg_i2c.h ( \see CONFIG_I2C_BACKEND)
+ * that you want the bitbang backend.
+ * \{
+ */
+void i2c_bitbang_init(void);
+bool i2c_bitbang_start_w(uint8_t id);
+bool i2c_bitbang_start_r(uint8_t id);
+void i2c_bitbang_stop(void);
+bool i2c_bitbang_put(uint8_t _data);
+int i2c_bitbang_get(bool ack);
+/*\}*/
+
+#if CONFIG_I2C_BACKEND == I2C_BACKEND_BUILTIN
+       #define i2c_init    i2c_builtin_init
+       #define i2c_start_w i2c_builtin_start_w
+       #define i2c_start_r i2c_builtin_start_r
+       #define i2c_stop    i2c_builtin_stop
+       #define i2c_put     i2c_builtin_put
+       #define i2c_get     i2c_builtin_get
+#elif CONFIG_I2C_BACKEND == I2C_BACKEND_BITBANG
+       #define i2c_init    i2c_bitbang_init
+       #define i2c_start_w i2c_bitbang_start_w
+       #define i2c_start_r i2c_bitbang_start_r
+       #define i2c_stop    i2c_bitbang_stop
+       #define i2c_put     i2c_bitbang_put
+       #define i2c_get     i2c_bitbang_get
+#else
+       #error Unsupported i2c backend.
+#endif
+
 bool i2c_send(const void *_buf, size_t count);
 bool i2c_recv(void *_buf, size_t count);