diff --git a/keyboard/kimera/config.h b/keyboard/kimera/config.h
index 2ae301f6..d85e789b 100644
--- a/keyboard/kimera/config.h
+++ b/keyboard/kimera/config.h
@@ -90,6 +90,6 @@ along with this program. If not, see .
#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
-#define NO_SUSPEND_POWER_DOWN
+//#define NO_SUSPEND_POWER_DOWN
#endif
diff --git a/keyboard/kimera/i2c_wrapper.c b/keyboard/kimera/i2c_wrapper.c
index 07f87838..9ab9a967 100644
--- a/keyboard/kimera/i2c_wrapper.c
+++ b/keyboard/kimera/i2c_wrapper.c
@@ -18,78 +18,22 @@ along with this program. If not, see .
#include
#include
#include
+#include "timer.h"
#include "i2cmaster.h"
#include "i2c_wrapper.h"
#include "debug.h"
-#define wdt_intr_enable(value) \
-__asm__ __volatile__ ( \
- "in __tmp_reg__,__SREG__" "\n\t" \
- "cli" "\n\t" \
- "wdr" "\n\t" \
- "sts %0,%1" "\n\t" \
- "out __SREG__,__tmp_reg__" "\n\t" \
- "sts %0,%2" "\n\t" \
- : /* no outputs */ \
- : "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \
- "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \
- "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
- _BV(WDIE) | (value & 0x07)) ) \
- : "r0" \
-)
-
-#define SCL_CLOCK 400000L
-#define SCL_DURATION (1000000L/SCL_CLOCK)/2
-
-static uint8_t i2c_wdt_enabled = 0;
-
-extern uint8_t i2c_force_stop;
-
-static void wdt_init(void);
-
void i2c_wrapper_init(void)
{
+ dprintf("I2C Init\n");
+
+ /* init timer */
+ timer_init();
+
/* init i2c */
i2c_init();
-
- /* init watch dog */
- wdt_init();
}
void i2c_wrapper_task(void)
{
- /* reset watch dog counter */
- wdt_reset();
-}
-
-void wdt_init(void)
-{
- cli();
- wdt_reset();
- wdt_intr_enable(WDTO_2S);
- sei();
-}
-
-ISR(WDT_vect)
-{
- xprintf("i2c timeout\n");
-
- /* let slave to release SDA */
- TWCR = 0;
- DDRD |= (1<
#include
+#include
#include
+#include "timer.h"
#include "debug.h"
@@ -20,9 +22,30 @@
/* I2C clock in Hz */
#define SCL_CLOCK 400000L
+#define SCL_DURATION (1000000L/SCL_CLOCK)/2
volatile uint8_t i2c_force_stop = 0;
+#define TIMEOUT 3000
#define CHECK_FORCE_STOP() if(i2c_force_stop){i2c_force_stop=0;break;}
+#define CHECK_TIMEOUT_PRE() \
+ uint16_t start; \
+ uint8_t once = 1;
+#define CHECK_TIMEOUT_PRE2() \
+ once = 1;
+#define CHECK_TIMEOUT(retval) { \
+ if (once) { \
+ start = timer_read(); \
+ once = 0; \
+ } \
+ else { \
+ if (timer_elapsed(start) >= TIMEOUT) { \
+ i2c_forceStop(); \
+ return retval; \
+ } \
+ } \
+}
+
+static void i2c_forceStop(void);
/*************************************************************************
Initialization of the I2C bus interface. Need to be called only once
@@ -49,7 +72,8 @@ unsigned char i2c_start(unsigned char address)
TWCR = (1<