+#else
+#error "Don't know how to set pullups for this chip, please add support"
+#endif
+}
+
+void i2c_send(unsigned char *buf, int len)
+{
+ uint8_t old_TWCR = TWCR;
+ uint8_t old_SREG = SREG;
+ int i;
+
+ cli();
+
+ TWCR = ((1<<TWINT) | (1<<TWSTA) | (1<<TWEN)); /* Send start */
+
+ while(!(TWCR & (1<<TWINT))) {}
+ if (TW_STATUS != TW_START) {
+#ifdef DEBUG
+ printf("I2C: error sending START\n");
+#endif
+ goto out;
+ }
+
+ TWDR = buf[0]; /* SLA_W */
+ TWCR = ((1<<TWINT) | (1<<TWEN));
+
+ while(!(TWCR & (1<<TWINT))) {}
+ if (TW_STATUS != TW_MT_SLA_ACK) {
+#ifdef DEBUG
+ printf("I2C: error sending SLA_W\n");
+#endif
+ goto out2;
+ }
+
+ for(i = 1; i < len; i++) {
+ TWDR = buf[i]; /* Send Data */
+ TWCR = ((1<<TWINT) | (1<<TWEN));
+
+ while(!(TWCR & (1<<TWINT))) {}
+ if (TW_STATUS != TW_MT_DATA_ACK) {
+#ifdef DEBUG
+ printf("I2C: error sending DATA byte %d\n", i);
+#endif
+ goto out2;
+ }
+ }
+
+#ifdef DEBUG
+ printf("I2C Data sent\n");
+#endif
+
+out2:
+ TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWSTO));
+ while(TWCR & (1<<TWSTO)) {}
+
+ TWCR = (1<<TWINT) | (1<<TWEN);
+out:
+ TWCR = old_TWCR;
+ SREG = old_SREG;