Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
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);
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);
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");
return 1;
dump_to_file(argv[1], buf, READ_SIZE);
return 0;

This comment has been minimized.

Copy link
Owner Author

@Zibri 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