BBB Reading/Writing EEPROM

I’ve been playing with the BBB 32k eeprom by reading and writing data to it. I use fseek(), fopen(), fread() and fwrite(). The device I am reading/writing/opening is:

This does seem to work however not well. I noticed that the same data is repeated every 0x1000 bytes. Why is that? Am I not addressing the part correctly? Since I’m ultimately using the at24.c driver, I inspected it and it does seem to attempt to translate addresses for the part. Are there specific limitations with at24 that I should be aware of, nothing seems to be documented that I’ve seen.

#define e2FILE “/sys/bus/i2c/devices/0-0050/at24-0/nvmem”

int readEEPROMAt(unsigned char *p, unsigned int startAddr, unsigned int len)
int retVal = 0;
FILE *fp = NULL;

if ((fp = fopen(e2FILE, “r”)) != NULL)
if (fseek(fp, startAddr, 0) == 0)
if (fread(p, 1, len, fp) != len)
printf(“Error: Cannot read EEPROM\n”);
retVal = 1;
} else {
printf(“Error: Could not index EEPROM, no data read.”);
} else {
printf(“Error: Cannot open EEPROM\n”);

if (fp)

return retVal;



You need to learn to speak “marketing” and “binary”.

A 32 k EEPROM (named by marketing) is a 32k BIT EEPROM.

32k BITs divided by 8 bits-per-byte is 4k BYTES.

4k BYTES is 0x1000 BYTES.

So, your address space wraps around every 0x1000 BYTES.

The data is not repeated every 0x1000 bytes, it is the SAME data.

Sounds like your EEPROM is working just fine.

— Graham

The part number is AT24c256 and a quick jot over to Atmel’s trusty website and I found the spec sheet… “256K Serial Eeprom… organized as 512 pages of 64 bytes each.”

So, that should mean 512x64 = 32,768 bytes… .32K.
256k bits = 262,144 / 8 = 32,768 bytes… 32k.

It’s most certainly a 32k-byte part.


OK. In that case it is a 32k Byte part.
— Graham

Are the docs you are using up to date?

Reading the current SRM, (Version C.1) section 5.3.2 says that there is a single 4K Byte EEPROM on board the Beaglebone.

They mumble something about there having been a cost reduction. :slight_smile:

— Graham


I do not think he’s talking about the on board eeprom.

The part number is AT24c256 and a quick jot over to Atmel’s trusty website and I found the spec sheet… “256K Serial Eeprom… organized as 512 pages of 64 bytes each.”

But even if he is, the SRM says:

32k right on page 30:

5.3.2 32KB EEPROM

It also says 2G eMMC so it has to be in relationto a Rev A, or Rev B. However . . .since no ones asked, or mentioned the board revision number . . .

I looked at the BOM… U7 is the part. Lo and behold, Graham, you’re right. It’s a 32k-BIT part. The internet said it was a 24c256 part and dammit, we know the internet is NEVER EVER wrong on these things, therefore reality is wrong! :slight_smile:

Explains the mirroring I’m seeing every 0x1000 bytes (4k) because the at24.c driver isn’t smart enough to know it’s limited, I think. I knew something was up when I saw that in the memory dump.

Okay, mystery solved. Thanks for your help!


He is talking about the on board BBB EEPROM, because he overwrote the I.D. information, and it no longer boots.

Best I can tell, Rev B. and earlier did have a 32K Byte EEPROM, but they cost reduced it to 4K Byte with the Rev. C.

— Graham

I have an A6A, the BOM files lists a 32K Bit chip.


Rev C. lists the same I believe...


I guess whoever wrote the SRM doesn’t realize that “KB” is an abbreviation for kilobytes. Kilobits is Kb or Kbit.

Anyhow I don’t see anywhere where the OP says he rendered his BBB unbootable. However if this is the case, Download the blank flasher image, and it should rewrite the eeprom to factory specs.

That was in another thread, same poster...