Skip to content

Instantly share code, notes, and snippets.

@Zibri
Forked from gquere/dump_i2c_eeprom.c
Last active August 27, 2021 16:27
Show Gist options
  • Save Zibri/9ad473d3af8ff54e04d208967b38d99f to your computer and use it in GitHub Desktop.
Save Zibri/9ad473d3af8ff54e04d208967b38d99f to your computer and use it in GitHub Desktop.
dump I2C EEPROM memory from Linux device ioctl
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#define READ_SIZE (256)
#define NB_PAGES (128)
void dump_to_file(const char *output_file_path,
const uint8_t *buffer, const int buffer_length)
{
int output_file = open(output_file_path, O_RDWR|O_APPEND|O_CREAT);
if (output_file < 0) {
printf("Failed opening output file %s\n", output_file_path);
return;
}
write(output_file, buffer, buffer_length);
}
int main(int argc, char *argv[])
{
const char *i2c_device = "/dev/i2c-4";
const int device_address = 0x50;
int file = open(i2c_device, O_RDWR);
if (file < 0) {
printf("Failed opening %s\n", i2c_device);
return 1;
}
if (ioctl(file, I2C_SLAVE, device_address) < 0) {
printf("Failed addressing device at %02X\n", device_address);
close(file);
return 1;
}
int i = 0;
write(file,'\x00\x00',2); // ADDRESS
for (i = 0; i < NB_PAGES; i++) {
char buf[READ_SIZE] = {0};
if (read(file, buf, READ_SIZE) != READ_SIZE) {
printf("Failed reading\n");
close(file);
return 1;
}
dump_to_file(argv[1], buf, READ_SIZE);
}
close(file);
return 0;
}
@Zibri
Copy link
Author

Zibri commented Aug 22, 2021

Forked from gquere/dump_i2c_eeprom.c

He forgot to initialize the starting address to read the eeprom. Without this addition you will read the eprom starting from a random page.
To set the page to 0x00 all that was needed was:

write(file,'\x00\x00',2); // ADDRESS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment