~ruther/qmk_firmware

8cf7265f8fae6f94b17c5d78ed41e52b22e2b218 — James Churchill 6 years ago 127ec5f
Rename i2c_slave functions so it can coexist with i2c_master (#4875)

Also merges tx/rx buffers, as only one is necessary.
M drivers/avr/i2c_slave.c => drivers/avr/i2c_slave.c +14 -11
@@ 9,23 9,26 @@

#include "i2c_slave.h"

void i2c_init(uint8_t address){
volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT];

static volatile uint8_t buffer_address;
static volatile bool slave_has_register_set = false;

void i2c_slave_init(uint8_t address){
    // load address into TWI address register
    TWAR = (address << 1);
    // set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt
    TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
}

void i2c_stop(void){
void i2c_slave_stop(void){
    // clear acknowledge and enable bits
    TWCR &= ~((1 << TWEA) | (1 << TWEN));
}

ISR(TWI_vect){
    uint8_t ack = 1;
    // temporary stores the received data
    //uint8_t data;
    

    switch(TW_STATUS){
        case TW_SR_SLA_ACK:
            // The device is now a slave receiver


@@ 38,13 41,13 @@ ISR(TWI_vect){
            if(!slave_has_register_set){
                buffer_address = TWDR;

                if (buffer_address >= RX_BUFFER_SIZE){ // address out of bounds dont ack
                    ack = 0;
                    buffer_address = 0;
                if (buffer_address >= I2C_SLAVE_REG_COUNT) {  // address out of bounds dont ack
                  ack            = 0;
                  buffer_address = 0;
                }
                slave_has_register_set = true; // address has been receaved now fill in buffer
            } else {
                rxbuffer[buffer_address] = TWDR;
                i2c_slave_reg[buffer_address] = TWDR;
                buffer_address++;
            }
            break;


@@ 52,7 55,7 @@ ISR(TWI_vect){
        case TW_ST_SLA_ACK:
        case TW_ST_DATA_ACK:
            // This device is a slave transmitter and master has requested data
            TWDR = txbuffer[buffer_address];
            TWDR = i2c_slave_reg[buffer_address];
            buffer_address++;
            break;



@@ 63,6 66,6 @@ ISR(TWI_vect){
            break;
    }

    // Reset i2c state mahcine to be ready for next interrupt
    // Reset i2c state machine to be ready for next interrupt
    TWCR |= (1 << TWIE) | (1 << TWINT) | (ack << TWEA) | (1 << TWEN);
}
\ No newline at end of file

M drivers/avr/i2c_slave.h => drivers/avr/i2c_slave.h +4 -9
@@ 8,16 8,11 @@
#ifndef I2C_SLAVE_H
#define I2C_SLAVE_H

#define TX_BUFFER_SIZE 30
#define RX_BUFFER_SIZE 30
#define I2C_SLAVE_REG_COUNT 30

volatile uint8_t buffer_address;
static volatile bool slave_has_register_set = false;
volatile uint8_t txbuffer[TX_BUFFER_SIZE];
volatile uint8_t rxbuffer[RX_BUFFER_SIZE];
extern volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT];

void i2c_init(uint8_t address);
void i2c_stop(void);
ISR(TWI_vect);
void i2c_slave_init(uint8_t address);
void i2c_slave_stop(void);

#endif // I2C_SLAVE_H
\ No newline at end of file

M keyboards/dc01/arrow/matrix.c => keyboards/dc01/arrow/matrix.c +6 -6
@@ 195,14 195,14 @@ uint8_t matrix_scan(void)
            debouncing = false;
        }
#   endif
        

        if (USB_DeviceState != DEVICE_STATE_Configured){
            txbuffer[1] = 0x55;
            i2c_slave_reg[1] = 0x55;
            for (uint8_t i = 0; i < MATRIX_ROWS; i++){
                txbuffer[i+2] = matrix[i]; //send matrix over i2c
                i2c_slave_reg[i+2] = matrix[i]; //send matrix over i2c
            }
        }
    

    matrix_scan_quantum();
    return 1;
}


@@ 396,9 396,9 @@ static void unselect_cols(void)

//this replases tmk code
void matrix_setup(void){
    

    if (USB_DeviceState != DEVICE_STATE_Configured){
        i2c_init(SLAVE_I2C_ADDRESS); //setup address of slave i2c
        i2c_slave_init(SLAVE_I2C_ADDRESS); //setup address of slave i2c
        sei(); //enable interupts
    }
}
\ No newline at end of file

M keyboards/dc01/numpad/matrix.c => keyboards/dc01/numpad/matrix.c +6 -6
@@ 195,14 195,14 @@ uint8_t matrix_scan(void)
            debouncing = false;
        }
#   endif
        

        if (USB_DeviceState != DEVICE_STATE_Configured){
            txbuffer[1] = 0x55;
            i2c_slave_reg[1] = 0x55;
            for (uint8_t i = 0; i < MATRIX_ROWS; i++){
                txbuffer[i+2] = matrix[i]; //send matrix over i2c
                i2c_slave_reg[i+2] = matrix[i]; //send matrix over i2c
            }
        }
    

    matrix_scan_quantum();
    return 1;
}


@@ 396,9 396,9 @@ static void unselect_cols(void)

//this replases tmk code
void matrix_setup(void){
    

    if (USB_DeviceState != DEVICE_STATE_Configured){
        i2c_init(SLAVE_I2C_ADDRESS); //setup address of slave i2c
        i2c_slave_init(SLAVE_I2C_ADDRESS); //setup address of slave i2c
        sei(); //enable interupts
    }
}
\ No newline at end of file

M keyboards/dc01/right/matrix.c => keyboards/dc01/right/matrix.c +6 -6
@@ 195,14 195,14 @@ uint8_t matrix_scan(void)
            debouncing = false;
        }
#   endif
        

        if (USB_DeviceState != DEVICE_STATE_Configured){
            txbuffer[1] = 0x55;
            i2c_slave_reg[1] = 0x55;
            for (uint8_t i = 0; i < MATRIX_ROWS; i++){
                txbuffer[i+2] = matrix[i]; //send matrix over i2c
                i2c_slave_reg[i+2] = matrix[i]; //send matrix over i2c
            }
        }
    

    matrix_scan_quantum();
    return 1;
}


@@ 396,9 396,9 @@ static void unselect_cols(void)

//this replases tmk code
void matrix_setup(void){
    

    if (USB_DeviceState != DEVICE_STATE_Configured){
        i2c_init(SLAVE_I2C_ADDRESS); //setup address of slave i2c
        i2c_slave_init(SLAVE_I2C_ADDRESS); //setup address of slave i2c
        sei(); //enable interupts
    }
}
\ No newline at end of file