From 7343085df78d0fabedcdd69b207b2c04962cf98a Mon Sep 17 00:00:00 2001
From: Daniel Friesel <derf@finalrewind.org>
Date: Thu, 16 Aug 2018 09:14:56 +0200
Subject: [PATCH] Blinkenrocket: Configurable I2C speed

---
 src/arch/blinkenrocket/Makefile.inc  | 4 ++++
 src/arch/blinkenrocket/driver/i2c.cc | 8 ++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/arch/blinkenrocket/Makefile.inc b/src/arch/blinkenrocket/Makefile.inc
index 1d99d0b..5a4259f 100644
--- a/src/arch/blinkenrocket/Makefile.inc
+++ b/src/arch/blinkenrocket/Makefile.inc
@@ -27,6 +27,10 @@ else ifneq ($(findstring i2c,${arch_drivers}), )
 	TARGETS += src/arch/blinkenrocket/driver/i2c.cc
 endif
 
+ifneq (${i2c_freq}, )
+	COMMON_FLAGS += -DF_I2C=${i2c_freq}
+endif
+
 OBJECTS = ${TARGETS:.cc=.o}
 
 .cc.o:
diff --git a/src/arch/blinkenrocket/driver/i2c.cc b/src/arch/blinkenrocket/driver/i2c.cc
index 487c60e..df275ff 100644
--- a/src/arch/blinkenrocket/driver/i2c.cc
+++ b/src/arch/blinkenrocket/driver/i2c.cc
@@ -3,6 +3,10 @@
 #include <avr/io.h>
 #include <avr/interrupt.h>
 
+#ifndef F_I2C
+#define F_I2C 100000UL
+#endif
+
 inline void await_twint(unsigned char twcr_values)
 {
 #if 1
@@ -27,7 +31,7 @@ static signed char i2c_start_read(unsigned char addr)
 	if (!(TWSR & 0x18)) // 0x08 == START ok, 0x10 == RESTART ok
 		return -1;
 
-	// Note: An adress with read bit set ("... | 1") causes the TWI momodule
+	// Note: An adress with read bit set ("... | 1") causes the TWI module
 	// to switch to Master Receive mode
 	TWDR = (addr << 1) | 1;
 	await_twint(_BV(TWEN));
@@ -106,7 +110,7 @@ static signed char i2c_receive(uint8_t len, uint8_t *data)
 signed char I2C::setup()
 {
 	TWSR = 0;
-	TWBR = ((F_CPU / 100000UL) - 16) / 2;
+	TWBR = ((F_CPU / F_I2C) - 16) / 2;
 
 	return 0;
 }
-- 
GitLab