Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 Nov 2019 16:22:25 +0100
From:      Emmanuel Vadot <manu@bidouilliste.com>
To:        Ian Lepore <ian@freebsd.org>
Cc:        mishin@mh.san.ru, freebsd-arm@freebsd.org
Subject:   Re: Can't write to IIC by I2CRDWR with two records 'struct iic_msg'
Message-ID:  <20191110162225.49afa19a8031d679e97f03bd@bidouilliste.com>
In-Reply-To: <1dff42bdef54d3eca4791e5da729ee479b386731.camel@freebsd.org>
References:  <7ace6346d97d0bfe95cfab3cb6fa820b@mh.san.ru> <1dff42bdef54d3eca4791e5da729ee479b386731.camel@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 10 Nov 2019 08:16:03 -0700
Ian Lepore <ian@freebsd.org> wrote:

> On Sun, 2019-11-10 at 16:55 +0400, mishin@mh.san.ru wrote:
> > About a system:
> > 1. FreeBSD betta 12.1-STABLE FreeBSD 12.1-STABLE r354236
> > OPI_ZERO  arm
> > 2. Allwinner H2+
> > 3.
> > iichb0: <Allwinner Integrated I2C Bus Controller> mem 
> > 0x1c2ac00-0x1c2afff irq 35 on simplebus0
> > iicbus0: <OFW I2C bus> on iichb0
> > iic0: <I2C generic I/O> on iicbus0
> > 
> > 
> > I trying to send a data array following a register value to a
> > SSD1306 
> > display
> > from 'Allwinner H2+' by a following method (according to `i2c.c`):
> > 
> > char SSD1306::iic_write(uint8_t offset, uint8_t data[], uint16_t
> > size) 
> > const {
> >    struct iic_msg msgs[2] =
> >    {
> >      {slave_addr, IIC_M_WR | IIC_M_NOSTOP, sizeof(offset), &offset},
> >      {slave_addr, IIC_M_WR | IIC_M_NOSTART, size, data}
> >    };
> 
> Some i2c hardware controller drivers don't properly support the NOSTOP
> and NOSTART flags.  Sometimes it's a bug, and sometimes it's because
> hardware limitations prevent it.  In the allwinner case, I think it's a
> bug, but manu would know for sure.
> 
> -- Ian

 TWSI supports NOSTOP but I could never find the right incantation to
support NOSTART.

> 
> >    struct iic_rdwr_data xfer = {msgs, 2};
> > 
> >    if ( ioctl(iic_handle, I2CRDWR, &xfer) == -1 )  {
> >      perror("ioctl(I2CRDWR)");
> >      return(-1);
> >    };
> >    return(0);
> > };
> > 
> > iic_write(0x40, buffer, buffer_size);
> > 
> > But something goes wrong and the display stills blank (no errors, 
> > though). But when I use an 'one record' struct
> > with combined 'register+data' array (see below) or read by that 'two 
> > records' scheme (see below), all is ok.
> > 
> > Have I made a mistake is flags or it is a feature or a bug?
> > 
> > Thanks
> > 
> > 
> > 
> > 
> > ---
> > Next two methods works ok
> > 
> > Read following write:
> > char TEA5767::iic_read(uint8_t offset, uint8_t *data, uint16_t size) 
> > const {
> >    struct iic_msg msgs[2] =
> >    {
> >      {slave_addr, IIC_M_WR | IIC_M_NOSTOP, sizeof(offset), &offset},
> >      {slave_addr, IIC_M_RD, size, data}
> >    };
> >    struct iic_rdwr_data xfer = {msgs, 2};
> > 
> >    if ( ioctl(iic_handle, I2CRDWR, &xfer) == -1)  {
> >      perror("ioctl(I2CRDWR)");
> >      return(-1);
> >    };
> >    return(0);
> > };
> > 
> > and write a combined 'register+data' array works too:
> > 
> > char SSD1306::iic_write(uint8_t data[], uint16_t size) const
> > {
> >    struct iic_msg msgs[1] =
> >    {
> >      {slave_addr, IIC_M_WR, size, data}
> >    };
> >    struct iic_rdwr_data xfer = {msgs, 1};
> > 
> >    if ( ioctl(iic_handle, I2CRDWR, &xfer) == -1)  {
> >      perror("ioctl(I2CRDWR)");
> >      return(-1);
> >    };
> >    return(0);
> > }
> > _______________________________________________
> > freebsd-arm@freebsd.org mailing list
> > https://lists.freebsd.org/mailman/listinfo/freebsd-arm
> > To unsubscribe, send any mail to "freebsd-arm-unsubscribe@freebsd.org
> > "
> 
> _______________________________________________
> freebsd-arm@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-arm
> To unsubscribe, send any mail to "freebsd-arm-unsubscribe@freebsd.org"


-- 
Emmanuel Vadot <manu@bidouilliste.com>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20191110162225.49afa19a8031d679e97f03bd>