+Heiko Schocher who might know more about this I2C question

On Mon, 9 Nov 2020 at 15:09, Duffin, CooperX <cooperx.duf...@intel.com> wrote:
>
> -----Original Message-----
> From: Simon Glass <s...@chromium.org>
> Sent: Saturday, November 7, 2020 1:33 PM
> To: Duffin, CooperX <cooperx.duf...@intel.com>
> Cc: U-Boot Mailing List <u-boot@lists.denx.de>; uboot-snps-...@synopsys.com; 
> Tom Rini <tr...@konsulko.com>; Robert Beckett <bob.beck...@collabora.com>; 
> Heiko Schocher <h...@denx.de>; Wolgang Denk <w...@denx.de>; Ian Ray 
> <ian....@ge.com>
> Subject: Re: [dwi2c PATCH v1] dwi2c add offsets to reads
>
> Hi CooperX,
>
> On Fri, 6 Nov 2020 at 16:08, Duffin, CooperX <cooperx.duf...@intel.com> wrote:
> >
> > Hello Simon,
> >
> > I wasn’t using the test/dm/i2c I this was tested using hardware where I was 
> > using the dm_i2c_read() function. I just tried to use the test/dm/i2c where 
> > I am following the README but I keep getting  "sdl2-config: Command not 
> > found". I suspect it would also fail where it is trying to read but I will 
> > have to get test/dm/i2c working before I know for sure.
> >
> > Essentially my test was
> >
> > int uboot_app (int argc, char * const argv[]) {
> >         uint8_t buf[10];
> >         uint8_t read_buf[5];
> >         uint8_t dev_addr;
> >         uint32_t bus_speed;
> >         //i2c_bus device pointer
> >         struct udevice *i2c_led;
> >         struct udevice *bus;
> >         app_startup(argv);
> >         /* Print the ABI version */
> >         printf ("Example expects ABI version %d\n", XF_VERSION);
> >         printf ("Actual U-Boot ABI version %d\n", (int)get_version());
> >
> >         dev_addr = 0x60;
> >         bus_speed = 100000; //100KHz
> >         printf("starting test i2c\n");
> >         buf[0] = 'b';
> >         buf[1] = 'o';
> >         buf[2] = 'o';
> >         buf[3] = 't';
> >         //Get i2c chip, init the code
> >         printf("init starting\n");
> >         if(i2c_get_chip_for_busnum(0 , 0x60, 1, &i2c_led)!=0){
> >                 printf("ERROR: no device found at %x \n",dev_addr);
> >                 return (0);
> >         }
> >         uclass_get_device_by_seq(UCLASS_I2C, 0, &bus);
> >         printf("Setting bus speed to %d\n", bus_speed);
> >         if(dm_i2c_set_bus_speed(bus,bus_speed)!=0){
> >                 printf("ERROR: Cannot set buspeed\n");
> >                 return (0);
> >         }
> >         printf("i2c_led name is %s\n",i2c_led->name);
> >         if(i2c_led == NULL){
> >                 printf("ERROR i2c_led 0 is null\n");
> >                 return (0);
> >         }
> >         printf("Writing\n");
> >         for(unsigned int a =0; a< 4; a++){
> >                 if(dm_i2c_write(i2c_led,a,&buf[a],1)!=0){
> >                         printf("ERROR writing\n");
> >                         return (0);
> >                 }
> >         }
> >
> >         printf("Reading\n");
> >         for(unsigned int a =0; a< 4; a++){
> >                 if(dm_i2c_read(i2c_led,a,&read_buf[a],1)!=0){
> >                         printf("ERROR writing\n");
> >                         return (0);
> >                 }
> >         }
> >         printf("read buffer is %c, %c, %c, %c \n",read_buf[0],read_buf[1], 
> > read_buf[2],read_buf[3]);
> >         printf ("\n\n");
> >         return (0);
> > }
> >
> > ## Starting application at 0x0C100000 ...
> > Example expects ABI version 10
> > Actual U-Boot ABI version 10
> > starting test i2c
> > init starting
> > Setting bus speed to 100000
> > i2c_led name is generic_60
> > Writing
> > Reading
> > read buffer is o, o, o, o
> >
> > with the fix I get:
> >
> > ## Starting application at 0x0C100000 ...
> > Example expects ABI version 10
> > Actual U-Boot ABI version 10
> > starting test i2c
> > init starting
> > Setting bus speed to 100000
> > i2c_led name is generic_60
> > Writing
> > Reading
> > read buffer is b, o, o, t
> >
> > which is correct. Similarly if I stop auto boot I get a similar result:
> >
> > Hit any key to stop autoboot:  0
> > device # i2c
> > i2c - I2C sub-system
> >
> > Assuming I write "boot" to the device
> > device # i2c dev 0
> > Setting bus to 0
> > device # i2c md 0x60 0 4
> > 0000: 6f 6f 6f 6f    oooo
> >
> > With the fix/patch I get:
> >
> > device# i2c md 0x60 0 4
> > 0000: 62 6f 6f 74    boot
> >
> > Which is correct. Also the reads were working in linux leading to my 
> > original suspicion that there might be something going on in the driver. 
> > Hopefully that answers your question let me know if you have anymore.
>
> I had a bit of a look at this. If you look at dm_i2c_read() it actually 
> builds the address into the buffer it sends. So when it gets to 
> __dw_i2c_write() the alen parameter is always 0. That function is actually a 
> holdover from before driver model, so one day the alen and addr parameters 
> will go away.
>
> I wonder if your device does not support multiple-byte reads or writes? Can 
> you try the i2c md with a single byte? There is a DM_I2C_CHIP_WR_ADDRESS 
> option to handle this - see the 'i2c flags'
> command.
>
> In the designware_i2c_xfer(), try printing out the bytes that it gets in each 
> message using i2c_dump_msgs().
>
> Also check the i2c_get_chip() function which you are using. See if
> chip->offset_len is set to 1 as it should be, for your device. If not,
> perhaps something is missing.
>
> In short I am not really sure what is going on, but I think it needs more 
> investigation.
>
> BTW with this mailing list we like people to reply inline or at the bottom, 
> not at the top.
>
> Regards,
> Simon
>
> >
> > Best regards,
> >
> > -Cooper Duffin
> > -----Original Message-----
> > From: Simon Glass <s...@chromium.org>
> > Sent: Friday, November 6, 2020 10:51 AM
> > To: Duffin, CooperX <cooperx.duf...@intel.com>
> > Cc: U-Boot Mailing List <u-boot@lists.denx.de>;
> > uboot-snps-...@synopsys.com; Tom Rini <tr...@konsulko.com>; Robert
> > Beckett <bob.beck...@collabora.com>; Heiko Schocher <h...@denx.de>;
> > Wolgang Denk <w...@denx.de>; Ian Ray <ian....@ge.com>
> > Subject: Re: [dwi2c PATCH v1] dwi2c add offsets to reads
> >
> > Hi Cduffinx,
> >
> > On Thu, 5 Nov 2020 at 14:26, cduffinx <cooperx.duf...@intel.com> wrote:
> > >
> > > modify the designware_i2c_xfer function to use 1 byte per address,
> > > it was set to 0 before which makes it think its reading a register type.
> > > Added offset of where it is supposed to read from. Before it was
> > > always reading from offset 0 despite specifying the offset in the
> > > higher level function.
> > >
> > > Signed-off-by: Cooper Duffin <cooperx.duf...@intel.com>
> > > Signed-off-by: cduffinx <cooperx.duf...@intel.com>
> > > ---
> > >
> > >  drivers/i2c/designware_i2c.c | 5 +++--
> > >  drivers/i2c/i2c-uclass.c     | 1 +
> > >  include/i2c.h                | 1 +
> > >  3 files changed, 5 insertions(+), 2 deletions(-)
> > >
> >
> > Thanks for the patch!
> >
> > Is there a test that was failing before (test/dm/i2c.c) or should we add a 
> > new one to catch this?
> >
> > Regards,
> > Simon
>
> [Duffin, CooperX]
> Thanks for the reply Simon.  I tried a couple more things.
>
> Simon Glass <s...@chromium.org> wrote:
> > I wonder if your device does not support multiple-byte reads or writes? Can 
> > you try the i2c md with a single byte? There is a DM_I2C_CHIP_WR_ADDRESS 
> > option to handle this - see the 'i2c flags'
> >command.
>
> I tried with the flag DM_I2C_CHIP_WR_ADDRESS but it did not make a 
> difference. A single byte read will yield the following:
>
> Device # i2c md 0x60 0 1
> 0000: 6f    o
>
> Which is not correct in fact it doesn’t seem to matter how much I read it 
> only picks up the second character I wrote to it. For example if I read 16 
> characters I get:
> device# i2c flags 0x60 4
> device # i2c md 0x60 0 10
> 0000: 6f 6f 6f 6f 6f 6f 6f 6f 6f 6f 6f 6f 6f 6f 6f 6f    oooooooooooooooo
>
> I can tell the writes are working because I am writing to an LED display and 
> I can see the proper characters get displayed. Also I think my i2c device 
> needs restarts in-between each byte for it to work properly, so I need to be 
> able to read individual bytes with there corresponding offsets, also 
> i2c-tools supports this.
>
> Simon Glass <s...@chromium.org> wrote:
> >Also check the i2c_get_chip() function which you are using. See if
> >chip->offset_len is set to 1 as it should be, for your device. If not,
> >perhaps something is missing.
> If I use this command I get:
>
> device # i2c olen 0x60
> 1
>
> This is  without the patch BTW.

Reply via email to