#define DEB2(x) if (i2c_debug >= 2) x #define DEB3(x) if (i2c_debug >= 3) x /* print several statistical values */ #define DEBPROTO(x) if (i2c_debug >= 9) x; /* debug the protocol by showing transferred bits */ #define DEF_TIMEOUT 16
/* *moduleparameters:
*/ staticint i2c_debug;
/* setting states on the bus with the right timing: */
/* check to see PCF is really idled and we can access status register */ if ((temp = get_pcf(adap, 1)) != (I2C_PCF_PIN | I2C_PCF_BB)) {
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: PCF detection failed -- can't select S1` (0x%02x).\n", temp)); return -ENXIO;
}
printk(KERN_DEBUG "i2c-algo-pcf.o: detected and initialized PCF8584.\n");
return0;
}
staticint pcf_sendbytes(struct i2c_adapter *i2c_adap, constchar *buf, int count, int last)
{ struct i2c_algo_pcf_data *adap = i2c_adap->algo_data; int wrcount, status, timeout;
for (wrcount=0; wrcount<count; ++wrcount) {
DEB2(dev_dbg(&i2c_adap->dev, "i2c_write: writing %2.2X\n",
buf[wrcount] & 0xff));
i2c_outb(adap, buf[wrcount]);
timeout = wait_for_pin(adap, &status); if (timeout) { if (timeout == -EINTR) return -EINTR; /* arbitration lost */
i2c_stop(adap);
dev_err(&i2c_adap->dev, "i2c_write: error - timeout.\n"); return -EREMOTEIO; /* got a better one ?? */
} if (status & I2C_PCF_LRB) {
i2c_stop(adap);
dev_err(&i2c_adap->dev, "i2c_write: error - no ack.\n"); return -EREMOTEIO; /* got a better one ?? */
}
} if (last)
i2c_stop(adap); else
i2c_repstart(adap);
return wrcount;
}
staticint pcf_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count, int last)
{ int i, status; struct i2c_algo_pcf_data *adap = i2c_adap->algo_data; int wfp;
/* increment number of bytes to read by one -- read dummy byte */ for (i = 0; i <= count; i++) {
if ((wfp = wait_for_pin(adap, &status))) { if (wfp == -EINTR) return -EINTR; /* arbitration lost */
if (msg->flags & I2C_M_REV_DIR_ADDR)
addr ^= 1;
i2c_outb(adap, addr);
return0;
}
staticint pcf_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num)
{ struct i2c_algo_pcf_data *adap = i2c_adap->algo_data; struct i2c_msg *pmsg; int i; int ret=0, timeout, status;
if (adap->xfer_begin)
adap->xfer_begin(adap->data);
/* Check for bus busy */
timeout = wait_for_bb(adap); if (timeout) {
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: " "Timeout waiting for BB in pcf_xfer\n");)
i = -EIO; goto out;
}
for (i = 0;ret >= 0 && i < num; i++) {
pmsg = &msgs[i];
DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: Doing %s %d bytes to 0x%02x - %d of %d messages\n",
str_read_write(pmsg->flags & I2C_M_RD),
pmsg->len, pmsg->addr, i + 1, num);)
ret = pcf_doAddress(adap, pmsg);
/* Send START */ if (i == 0)
i2c_start(adap);
/* Wait for PIN (pending interrupt NOT) */
timeout = wait_for_pin(adap, &status); if (timeout) { if (timeout == -EINTR) { /* arbitration lost */
i = -EINTR; goto out;
}
i2c_stop(adap);
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting " "for PIN(1) in pcf_xfer\n");)
i = -EREMOTEIO; goto out;
}
/* Check LRB (last rcvd bit - slave ack) */ if (status & I2C_PCF_LRB) {
i2c_stop(adap);
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");)
i = -EREMOTEIO; goto out;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.