]> git.zerfleddert.de Git - rsbs2/blobdiff - bmc/i2c.c
firmware: fix firmware extraction
[rsbs2] / bmc / i2c.c
index f0816f0021cefb1e6a514508e9ec169e501455de..07d2e7902a4e5a6858a550dd7c423baf450f5b6f 100644 (file)
--- a/bmc/i2c.c
+++ b/bmc/i2c.c
@@ -3,6 +3,7 @@
 #include <stdio.h>
 #include "i2c.h"
 #include "bmc.h"
 #include <stdio.h>
 #include "i2c.h"
 #include "bmc.h"
+#include "config.h"
 #include "ipmb.h"
 
 #define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);  
 #include "ipmb.h"
 
 #define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);  
@@ -14,9 +15,15 @@ volatile uint8_t i2c_len = 0x00;
 static volatile uint8_t i2c_pos = 0x00;
 volatile uint8_t i2c_done = 0x00;
 
 static volatile uint8_t i2c_pos = 0x00;
 volatile uint8_t i2c_done = 0x00;
 
+#define I2C_FREQ 20000UL
+
 void i2c_init()
 {
 void i2c_init()
 {
-       TWBR = 0xff;
+       /* SCLf = F_CPU / (16 + 2 * TWBR * 4^TWPS)
+        * TWPS is 0 =>
+        * TWBR = (F_CPU/(2 * SCL)) - 8
+        */
+       TWBR = (F_CPU/(2*I2C_FREQ))-8;
        TWAR = BMC_ADDR & 0xfe;
        TWDR = 0x00;
        TWCR &= ~((1<<TWSTA) | (1<<TWSTO));
        TWAR = BMC_ADDR & 0xfe;
        TWDR = 0x00;
        TWCR &= ~((1<<TWSTA) | (1<<TWSTO));
@@ -78,10 +85,9 @@ out2:
        TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWSTO));
        while(TWCR & (1<<TWSTO)) {}
 
        TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWSTO));
        while(TWCR & (1<<TWSTO)) {}
 
-       TWCR = (1<<TWINT) | (1<<TWEN);
 out:   
 out:   
-       TWCR = old_TWCR;
        SREG = old_SREG;
        SREG = old_SREG;
+       TWCR = old_TWCR | (1<<TWINT);
 }
 
 ISR (TWI_vect, ISR_BLOCK)
 }
 
 ISR (TWI_vect, ISR_BLOCK)
Impressum, Datenschutz