Re: at24 driver - a possible problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Aleksandar,

thank you for your very detailed and very good bug-report. I need to do some
tests myself tomorrow, but I think your assumptions are correct. Possibly we
need a similar loop for the read case. I'll add the linux-i2c-list to cc for
more opinions.

Regards,

   Wolfram

On Thu, Nov 05, 2009 at 06:10:12PM +0200, Aleksandar Ivanov wrote:
> Hello Mr Brownell and Mr Sang,
> 
> I've been experimenting with the at24 driver I want to make sure that
> what I encountered is not a limitation or a bug of the driver.
> The problem that I am experiencing is that a read operation
> immediately after a write.
> 
> Here is my testing environment:
> I am using a Linux kernel 2.6.30.3 and have a board with a AT24C512 eeprom chip.
> I am using the linux system calls read and write. At the end of the
> e-mail is the source of the test app that I'm using, which does the
> following:
> 1. Opens the eeprom file for reading and writing.
> 2. Performs a 10 byte read.
> 3. Performs a 10 byte write.
> 4. Performs a 10 byte read.
> 
> The final read fails with the errno seto to ENXIO (6 /* No such device
> or address */).
> 
> I've compiled the driver with debug information so here is the log
> corresponding to the execution of the test application:
> 
> i2c-adapter i2c-0: master_xfer[0] W, addr=0x50, len=2
> i2c-adapter i2c-0: master_xfer[1] R, addr=0x50, len=10
> at24 0-0050: i2c read 10@0 --> 2
> i2c-adapter i2c-0: master_xfer[0] W, addr=0x50, len=12
> at24 0-0050: write 10@10 --> 10 (597993)
> i2c-adapter i2c-0: master_xfer[0] W, addr=0x50, len=2
> i2c-adapter i2c-0: master_xfer[1] R, addr=0x50, len=10
> at24 0-0050: i2c read 10@20 --> -6
> 
> The failure is not in 100% of the cases. What I also noted is that if
> I insert a usleep() call, or just a for loop with enough cycles, the
> final read succeeds.
> After looking carefully at your code I found that when in a write
> operation you are expecting that a previous write might still be in
> progress.
> While this is not the case in the read operation.
> Could this be the problem that I am experiencing - the final read
> fails, because the previous write operation is not finished, and the
> read does not have a timeout protection.
> 
> If you need more information, I'll be glad to help.
> Thanks in advance for your consideration!
> Aleks
> 
> 
> Here is the source of the test app:
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <unistd.h>
> #include <stdio.h>
> #include <string.h>
> #include <errno.h>
> 
> #define EPPROM_FILE_NAME    "/sys/class/i2c-adapter/i2c-0/0-0050/eeprom"
> 
> int main(int argc, char *argv[])
> {
>     char            buf[10];
>     int             bytes = 0;
>     const unsigned  len = sizeof(buf);
>     int             fd = -1;
> 
>     fd = open(EPPROM_FILE_NAME, O_RDWR | O_SYNC);
>     if (-1 == fd)
>     {
>         printf("Error opening EEPROM file %s: %s.\n",
> EPPROM_FILE_NAME, strerror(errno));
>         return -1;
>     }
> 
>     bytes = read(fd, buf, len);
> 
>     if ((bytes > 0) &&
>         (len == (unsigned)bytes))
>     {
>         printf("Data read.\n");
>     }
>     else
>     {
>         printf("Failed to read from %s, bytes = %d, errno = %d, %s\n",
> EPPROM_FILE_NAME, bytes, errno, strerror(errno));
>         close(fd);
>         return -1;
>     }
> 
>     bytes = write(fd, buf, len);
> 
>     if ((bytes > 0) &&
>         (len == (unsigned)bytes))
>     {
>         printf("Data written.\n");
>     }
>     else
>     {
>         printf("Failed to write to %s, bytes = %d, %s\n",
> EPPROM_FILE_NAME, bytes, strerror(errno));
>         close(fd);
>         return -1;
>     }
> 
>     bytes = read(fd, buf, len);         // This call fails
> 
>     if ((bytes > 0) &&
>         (len == (unsigned)bytes))
>     {
>         printf("Data read.\n");
>     }
>     else
>     {
>         printf("Failed to read from %s, bytes = %d, errno = %d, %s\n",
> EPPROM_FILE_NAME, bytes, errno, strerror(errno));
>         close(fd);
>         return -1;
>     }
> 
>     close(fd);
>     return 0;
> }
> 
> 
> Here is the log from my test application:
> "Data read.
> Data written.
> Failed to read from /sys/class/i2c-adapter/i2c-0/0-0050/eeprom, bytes
> = -1, errno = 6, No such device or address"

-- 
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-5064 |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux