/* Function Description: Send the address for a read access. * Return : 0 if not acknowledged, otherwise acknowledged. */ static int envctrl_i2c_read_addr(unsigned char addr) { envctrl_i2c_test_bb(); /* Load address. */ envctrl_writeb(addr + 1, &i2c->data); envctrl_i2c_test_bb(); envctrl_writeb(OBD_SEND_START, &i2c->csr); /* Wait for PIN. */ envtrl_i2c_test_pin(); /* CSR 0 means acknowledged. */ if (!(envctrl_readb(&i2c->csr) & STATUS_LRB)) { return envctrl_readb(&i2c->data); } else { envctrl_writeb(OBD_SEND_STOP, &i2c->csr); return 0; } }
/* Function Description: Send the address for a read access. * Return : 0 if not acknowledged, otherwise acknowledged. */ static int envctrl_i2c_read_addr(unsigned char addr) { envctrl_i2c_test_bb(); /* Load address. */ writeb(addr + 1, i2c + PCF8584_DATA); envctrl_i2c_test_bb(); writeb(OBD_SEND_START, i2c + PCF8584_CSR); /* Wait for PIN. */ envtrl_i2c_test_pin(); /* CSR 0 means acknowledged. */ if (!(readb(i2c + PCF8584_CSR) & STATUS_LRB)) { return readb(i2c + PCF8584_DATA); } else { writeb(OBD_SEND_STOP, i2c + PCF8584_CSR); return 0; } }
/* Function Description: Generate Stop condition after last byte is sent. * Return : None. */ static void envctrl_i2c_stop(void) { envtrl_i2c_test_pin(); envctrl_writeb(OBD_SEND_STOP, &i2c->csr); }
/* Function Description: Instruct the device which port to read data from. * Return : None. */ static void envctrl_i2c_write_data(unsigned char port) { envtrl_i2c_test_pin(); envctrl_writeb(port, &i2c->data); }
/* Function Description: Read 1 byte of data from addr * set by envctrl_i2c_read_addr() * Return : Data from address set by envctrl_i2c_read_addr(). */ static unsigned char envctrl_i2c_read_data(void) { envtrl_i2c_test_pin(); envctrl_writeb(CONTROL_ES0, &i2c->csr); /* Send neg ack. */ return envctrl_readb(&i2c->data); }
/* Function Description: Generate Stop condition after last byte is sent. * Return : None. */ static void envctrl_i2c_stop(void) { envtrl_i2c_test_pin(); writeb(OBD_SEND_STOP, i2c + PCF8584_CSR); }
/* Function Description: Instruct the device which port to read data from. * Return : None. */ static void envctrl_i2c_write_data(unsigned char port) { envtrl_i2c_test_pin(); writeb(port, i2c + PCF8584_DATA); }
/* Function Description: Read 1 byte of data from addr * set by envctrl_i2c_read_addr() * Return : Data from address set by envctrl_i2c_read_addr(). */ static unsigned char envctrl_i2c_read_data(void) { envtrl_i2c_test_pin(); writeb(CONTROL_ES0, i2c + PCF8584_CSR); /* Send neg ack. */ return readb(i2c + PCF8584_DATA); }