[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH v3] i2c_tools.c: add i2ctransfer utility
From: Nikolaus Voss <nv () vosn ! de>
Date: 2019-02-11 10:16:00
Message-ID: alpine.DEB.2.20.1902110944050.48155 () fox ! voss ! local
[Download RAW message or body]
Hi Denys,
many thanks for reviewing and merging this. For my use case it works as
expected with your modifications.
On Sun, 10 Feb 2019, Denys Vlasenko wrote:
> On Sun, Feb 10, 2019 at 7:24 PM Denys Vlasenko <vda.linux@googlemail.com> wrote:
> > On Mon, Jan 7, 2019 at 2:29 PM Nikolaus Voss <nv@vosn.de> wrote:
> > > i2ctransfer sends and receives user defined i2c messages
> > > v2: apply Xabier's comments: add -a option, don't decrement argc,
> > > use bb_show_usage() and xzalloc()
> > > v3: fix possible out of bound access to msgs[nmsgs]
> > >
> > > Reviewed-by: Xabier Oneca -- xOneca <xoneca@gmail.com>
> > > Signed-off-by: Nikolaus Voss <nikolaus.voss@loewensteinmedical.de>
> > > ---
> > > miscutils/i2c_tools.c | 206 +++++++++++++++++++++++++++++++++++++++++-
> > > 1 file changed, 205 insertions(+), 1 deletion(-)
> > >
> > > + switch (*arg_ptr++) {
> > > + case 'r': flags |= I2C_M_RD; break;
> > > + case 'w': break;
> > > + default:
> > > + bb_show_usage();
> > > + }
> > > +
> > > + len = strtoul(arg_ptr, &end, 0);
> > > + if (len > 0xffff || arg_ptr == end)
> > > + bb_error_msg_and_die("Error: Length invalid: \
> > > %s\n", *argv); +
> > > + arg_ptr = end;
> > > + if (*arg_ptr) {
> > > + if (*arg_ptr++ != '@')
> > > + bb_error_msg_and_die("Error: Unknown \
> > > separator after length: %s\n", + \
> > > *argv); + bus_addr = xstrtou_range(arg_ptr, 0, \
> > > first, last); +
> > > + if (!(opts & opt_f))
> > > + i2c_set_slave_addr(fd, bus_addr, opts & \
> > > opt_f);
> >
> > This last if() looks fishy. What is it trying to accomplish?
It skips kernel range and busy checking if -f is set:
/tmp # i2cdetect -y 6
i2cdetect: warning: can't use SMBus quick write command, will skip some
addresses
0 1 2 3 4 5 6 7 8 9 a b c d e f
00:
10:
20:
30: -- -- -- -- UU -- -- --
40:
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60:
70:
/tmp # i2ctransfer -y 6 w1@0x34 0 r1
i2ctransfer: can't set address to 0x34: Device or resource busy
/tmp # i2ctransfer -f -y 6 w1@0x34 0 r1
0x04
As range checking is already done in user mode, only busy checking is
effective, which is skipped if the force flag of i2c_set_slave_addr() is
set. So i2c_set_slave_addr() could/should be be called unconditionally,
the above example would create exactly the same output.
Nikolaus
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic