/* * Waiting for ACKNOWLEDGE. * * When a chip is being addressed or has received data it will issue an * ACKNOWLEDGE pulse. Therefore the MASTER must release the DATA line * (set it to high level) and then release the CLOCK line. * Now it must wait for the SLAVE to pull the DATA line low. * Actually on the bus this looks like a START condition so nothing happens * because of the fact that the IC's that have not been addressed are doing * nothing. * * When the SLAVE has pulled this line low the MASTER will take the CLOCK * line low and then the SLAVE will release the SDA (data) line. */ static int iicbb_ack(device_t dev, int timeout) { int noack; int k = 0; I2C_SET(dev,0,1); I2C_SET(dev,1,1); do { noack = I2C_GETSDA(dev); if (!noack) break; DELAY(10); k += 10; } while (k < timeout); I2C_SET(dev,0,1); I2C_DEBUG(printf("%c ",noack?'-':'+')); return (noack); }
static u_char iicbb_readbyte(device_t dev, int last, int timeout) { int i; unsigned char data=0; I2C_SET(dev,0,1); for (i=7; i>=0; i--) { I2C_SET(dev,1,1); if (I2C_GETSDA(dev)) data |= (1<<i); I2C_SET(dev,0,1); } if (last) { iicbb_one(dev, timeout); } else { iicbb_zero(dev, timeout); } I2C_DEBUG(printf("r%02x%c ",(int)data,last?'-':'+')); return data; }
/* * Waiting for ACKNOWLEDGE. * * When a chip is being addressed or has received data it will issue an * ACKNOWLEDGE pulse. Therefore the MASTER must release the DATA line * (set it to high level) and then release the CLOCK line. * Now it must wait for the SLAVE to pull the DATA line low. * Actually on the bus this looks like a START condition so nothing happens * because of the fact that the IC's that have not been addressed are doing * nothing. * * When the SLAVE has pulled this line low the MASTER will take the CLOCK * line low and then the SLAVE will release the SDA (data) line. */ static int iicbb_ack(device_t dev, int timeout) { struct iicbb_softc *sc = device_get_softc(dev); int noack; int k = 0; I2C_SET(sc,dev,0,1); I2C_SET(sc,dev,1,1); do { noack = I2C_GETSDA(dev); if (!noack) break; DELAY(1); k++; } while (k < timeout); I2C_SET(sc,dev,0,1); I2C_DEBUG(printf("%c ",noack?'-':'+')); return (noack); }