Can't write to IIC by I2CRDWR with two records 'struct iic_msg'
mishin at mh.san.ru
mishin at mh.san.ru
Sun Nov 10 19:27:39 UTC 2019
Warner Losh писал 2019-11-10 21:22:
> On Sun, Nov 10, 2019 at 8:22 AM Emmanuel Vadot <manu at bidouilliste.com>
> wrote:
>
>> On Sun, 10 Nov 2019 08:16:03 -0700
>> Ian Lepore <ian at freebsd.org> wrote:
>>
>> > On Sun, 2019-11-10 at 16:55 +0400, mishin at 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.
>>
>
> In the past I've had good luck "simulating" it with a single transfer
> that
> did the entire thing for picky hardware that doesn't like to
> 'interrupt'
> transactions. It's less convenient, to be sure, but works well when you
> have no other choice... It's clearly used here as a means to
> scatter/gather
> the data...
>
> Warner
>
Thanks for all replies.
I generally expected to hear something like that. So I'll revert that
method back
to the "simulating it with a single transfer".
Thanks.
P.S.: Sorry, if received that message twice.
>> > >
>> > > 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 at freebsd.org mailing list
>> > > https://lists.freebsd.org/mailman/listinfo/freebsd-arm
>> > > To unsubscribe, send any mail to "freebsd-arm-unsubscribe at freebsd.org
>> > > "
>> >
>> > _______________________________________________
>> > freebsd-arm at freebsd.org mailing list
>> > https://lists.freebsd.org/mailman/listinfo/freebsd-arm
>> > To unsubscribe, send any mail to "freebsd-arm-unsubscribe at freebsd.org"
>>
>>
>> --
>> Emmanuel Vadot <manu at bidouilliste.com>
>> _______________________________________________
>> freebsd-arm at freebsd.org mailing list
>> https://lists.freebsd.org/mailman/listinfo/freebsd-arm
>> To unsubscribe, send any mail to "freebsd-arm-unsubscribe at freebsd.org"
>>
> _______________________________________________
> freebsd-arm at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-arm
> To unsubscribe, send any mail to "freebsd-arm-unsubscribe at freebsd.org"
More information about the freebsd-arm
mailing list