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