[BISECTED] BeagleBone Black doesn't boot after a58147c2dbbf

Matwey V. Kornilov matwey.kornilov at gmail.com
Thu Aug 18 10:28:05 CEST 2022


I've played a little and now I believe that the issue is that EEPROM read addr
pointer is somehow corrupted due to 1-byte address write. The EEPROM is
definitely have two-byte read address accoring the datasheet.
I've failed to unravel exact rule what is happening when only one address byte
is set, but was able to read random places of EEPROM.


However, the following diff makes the board bootable.


diff --git a/board/ti/common/board_detect.c b/board/ti/common/board_detect.c
index ed34991377..26edddccc6 100644
--- a/board/ti/common/board_detect.c
+++ b/board/ti/common/board_detect.c
@@ -86,7 +86,6 @@ __weak void gpi2c_init(void)
 static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
                                            u32 header, u32 size, uint8_t *ep)
 {
-       u32 hdr_read = 0xdeadbeef;
        int rc;

 #if CONFIG_IS_ENABLED(DM_I2C)
@@ -113,10 +112,10 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
         * We must allow for fall through to check the data if 2 byte
         * addressing works
         */
-       (void)dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
+       rc = dm_i2c_read(dev, 0, ep, size);

        /* Corrupted data??? */
-       if (hdr_read != header) {
+       if (rc || (*((u32*)ep) != header)) {
                /*
                 * read the eeprom header using i2c again, but use only a
                 * 2 byte address (some newer boards need this..)
@@ -125,16 +124,13 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
                if (rc)
                        return rc;

-               rc = dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
+               rc = dm_i2c_read(dev, 0, ep, size);
                if (rc)
                        return rc;
        }
-       if (hdr_read != header)
+       if (*((u32*)ep) != header)
                return -1;

-       rc = dm_i2c_read(dev, 0, ep, size);
-       if (rc)
-               return rc;
 #else
        u32 byte;





More information about the U-Boot mailing list