Hello Duffin,

Am 14.12.20 um 18:12 schrieb Duffin, CooperX:
> Hello Heiko,
> 
> I hope you are doing well, just curious if you have had a chance to look into 
> my latest response?

Yep, thanks all fine, just to much workload ... and seems
I forgot to response....

> 
> Regards,
> 
> -Cooper Duffin
> 
> Hello Heiko,
> 
> I hope you are doing well, just curious if you have had a chance to look into 
> my latest response?
> 
> Regards,
> 
> -Cooper Duffin
> 
> -----Original Message-----
> From: Duffin, CooperX 
> Sent: Wednesday, December 2, 2020 1:53 PM
> To: h...@denx.de
> Cc: Simon Glass <s...@chromium.org>; U-Boot Mailing List 
> <u-boot@lists.denx.de>; uboot-snps-...@synopsys.com; Tom Rini 
> <tr...@konsulko.com>; Robert Beckett <bob.beck...@collabora.com>; Wolgang 
> Denk <w...@denx.de>; Ian Ray <ian....@ge.com>
> Subject: RE: [dwi2c PATCH v1] dwi2c add offsets to reads
> 
> -----Original Message-----
> From: Heiko Schocher <h...@denx.de>
> Sent: Tuesday, November 17, 2020 11:42 PM
> To: Duffin, CooperX <cooperx.duf...@intel.com>
> Cc: Simon Glass <s...@chromium.org>; U-Boot Mailing List 
> <u-boot@lists.denx.de>; uboot-snps-...@synopsys.com; Tom Rini 
> <tr...@konsulko.com>; Robert Beckett <bob.beck...@collabora.com>; Wolgang 
> Denk <w...@denx.de>; Ian Ray <ian....@ge.com>
> Subject: Re: [dwi2c PATCH v1] dwi2c add offsets to reads
> 
> Hello Simon,
> 
> Am 17.11.2020 um 00:20 schrieb Simon Glass:
>> +Heiko Schocher who might know more about this I2C question
> 
> Sorry for late response ...
> 
>> 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 
>>> chip->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 
>>>> chip->not,
>>>> perhaps something is missing.
>>> If I use this command I get:
>>>
>>> device # i2c olen 0x60
>>> 1
>>>
>>> This is  without the patch BTW.
> 
>> Hard to say here anything usefull, without the chance to try out...
> 
>> trying with an i2c epprom (imx6 based board)
> 
>> => i2c md 0x58 0 10
>> 0000: 01 00 04 23 00 02 b1 61 00 23 00 10 00 00 03 09    ...#...a.#......
>> => i2c md 0x58 0 1
>> 0000: 01    .
>> => i2c md 0x58 1 1
>> 0001: 00    .
>> => i2c md 0x58 2 1
>> 0002: 04    .
>> => i2c md 0x58 3 1
>> 0003: 23    #
>> =>
>>
>> => i2c flags 0x58
>> 0
>> => i2c olen 0x58
>> 1
>> =>
>>
>> May you can enable debug in drivers/i2c/designware_i2c.c driver?
>>
>> So we should see, what sort of messages designware_i2c_xfer() gets ... and 
>> may have an idea... and may add
>>
>> 717                 debug("i2c_xfer: chip=0x%x, len=0x%x\n", msg->addr, 
>> msg->len);
>>
>> also a dump of msg->buf and msg->len.
>>
>> bye,
>> Heiko
>> -- 
>> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
>> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>> Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: h...@denx.de
> [Duffin, CooperX]
> Sorry About the late reply
> 
> After changing the debug to printf and adding the msg->buf I get the 
> following:
> 
> Hit any key to stop autoboot:  0
> device # i2c dev 0
> Setting bus to 0
> I2C bus i2c@ffc02900 version 0x3230302a
> device # i2c md 0x60 0 4
> i2c_xfer: 2 messages
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2d398
> i2c_xfer: chip=0x60, len=0x4, buf=0x7fa2d460
> 0000: 6f 6f 6f 6f    oooo
> 
> Additionally if I run my standalone application I get this 
> 
> I2C bus i2c@ffc02900 version 0x3230302a
> Setting bus speed to 100000
> i2c_led name is generic_60
> Writing
> i2c_xfer: 1 messages
> i2c_xfer: chip=0x60, len=0x2, buf=0x7fa2ced0
> i2c_xfer: 1 messages
> i2c_xfer: chip=0x60, len=0x2, buf=0x7fa2ced0
> i2c_xfer: 1 messages
> i2c_xfer: chip=0x60, len=0x2, buf=0x7fa2ced0
> i2c_xfer: 1 messages
> i2c_xfer: chip=0x60, len=0x2, buf=0x7fa2ced0 Reading
> i2c_xfer: 2 messages
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf28
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf88
> i2c_xfer: 2 messages
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf28
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf89
> i2c_xfer: 2 messages
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf28
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf8a
> i2c_xfer: 2 messages
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf28
> i2c_xfer: chip=0x60, len=0x1, buf=0x7fa2cf8b read buffer is o, o, o, o

Hmm... sorry for being unclear, i was interested in the content of each
buffer not only the address of it ...

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: h...@denx.de

Reply via email to