From owner-p4-projects@FreeBSD.ORG Tue Dec 19 07:45:01 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6C75D16A40F; Tue, 19 Dec 2006 07:45:01 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 47F8816A403 for ; Tue, 19 Dec 2006 07:45:01 +0000 (UTC) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id EBFDC43CA2 for ; Tue, 19 Dec 2006 07:45:00 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kBJ7iukW056866 for ; Tue, 19 Dec 2006 07:44:56 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kBJ7iukl056863 for perforce@freebsd.org; Tue, 19 Dec 2006 07:44:56 GMT (envelope-from imp@freebsd.org) Date: Tue, 19 Dec 2006 07:44:56 GMT Message-Id: <200612190744.kBJ7iukl056863@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 111929 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 Dec 2006 07:45:01 -0000 http://perforce.freebsd.org/chv.cgi?CH=111929 Change 111929 by imp@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;