PERFORCE change 111929 for review
Warner Losh
imp at FreeBSD.org
Mon Dec 18 23:45:01 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111929
Change 111929 by imp at imp_lighthouse on 2006/12/19 07:44:45
MF FreeBSD-tsc-6
Convert write to 7-1 addressing.
Also, it turns out that my bitchin' iic controller was smart and
would keep retrying until we'd succeed. This means that the
delay caused by writes were getting obscured. Now we read back
the first byte we've written. This gets the iic eeproms
working on the hacked-up bit-bang driver that I wrote for AT91
in place of at91_twi. Turns out we'll likely not need it, but
it was a good excersize none-the-less...
Affected files ...
.. //depot/projects/arm/src/sys/dev/iicbus/icee.c#9 edit
Differences ...
==== //depot/projects/arm/src/sys/dev/iicbus/icee.c#9 (text+ko) ====
@@ -214,11 +214,14 @@
icee_write(struct cdev *dev, struct uio *uio, int ioflag)
{
struct icee_softc *sc;
- int error, len, slave;
+ int error, len, slave, waitlimit;
uint8_t data[MAX_WR_SZ + 2];
- struct iic_msg msgs[1] = {
+ struct iic_msg wr[1] = {
{ 0, IIC_M_WR, 0, data },
};
+ struct iic_msg rd[1] = {
+ { 0, IIC_M_RD, 1, data },
+ };
sc = CDEV2SOFTC(dev);
if (uio->uio_offset >= sc->size)
@@ -234,24 +237,36 @@
uio->uio_resid);
switch (sc->type) {
case 8:
- slave = (uio->uio_offset >> 8) | sc->addr;
- msgs[0].len = 1 + len;
+ slave = (uio->uio_offset >> 7) | sc->addr;
+ wr[0].len = 1 + len;
data[0] = uio->uio_offset & 0xff;
break;
case 16:
- slave = sc->addr | (uio->uio_offset >> 16);
- msgs[0].len = 2 + len;
+ slave = sc->addr | (uio->uio_offset >> 15);
+ wr[0].len = 2 + len;
data[0] = (uio->uio_offset >> 8) & 0xff;
data[1] = uio->uio_offset & 0xff;
break;
}
- msgs[0].slave = slave;
+ wr[0].slave = slave;
error = uiomove(data + sc->type / 8, len, uio);
if (error)
break;
- error = iicbus_transfer(sc->sc_dev, msgs, 1);
+ error = iicbus_transfer(sc->sc_dev, wr, 1);
if (error)
break;
+ // Now wait for the write to be done by trying to read
+ // the part.
+ waitlimit = 10000;
+ rd[0].slave = slave;
+ do
+ {
+ error = iicbus_transfer(sc->sc_dev, rd, 1);
+ } while (waitlimit-- > 0 && error != 0);
+ if (error) {
+ printf("waiting for write failed %d\n", error);
+ break;
+ }
}
ICEE_UNLOCK(sc);
return error;
More information about the p4-projects
mailing list