From owner-freebsd-arm@freebsd.org Wed Mar 31 05:06:18 2021 Return-Path: Delivered-To: freebsd-arm@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 0EB715BAFBC for ; Wed, 31 Mar 2021 05:06:18 +0000 (UTC) (envelope-from danny@cs.huji.ac.il) Received: from mailman.nyi.freebsd.org (mailman.nyi.freebsd.org [IPv6:2610:1c1:1:606c::50:13]) by mx1.freebsd.org (Postfix) with ESMTP id 4F9Dmn446pz4Zp8 for ; Wed, 31 Mar 2021 05:06:17 +0000 (UTC) (envelope-from danny@cs.huji.ac.il) Received: by mailman.nyi.freebsd.org (Postfix) id 897265BB175; Wed, 31 Mar 2021 05:06:17 +0000 (UTC) Delivered-To: arm@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 880DE5BAFBB for ; Wed, 31 Mar 2021 05:06:17 +0000 (UTC) (envelope-from danny@cs.huji.ac.il) Received: from kabab.cs.huji.ac.il (kabab.cs.huji.ac.il [132.65.116.210]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4F9Dml5tCfz4b8T for ; Wed, 31 Mar 2021 05:06:14 +0000 (UTC) (envelope-from danny@cs.huji.ac.il) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cs.huji.ac.il; s=57791128; h=To:Message-Id:Resent-To:Resent-Date:Content-Transfer-Encoding:Date:Resent-From:From:Subject:Mime-Version:Content-Type; bh=dTQpdHIBFCTv6gUTE/WpMNTzKdWpvvKOcy6T+mOZebY=; b=Zc1Q5gTMd/9Vmvt49LnhXgrjXT7JJf+QHoDgvwD3t0SzGIgO56tiDlnfS6EanwvIB7Gfco6Z3WcqNZQUiQv2aLzOMERl+8h/Ypt2FVkEmk1y3lSUKSJsBlFaPudF8Vw2YbDcCqBFTmcvJ/NGPFAE0TC6RH5o27aUIzPWVK1ZT3ZvLIlH//YtR9vmHpQnytRs0pDCPPWNTZtqs55UnDfh00jKa6ZbICr3hGfuyeRoPvMLyUDT32v3Dazp7StPyfHew9qXad+Fu8OWswa9ql81MDAeEgtkT/eGtYNJ8SEouJGNZwN4ar0tKcCHpaSaK9K93T4WH6xUWmHuFdlAqbzuqg==; Received: from bach.cs.huji.ac.il ([132.65.80.20]) by kabab.cs.huji.ac.il with esmtp id 1lRT3T-000Jie-SD for arm@freebsd.org; Wed, 31 Mar 2021 08:06:11 +0300 Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 14.0 \(3654.60.0.2.21\)) Subject: i2c/twsi/allwinner problems. From: Daniel Braniss Resent-From: Daniel Braniss Date: Tue, 30 Mar 2021 12:58:50 +0300 Content-Transfer-Encoding: quoted-printable Resent-Date: Wed, 31 Mar 2021 08:06:11 +0300 Resent-To: "freebsd-arm@freebsd.org" Message-Id: To: "freebsd-arm@freebsd.org" X-Mailer: Apple Mail (2.3654.60.0.2.21) X-Rspamd-Queue-Id: 4F9Dml5tCfz4b8T X-Spamd-Bar: --- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=cs.huji.ac.il header.s=57791128 header.b=Zc1Q5gTM; dmarc=pass (policy=none) header.from=huji.ac.il; spf=none (mx1.freebsd.org: domain of danny@cs.huji.ac.il has no SPF policy when checking 132.65.116.210) smtp.mailfrom=danny@cs.huji.ac.il X-Spamd-Result: default: False [-3.30 / 15.00]; MID_RHS_MATCH_FROM(0.00)[]; RBL_DBL_DONT_QUERY_IPS(0.00)[132.65.116.210:from]; R_DKIM_ALLOW(-0.20)[cs.huji.ac.il:s=57791128]; FREEFALL_USER(0.00)[danny]; FROM_HAS_DN(0.00)[]; MV_CASE(0.50)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[text/plain]; ARC_NA(0.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; RCPT_COUNT_ONE(0.00)[1]; SPAMHAUS_ZRD(0.00)[132.65.116.210:from:127.0.2.255]; NEURAL_HAM_MEDIUM(-1.00)[-1.000]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[cs.huji.ac.il:+]; DMARC_POLICY_ALLOW(-0.50)[huji.ac.il,none]; NEURAL_HAM_SHORT(-1.00)[-0.997]; R_SPF_NA(0.00)[no SPF record]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_LAST(0.00)[]; ASN(0.00)[asn:378, ipnet:132.64.0.0/13, country:IL]; RCVD_COUNT_TWO(0.00)[2]; MAILMAN_DEST(0.00)[arm] X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Porting FreeBSD to ARM processors List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 Mar 2021 05:06:18 -0000 hi all, after some time, I decided to try FreeBSD 13 on my all winner (nano neo) = and got it working only with debugging on, so I started cherry picking till I got it working, = replacing printfs with DELAY and this is is now working, of course not the correct solution, but if = someone with better i2c knowledge can propose a better solution I=E2=80=99m willing to test = if with my program (it reads RFIDs using a board with PN532), this are the diffs: diff --git a/sys/dev/iicbus/twsi/twsi.c b/sys/dev/iicbus/twsi/twsi.c index a606c2aef..8ede62073 100644 --- a/sys/dev/iicbus/twsi/twsi.c +++ b/sys/dev/iicbus/twsi/twsi.c @@ -86,6 +86,8 @@ __FBSDID("$FreeBSD$"); #define TWSI_DEBUG #undef TWSI_DEBUG +#define debug_(dev, fmt, args...) device_printf(dev, "%s: " fmt, = __func__, ##args) + #ifdef TWSI_DEBUG #define debugf(dev, fmt, args...) device_printf(dev, "%s: " fmt, = __func__, ##args) #else @@ -103,6 +105,7 @@ TWSI_READ(struct twsi_softc *sc, bus_size_t off) { uint32_t val; + DELAY(1000); // danny: needed=20 val =3D bus_read_4(sc->res[0], off); debugf(sc->dev, "read %x from %lx\n", val, off); return (val); @@ -165,15 +168,14 @@ twsi_clear_iflg(struct twsi_softc *sc) static int twsi_poll_ctrl(struct twsi_softc *sc, int timeout, uint32_t mask) { - timeout /=3D 10; - debugf(sc->dev, "Waiting for ctrl reg to match mask %x\n", = mask); + debug_(sc->dev, "Waiting for ctrl reg to match mask %x = timeout=3D%d\n", mask, timeout); while (!(TWSI_READ(sc, sc->reg_control) & mask)) { - DELAY(10); + // DELAY(10); if (--timeout < 0) return (timeout); } - debugf(sc->dev, "done\n"); + debug_(sc->dev, "done\n"); return (0); } @@ -212,7 +214,7 @@ twsi_locked_start(device_t dev, struct twsi_softc = *sc, int32_t mask, DELAY(1000); if (twsi_poll_ctrl(sc, timeout, TWSI_CONTROL_IFLG)) { - debugf(dev, "timeout sending %sSTART condition\n", + debug_(dev, "timeout sending %sSTART condition\n", mask =3D=3D TWSI_STATUS_START ? "" : "repeated "); return (IIC_ETIMEOUT); } @@ -221,7 +223,7 @@ twsi_locked_start(device_t dev, struct twsi_softc = *sc, int32_t mask, debugf(dev, "status=3D%x\n", status); if (status !=3D mask) { - debugf(dev, "wrong status (%02x) after sending %sSTART = condition\n", + debug_(dev, "wrong status (%02x) after sending %sSTART = condition\n", status, mask =3D=3D TWSI_STATUS_START ? "" : = "repeated "); return (IIC_ESTATUS); } @@ -231,7 +233,7 @@ twsi_locked_start(device_t dev, struct twsi_softc = *sc, int32_t mask, DELAY(1000); if (twsi_poll_ctrl(sc, timeout, TWSI_CONTROL_IFLG)) { - debugf(dev, "timeout sending slave address = (timeout=3D%d)\n", timeout); + debug_(dev, "timeout sending slave address = (timeout=3D%d)\n", timeout); return (IIC_ETIMEOUT); } @@ -239,7 +241,7 @@ twsi_locked_start(device_t dev, struct twsi_softc = *sc, int32_t mask, status =3D TWSI_READ(sc, sc->reg_status); if (status !=3D (read_access ? TWSI_STATUS_ADDR_R_ACK : TWSI_STATUS_ADDR_W_ACK)) { - debugf(dev, "no ACK (status: %02x) after sending slave = address\n", + debug_(dev, "no ACK (status: %02x) after sending slave = address\n", status); return (IIC_ENOACK); } @@ -405,7 +407,8 @@ twsi_read(device_t dev, char *buf, int len, int = *read, int last, int delay) int last_byte, rv; sc =3D device_get_softc(dev); - + debug_(dev, "twsi_read: len=3D%d delay=3D%d", len, delay); // = danny +=09 mtx_lock(&sc->mutex); *read =3D 0; while (*read < len) { @@ -423,7 +426,7 @@ twsi_read(device_t dev, char *buf, int len, int = *read, int last, int delay) DELAY(1000); if (twsi_poll_ctrl(sc, delay, TWSI_CONTROL_IFLG)) { - debugf(dev, "timeout reading data (delay=3D%d)\n",= delay); + debug_(dev, "timeout reading data (delay=3D%d)\n",= delay); rv =3D IIC_ETIMEOUT; goto out; } @@ -431,7 +434,7 @@ twsi_read(device_t dev, char *buf, int len, int = *read, int last, int delay) status =3D TWSI_READ(sc, sc->reg_status); if (status !=3D (last_byte ? TWSI_STATUS_DATA_RD_NOACK : = TWSI_STATUS_DATA_RD_ACK)) { - debugf(dev, "wrong status (%02x) while = reading\n", status); + debug_(dev, "wrong status (%02x) while = reading\n", status); rv =3D IIC_ESTATUS; goto out; } @@ -462,14 +465,14 @@ twsi_write(device_t dev, const char *buf, int len, = int *sent, int timeout) twsi_clear_iflg(sc); DELAY(1000); if (twsi_poll_ctrl(sc, timeout, TWSI_CONTROL_IFLG)) { - debugf(dev, "timeout writing data = (timeout=3D%d)\n", timeout); + debug_(dev, "timeout writing data = (timeout=3D%d)\n", timeout); rv =3D IIC_ETIMEOUT; goto out; } status =3D TWSI_READ(sc, sc->reg_status); if (status !=3D TWSI_STATUS_DATA_WR_ACK) { - debugf(dev, "wrong status (%02x) while = writing\n", status); + debug_(dev, "wrong status (%02x) while = writing\n", status); rv =3D IIC_ESTATUS; goto out; } @@ -496,8 +499,12 @@ twsi_transfer(device_t dev, struct iic_msg *msgs, = uint32_t nmsgs) sc->control_val =3D TWSI_CONTROL_TWSIEN | TWSI_CONTROL_INTEN | TWSI_CONTROL_ACK; TWSI_WRITE(sc, sc->reg_control, sc->control_val); - debugf(dev, "transmitting %d messages\n", nmsgs); - debugf(sc->dev, "status=3D%x\n", TWSI_READ(sc, sc->reg_status)); +#if 0 + debug_(dev, "transmitting %d messages\n", nmsgs); + debug_(sc->dev, "status=3D%x\n", TWSI_READ(sc, sc->reg_status)); +#else + DELAY(8000); +#endif sc->nmsgs =3D nmsgs; sc->msgs =3D msgs; sc->msg_idx =3D 0; @@ -519,15 +526,24 @@ twsi_transfer(device_t dev, struct iic_msg *msgs, = uint32_t nmsgs) debugf(sc->dev, "pause finish\n"); if (sc->error) { - debugf(sc->dev, "Error, aborting (%d)\n", sc->error); + debug_(sc->dev, "Error, aborting (%d)\n", sc->error); TWSI_WRITE(sc, sc->reg_control, 0); } /* Disable module and interrupts */ - debugf(sc->dev, "status=3D%x\n", TWSI_READ(sc, sc->reg_status)); +#if 0 + debug_(sc->dev, "status=3D%x\n", TWSI_READ(sc, sc->reg_status)); = // TWSI_WRITE(sc, sc->reg_control, 0); - debugf(sc->dev, "status=3D%x\n", TWSI_READ(sc, sc->reg_status)); - + debugf(sc->dev, "status=3D%x\n", TWSI_READ(sc, sc->reg_status)); = // + debugf(sc->dev, "error=3D%d\n", sc->error); // danny +#else + int status; + DELAY(8000); // danny: works! + status =3D TWSI_READ(sc, sc->reg_status); + TWSI_WRITE(sc, sc->reg_control, 0); + status =3D TWSI_READ(sc, sc->reg_status); + //debug_(sc->dev, "status=3D%x\n", TWSI_READ(sc, = sc->reg_status)); +#endif return (sc->error); } @@ -581,7 +597,7 @@ twsi_intr(void *arg) case TWSI_STATUS_ADDR_W_NACK: case TWSI_STATUS_ADDR_R_NACK: - debugf(sc->dev, "No ack received after transmitting the = address\n"); + debug_(sc->dev, "No ack received after transmitting the = address\n"); sc->transfer =3D 0; sc->error =3D IIC_ENOACK; sc->control_val =3D 0; @@ -662,7 +678,7 @@ twsi_intr(void *arg) break; default: - debugf(sc->dev, "status=3D%x hot handled\n", status); + debug_(sc->dev, "status=3D%x hot handled\n", status); sc->transfer =3D 0; sc->error =3D IIC_EBUSERR; sc->control_val =3D 0;