From a66936bf2a0ecb46608a1b0e24c6128368dedf36 Mon Sep 17 00:00:00 2001 From: Kai Ryu Date: Wed, 14 Dec 2016 21:41:20 +0900 Subject: [PATCH] kimera: Improve method to checkout i2c timeout --- keyboard/kimera/config.h | 2 +- keyboard/kimera/i2c_wrapper.c | 68 ++++------------------------------- keyboard/kimera/twimaster.c | 67 ++++++++++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 70 deletions(-) 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<